]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'sb/unpack-trees-grammofix' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 17 Jan 2017 23:19:05 +0000 (15:19 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 Jan 2017 23:19:05 +0000 (15:19 -0800)
* sb/unpack-trees-grammofix:
  unpack-trees: fix grammar for untracked files in directories

938 files changed:
.gitattributes
.gitignore
.mailmap
.travis.yml
Documentation/CodingGuidelines
Documentation/Makefile
Documentation/RelNotes/2.10.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.10.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.10.2.txt [new file with mode: 0644]
Documentation/RelNotes/2.10.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.11.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.3.10.txt
Documentation/RelNotes/2.4.10.txt
Documentation/RelNotes/2.5.4.txt
Documentation/RelNotes/2.6.1.txt
Documentation/RelNotes/2.8.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.8.2.txt [new file with mode: 0644]
Documentation/RelNotes/2.8.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.8.4.txt [new file with mode: 0644]
Documentation/RelNotes/2.9.0.txt [new file with mode: 0644]
Documentation/RelNotes/2.9.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.9.2.txt [new file with mode: 0644]
Documentation/RelNotes/2.9.3.txt [new file with mode: 0644]
Documentation/RelNotes/2.9.4.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/blame-options.txt
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/everyday.txto
Documentation/fetch-options.txt
Documentation/git-add.txt
Documentation/git-am.txt
Documentation/git-annotate.txt
Documentation/git-apply.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-ignore.txt
Documentation/git-check-ref-format.txt
Documentation/git-checkout.txt
Documentation/git-cherry-pick.txt
Documentation/git-clean.txt
Documentation/git-clone.txt
Documentation/git-commit-tree.txt
Documentation/git-commit.txt
Documentation/git-config.txt
Documentation/git-count-objects.txt
Documentation/git-credential-store.txt
Documentation/git-cvsimport.txt
Documentation/git-cvsserver.txt
Documentation/git-daemon.txt
Documentation/git-describe.txt
Documentation/git-diff-index.txt
Documentation/git-diff-tree.txt
Documentation/git-difftool.txt
Documentation/git-fast-import.txt
Documentation/git-fetch-pack.txt
Documentation/git-fetch.txt
Documentation/git-filter-branch.txt
Documentation/git-fmt-merge-msg.txt
Documentation/git-for-each-ref.txt
Documentation/git-format-patch.txt
Documentation/git-fsck.txt
Documentation/git-gc.txt
Documentation/git-grep.txt
Documentation/git-gui.txt
Documentation/git-help.txt
Documentation/git-http-backend.txt
Documentation/git-http-push.txt
Documentation/git-index-pack.txt
Documentation/git-init.txt
Documentation/git-instaweb.txt
Documentation/git-interpret-trailers.txt
Documentation/git-log.txt
Documentation/git-ls-files.txt
Documentation/git-ls-tree.txt
Documentation/git-mailinfo.txt
Documentation/git-mailsplit.txt
Documentation/git-merge-base.txt
Documentation/git-merge.txt
Documentation/git-mergetool.txt
Documentation/git-mktree.txt
Documentation/git-mv.txt
Documentation/git-notes.txt
Documentation/git-p4.txt
Documentation/git-pack-objects.txt
Documentation/git-pull.txt
Documentation/git-push.txt
Documentation/git-quiltimport.txt
Documentation/git-rebase.txt
Documentation/git-receive-pack.txt
Documentation/git-remote-fd.txt
Documentation/git-remote.txt
Documentation/git-repack.txt
Documentation/git-replace.txt
Documentation/git-revert.txt
Documentation/git-send-email.txt
Documentation/git-send-pack.txt
Documentation/git-sh-setup.txt
Documentation/git-shell.txt
Documentation/git-show-branch.txt
Documentation/git-show-ref.txt
Documentation/git-stash.txt
Documentation/git-status.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-tag.txt
Documentation/git-unpack-objects.txt
Documentation/git-update-index.txt
Documentation/git-upload-pack.txt
Documentation/git-verify-commit.txt
Documentation/git-web--browse.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/githooks.txt
Documentation/gitignore.txt
Documentation/gitk.txt
Documentation/gitmodules.txt
Documentation/gitremote-helpers.txt
Documentation/gitrepository-layout.txt
Documentation/gitrevisions.txt
Documentation/gitweb.conf.txt
Documentation/gitweb.txt
Documentation/glossary-content.txt
Documentation/howto/new-command.txt
Documentation/howto/revert-a-faulty-merge.txt
Documentation/lint-gitlink.perl [new file with mode: 0755]
Documentation/merge-config.txt
Documentation/merge-options.txt
Documentation/pretty-formats.txt
Documentation/pretty-options.txt
Documentation/rev-list-options.txt
Documentation/revisions.txt
Documentation/technical/api-config.txt
Documentation/technical/api-credentials.txt
Documentation/technical/api-hashmap.txt
Documentation/technical/api-parse-options.txt
Documentation/technical/api-sha1-array.txt
Documentation/technical/api-trace.txt
Documentation/technical/pack-protocol.txt
Documentation/technical/protocol-capabilities.txt
Documentation/technical/protocol-common.txt
Documentation/technical/signature-format.txt [new file with mode: 0644]
GIT-VERSION-GEN
Makefile
README.md
RelNotes
abspath.c
advice.c
apply.c [new file with mode: 0644]
apply.h [new file with mode: 0644]
archive-tar.c
archive.c
archive.h
attr.c
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/cat-file.c
builtin/checkout-index.c
builtin/checkout.c
builtin/clone.c
builtin/commit-tree.c
builtin/commit.c
builtin/config.c
builtin/count-objects.c
builtin/describe.c
builtin/diff-files.c
builtin/diff-index.c
builtin/diff-tree.c
builtin/diff.c
builtin/fast-export.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/fmt-merge-msg.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/interpret-trailers.c
builtin/log.c
builtin/ls-files.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-tree.c
builtin/merge.c
builtin/mktree.c
builtin/mv.c
builtin/name-rev.c
builtin/notes.c
builtin/pack-objects.c
builtin/patch-id.c
builtin/pull.c
builtin/push.c
builtin/read-tree.c
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/stripspace.c
builtin/submodule--helper.c
builtin/symbolic-ref.c
builtin/tag.c
builtin/unpack-objects.c
builtin/update-index.c
builtin/upload-archive.c
builtin/verify-tag.c
builtin/worktree.c
bundle.c
cache-tree.c
cache.h
check-racy.c
ci/test-documentation.sh [new file with mode: 0755]
color.c
color.h
combine-diff.c
commit-slab.h
commit.c
commit.h
common-main.c [new file with mode: 0644]
compat/apple-common-crypto.h
compat/mingw.c
compat/mingw.h
compat/nedmalloc/nedmalloc.c
compat/precompose_utf8.c
compat/regex/regcomp.c
compat/regex/regex.c
compat/snprintf.c
compat/strdup.c [new file with mode: 0644]
compat/vcbuild/include/unistd.h
compat/win32/pthread.h
compat/win32/syslog.c
compat/win32mmap.c
compat/winansi.c
config.c
config.mak.uname
configure.ac
connect.c
connected.c
connected.h
contrib/coccinelle/.gitignore [new file with mode: 0644]
contrib/coccinelle/README [new file with mode: 0644]
contrib/coccinelle/array.cocci [new file with mode: 0644]
contrib/coccinelle/free.cocci [new file with mode: 0644]
contrib/coccinelle/object_id.cocci [new file with mode: 0644]
contrib/coccinelle/qsort.cocci [new file with mode: 0644]
contrib/coccinelle/strbuf.cocci [new file with mode: 0644]
contrib/coccinelle/xstrdup_or_null.cocci [new file with mode: 0644]
contrib/completion/git-completion.bash
contrib/completion/git-prompt.sh
contrib/credential/gnome-keyring/Makefile
contrib/credential/libsecret/Makefile [new file with mode: 0644]
contrib/credential/libsecret/git-credential-libsecret.c [new file with mode: 0644]
contrib/diff-highlight/Makefile [new file with mode: 0644]
contrib/diff-highlight/diff-highlight
contrib/diff-highlight/t/.gitignore [new file with mode: 0644]
contrib/diff-highlight/t/Makefile [new file with mode: 0644]
contrib/diff-highlight/t/t9400-diff-highlight.sh [new file with mode: 0755]
contrib/fast-import/import-tars.perl
contrib/git-jump/README
contrib/git-jump/git-jump
contrib/hooks/multimail/CHANGES
contrib/hooks/multimail/CONTRIBUTING.rst
contrib/hooks/multimail/README
contrib/hooks/multimail/README.Git
contrib/hooks/multimail/doc/customizing-emails.rst [new file with mode: 0644]
contrib/hooks/multimail/doc/troubleshooting.rst [new file with mode: 0644]
contrib/hooks/multimail/git_multimail.py
contrib/hooks/multimail/post-receive.example
contrib/long-running-filter/example.pl [new file with mode: 0755]
contrib/mw-to-git/.perlcriticrc
contrib/mw-to-git/git-remote-mediawiki.perl
contrib/persistent-https/Makefile
contrib/subtree/git-subtree.sh
contrib/subtree/t/t7900-subtree.sh
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]
convert.c
convert.h
copy.c
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
daemon.c
date.c
diff-lib.c
diff-no-index.c
diff.c
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore.h
dir-iterator.c [new file with mode: 0644]
dir-iterator.h [new file with mode: 0644]
dir.c
dir.h
editor.c
entry.c
environment.c
exec_cmd.c
exec_cmd.h
fast-import.c
fetch-pack.c
fetch-pack.h
fsck.c
fsck.h
gettext.c
gettext.h
git-add--interactive.perl
git-bisect.sh
git-compat-util.h
git-cvsserver.perl
git-difftool--helper.sh
git-difftool.perl
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/ja.po
git-gui/po/pt_pt.po [new file with mode: 0644]
git-gui/po/ru.po
git-merge-octopus.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-rebase--am.sh
git-rebase--interactive.sh
git-rebase--merge.sh
git-rebase.sh
git-send-email.perl
git-sh-i18n.sh
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git-svn.perl
git.c
git.spec.in [deleted file]
gitweb/gitweb.perl
gpg-interface.c
graph.c
graph.h
grep.c
grep.h
help.c
hex.c
http-backend.c
http-fetch.c
http-push.c
http-walker.c
http.c
http.h
ident.c
imap-send.c
iterator.h [new file with mode: 0644]
line-log.c
list-objects.c
list.h [new file with mode: 0644]
ll-merge.c
lockfile.c
lockfile.h
log-tree.c
mailinfo.c
mailinfo.h
mailmap.c
match-trees.c
merge-recursive.c
merge-recursive.h
merge.c
mergetools/araxis
mergetools/bc
mergetools/codecompare
mergetools/deltawalker
mergetools/diffmerge
mergetools/diffuse
mergetools/ecmerge
mergetools/emerge
mergetools/examdiff [new file with mode: 0644]
mergetools/kdiff3
mergetools/kompare
mergetools/meld
mergetools/opendiff
mergetools/p4merge
mergetools/tkdiff
mergetools/tortoisemerge
mergetools/vimdiff
mergetools/winmerge
mergetools/xxdiff
mru.c [new file with mode: 0644]
mru.h [new file with mode: 0644]
notes-merge.c
notes.c
object.h
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/SVN.pm
perl/Git/SVN/Editor.pm
perl/Git/SVN/Fetcher.pm
perl/Git/SVN/Migration.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/is.po
po/ko.po
po/pt_PT.po
po/ru.po
po/sv.po
po/vi.po
po/zh_CN.po
pretty.c
quote.c
quote.h
reachable.c
read-cache.c
ref-filter.c
reflog-walk.c
refs.c
refs.h
refs/files-backend.c
refs/iterator.c [new file with mode: 0644]
refs/refs-internal.h
remote-curl.c
remote-testsvn.c
remote.c
remote.h
rerere.c
rerere.h
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
shallow.c
shell.c
shortlog.h
show-index.c
sideband.c
sideband.h
split-index.c
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c
submodule-config.c
submodule-config.h
submodule.c
submodule.h
t/Makefile
t/README
t/helper/.gitignore [new file with mode: 0644]
t/helper/test-chmtime.c [moved from test-chmtime.c with 98% similarity]
t/helper/test-config.c [moved from test-config.c with 80% similarity]
t/helper/test-ctype.c [moved from test-ctype.c with 95% similarity]
t/helper/test-date.c [moved from test-date.c with 56% similarity]
t/helper/test-delta.c [moved from test-delta.c with 97% similarity]
t/helper/test-dump-cache-tree.c [moved from test-dump-cache-tree.c with 96% similarity]
t/helper/test-dump-split-index.c [moved from test-dump-split-index.c with 89% similarity]
t/helper/test-dump-untracked-cache.c [moved from test-dump-untracked-cache.c with 88% similarity]
t/helper/test-fake-ssh.c [moved from test-fake-ssh.c with 94% similarity]
t/helper/test-genrandom.c [moved from test-genrandom.c with 94% similarity]
t/helper/test-hashmap.c [moved from test-hashmap.c with 99% similarity]
t/helper/test-index-version.c [moved from test-index-version.c with 84% similarity]
t/helper/test-line-buffer.c [moved from test-line-buffer.c with 98% similarity]
t/helper/test-match-trees.c [new file with mode: 0644]
t/helper/test-mergesort.c [moved from test-mergesort.c with 95% similarity]
t/helper/test-mktemp.c [moved from test-mktemp.c with 84% similarity]
t/helper/test-parse-options.c [moved from test-parse-options.c with 51% similarity]
t/helper/test-path-utils.c [moved from test-path-utils.c with 98% similarity]
t/helper/test-prio-queue.c [moved from test-prio-queue.c with 93% similarity]
t/helper/test-read-cache.c [moved from test-read-cache.c with 80% similarity]
t/helper/test-regex.c [new file with mode: 0644]
t/helper/test-revision-walking.c [moved from test-revision-walking.c with 95% similarity]
t/helper/test-run-command.c [moved from test-run-command.c with 90% similarity]
t/helper/test-scrap-cache-tree.c [moved from test-scrap-cache-tree.c with 85% similarity]
t/helper/test-sha1-array.c [moved from test-sha1-array.c with 87% similarity]
t/helper/test-sha1.c [moved from test-sha1.c with 96% similarity]
t/helper/test-sha1.sh [moved from test-sha1.sh with 96% similarity]
t/helper/test-sigchain.c [moved from test-sigchain.c with 87% similarity]
t/helper/test-string-list.c [moved from test-string-list.c with 98% similarity]
t/helper/test-submodule-config.c [moved from test-submodule-config.c with 87% similarity]
t/helper/test-subprocess.c [moved from test-subprocess.c with 89% similarity]
t/helper/test-svn-fe.c [moved from test-svn-fe.c with 93% similarity]
t/helper/test-urlmatch-normalization.c [moved from test-urlmatch-normalization.c with 96% similarity]
t/helper/test-wildmatch.c [moved from test-wildmatch.c with 93% similarity]
t/lib-git-daemon.sh
t/lib-git-p4.sh
t/lib-git-svn.sh
t/lib-gpg.sh
t/lib-httpd.sh
t/lib-httpd/apache.conf
t/lib-rebase.sh
t/perf/README
t/perf/p0003-delta-base-cache.sh [new file with mode: 0755]
t/perf/p3400-rebase.sh [new file with mode: 0755]
t/perf/p3404-rebase-interactive.sh [new file with mode: 0755]
t/perf/p4211-line-log.sh
t/perf/p5303-many-packs.sh [new file with mode: 0755]
t/perf/p5310-pack-bitmaps.sh
t/perf/p5550-fetch-tags.sh [new file with mode: 0755]
t/perf/perf-lib.sh
t/perf/run
t/t0000-basic.sh
t/t0001-init.sh
t/t0005-signals.sh
t/t0006-date.sh
t/t0008-ignores.sh
t/t0012-help.sh [new file with mode: 0755]
t/t0020-crlf.sh
t/t0021-conversion.sh
t/t0021/rot13-filter.pl [new file with mode: 0644]
t/t0025-crlf-auto.sh
t/t0027-auto-crlf.sh
t/t0030-stripspace.sh
t/t0040-parse-options.sh
t/t0060-path-utils.sh
t/t0070-fundamental.sh
t/t0300-credentials.sh
t/t1006-cat-file.sh
t/t1007-hash-object.sh
t/t1011-read-tree-sparse-checkout.sh
t/t1020-subdirectory.sh
t/t1050-large.sh
t/t1100-commit-tree-options.sh
t/t1300-repo-config.sh
t/t1301-shared-repo.sh
t/t1302-repo-version.sh
t/t1307-config-blob.sh
t/t1308-config-set.sh
t/t1350-config-hooks-path.sh [new file with mode: 0755]
t/t1400-update-ref.sh
t/t1401-symbolic-ref.sh
t/t1404-update-ref-df-conflicts.sh [deleted file]
t/t1404-update-ref-errors.sh [new file with mode: 0755]
t/t1410-reflog.sh
t/t1430-bad-ref-name.sh
t/t1450-fsck.sh
t/t1500-rev-parse.sh
t/t1503-rev-parse-verify.sh
t/t1506-rev-parse-diagnosis.sh
t/t1512-rev-parse-disambiguation.sh
t/t1515-rev-parse-outside-repo.sh [new file with mode: 0755]
t/t1700-split-index.sh
t/t2010-checkout-ambiguous.sh
t/t2018-checkout-branch.sh
t/t2020-checkout-detach.sh
t/t2024-checkout-dwim.sh
t/t2025-worktree-add.sh
t/t2027-worktree-list.sh
t/t2028-worktree-move.sh [new file with mode: 0755]
t/t2107-update-index-basic.sh
t/t2203-add-intent.sh
t/t2300-cd-to-toplevel.sh
t/t3007-ls-files-recurse-submodules.sh [new file with mode: 0755]
t/t3030-merge-recursive.sh
t/t3033-merge-toplevel.sh
t/t3101-ls-tree-dirname.sh
t/t3102-ls-tree-wildcards.sh
t/t3200-branch.sh
t/t3201-branch-contains.sh
t/t3203-branch-output.sh
t/t3310-notes-merge-manual-resolve.sh
t/t3320-notes-merge-worktrees.sh
t/t3400-rebase.sh
t/t3402-rebase-merge.sh
t/t3404-rebase-interactive.sh
t/t3412-rebase-root.sh
t/t3415-rebase-autosquash.sh
t/t3419-rebase-patch-id.sh
t/t3420-rebase-autostash.sh
t/t3421-rebase-topology-linear.sh
t/t3426-rebase-submodule.sh
t/t3427-rebase-subtree.sh [new file with mode: 0755]
t/t3501-revert-cherry-pick.sh
t/t3510-cherry-pick-sequence.sh
t/t3513-revert-submodule.sh
t/t3600-rm.sh
t/t3700-add.sh
t/t3900-i18n-commit.sh
t/t3901-i18n-patch.sh
t/t3903-stash.sh
t/t3910-mac-os-precompose.sh
t/t4001-diff-rename.sh
t/t4010-diff-pathspec.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/t4018-diff-funcname.sh
t/t4018/css-brace-in-col-1 [new file with mode: 0644]
t/t4018/css-colon-eol [new file with mode: 0644]
t/t4018/css-colon-selector [new file with mode: 0644]
t/t4018/css-common [new file with mode: 0644]
t/t4018/css-long-selector-list [new file with mode: 0644]
t/t4018/css-prop-sans-indent [new file with mode: 0644]
t/t4018/css-short-selector-list [new file with mode: 0644]
t/t4018/css-trailing-space [new file with mode: 0644]
t/t4021-format-patch-numbered.sh
t/t4026-color.sh
t/t4033-diff-patience.sh
t/t4034-diff-words.sh
t/t4034/css/expect [new file with mode: 0644]
t/t4034/css/post [new file with mode: 0644]
t/t4034/css/pre [new file with mode: 0644]
t/t4047-diff-dirstat.sh
t/t4051-diff-function-context.sh
t/t4051/appended1.c [new file with mode: 0644]
t/t4051/appended2.c [new file with mode: 0644]
t/t4051/dummy.c [new file with mode: 0644]
t/t4051/hello.c [new file with mode: 0644]
t/t4051/includes.c [new file with mode: 0644]
t/t4053-diff-no-index.sh
t/t4054-diff-bogus-tree.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 [new file with mode: 0755]
t/t4130-apply-criss-cross-rename.sh
t/t4150-am.sh
t/t4151-am-abort.sh
t/t4153-am-resume-override-opts.sh
t/t4200-rerere.sh
t/t4201-shortlog.sh
t/t4202-log.sh
t/t4204-patch-id.sh
t/t4205-log-pretty-formats.sh
t/t4207-log-decoration-colors.sh
t/t4208-log-magic-pathspec.sh
t/t4211-line-log.sh
t/t4213-log-tabexpand.sh [new file with mode: 0755]
t/t4254-am-corrupt.sh
t/t5000-tar-tree.sh
t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a [new file with mode: 0644]
t/t5000/huge-and-future.tar [new file with mode: 0644]
t/t5100-mailinfo.sh
t/t5100/0001mboxrd [new file with mode: 0644]
t/t5100/0002mboxrd [new file with mode: 0644]
t/t5100/comment.expect [new file with mode: 0644]
t/t5100/comment.in [new file with mode: 0644]
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/quoted-string.expect [new file with mode: 0644]
t/t5100/quoted-string.in [new file with mode: 0644]
t/t5100/sample.mbox
t/t5100/sample.mboxrd [new file with mode: 0644]
t/t5300-pack-object.sh
t/t5305-include-tag.sh
t/t5310-pack-bitmaps.sh
t/t5314-pack-cycle-detection.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/t5510-fetch.sh
t/t5512-ls-remote.sh
t/t5520-pull.sh
t/t5521-pull-options.sh
t/t5523-push-upstream.sh
t/t5526-fetch-submodules.sh
t/t5528-push-default.sh
t/t5531-deep-submodule-push.sh
t/t5532-fetch-proxy.sh
t/t5533-push-cas.sh
t/t5536-fetch-conflicts.sh
t/t5539-fetch-http-shallow.sh
t/t5541-http-push-smart.sh
t/t5544-pack-objects-hook.sh [new file with mode: 0755]
t/t5545-push-options.sh [new file with mode: 0755]
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/t5601-clone.sh
t/t5604-clone-reference.sh [moved from t/t5700-clone-reference.sh with 100% similarity]
t/t5605-clone-local.sh [moved from t/t5701-clone-local.sh with 100% similarity]
t/t5606-clone-options.sh [moved from t/t5702-clone-options.sh with 100% similarity]
t/t5607-clone-bundle.sh [moved from t/t5704-bundle.sh with 100% similarity]
t/t5608-clone-2gb.sh [moved from t/t5705-clone-2gb.sh with 100% similarity]
t/t5609-clone-branch.sh [moved from t/t5706-clone-branch.sh with 100% similarity]
t/t5610-clone-detached.sh [moved from t/t5707-clone-detached.sh with 100% similarity]
t/t5611-clone-config.sh [moved from t/t5708-clone-config.sh with 63% similarity]
t/t5612-clone-refspec.sh [moved from t/t5709-clone-refspec.sh with 100% similarity]
t/t5613-info-alternate.sh [new file with mode: 0755]
t/t5614-clone-submodules.sh [new file with mode: 0755]
t/t5615-alternate-env.sh [new file with mode: 0755]
t/t5710-info-alternate.sh [deleted file]
t/t5812-proto-disable-http.sh
t/t6000-rev-list-misc.sh
t/t6006-rev-list-format.sh
t/t6007-rev-list-cherry-pick-file.sh
t/t6009-rev-list-parent.sh
t/t6010-merge-base.sh
t/t6012-rev-list-simplify.sh
t/t6018-rev-list-glob.sh
t/t6024-recursive-merge.sh
t/t6026-merge-attr.sh
t/t6029-merge-subtree.sh
t/t6030-bisect-porcelain.sh
t/t6036-recursive-corner-cases.sh
t/t6038-merge-text-auto.sh
t/t6041-bisect-submodule.sh
t/t6044-merge-unrelated-index-changes.sh [new file with mode: 0755]
t/t6101-rev-parse-parents.sh
t/t6300-for-each-ref.sh
t/t6301-for-each-ref-errors.sh
t/t6302-for-each-ref-filter.sh
t/t7001-mv.sh
t/t7004-tag.sh
t/t7006-pager.sh
t/t7011-skip-worktree-reading.sh
t/t7012-skip-worktree-writing.sh
t/t7030-verify-tag.sh
t/t7060-wtstatus.sh
t/t7063-status-untracked-cache.sh
t/t7064-wtstatus-pv2.sh [new file with mode: 0755]
t/t7102-reset.sh
t/t7201-co.sh
t/t7300-clean.sh
t/t7400-submodule-basic.sh
t/t7403-submodule-sync.sh
t/t7406-submodule-update.sh
t/t7407-submodule-foreach.sh
t/t7408-submodule-reference.sh
t/t7411-submodule-config.sh
t/t7501-commit.sh
t/t7502-commit.sh
t/t7507-commit-verbose.sh
t/t7508-status.sh
t/t7510-signed-commit.sh
t/t7512-status-help.sh
t/t7513-interpret-trailers.sh
t/t7517-per-repo-email.sh
t/t7600-merge.sh
t/t7605-merge-resolve.sh
t/t7607-merge-overwrite.sh
t/t7609-merge-co-error-msgs.sh
t/t7610-mergetool.sh
t/t7701-repack-unpack-unreachable.sh
t/t7800-difftool.sh
t/t7810-grep.sh
t/t7812-grep-icase-non-ascii.sh [new file with mode: 0755]
t/t7813-grep-icase-iso.sh [new file with mode: 0755]
t/t8002-blame.sh
t/t8003-blame-corner-cases.sh
t/t8008-blame-formats.sh
t/t8010-cat-file-filters.sh [new file with mode: 0755]
t/t9000/test.pl
t/t9001-send-email.sh
t/t9003-help-autocorrect.sh
t/t9100-git-svn-basic.sh
t/t9101-git-svn-props.sh
t/t9102-git-svn-deep-rmdir.sh
t/t9103-git-svn-tracked-directory-removed.sh
t/t9106-git-svn-commit-diff-clobber.sh
t/t9107-git-svn-migrate.sh
t/t9110-git-svn-use-svm-props.sh
t/t9111-git-svn-use-svnsync-props.sh
t/t9115-git-svn-dcommit-funky-renames.sh
t/t9118-git-svn-funky-branch-names.sh
t/t9120-git-svn-clone-with-percent-escapes.sh
t/t9123-git-svn-rebuild-with-rewriteroot.sh
t/t9142-git-svn-shallow-clone.sh
t/t9153-git-svn-rewrite-uuid.sh
t/t9158-git-svn-mergeinfo.sh
t/t9160-git-svn-preserve-empty-dirs.sh
t/t9300-fast-import.sh
t/t9302-fast-import-unpack-limit.sh [new file with mode: 0755]
t/t9400-git-cvsserver-server.sh
t/t9401-git-cvsserver-crlf.sh
t/t9500-gitweb-standalone-no-errors.sh
t/t9800-git-p4-basic.sh
t/t9801-git-p4-branch.sh
t/t9802-git-p4-filetype.sh
t/t9824-git-p4-git-lfs.sh
t/t9826-git-p4-keep-empty-commits.sh
t/t9828-git-p4-map-user.sh [new file with mode: 0755]
t/t9829-git-p4-jobs.sh [new file with mode: 0755]
t/t9830-git-p4-symlink-dir.sh [new file with mode: 0755]
t/t9902-completion.sh
t/t9903-bash-prompt.sh
t/test-lib-functions.sh
t/test-lib.sh
t/valgrind/valgrind.sh
tag.c
tag.h
tempfile.c
tempfile.h
templates/hooks--pre-receive.sample [new file with mode: 0755]
test-match-trees.c [deleted file]
test-regex.c [deleted file]
tmp-objdir.c [new file with mode: 0644]
tmp-objdir.h [new file with mode: 0644]
trace.c
trailer.c
transport-helper.c
transport.c
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
unicode_width.h
unpack-trees.c
update_unicode.sh [deleted file]
upload-pack.c
url.c
usage.c
userdiff.c
utf8.h
vcs-svn/fast_export.c
vcs-svn/line_buffer.c
vcs-svn/sliding_window.c
vcs-svn/svndiff.c
vcs-svn/svndump.c
walker.c
walker.h
wildmatch.c
worktree.c
worktree.h
wrap-for-bin.sh
wrapper.c
write_or_die.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
xdiff/xdiff.h
xdiff/xdiffi.c
xdiff/xemit.c
xdiff/xpatience.c
xdiff/xprepare.c
xdiff/xutils.c

index 5e98806c6cc246acef5f539ae191710a0c06ad3f..320e33c327c6f597bcfd255b13876f21b0b2d8aa 100644 (file)
@@ -1,3 +1,3 @@
 * whitespace=!indent,trail,space
-*.[ch] whitespace=indent,trail,space
+*.[ch] whitespace=indent,trail,space diff=cpp
 *.sh whitespace=indent,trail,space
index 5087ce1eb7e2210e7fc25a9a14ac3f499ad5ac2f..6722f78f9ab7e9647a3358a52e627f1c9e83f685 100644 (file)
 /gitweb/gitweb.cgi
 /gitweb/static/gitweb.js
 /gitweb/static/gitweb.min.*
-/test-chmtime
-/test-ctype
-/test-config
-/test-date
-/test-delta
-/test-dump-cache-tree
-/test-dump-split-index
-/test-dump-untracked-cache
-/test-fake-ssh
-/test-scrap-cache-tree
-/test-genrandom
-/test-hashmap
-/test-index-version
-/test-line-buffer
-/test-match-trees
-/test-mergesort
-/test-mktemp
-/test-parse-options
-/test-path-utils
-/test-prio-queue
-/test-read-cache
-/test-regex
-/test-revision-walking
-/test-run-command
-/test-sha1
-/test-sha1-array
-/test-sigchain
-/test-string-list
-/test-submodule-config
-/test-subprocess
-/test-svn-fe
-/test-urlmatch-normalization
-/test-wildmatch
 /common-cmds.h
 *.tar.gz
 *.dsc
 /config.mak.autogen
 /config.mak.append
 /configure
-/unicode
 /tags
 /TAGS
 /cscope*
index e5b4126bec557db55924b7b60ed70349626ea2c4..9cc33e925de8adc562daf9b176135aba7b5e4d9b 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -33,6 +33,7 @@ Cheng Renquan <crquan@gmail.com>
 Chris Shoemaker <c.shoemaker@cox.net>
 Chris Wright <chrisw@sous-sol.org> <chrisw@osdl.org>
 Cord Seele <cowose@gmail.com> <cowose@googlemail.com>
+Christian Couder <chriscool@tuxfamily.org> <christian.couder@gmail.com>
 Christian Stimming <stimming@tuhh.de> <chs@ckiste.goetheallee>
 Csaba Henk <csaba@gluster.com> <csaba@lowlife.hu>
 Dan Johnson <computerdruid@gmail.com>
@@ -46,11 +47,14 @@ David D. Kilzer <ddkilzer@kilzer.net>
 David Kågedal <davidk@lysator.liu.se>
 David Reiss <dreiss@facebook.com> <dreiss@dreiss-vmware.(none)>
 David S. Miller <davem@davemloft.net>
+David Turner <novalis@novalis.org> <dturner@twopensource.com>
+David Turner <novalis@novalis.org> <dturner@twosigma.com>
 Deskin Miller <deskinm@umich.edu>
 Dirk Süsserott <newsletter@dirk.my1.cc>
 Eric Blake <eblake@redhat.com> <ebb9@byu.net>
 Eric Hanchrow <eric.hanchrow@gmail.com> <offby1@blarg.net>
 Eric S. Raymond <esr@thyrsus.com>
+Eric Wong <e@80x24.org> <normalperson@yhbt.net>
 Erik Faye-Lund <kusmabite@gmail.com> <kusmabite@googlemail.com>
 Eyvind Bernhardsen <eyvind.bernhardsen@gmail.com> <eyvind-git@orakel.ntnu.no>
 Florian Achleitner <florian.achleitner.2.6.31@gmail.com> <florian.achleitner2.6.31@gmail.com>
index 78e433ba718df00d112a5f57d523afb8db189c79..3843967a692d1642e43f536d5e2652b566ca554d 100644 (file)
@@ -18,37 +18,59 @@ addons:
   apt:
     packages:
     - language-pack-is
+    - git-svn
+    - apache2
 
 env:
   global:
     - DEVELOPER=1
-    - P4_VERSION="15.2"
-    - GIT_LFS_VERSION="1.1.0"
+    # 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.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 --tee"
+    - GIT_TEST_OPTS="--verbose-log"
     - GIT_TEST_CLONE_2GB=YesPlease
     # t9810 occasionally fails on Travis CI OS X
     # t9816 occasionally fails with "TAP out of sequence errors" on Travis CI OS X
     - GIT_SKIP_TESTS="t9810 t9816"
 
+matrix:
+  include:
+    - env: Documentation
+      os: linux
+      compiler: clang
+      addons:
+        apt:
+          packages:
+          - asciidoc
+          - xmlto
+      before_install:
+      before_script:
+      script: ci/test-documentation.sh
+      after_failure:
+
 before_install:
   - >
     case "${TRAVIS_OS_NAME:-linux}" in
     linux)
+      export GIT_TEST_HTTPD=YesPlease
+
       mkdir --parents custom/p4
       pushd custom/p4
-        wget --quiet http://filehost.perforce.com/perforce/r$P4_VERSION/bin.linux26x86_64/p4d
-        wget --quiet http://filehost.perforce.com/perforce/r$P4_VERSION/bin.linux26x86_64/p4
+        wget --quiet http://filehost.perforce.com/perforce/r$LINUX_P4_VERSION/bin.linux26x86_64/p4d
+        wget --quiet http://filehost.perforce.com/perforce/r$LINUX_P4_VERSION/bin.linux26x86_64/p4
         chmod u+x p4d
         chmod u+x p4
         export PATH="$(pwd):$PATH"
       popd
       mkdir --parents custom/git-lfs
       pushd custom/git-lfs
-        wget --quiet https://github.com/github/git-lfs/releases/download/v$GIT_LFS_VERSION/git-lfs-linux-amd64-$GIT_LFS_VERSION.tar.gz
-        tar --extract --gunzip --file "git-lfs-linux-amd64-$GIT_LFS_VERSION.tar.gz"
-        cp git-lfs-$GIT_LFS_VERSION/git-lfs .
+        wget --quiet https://github.com/github/git-lfs/releases/download/v$LINUX_GIT_LFS_VERSION/git-lfs-linux-amd64-$LINUX_GIT_LFS_VERSION.tar.gz
+        tar --extract --gunzip --file "git-lfs-linux-amd64-$LINUX_GIT_LFS_VERSION.tar.gz"
+        cp git-lfs-$LINUX_GIT_LFS_VERSION/git-lfs .
         export PATH="$(pwd):$PATH"
       popd
       ;;
@@ -57,12 +79,14 @@ before_install:
         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" \
-          /usr/local/Library/Taps/homebrew/homebrew-binary/$FORMULA.rb
+          "$(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 link --force gettext
       ;;
index 0ddd36879a4b90392b1659025070e1faaed091f1..4cd95da6b1e436c8764d51f17ea0446ca3bad73d 100644 (file)
@@ -526,12 +526,20 @@ Writing Documentation:
  modifying paragraphs or option/command explanations that contain options
  or commands:
 
- Literal examples (e.g. use of command-line options, command names, and
configuration variables) are typeset in monospace, and if you can use
- `backticks around word phrases`, do so.
+ Literal examples (e.g. use of command-line options, command names,
branch names, configuration and environment variables) must be
+ typeset in monospace (i.e. wrapped with backticks):
    `--pretty=oneline`
    `git rev-list`
    `remote.pushDefault`
+   `GIT_DIR`
+   `HEAD`
+
+ An environment variable must be prefixed with "$" only when referring to its
+ value and not when referring to the variable itself, in this case there is
+ nothing to add except the backticks:
+   `GIT_DIR` is specified
+   `$GIT_DIR/hooks/pre-receive`
 
  Word phrases enclosed in `backtick characters` are rendered literally
  and will not be further expanded. The use of `backticks` to achieve the
index 3e39e2815baca82fe5f1fff8791de37c3c7247ac..b43d66eae6e154b229aa1477b8454ce2918ba8b9 100644 (file)
@@ -76,6 +76,7 @@ TECH_DOCS += technical/protocol-common
 TECH_DOCS += technical/racy-git
 TECH_DOCS += technical/send-pack-pipeline
 TECH_DOCS += technical/shallow
+TECH_DOCS += technical/signature-format
 TECH_DOCS += technical/trivial-merge
 SP_ARTICLES += $(TECH_DOCS)
 SP_ARTICLES += technical/api-index
@@ -146,7 +147,7 @@ else
        ASCIIDOC_EXTRA += -a git-asciidoc-no-roff
        endif
 endif
-ifdef MAN_BOLD_LITERAL
+ifndef NO_MAN_BOLD_LITERAL
 XMLTO_EXTRA += -m manpage-bold-literal.xsl
 endif
 ifdef DOCBOOK_SUPPRESS_SP
@@ -204,6 +205,7 @@ ifndef V
        QUIET_DBLATEX   = @echo '   ' DBLATEX $@;
        QUIET_XSLTPROC  = @echo '   ' XSLTPROC $@;
        QUIET_GEN       = @echo '   ' GEN $@;
+       QUIET_LINT      = @echo '   ' LINT $@;
        QUIET_STDERR    = 2> /dev/null
        QUIET_SUBDIR0   = +@subdir=
        QUIET_SUBDIR1   = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
@@ -427,4 +429,7 @@ quick-install-html: require-htmlrepo
 print-man1:
        @for i in $(MAN1_TXT); do echo $$i; done
 
+lint-docs::
+       $(QUIET_LINT)$(PERL_PATH) lint-gitlink.perl
+
 .PHONY: FORCE
diff --git a/Documentation/RelNotes/2.10.0.txt b/Documentation/RelNotes/2.10.0.txt
new file mode 100644 (file)
index 0000000..f4da28a
--- /dev/null
@@ -0,0 +1,675 @@
+Git 2.10 Release Notes
+======================
+
+Backward compatibility notes
+----------------------------
+
+Updates since v2.9
+------------------
+
+UI, Workflows & Features
+
+ * "git pull --rebase --verify-signature" learned to warn the user
+   that "--verify-signature" is a no-op when rebasing.
+
+ * An upstream project can make a recommendation to shallowly clone
+   some submodules in the .gitmodules file it ships.
+
+ * "git worktree add" learned that '-' can be used as a short-hand for
+   "@{-1}", the previous branch.
+
+ * Update the funcname definition to support css files.
+
+ * The completion script (in contrib/) learned to complete "git
+   status" options.
+
+ * Messages that are generated by auto gc during "git push" on the
+   receiving end are now passed back to the sending end in such a way
+   that they are shown with "remote: " prefix to avoid confusing the
+   users.
+
+ * "git add -i/-p" learned to honor diff.compactionHeuristic
+   experimental knob, so that the user can work on the same hunk split
+   as "git diff" output.
+
+ * "upload-pack" allows a custom "git pack-objects" replacement when
+   responding to "fetch/clone" via the uploadpack.packObjectsHook.
+   (merge b738396 jk/upload-pack-hook later to maint).
+
+ * Teach format-patch and mailsplit (hence "am") how a line that
+   happens to begin with "From " in the e-mail message is quoted with
+   ">", so that these lines can be restored to their original shape.
+   (merge d9925d1 ew/mboxrd-format-am later to maint).
+
+ * "git repack" learned the "--keep-unreachable" option, which sends
+   loose unreachable objects to a pack instead of leaving them loose.
+   This helps heuristics based on the number of loose objects
+   (e.g. "gc --auto").
+   (merge e26a8c4 jk/repack-keep-unreachable later to maint).
+
+ * "log --graph --format=" learned that "%>|(N)" specifies the width
+   relative to the terminal's left edge, not relative to the area to
+   draw text that is to the right of the ancestry-graph section.  It
+   also now accepts negative N that means the column limit is relative
+   to the right border.
+
+ * A careless invocation of "git send-email directory/" after editing
+   0001-change.patch with an editor often ends up sending both
+   0001-change.patch and its backup file, 0001-change.patch~, causing
+   embarrassment and a minor confusion.  Detect such an input and
+   offer to skip the backup files when sending the patches out.
+   (merge 531220b jc/send-email-skip-backup later to maint).
+
+ * "git submodule update" that drives many "git clone" could
+   eventually hit flaky servers/network conditions on one of the
+   submodules; the command learned to retry the attempt.
+
+ * The output coloring scheme learned two new attributes, italic and
+   strike, in addition to existing bold, reverse, etc.
+
+ * "git log" learns log.showSignature configuration variable, and a
+   command line option "--no-show-signature" to countermand it.
+   (merge fce04c3 mj/log-show-signature-conf later to maint).
+
+ * More markings of messages for i18n, with updates to various tests
+   to pass GETTEXT_POISON tests.
+
+ * "git archive" learned to handle files that are larger than 8GB and
+   commits far in the future than expressible by the traditional US-TAR
+   format.
+   (merge 560b0e8 jk/big-and-future-archive-tar later to maint).
+
+
+ * A new configuration variable core.sshCommand has been added to
+   specify what value for GIT_SSH_COMMAND to use per repository.
+
+ * "git worktree prune" protected worktrees that are marked as
+   "locked" by creating a file in a known location.  "git worktree"
+   command learned a dedicated command pair to create and remove such
+   a file, so that the users do not have to do this with editor.
+
+ * A handful of "git svn" updates.
+
+ * "git push" learned to accept and pass extra options to the
+   receiving end so that hooks can read and react to them.
+
+ * "git status" learned to suggest "merge --abort" during a conflicted
+   merge, just like it already suggests "rebase --abort" during a
+   conflicted rebase.
+
+ * "git jump" script (in contrib/) has been updated a bit.
+   (merge a91e692 jk/git-jump later to maint).
+
+ * "git push" and "git clone" learned to give better progress meters
+   to the end user who is waiting on the terminal.
+
+ * An entry "git log --decorate" for the tip of the current branch is
+   shown as "HEAD -> name" (where "name" is the name of the branch);
+   the arrow is now painted in the same color as "HEAD", not in the
+   color for commits.
+
+ * "git format-patch" learned format.from configuration variable to
+   specify the default settings for its "--from" option.
+
+ * "git am -3" calls "git merge-recursive" when it needs to fall back
+   to a three-way merge; this call has been turned into an internal
+   subroutine call instead of spawning a separate subprocess.
+
+ * The command line completion scripts (in contrib/) now knows about
+   "git branch --delete/--move [--remote]".
+   (merge 2703c22 vs/completion-branch-fully-spelled-d-m-r later to maint).
+
+ * "git rev-parse --git-path hooks/<hook>" learned to take
+   core.hooksPath configuration variable (introduced during 2.9 cycle)
+   into account.
+   (merge 9445b49 ab/hooks later to maint).
+
+ * "git log --show-signature" and other commands that display the
+   verification status of PGP signature now shows the longer key-id,
+   as 32-bit key-id is so last century.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * "git fast-import" learned the same performance trick to avoid
+   creating too small a packfile as "git fetch" and "git push" have,
+   using *.unpackLimit configuration.
+
+ * When "git daemon" is run without --[init-]timeout specified, a
+   connection from a client that silently goes offline can hang around
+   for a long time, wasting resources.  The socket-level KEEPALIVE has
+   been enabled to allow the OS to notice such failed connections.
+
+ * "git upload-pack" command has been updated to use the parse-options
+   API.
+
+ * The "git apply" standalone program is being libified; the first
+   step to move many state variables into a structure that can be
+   explicitly (re)initialized to make the machinery callable more
+   than once has been merged.
+
+ * HTTP transport gained an option to produce more detailed debugging
+   trace.
+   (merge 73e57aa ep/http-curl-trace later to maint).
+
+ * Instead of taking advantage of the fact that a struct string_list
+   that is allocated with all NULs happens to be the INIT_NODUP kind,
+   the users of string_list structures are taught to initialize them
+   explicitly as such, to document their behaviour better.
+   (merge 2721ce2 jk/string-list-static-init later to maint).
+
+ * HTTPd tests learned to show the server error log to help diagnosing
+   a failing tests.
+   (merge 44f243d nd/test-lib-httpd-show-error-log-in-verbose later to maint).
+
+ * The ownership rule for the piece of memory that hold references to
+   be fetched in "git fetch" was screwy, which has been cleaned up.
+
+ * "git bisect" makes an internal call to "git diff-tree" when
+   bisection finds the culprit, but this call did not initialize the
+   data structure to pass to the diff-tree API correctly.
+
+ * Further preparatory clean-up for "worktree" feature continues.
+   (merge 0409e0b nd/worktree-cleanup-post-head-protection later to maint).
+
+ * Formats of the various data (and how to validate them) where we use
+   GPG signature have been documented.
+
+ * A new run-command API function pipe_command() is introduced to
+   sanely feed data to the standard input while capturing data from
+   the standard output and the standard error of an external process,
+   which is cumbersome to hand-roll correctly without deadlocking.
+
+ * The codepath to sign data in a prepared buffer with GPG has been
+   updated to use this API to read from the status-fd to check for
+   errors (instead of relying on GPG's exit status).
+   (merge efee955 jk/gpg-interface-cleanup later to maint).
+
+ * Allow t/perf framework to use the features from the most recent
+   version of Git even when testing an older installed version.
+
+ * The commands in the "log/diff" family have had an FILE* pointer in the
+   data structure they pass around for a long time, but some codepaths
+   used to always write to the standard output.  As a preparatory step
+   to make "git format-patch" available to the internal callers, these
+   codepaths have been updated to consistently write into that FILE*
+   instead.
+
+ * Conversion from unsigned char sha1[20] to struct object_id
+   continues.
+
+ * Improve the look of the way "git fetch" reports what happened to
+   each ref that was fetched.
+
+ * The .c/.h sources are marked as such in our .gitattributes file so
+   that "git diff -W" and friends would work better.
+
+ * Code clean-up to avoid using a variable string that compilers may
+   feel untrustable as printf-style format given to write_file()
+   helper function.
+
+ * "git p4" used a location outside $GIT_DIR/refs/ to place its
+   temporary branches, which has been moved to refs/git-p4-tmp/.
+
+ * Existing autoconf generated test for the need to link with pthread
+   library did not check all the functions from pthread libraries;
+   recent FreeBSD has some functions in libc but not others, and we
+   mistakenly thought linking with libc is enough when it is not.
+
+ * When "git fsck" reports a broken link (e.g. a tree object contains
+   a blob that does not exist), both containing object and the object
+   that is referred to were reported with their 40-hex object names.
+   The command learned the "--name-objects" option to show the path to
+   the containing object from existing refs (e.g. "HEAD~24^2:file.txt").
+
+ * Allow http daemon tests in Travis CI tests.
+
+ * Makefile assumed that -lrt is always available on platforms that
+   want to use clock_gettime() and CLOCK_MONOTONIC, which is not a
+   case for recent Mac OS X.  The necessary symbols are often found in
+   libc on many modern systems and having -lrt on the command line, as
+   long as the library exists, had no effect, but when the platform
+   removes librt.a that is a different matter--having -lrt will break
+   the linkage.
+
+   This change could be seen as a regression for those who do need to
+   specify -lrt, as they now specifically ask for NEEDS_LIBRT when
+   building. Hopefully they are in the minority these days.
+
+ * Further preparatory work on the refs API before the pluggable
+   backend series can land.
+
+ * Error handling in the codepaths that updates refs has been
+   improved.
+
+ * The API to iterate over all the refs (i.e. for_each_ref(), etc.)
+   has been revamped.
+
+ * The handling of the "text=auto" attribute has been corrected.
+   $ echo "* text=auto eol=crlf" >.gitattributes
+   used to have the same effect as
+   $ echo "* text eol=crlf" >.gitattributes
+   i.e. declaring all files are text (ignoring "auto").  The
+   combination has been fixed to be equivalent to doing
+   $ git config core.autocrlf true
+
+ * Documentation has been updated to show better example usage
+   of the updated "text=auto" attribute.
+
+ * A few tests that specifically target "git rebase -i" have been
+   added.
+
+ * Dumb http transport on the client side has been optimized.
+   (merge ecba195 ew/http-walker later to maint).
+
+ * Users of the parse_options_concat() API function need to allocate
+   extra slots in advance and fill them with OPT_END() when they want
+   to decide the set of supported options dynamically, which makes the
+   code error-prone and hard to read.  This has been corrected by tweaking
+   the API to allocate and return a new copy of "struct option" array.
+
+ * "git fetch" exchanges batched have/ack messages between the sender
+   and the receiver, initially doubling every time and then falling
+   back to enlarge the window size linearly.  The "smart http"
+   transport, being an half-duplex protocol, outgrows the preset limit
+   too quickly and becomes inefficient when interacting with a large
+   repository.  The internal mechanism learned to grow the window size
+   more aggressively when working with the "smart http" transport.
+
+ * Tests for "git svn" have been taught to reuse the lib-httpd test
+   infrastructure when testing the subversion integration that
+   interacts with subversion repositories served over the http://
+   protocol.
+   (merge a8a5d25 ew/git-svn-http-tests later to maint).
+
+ * "git pack-objects" has a few options that tell it not to pack
+   objects found in certain packfiles, which require it to scan .idx
+   files of all available packs.  The codepaths involved in these
+   operations have been optimized for a common case of not having any
+   non-local pack and/or any .kept pack.
+
+ * The t3700 test about "add --chmod=-x" have been made a bit more
+   robust and generally cleaned up.
+   (merge 766cdc4 ib/t3700-add-chmod-x-updates later to maint).
+
+ * The build procedure learned PAGER_ENV knob that lists what default
+   environment variable settings to export for popular pagers.  This
+   mechanism is used to tweak the default settings to MORE on FreeBSD.
+   (merge 995bc22 ew/build-time-pager-tweaks later to maint).
+
+ * The http-backend (the server-side component of smart-http
+   transport) used to trickle the HTTP header one at a time.  Now
+   these write(2)s are batched.
+   (merge b36045c ew/http-backend-batch-headers later to maint).
+
+ * When "git rebase" tries to compare set of changes on the updated
+   upstream and our own branch, it computes patch-id for all of these
+   changes and attempts to find matches. This has been optimized by
+   lazily computing the full patch-id (which is expensive) to be
+   compared only for changes that touch the same set of paths.
+   (merge ba67504 kw/patch-ids-optim later to maint).
+
+ * A handful of tests that were broken under gettext-poison build have
+   been fixed.
+
+ * The recent i18n patch we added during this cycle did a bit too much
+   refactoring of the messages to avoid word-legos; the repetition has
+   been reduced to help translators.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.9
+----------------
+
+Unless otherwise noted, all the fixes since v2.8 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * The commands in `git log` family take %C(auto) in a custom format
+   string.  This unconditionally turned the color on, ignoring
+   --no-color or with --color=auto when the output is not connected to
+   a tty; this was corrected to make the format truly behave as
+   "auto".
+
+ * "git rev-list --count" whose walk-length is limited with "-n"
+   option did not work well with the counting optimized to look at the
+   bitmap index.
+
+ * "git show -W" (extend hunks to cover the entire function, delimited
+   by lines that match the "funcname" pattern) used to show the entire
+   file when a change added an entire function at the end of the file,
+   which has been fixed.
+
+ * The documentation set has been updated so that literal commands,
+   configuration variables and environment variables are consistently
+   typeset in fixed-width font and bold in manpages.
+
+ * "git svn propset" subcommand that was added in 2.3 days is
+   documented now.
+
+ * The documentation tries to consistently spell "GPG"; when
+   referring to the specific program name, "gpg" is used.
+
+ * "git reflog" stopped upon seeing an entry that denotes a branch
+   creation event (aka "unborn"), which made it appear as if the
+   reflog was truncated.
+
+ * The git-prompt scriptlet (in contrib/) was not friendly with those
+   who uses "set -u", which has been fixed.
+
+ * compat/regex code did not cleanly compile.
+
+ * A codepath that used alloca(3) to place an unbounded amount of data
+   on the stack has been updated to avoid doing so.
+
+ * "git update-index --add --chmod=+x file" may be usable as an escape
+   hatch, but not a friendly thing to force for people who do need to
+   use it regularly.  "git add --chmod=+x file" can be used instead.
+
+ * Build improvements for gnome-keyring (in contrib/)
+
+ * "git status" used to say "working directory" when it meant "working
+   tree".
+
+ * Comments about misbehaving FreeBSD shells have been clarified with
+   the version number (9.x and before are broken, newer ones are OK).
+
+ * "git cherry-pick A" worked on an unborn branch, but "git
+   cherry-pick A..B" didn't.
+
+ * Fix an unintended regression in v2.9 that breaks "clone --depth"
+   that recurses down to submodules by forcing the submodules to also
+   be cloned shallowly, which many server instances that host upstream
+   of the submodules are not prepared for.
+
+ * Fix unnecessarily waste in the idiomatic use of ': ${VAR=default}'
+   to set the default value, without enclosing it in double quotes.
+
+ * Some platform-specific code had non-ANSI strict declarations of C
+   functions that do not take any parameters, which has been
+   corrected.
+
+ * The internal code used to show local timezone offset is not
+   prepared to handle timestamps beyond year 2100, and gave a
+   bogus offset value to the caller.  Use a more benign looking
+   +0000 instead and let "git log" going in such a case, instead
+   of aborting.
+
+ * One among four invocations of readlink(1) in our test suite has
+   been rewritten so that the test can run on systems without the
+   command (others are in valgrind test framework and t9802).
+
+ * t/perf needs /usr/bin/time with GNU extension; the invocation of it
+   is updated to "gtime" on Darwin.
+
+ * A bug, which caused "git p4" while running under verbose mode to
+   report paths that are omitted due to branch prefix incorrectly, has
+   been fixed; the command said "Ignoring file outside of prefix" for
+   paths that are _inside_.
+
+ * The top level documentation "git help git" still pointed at the
+   documentation set hosted at now-defunct google-code repository.
+   Update it to point to https://git.github.io/htmldocs/git.html
+   instead.
+
+ * A helper function that takes the contents of a commit object and
+   finds its subject line did not ignore leading blank lines, as is
+   commonly done by other codepaths.  Make it ignore leading blank
+   lines to match.
+
+ * For a long time, we carried an in-code comment that said our
+   colored output would work only when we use fprintf/fputs on
+   Windows, which no longer is the case for the past few years.
+
+ * "gc.autoPackLimit" when set to 1 should not trigger a repacking
+   when there is only one pack, but the code counted poorly and did
+   so.
+
+ * Add a test to specify the desired behaviour that currently is not
+   available in "git rebase -Xsubtree=...".
+
+ * More mark-up updates to typeset strings that are expected to
+   literally typed by the end user in fixed-width font.
+
+ * "git commit --amend --allow-empty-message -S" for a commit without
+   any message body could have misidentified where the header of the
+   commit object ends.
+
+ * "git rebase -i --autostash" did not restore the auto-stashed change
+   when the operation was aborted.
+
+ * Git does not know what the contents in the index should be for a
+   path added with "git add -N" yet, so "git grep --cached" should not
+   show hits (or show lack of hits, with -L) in such a path, but that
+   logic does not apply to "git grep", i.e. searching in the working
+   tree files.  But we did so by mistake, which has been corrected.
+
+ * "git blame -M" missed a single line that was moved within the file.
+
+ * Fix recently introduced codepaths that are involved in parallel
+   submodule operations, which gave up on reading too early, and
+   could have wasted CPU while attempting to write under a corner
+   case condition.
+
+ * "git grep -i" has been taught to fold case in non-ascii locales
+   correctly.
+
+ * A test that unconditionally used "mktemp" learned that the command
+   is not necessarily available everywhere.
+
+ * There are certain house-keeping tasks that need to be performed at
+   the very beginning of any Git program, and programs that are not
+   built-in commands had to do them exactly the same way as "git"
+   potty does.  It was easy to make mistakes in one-off standalone
+   programs (like test helpers).  A common "main()" function that
+   calls cmd_main() of individual program has been introduced to
+   make it harder to make mistakes.
+   (merge de61ceb jk/common-main later to maint).
+
+ * The test framework learned a new helper test_match_signal to
+   check an exit code from getting killed by an expected signal.
+
+ * General code clean-up around a helper function to write a
+   single-liner to a file.
+   (merge 7eb6e10 jk/write-file later to maint).
+
+ * One part of "git am" had an oddball helper function that called
+   stuff from outside "his" as opposed to calling what we have "ours",
+   which was not gender-neutral and also inconsistent with the rest of
+   the system where outside stuff is usuall called "theirs" in
+   contrast to "ours".
+
+ * "git blame file" allowed the lineage of lines in the uncommitted,
+   unadded contents of "file" to be inspected, but it refused when
+   "file" did not appear in the current commit.  When "file" was
+   created by renaming an existing file (but the change has not been
+   committed), this restriction was unnecessarily tight.
+
+ * "git add -N dir/file && git write-tree" produced an incorrect tree
+   when there are other paths in the same directory that sorts after
+   "file".
+
+ * "git fetch http://user:pass@host/repo..." scrubbed the userinfo
+   part, but "git push" didn't.
+
+ * "git merge" with renormalization did not work well with
+   merge-recursive, due to "safer crlf" conversion kicking in when it
+   shouldn't.
+   (merge 1335d76 jc/renormalize-merge-kill-safer-crlf later to maint).
+
+ * The use of strbuf in "git rm" to build filename to remove was a bit
+   suboptimal, which has been fixed.
+
+ * An age old bug that caused "git diff --ignore-space-at-eol"
+   misbehave has been fixed.
+
+ * "git notes merge" had a code to see if a path exists (and fails if
+   it does) and then open the path for writing (when it doesn't).
+   Replace it with open with O_EXCL.
+
+ * "git pack-objects" and "git index-pack" mostly operate with off_t
+   when talking about the offset of objects in a packfile, but there
+   were a handful of places that used "unsigned long" to hold that
+   value, leading to an unintended truncation.
+
+ * Recent update to "git daemon" tries to enable the socket-level
+   KEEPALIVE, but when it is spawned via inetd, the standard input
+   file descriptor may not necessarily be connected to a socket.
+   Suppress an ENOTSOCK error from setsockopt().
+
+ * Recent FreeBSD stopped making perl available at /usr/bin/perl;
+   switch the default the built-in path to /usr/local/bin/perl on not
+   too ancient FreeBSD releases.
+
+ * "git commit --help" said "--no-verify" is only about skipping the
+   pre-commit hook, and failed to say that it also skipped the
+   commit-msg hook.
+
+ * "git merge" in Git v2.9 was taught to forbid merging an unrelated
+   lines of history by default, but that is exactly the kind of thing
+   the "--rejoin" mode of "git subtree" (in contrib/) wants to do.
+   "git subtree" has been taught to use the "--allow-unrelated-histories"
+   option to override the default.
+
+ * The build procedure for "git persistent-https" helper (in contrib/)
+   has been updated so that it can be built with more recent versions
+   of Go.
+
+ * There is an optimization used in "git diff $treeA $treeB" to borrow
+   an already checked-out copy in the working tree when it is known to
+   be the same as the blob being compared, expecting that open/mmap of
+   such a file is faster than reading it from the object store, which
+   involves inflating and applying delta.  This however kicked in even
+   when the checked-out copy needs to go through the convert-to-git
+   conversion (including the clean filter), which defeats the whole
+   point of the optimization.  The optimization has been disabled when
+   the conversion is necessary.
+
+ * "git -c grep.patternType=extended log --basic-regexp" misbehaved
+   because the internal API to access the grep machinery was not
+   designed well.
+
+ * Windows port was failing some tests in t4130, due to the lack of
+   inum in the returned values by its lstat(2) emulation.
+
+ * The reflog output format is documented better, and a new format
+   --date=unix to report the seconds-since-epoch (without timezone)
+   has been added.
+   (merge 442f6fd jk/reflog-date later to maint).
+
+ * "git difftool <paths>..." started in a subdirectory failed to
+   interpret the paths relative to that directory, which has been
+   fixed.
+
+ * The characters in the label shown for tags/refs for commits in
+   "gitweb" output are now properly escaped for proper HTML output.
+
+ * FreeBSD can lie when asked mtime of a directory, which made the
+   untracked cache code to fall back to a slow-path, which in turn
+   caused tests in t7063 to fail because it wanted to verify the
+   behaviour of the fast-path.
+
+ * Squelch compiler warnings for nedmalloc (in compat/) library.
+
+ * A small memory leak in the command line parsing of "git blame"
+   has been plugged.
+
+ * The API documentation for hashmap was unclear if hashmap_entry
+   can be safely discarded without any other consideration.  State
+   that it is safe to do so.
+
+ * Not-so-recent rewrite of "git am" that started making internal
+   calls into the commit machinery had an unintended regression, in
+   that no matter how many seconds it took to apply many patches, the
+   resulting committer timestamp for the resulting commits were all
+   the same.
+
+ * "git push --force-with-lease" already had enough logic to allow
+   ensuring that such a push results in creation of a ref (i.e. the
+   receiving end did not have another push from sideways that would be
+   discarded by our force-pushing), but didn't expose this possibility
+   to the users.  It does so now.
+   (merge 9eed4f3 jk/push-force-with-lease-creation later to maint).
+
+ * The mechanism to limit the pack window memory size, when packing is
+   done using multiple threads (which is the default), is per-thread,
+   but this was not documented clearly.
+   (merge 954176c ms/document-pack-window-memory-is-per-thread later to maint).
+
+ * "import-tars" fast-import script (in contrib/) used to ignore a
+   hardlink target and replaced it with an empty file, which has been
+   corrected to record the same blob as the other file the hardlink is
+   shared with.
+   (merge 04e0869 js/import-tars-hardlinks later to maint).
+
+ * "git mv dir non-existing-dir/" did not work in some environments
+   the same way as existing mainstream platforms.  The code now moves
+   "dir" to "non-existing-dir", without relying on rename("A", "B/")
+   that strips the trailing slash of '/'.
+   (merge 189d035 js/mv-dir-to-new-directory later to maint).
+
+ * The "t/" hierarchy is prone to get an unusual pathname; "make test"
+   has been taught to make sure they do not contain paths that cannot
+   be checked out on Windows (and the mechanism can be reusable to
+   catch pathnames that are not portable to other platforms as need
+   arises).
+   (merge c2cafd3 js/test-lint-pathname later to maint).
+
+ * When "git merge-recursive" works on history with many criss-cross
+   merges in "verbose" mode, the names the command assigns to the
+   virtual merge bases could have overwritten each other by unintended
+   reuse of the same piece of memory.
+   (merge 5447a76 rs/pull-signed-tag later to maint).
+
+ * "git checkout --detach <branch>" used to give the same advice
+   message as that is issued when "git checkout <tag>" (or anything
+   that is not a branch name) is given, but asking with "--detach" is
+   an explicit enough sign that the user knows what is going on.  The
+   advice message has been squelched in this case.
+   (merge 779b88a sb/checkout-explit-detach-no-advice later to maint).
+
+ * "git difftool" by default ignores the error exit from the backend
+   commands it spawns, because often they signal that they found
+   differences by exiting with a non-zero status code just like "diff"
+   does; the exit status codes 126 and above however are special in
+   that they are used to signal that the command is not executable,
+   does not exist, or killed by a signal.  "git difftool" has been
+   taught to notice these exit status codes.
+   (merge 45a4f5d jk/difftool-command-not-found later to maint).
+
+ * On Windows, help.browser configuration variable used to be ignored,
+   which has been corrected.
+   (merge 6db5967 js/no-html-bypass-on-windows later to maint).
+
+ * The "git -c var[=val] cmd" facility to append a configuration
+   variable definition at the end of the search order was described in
+   git(1) manual page, but not in git-config(1), which was more likely
+   place for people to look for when they ask "can I make a one-shot
+   override, and if so how?"
+   (merge ae1f709 dg/document-git-c-in-git-config-doc later to maint).
+
+ * The tempfile (hence its user lockfile) API lets the caller to open
+   a file descriptor to a temporary file, write into it and then
+   finalize it by first closing the filehandle and then either
+   removing or renaming the temporary file.  When the process spawns a
+   subprocess after obtaining the file descriptor, and if the
+   subprocess has not exited when the attempt to remove or rename is
+   made, the last step fails on Windows, because the subprocess has
+   the file descriptor still open.  Open tempfile with O_CLOEXEC flag
+   to avoid this (on Windows, this is mapped to O_NOINHERIT).
+   (merge 05d1ed6 bw/mingw-avoid-inheriting-fd-to-lockfile later to maint).
+
+ * Correct an age-old calco (is that a typo-like word for calc)
+   in the documentation.
+   (merge 7841c48 ls/packet-line-protocol-doc-fix later to maint).
+
+ * Other minor clean-ups and documentation updates
+   (merge 02a8cfa rs/merge-add-strategies-simplification later to maint).
+   (merge af4941d rs/merge-recursive-string-list-init later to maint).
+   (merge 1eb47f1 rs/use-strbuf-add-unique-abbrev later to maint).
+   (merge ddd0bfa jk/tighten-alloc later to maint).
+   (merge ecf30b2 rs/mailinfo-lib later to maint).
+   (merge 0eb75ce sg/reflog-past-root later to maint).
+   (merge 4369523 hv/doc-commit-reference-style later to maint).
diff --git a/Documentation/RelNotes/2.10.1.txt b/Documentation/RelNotes/2.10.1.txt
new file mode 100644 (file)
index 0000000..70462f7
--- /dev/null
@@ -0,0 +1,131 @@
+Git v2.10.1 Release Notes
+=========================
+
+Fixes since v2.10
+-----------------
+
+ * 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 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.
+
+ * 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 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 to
+   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.
+
+ * "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 to adjacent
+   hunks, but the code forgot to do so in some cases.
+
+ * Performance tests done via "t/perf" did not use the same set of
+   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 "-- " e-mail signature
+   line, which turned out to be inconvenient.  The base information
+   has been moved above the signature line.
+
+ * Even when "git pull --rebase=preserve" (and the underlying "git
+   rebase --preserve") can complete without creating any new commit
+   (i.e. fast-forwards), it still insisted on having a 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.
+
+ * 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").
+
+ * "git add --chmod=+x" added recently lacked documentation, which has
+   been corrected.
+
+ * "git add --chmod=+x <pathspec>" added recently only toggled the
+   executable bit for paths that are either new or modified. This has
+   been corrected to flip the executable bit for all paths that match
+   the given pathspec.
+
+ * "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.
+
+ * Documentation around tools to import from CVS was fairly outdated.
+
+ * 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 ai_canonname
+   field in struct addrinfo without making sure it is not NULL first.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.10.2.txt b/Documentation/RelNotes/2.10.2.txt
new file mode 100644 (file)
index 0000000..c4d4397
--- /dev/null
@@ -0,0 +1,111 @@
+Git v2.10.2 Release Notes
+=========================
+
+Fixes since v2.10.1
+-------------------
+
+ * The code that parses the format parameter of for-each-ref command
+   has seen a micro-optimization.
+
+ * 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.
+
+ * 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.
+
+ * Doc update to clarify what "log -3 --reverse" does.
+
+ * An author name, that spelled 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.
+
+ * 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.
+
+ * Codepaths that read from an on-disk loose object were too loose in
+   validating what they are reading is 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.
+
+ * "git worktree", even though it used the default_abbrev setting that
+   ought to be affected by core.abbrev configuration variable, ignored
+   the variable setting.  The command has been taught to read the
+   default set of configuration variables to correct this.
+
+ * 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.
+
+ * When we started cURL to talk to imap server when a new enough
+   version of cURL library is available, 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.
+
+ * http.emptyauth configuration 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 $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 and submodule.<name>.url next to
+   each other as if both belong to .git/config.  This has been fixed.
+
+ * Recent git allows submodule.<name>.branch to use a special token
+   "." instead of the branch name; the documentation has been updated
+   to describe it.
+
+ * In a worktree connected to a repository elsewhere, 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
+   reopsitory, 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
+   when checking if the object pointed at by a tag (that we are not
+   going to fetch!) exists in our repository too carefully.
+
+ * The Travis CI configuration we ship ran the tests with --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 failure.  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 formatter mishandles a displayed illustration with
+   tabs in it.  Adjust a few of them in merge-base documentation to
+   work around them.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.10.3.txt b/Documentation/RelNotes/2.10.3.txt
new file mode 100644 (file)
index 0000000..277a2a1
--- /dev/null
@@ -0,0 +1,48 @@
+Git v2.10.3 Release Notes
+=========================
+
+Fixes since v2.10.2
+-------------------
+
+ * Extract a small helper out of the function that reads the authors
+   script file "git am" internally uses.
+   This by itself is not useful until a second caller appears in the
+   future for "rebase -i" helper.
+
+ * 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".
+
+ * "git send-email" attempts to pick up valid e-mails from the
+   trailers, but people in 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 Mail::Address perl module.
+
+ * 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.
+
+ * "git daemon" used fixed-length buffers to turn URL to the
+   repository the client asked for into the server side directory
+   path, 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 overlong path to be
+   required to serve.
+
+ * 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 $(git --exec-path) output in front.
+
+ * Fix for a racy false-positive test failure.
+
+ * Portability update and workaround for builds on recent Mac OS X.
+
+ * Update to the test framework made in 2.9 timeframe broke running
+   the tests under valgrind, which has been fixed.
+
+ * Improve the rule to convert "unsigned char [20]" into "struct
+   object_id *" in contrib/coccinelle/
+
+Also contains minor documentation updates and code clean-ups.
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).
index 9d425d814ddf360f89dc7f5c794e4d72b437ef51..20c2d2caccfb846977feb740f781bbe82543293d 100644 (file)
@@ -7,7 +7,7 @@ Fixes since v2.3.9
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
index 8621199bc671718f67d26a84cf1e92bc75715bbf..702d8d4e224ee6bfd75c75c01e5c95db8a9d63b1 100644 (file)
@@ -7,7 +7,7 @@ Fixes since v2.4.9
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
index a5e8477a4a6bee8a7da10b353ddd5e8c5458c669..b8a2f93ee707e5e25903253d7a007c8a3de8b807 100644 (file)
@@ -7,7 +7,7 @@ Fixes since v2.5.4
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
index 1e51363e3c107a0dd22fc8a436f5138915365136..f37ea89cda2f1c8576909e71ba04ec7475ea2b7c 100644 (file)
@@ -7,7 +7,7 @@ Fixes since v2.6
  * xdiff code we use to generate diffs is not prepared to handle
    extremely large files.  It uses "int" in many places, which can
    overflow if we have a very large number of lines or even bytes in
-   our input files, for example.  Cap the input size to soemwhere
+   our input files, for example.  Cap the input size to somewhere
    around 1GB for now.
 
  * Some protocols (like git-remote-ext) can execute arbitrary code
diff --git a/Documentation/RelNotes/2.8.1.txt b/Documentation/RelNotes/2.8.1.txt
new file mode 100644 (file)
index 0000000..ef6d80b
--- /dev/null
@@ -0,0 +1,9 @@
+Git v2.8.1 Release Notes
+========================
+
+Fixes since v2.8
+----------------
+
+ * "make rpmbuild" target was broken as its input, git.spec.in, was
+   not updated to match a file it describes that has been renamed
+   recently.  This has been fixed.
diff --git a/Documentation/RelNotes/2.8.2.txt b/Documentation/RelNotes/2.8.2.txt
new file mode 100644 (file)
index 0000000..447b193
--- /dev/null
@@ -0,0 +1,70 @@
+Git v2.8.2 Release Notes
+========================
+
+Fixes since v2.8.1
+------------------
+
+ * The embedded args argv-array in the child process is used to build
+   the command line to run pack-objects instead of using a separate
+   array of strings.
+
+ * Bunch of tests on "git clone" has been renumbered for better
+   organization.
+
+ * The tests that involve running httpd leaked the system-wide
+   configuration in /etc/gitconfig to the tested environment.
+
+ * "index-pack --keep=<msg>" was broken since v2.1.0 timeframe.
+
+ * "git config --get-urlmatch", unlike other variants of the "git
+   config --get" family, did not signal error with its exit status
+   when there was no matching configuration.
+
+ * The "--local-env-vars" and "--resolve-git-dir" options of "git
+   rev-parse" failed to work outside a repository when the command's
+   option parsing was rewritten in 1.8.5 era.
+
+ * Fetching of history by naming a commit object name directly didn't
+   work across remote-curl transport.
+
+ * A small memory leak in an error codepath has been plugged in xdiff
+   code.
+
+ * strbuf_getwholeline() did not NUL-terminate the buffer on certain
+   corner cases in its error codepath.
+
+ * The startup_info data, which records if we are working inside a
+   repository (among other things), are now uniformly available to Git
+   subcommand implementations, and Git avoids attempting to touch
+   references when we are not in a repository.
+
+ * "git mergetool" did not work well with conflicts that both sides
+   deleted.
+
+ * "git send-email" had trouble parsing alias file in mailrc format
+   when lines in it had trailing whitespaces on them.
+
+ * When "git merge --squash" stopped due to conflict, the concluding
+   "git commit" failed to read in the SQUASH_MSG that shows the log
+   messages from all the squashed commits.
+
+ * "git merge FETCH_HEAD" dereferenced NULL pointer when merging
+   nothing into an unborn history (which is arguably unusual usage,
+   which perhaps was the reason why nobody noticed it).
+
+ * Build updates for MSVC.
+
+ * "git diff -M" used to work better when two originally identical
+   files A and B got renamed to X/A and X/B by pairing A to X/A and B
+   to X/B, but this was broken in the 2.0 timeframe.
+
+ * "git send-pack --all <there>" was broken when its command line
+   option parsing was written in the 2.6 timeframe.
+
+ * When running "git blame $path" with unnormalized data in the index
+   for the path, the data in the working tree was blamed, even though
+   "git add" would not have changed what is already in the index, due
+   to "safe crlf" that disables the line-end conversion.  It has been
+   corrected.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.8.3.txt b/Documentation/RelNotes/2.8.3.txt
new file mode 100644 (file)
index 0000000..fedd996
--- /dev/null
@@ -0,0 +1,101 @@
+Git v2.8.3 Release Notes
+========================
+
+Fixes since v2.8.2
+------------------
+
+ * "git send-email" now uses a more readable timestamps when
+   formulating a message ID.
+
+ * The repository set-up sequence has been streamlined (the biggest
+   change is that there is no longer git_config_early()), so that we
+   do not attempt to look into refs/* when we know we do not have a
+   Git repository.
+
+ * When "git worktree" feature is in use, "git branch -d" allowed
+   deletion of a branch that is checked out in another worktree
+
+ * When "git worktree" feature is in use, "git branch -m" renamed a
+   branch that is checked out in another worktree without adjusting
+   the HEAD symbolic ref for the worktree.
+
+ * "git format-patch --help" showed `-s` and `--no-patch` as if these
+   are valid options to the command.  We already hide `--patch` option
+   from the documentation, because format-patch is about showing the
+   diff, and the documentation now hides these options as well.
+
+ * A change back in version 2.7 to "git branch" broke display of a
+   symbolic ref in a non-standard place in the refs/ hierarchy (we
+   expect symbolic refs to appear in refs/remotes/*/HEAD to point at
+   the primary branch the remote has, and as .git/HEAD to point at the
+   branch we locally checked out).
+
+ * A partial rewrite of "git submodule" in the 2.7 timeframe changed
+   the way the gitdir: pointer in the submodules point at the real
+   repository location to use absolute paths by accident.  This has
+   been corrected.
+
+ * "git commit" misbehaved in a few minor ways when an empty message
+   is given via -m '', all of which has been corrected.
+
+ * Support for CRAM-MD5 authentication method in "git imap-send" did
+   not work well.
+
+ * The socks5:// proxy support added back in 2.6.4 days was not aware
+   that socks5h:// proxies behave differently.
+
+ * "git config" had a codepath that tried to pass a NULL to
+   printf("%s"), which nobody seems to have noticed.
+
+ * On Cygwin, object creation uses the "create a temporary and then
+   rename it to the final name" pattern, not "create a temporary,
+   hardlink it to the final name and then unlink the temporary"
+   pattern.
+
+   This is necessary to use Git on Windows shared directories, and is
+   already enabled for the MinGW and plain Windows builds.  It also
+   has been used in Cygwin packaged versions of Git for quite a while.
+   See http://thread.gmane.org/gmane.comp.version-control.git/291853
+   and http://thread.gmane.org/gmane.comp.version-control.git/275680.
+
+ * "git replace -e" did not honour "core.editor" configuration.
+
+ * Upcoming OpenSSL 1.1.0 will break compilation b updating a few APIs
+   we use in imap-send, which has been adjusted for the change.
+
+ * "git submodule" reports the paths of submodules the command
+   recurses into, but this was incorrect when the command was not run
+   from the root level of the superproject.
+
+ * The test scripts for "git p4" (but not "git p4" implementation
+   itself) has been updated so that they would work even on a system
+   where the installed version of Python is python 3.
+
+ * The "user.useConfigOnly" configuration variable makes it an error
+   if users do not explicitly set user.name and user.email.  However,
+   its check was not done early enough and allowed another error to
+   trigger, reporting that the default value we guessed from the
+   system setting was unusable.  This was a suboptimal end-user
+   experience as we want the users to set user.name/user.email without
+   relying on the auto-detection at all.
+
+ * "git mv old new" did not adjust the path for a submodule that lives
+   as a subdirectory inside old/ directory correctly.
+
+ * "git push" from a corrupt repository that attempts to push a large
+   number of refs deadlocked; the thread to relay rejection notices
+   for these ref updates blocked on writing them to the main thread,
+   after the main thread at the receiving end notices that the push
+   failed and decides not to read these notices and return a failure.
+
+ * A question by "git send-email" to ask the identity of the sender
+   has been updated.
+
+ * Recent update to Git LFS broke "git p4" by changing the output from
+   its "lfs pointer" subcommand.
+
+ * Some multi-byte encoding can have a backslash byte as a later part
+   of one letter, which would confuse "highlight" filter used in
+   gitweb.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.8.4.txt b/Documentation/RelNotes/2.8.4.txt
new file mode 100644 (file)
index 0000000..f4e2552
--- /dev/null
@@ -0,0 +1,69 @@
+Git v2.8.4 Release Notes
+========================
+
+Fixes since v2.8.3
+------------------
+
+ * Documentation for "git merge --verify-signatures" has been updated
+   to clarify that the signature of only the commit at the tip is
+   verified.  Also the phrasing used for signature and key validity is
+   adjusted to align with that used by OpenPGP.
+
+ * On Windows, .git and optionally any files whose name starts with a
+   dot are now marked as hidden, with a core.hideDotFiles knob to
+   customize this behaviour.
+
+ * Portability enhancement for "rebase -i" to help platforms whose
+   shell does not like "for i in <empty>" (which is not POSIX-kosher).
+
+ * "git fsck" learned to catch NUL byte in a commit object as
+   potential error and warn.
+
+ * CI test was taught to build documentation pages.
+
+ * Many 'linkgit:<git documentation page>' references were broken,
+   which are all fixed with this.
+
+ * "git describe --contains" often made a hard-to-justify choice of
+   tag to give name to a given commit, because it tried to come up
+   with a name with smallest number of hops from a tag, causing an old
+   commit whose close descendant that is recently tagged were not
+   described with respect to an old tag but with a newer tag.  It did
+   not help that its computation of "hop" count was further tweaked to
+   penalize being on a side branch of a merge.  The logic has been
+   updated to favor using the tag with the oldest tagger date, which
+   is a lot easier to explain to the end users: "We describe a commit
+   in terms of the (chronologically) oldest tag that contains the
+   commit."
+
+ * Running tests with '-x' option to trace the individual command
+   executions is a useful way to debug test scripts, but some tests
+   that capture the standard error stream and check what the command
+   said can be broken with the trace output mixed in.  When running
+   our tests under "bash", however, we can redirect the trace output
+   to another file descriptor to keep the standard error of programs
+   being tested intact.
+
+ * "http.cookieFile" configuration variable clearly wants a pathname,
+   but we forgot to treat it as such by e.g. applying tilde expansion.
+
+ * When de-initialising all submodules, "git submodule deinit" gave a
+   faulty recommendation to use "git submodule deinit .", which would
+   result in a strange error message in a pathological corner case.
+   This has been corrected to suggest "submodule deinit --all" instead.
+
+ * Many commands normalize command line arguments from NFD to NFC
+   variant of UTF-8 on OSX, but commands in the "diff" family did
+   not, causing "git diff $path" to complain that no such path is
+   known to Git.  They have been taught to do the normalization.
+
+ * A couple of bugs around core.autocrlf have been fixed.
+
+ * "git difftool" learned to handle unmerged paths correctly in
+   dir-diff mode.
+
+ * The "are we talking with TTY, doing an interactive session?"
+   detection has been updated to work better for "Git for Windows".
+
+
+Also contains other minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.9.0.txt b/Documentation/RelNotes/2.9.0.txt
new file mode 100644 (file)
index 0000000..b61d367
--- /dev/null
@@ -0,0 +1,512 @@
+Git 2.9 Release Notes
+=====================
+
+Backward compatibility notes
+----------------------------
+
+The end-user facing Porcelain level commands in the "git diff" and
+"git log" family by default enable the rename detection; you can still
+use "diff.renames" configuration variable to disable this.
+
+Merging two branches that have no common ancestor with "git merge" is
+by default forbidden now to prevent creating such an unusual merge by
+mistake.
+
+The output formats of "git log" that indents the commit log message by
+4 spaces now expands HT in the log message by default.  You can use
+the "--no-expand-tabs" option to disable this.
+
+"git commit-tree" plumbing command required the user to always sign
+its result when the user sets the commit.gpgsign configuration
+variable, which was an ancient mistake, which this release corrects.
+A script that drives commit-tree, if it relies on this mistake, now
+needs to read commit.gpgsign and pass the -S option as necessary.
+
+
+Updates since v2.8
+------------------
+
+UI, Workflows & Features
+
+ * Comes with git-multimail 1.3.1 (in contrib/).
+
+ * The end-user facing commands like "git diff" and "git log"
+   now enable the rename detection by default.
+
+ * The credential.helper configuration variable is cumulative and
+   there is no good way to override it from the command line.  As
+   a special case, giving an empty string as its value now serves
+   as the signal to clear the values specified in various files.
+
+ * A new "interactive.diffFilter" configuration can be used to
+   customize the diff shown in "git add -i" sessions.
+
+ * "git p4" now allows P4 author names to be mapped to Git author
+   names.
+
+ * "git rebase -x" can be used without passing "-i" option.
+
+ * "git -c credential.<var>=<value> submodule" can now be used to
+   propagate configuration variables related to credential helper
+   down to the submodules.
+
+ * "git tag" can create an annotated tag without explicitly given an
+   "-a" (or "-s") option (i.e. when a tag message is given).  A new
+   configuration variable, tag.forceSignAnnotated, can be used to tell
+   the command to create signed tag in such a situation.
+
+ * "git merge" used to allow merging two branches that have no common
+   base by default, which led to a brand new history of an existing
+   project created and then get pulled by an unsuspecting maintainer,
+   which allowed an unnecessary parallel history merged into the
+   existing project.  The command has been taught not to allow this by
+   default, with an escape hatch "--allow-unrelated-histories" option
+   to be used in a rare event that merges histories of two projects
+   that started their lives independently.
+
+ * "git pull" has been taught to pass the "--allow-unrelated-histories"
+   option to underlying "git merge".
+
+ * "git apply -v" learned to report paths in the patch that were
+   skipped via --include/--exclude mechanism or being outside the
+   current working directory.
+
+ * Shell completion (in contrib/) updates.
+
+ * The commit object name reported when "rebase -i" stops has been
+   shortened.
+
+ * "git worktree add" can be given "--no-checkout" option to only
+   create an empty worktree without checking out the files.
+
+ * "git mergetools" learned to drive ExamDiff.
+
+ * "git pull --rebase" learned "--[no-]autostash" option, so that
+   the rebase.autostash configuration variable set to true can be
+   overridden from the command line.
+
+ * When "git log" shows the log message indented by 4-spaces, the
+   remainder of a line after a HT does not align in the way the author
+   originally intended.  The command now expands tabs by default to help
+   such a case, and allows the users to override it with a new option,
+   "--no-expand-tabs".
+
+ * "git send-email" now uses a more readable timestamps when
+   formulating a message ID.
+
+ * "git rerere" can encounter two or more files with the same conflict
+   signature that have to be resolved in different ways, but there was
+   no way to record these separate resolutions.
+
+ * "git p4" learned to record P4 jobs in Git commit that imports from
+   the history in Perforce.
+
+ * "git describe --contains" often made a hard-to-justify choice of
+   tag to name a given commit, because it tried to come up
+   with a name with smallest number of hops from a tag, causing an old
+   commit whose close descendant that is recently tagged were not
+   described with respect to an old tag but with a newer tag.  It did
+   not help that its computation of "hop" count was further tweaked to
+   penalize being on a side branch of a merge.  The logic has been
+   updated to favor using the tag with the oldest tagger date, which
+   is a lot easier to explain to the end users: "We describe a commit
+   in terms of the (chronologically) oldest tag that contains the
+   commit."
+
+ * "git clone" learned the "--shallow-submodules" option.
+
+ * HTTP transport clients learned to throw extra HTTP headers at the
+   server, specified via http.extraHeader configuration variable.
+
+ * The "--compaction-heuristic" option to "git diff" family of
+   commands enables a heuristic to make the patch output more readable
+   by using a blank line as a strong hint that the contents before and
+   after it belong to logically separate units.  It is still
+   experimental.
+
+ * A new configuration variable core.hooksPath allows customizing
+   where the hook directory is.
+
+ * An earlier addition of "sanitize_submodule_env" with 14111fc4 (git:
+   submodule honor -c credential.* from command line, 2016-02-29)
+   turned out to be a convoluted no-op; implement what it wanted to do
+   correctly, and stop filtering settings given via "git -c var=val".
+
+ * "git commit --dry-run" reported "No, no, you cannot commit." in one
+   case where "git commit" would have allowed you to commit, and this
+   improves it a little bit ("git commit --dry-run --short" still does
+   not give you the correct answer, for example).  This is a stop-gap
+   measure in that "commit --short --dry-run" still gives an incorrect
+   result.
+
+ * The experimental "multiple worktree" feature gains more safety to
+   forbid operations on a branch that is checked out or being actively
+   worked on elsewhere, by noticing that e.g. it is being rebased.
+
+ * "git format-patch" learned a new "--base" option to record what
+   (public, well-known) commit the original series was built on in
+   its output.
+
+ * "git commit" learned to pay attention to the "commit.verbose"
+   configuration variable and act as if the "--verbose" option
+   was given from the command line.
+
+ * Updated documentation gives hints to GMail users with two-factor
+   auth enabled that they need app-specific-password when using
+   "git send-email".
+
+ * The manpage output of our documentation did not render well in
+   terminal; typeset literals in bold by default to make them stand
+   out more.
+
+ * The mark-up in the top-level README.md file has been updated to
+   typeset CLI command names differently from the body text.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The embedded args argv-array in the child process is used to build
+   the command line to run pack-objects instead of using a separate
+   array of strings.
+
+ * A test for tags has been restructured so that more parts of it can
+   easily be run on a platform without a working GnuPG.
+
+ * The startup_info data, which records if we are working inside a
+   repository (among other things), are now uniformly available to Git
+   subcommand implementations, and Git avoids attempting to touch
+   references when we are not in a repository.
+
+ * The command line argument parser for "receive-pack" has been
+   rewritten to use parse-options.
+
+ * A major part of "git submodule update" has been ported to C to take
+   advantage of the recently added framework to run download tasks in
+   parallel.  Other updates to "git submodule" that move pieces of
+   logic to C continues.
+
+ * Rename bunch of tests on "git clone" for better organization.
+
+ * The tests that involve running httpd leaked the system-wide
+   configuration in /etc/gitconfig to the tested environment.
+
+ * Build updates for MSVC.
+
+ * The repository set-up sequence has been streamlined (the biggest
+   change is that there is no longer git_config_early()), so that we
+   do not attempt to look into refs/* when we know we do not have a
+   Git repository.
+
+ * Code restructuring around the "refs" API to prepare for pluggable
+   refs backends.
+
+ * Sources to many test helper binaries and the generated helpers
+   have been moved to t/helper/ subdirectory to reduce clutter at the
+   top level of the tree.
+
+ * Unify internal logic between "git tag -v" and "git verify-tag"
+   commands by making one directly call into the other.
+
+ * "merge-recursive" strategy incorrectly checked if a path that is
+   involved in its internal merge exists in the working tree.
+
+ * The test scripts for "git p4" (but not "git p4" implementation
+   itself) has been updated so that they would work even on a system
+   where the installed version of Python is python 3.
+
+ * As nobody maintains our in-tree git.spec.in and distros use their
+   own spec file, we stopped pretending that we support "make rpm".
+
+ * Move from "unsigned char[20]" to "struct object_id" continues.
+
+ * The code for warning_errno/die_errno has been refactored and a new
+   error_errno() reporting helper is introduced.
+   (merge 1da045f nd/error-errno later to maint).
+
+ * Running tests with '-x' option to trace the individual command
+   executions is a useful way to debug test scripts, but some tests
+   that capture the standard error stream and check what the command
+   said can be broken with the trace output mixed in.  When running
+   our tests under "bash", however, we can redirect the trace output
+   to another file descriptor to keep the standard error of programs
+   being tested intact.
+
+ * t0040 had too many unnecessary repetitions in its test data.  Teach
+   test-parse-options program so that a caller can tell what it
+   expects in its output, so that these repetitions can be cleaned up.
+
+ * Add perf test for "rebase -i".
+
+ * Common mistakes when writing gitlink: in our documentation are
+   found by "make check-docs".
+
+ * t9xxx series has been updated primarily for readability, while
+   fixing small bugs in it.  A few scripted Porcelain commands have
+   also been updated to fix possible bugs around their use of
+   "test -z" and "test -n".
+
+ * CI test was taught to run git-svn tests.
+
+ * "git cat-file --batch-all" has been sped up, by taking advantage
+   of the fact that it does not have to read a list of objects, in two
+   ways.
+
+ * test updates to make it more readable and maintainable.
+   (merge e6273f4 es/t1500-modernize later to maint).
+
+ * "make DEVELOPER=1" worked as expected; setting DEVELOPER=1 in
+   config.mak didn't.
+   (merge 51dd3e8 mm/makefile-developer-can-be-in-config-mak later to maint).
+
+ * The way how "submodule--helper list" signals unmatch error to its
+   callers has been updated.
+
+ * A bash-ism "local" has been removed from "git submodule" scripted
+   Porcelain.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.8
+----------------
+
+Unless otherwise noted, all the fixes since v2.8 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "git config --get-urlmatch", unlike other variants of the "git
+   config --get" family, did not signal error with its exit status
+   when there was no matching configuration.
+
+ * The "--local-env-vars" and "--resolve-git-dir" options of "git
+   rev-parse" failed to work outside a repository when the command's
+   option parsing was rewritten in 1.8.5 era.
+
+ * "git index-pack --keep[=<msg>] pack-$name.pack" simply did not work.
+
+ * Fetching of history by naming a commit object name directly didn't
+   work across remote-curl transport.
+
+ * A small memory leak in an error codepath has been plugged in xdiff
+   code.
+
+ * strbuf_getwholeline() did not NUL-terminate the buffer on certain
+   corner cases in its error codepath.
+
+ * "git mergetool" did not work well with conflicts that both sides
+   deleted.
+
+ * "git send-email" had trouble parsing alias file in mailrc format
+   when lines in it had trailing whitespaces on them.
+
+ * When "git merge --squash" stopped due to conflict, the concluding
+   "git commit" failed to read in the SQUASH_MSG that shows the log
+   messages from all the squashed commits.
+
+ * "git merge FETCH_HEAD" dereferenced NULL pointer when merging
+   nothing into an unborn history (which is arguably unusual usage,
+   which perhaps was the reason why nobody noticed it).
+
+ * When "git worktree" feature is in use, "git branch -d" allowed
+   deletion of a branch that is checked out in another worktree,
+   which was wrong.
+
+ * When "git worktree" feature is in use, "git branch -m" renamed a
+   branch that is checked out in another worktree without adjusting
+   the HEAD symbolic ref for the worktree.
+
+ * "git diff -M" used to work better when two originally identical
+   files A and B got renamed to X/A and X/B by pairing A to X/A and B
+   to X/B, but this was broken in the 2.0 timeframe.
+
+ * "git send-pack --all <there>" was broken when its command line
+   option parsing was written in the 2.6 timeframe.
+
+ * "git format-patch --help" showed `-s` and `--no-patch` as if these
+   are valid options to the command.  We already hide `--patch` option
+   from the documentation, because format-patch is about showing the
+   diff, and the documentation now hides these options as well.
+
+ * When running "git blame $path" with unnormalized data in the index
+   for the path, the data in the working tree was blamed, even though
+   "git add" would not have changed what is already in the index, due
+   to "safe crlf" that disables the line-end conversion.  It has been
+   corrected.
+
+ * A change back in version 2.7 to "git branch" broke display of a
+   symbolic ref in a non-standard place in the refs/ hierarchy (we
+   expect symbolic refs to appear in refs/remotes/*/HEAD to point at
+   the primary branch the remote has, and as .git/HEAD to point at the
+   branch we locally checked out).
+
+ * A partial rewrite of "git submodule" in the 2.7 timeframe changed
+   the way the gitdir: pointer in the submodules point at the real
+   repository location to use absolute paths by accident.  This has
+   been corrected.
+
+ * "git commit" misbehaved in a few minor ways when an empty message
+   is given via -m '', all of which has been corrected.
+
+ * Support for CRAM-MD5 authentication method in "git imap-send" did
+   not work well.
+
+ * Upcoming OpenSSL 1.1.0 will break compilation by updating a few API
+   elements we use in imap-send, which has been adjusted for the change.
+
+ * The socks5:// proxy support added back in 2.6.4 days was not aware
+   that socks5h:// proxies behave differently from socks5:// proxies.
+
+ * "git config" had a codepath that tried to pass a NULL to
+   printf("%s"), which nobody seems to have noticed.
+
+ * On Cygwin, object creation uses the "create a temporary and then
+   rename it to the final name" pattern, not "create a temporary,
+   hardlink it to the final name and then unlink the temporary"
+   pattern.
+
+   This is necessary to use Git on Windows shared directories, and is
+   already enabled for the MinGW and plain Windows builds.  It also
+   has been used in Cygwin packaged versions of Git for quite a while.
+   See http://thread.gmane.org/gmane.comp.version-control.git/291853
+
+ * "merge-octopus" strategy did not ensure that the index is clean
+   when merge begins.
+
+ * When "git merge" notices that the merge can be resolved purely at
+   the tree level (without having to merge blobs) and the resulting
+   tree happens to already exist in the object store, it forgot to
+   update the index, which left an inconsistent state that would
+   break later operations.
+
+ * "git submodule" reports the paths of submodules the command
+   recurses into, but these paths were incorrectly reported when
+   the command was not run from the root level of the superproject.
+
+ * The "user.useConfigOnly" configuration variable makes it an error
+   if users do not explicitly set user.name and user.email.  However,
+   its check was not done early enough and allowed another error to
+   trigger, reporting that the default value we guessed from the
+   system setting was unusable.  This was a suboptimal end-user
+   experience as we want the users to set user.name/user.email without
+   relying on the auto-detection at all.
+
+ * "git mv old new" did not adjust the path for a submodule that lives
+   as a subdirectory inside old/ directory correctly.
+
+ * "git replace -e" did not honour "core.editor" configuration.
+
+ * "git push" from a corrupt repository that attempts to push a large
+   number of refs deadlocked; the thread to relay rejection notices
+   for these ref updates blocked on writing them to the main thread,
+   after the main thread at the receiving end notices that the push
+   failed and decides not to read these notices and return a failure.
+
+ * mmap emulation on Windows has been optimized and work better without
+   consuming paging store when not needed.
+
+ * A question by "git send-email" to ask the identity of the sender
+   has been updated.
+
+ * UI consistency improvements for "git mergetool".
+
+ * "git rebase -m" could be asked to rebase an entire branch starting
+   from the root, but failed by assuming that there always is a parent
+   commit to the first commit on the branch.
+
+ * Fix a broken "p4 lfs" test.
+
+ * Recent update to Git LFS broke "git p4" by changing the output from
+   its "lfs pointer" subcommand.
+
+ * "git fetch" test t5510 was flaky while running a (forced) automagic
+   garbage collection.
+
+ * Documentation updates to help contributors setting up Travis CI
+   test for their patches.
+
+ * Some multi-byte encoding can have a backslash byte as a later part
+   of one letter, which would confuse "highlight" filter used in
+   gitweb.
+
+ * "git commit-tree" plumbing command required the user to always sign
+   its result when the user sets the commit.gpgsign configuration
+   variable, which was an ancient mistake.  Rework "git rebase" that
+   relied on this mistake so that it reads commit.gpgsign and pass (or
+   not pass) the -S option to "git commit-tree" to keep the end-user
+   expectation the same, while teaching "git commit-tree" to ignore
+   the configuration variable.  This will stop requiring the users to
+   sign commit objects used internally as an implementation detail of
+   "git stash".
+
+ * "http.cookieFile" configuration variable clearly wants a pathname,
+   but we forgot to treat it as such by e.g. applying tilde expansion.
+
+ * Consolidate description of tilde-expansion that is done to
+   configuration variables that take pathname to a single place.
+
+ * Correct faulty recommendation to use "git submodule deinit ." when
+   de-initialising all submodules, which would result in a strange
+   error message in a pathological corner case.
+
+ * Many 'linkgit:<git documentation page>' references were broken,
+   which are all fixed with this.
+
+ * "git rerere" can get confused by conflict markers deliberately left
+   by the inner merge step, because they are indistinguishable from
+   the real conflict markers left by the outermost merge which are
+   what the end user and "rerere" need to look at.  This was fixed by
+   making the conflict markers left by the inner merges a bit longer.
+   (merge 0f9fd5c jc/ll-merge-internal later to maint).
+
+ * CI test was taught to build documentation pages.
+
+ * "git fsck" learned to catch NUL byte in a commit object as
+   potential error and warn.
+
+ * Portability enhancement for "rebase -i" to help platforms whose
+   shell does not like "for i in <empty>" (which is not POSIX-kosher).
+
+ * On Windows, .git and optionally any files whose name starts with a
+   dot are now marked as hidden, with a core.hideDotFiles knob to
+   customize this behaviour.
+
+ * Documentation for "git merge --verify-signatures" has been updated
+   to clarify that the signature of only the commit at the tip is
+   verified.  Also the phrasing used for signature and key validity is
+   adjusted to align with that used by OpenPGP.
+
+ * A couple of bugs around core.autocrlf have been fixed.
+
+ * Many commands normalize command line arguments from NFD to NFC
+   variant of UTF-8 on OSX, but commands in the "diff" family did
+   not, causing "git diff $path" to complain that no such path is
+   known to Git.  They have been taught to do the normalization.
+
+ * "git difftool" learned to handle unmerged paths correctly in
+   dir-diff mode.
+
+ * The "are we talking with TTY, doing an interactive session?"
+   detection has been updated to work better for "Git for Windows".
+
+ * We forgot to add "git log --decorate=auto" to documentation when we
+   added the feature back in v2.1.0 timeframe.
+   (merge 462cbb4 rj/log-decorate-auto later to maint).
+
+ * "git fast-import --export-marks" would overwrite the existing marks
+   file even when it makes a dump from its custom die routine.
+   Prevent it from doing so when we have an import-marks file but
+   haven't finished reading it.
+   (merge f4beed6 fc/fast-import-broken-marks-file later to maint).
+
+ * "git rebase -i", after it fails to auto-resolve the conflict, had
+   an unnecessary call to "git rerere" from its very early days, which
+   was spotted recently; the call has been removed.
+   (merge 7063693 js/rebase-i-dedup-call-to-rerere later to maint).
+
+ * Other minor clean-ups and documentation updates
+   (merge cd82b7a pa/cherry-pick-doc-typo later to maint).
+   (merge 2bb73ae rs/patch-id-use-skip-prefix later to maint).
+   (merge aa20cbc rs/apply-name-terminate later to maint).
+   (merge fe17fc0 jc/t2300-setup later to maint).
+   (merge e256eec jk/shell-portability later to maint).
diff --git a/Documentation/RelNotes/2.9.1.txt b/Documentation/RelNotes/2.9.1.txt
new file mode 100644 (file)
index 0000000..3383940
--- /dev/null
@@ -0,0 +1,117 @@
+Git v2.9.1 Release Notes
+========================
+
+Fixes since v2.9
+----------------
+
+ * When "git daemon" is run without --[init-]timeout specified, a
+   connection from a client that silently goes offline can hang around
+   for a long time, wasting resources.  The socket-level KEEPALIVE has
+   been enabled to allow the OS to notice such failed connections.
+
+ * The commands in `git log` family take %C(auto) in a custom format
+   string.  This unconditionally turned the color on, ignoring
+   --no-color or with --color=auto when the output is not connected to
+   a tty; this was corrected to make the format truly behave as
+   "auto".
+
+ * "git rev-list --count" whose walk-length is limited with "-n"
+   option did not work well with the counting optimized to look at the
+   bitmap index.
+
+ * "git show -W" (extend hunks to cover the entire function, delimited
+   by lines that match the "funcname" pattern) used to show the entire
+   file when a change added an entire function at the end of the file,
+   which has been fixed.
+
+ * The documentation set has been updated so that literal commands,
+   configuration variables and environment variables are consistently
+   typeset in fixed-width font and bold in manpages.
+
+ * "git svn propset" subcommand that was added in 2.3 days is
+   documented now.
+
+ * The documentation tries to consistently spell "GPG"; when
+   referring to the specific program name, "gpg" is used.
+
+ * "git reflog" stopped upon seeing an entry that denotes a branch
+   creation event (aka "unborn"), which made it appear as if the
+   reflog was truncated.
+
+ * The git-prompt scriptlet (in contrib/) was not friendly with those
+   who uses "set -u", which has been fixed.
+
+ * A codepath that used alloca(3) to place an unbounded amount of data
+   on the stack has been updated to avoid doing so.
+
+ * "git update-index --add --chmod=+x file" may be usable as an escape
+   hatch, but not a friendly thing to force for people who do need to
+   use it regularly.  "git add --chmod=+x file" can be used instead.
+
+ * Build improvements for gnome-keyring (in contrib/)
+
+ * "git status" used to say "working directory" when it meant "working
+   tree".
+
+ * Comments about misbehaving FreeBSD shells have been clarified with
+   the version number (9.x and before are broken, newer ones are OK).
+
+ * "git cherry-pick A" worked on an unborn branch, but "git
+   cherry-pick A..B" didn't.
+
+ * "git add -i/-p" learned to honor diff.compactionHeuristic
+   experimental knob, so that the user can work on the same hunk split
+   as "git diff" output.
+
+ * "log --graph --format=" learned that "%>|(N)" specifies the width
+   relative to the terminal's left edge, not relative to the area to
+   draw text that is to the right of the ancestry-graph section.  It
+   also now accepts negative N that means the column limit is relative
+   to the right border.
+
+ * The ownership rule for the piece of memory that hold references to
+   be fetched in "git fetch" was screwy, which has been cleaned up.
+
+ * "git bisect" makes an internal call to "git diff-tree" when
+   bisection finds the culprit, but this call did not initialize the
+   data structure to pass to the diff-tree API correctly.
+
+ * Formats of the various data (and how to validate them) where we use
+   GPG signature have been documented.
+
+ * Fix an unintended regression in v2.9 that breaks "clone --depth"
+   that recurses down to submodules by forcing the submodules to also
+   be cloned shallowly, which many server instances that host upstream
+   of the submodules are not prepared for.
+
+ * Fix unnecessarily waste in the idiomatic use of ': ${VAR=default}'
+   to set the default value, without enclosing it in double quotes.
+
+ * Some platform-specific code had non-ANSI strict declarations of C
+   functions that do not take any parameters, which has been
+   corrected.
+
+ * The internal code used to show local timezone offset is not
+   prepared to handle timestamps beyond year 2100, and gave a
+   bogus offset value to the caller.  Use a more benign looking
+   +0000 instead and let "git log" going in such a case, instead
+   of aborting.
+
+ * One among four invocations of readlink(1) in our test suite has
+   been rewritten so that the test can run on systems without the
+   command (others are in valgrind test framework and t9802).
+
+ * t/perf needs /usr/bin/time with GNU extension; the invocation of it
+   is updated to "gtime" on Darwin.
+
+ * A bug, which caused "git p4" while running under verbose mode to
+   report paths that are omitted due to branch prefix incorrectly, has
+   been fixed; the command said "Ignoring file outside of prefix" for
+   paths that are _inside_.
+
+ * The top level documentation "git help git" still pointed at the
+   documentation set hosted at now-defunct google-code repository.
+   Update it to point to https://git.github.io/htmldocs/git.html
+   instead.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.9.2.txt b/Documentation/RelNotes/2.9.2.txt
new file mode 100644 (file)
index 0000000..2620003
--- /dev/null
@@ -0,0 +1,13 @@
+Git v2.9.2 Release Notes
+========================
+
+Fixes since v2.9.1
+------------------
+
+ * A fix merged to v2.9.1 had a few tests that are not meant to be
+   run on platforms without 64-bit long, which caused unnecessary
+   test failures on them because we didn't detect the platform and
+   skip them.  These tests are now skipped on platforms that they
+   are not applicable to.
+
+No other change is included in this update.
diff --git a/Documentation/RelNotes/2.9.3.txt b/Documentation/RelNotes/2.9.3.txt
new file mode 100644 (file)
index 0000000..695b86f
--- /dev/null
@@ -0,0 +1,170 @@
+Git v2.9.3 Release Notes
+========================
+
+Fixes since v2.9.2
+------------------
+
+ * A helper function that takes the contents of a commit object and
+   finds its subject line did not ignore leading blank lines, as is
+   commonly done by other codepaths.  Make it ignore leading blank
+   lines to match.
+
+ * Git does not know what the contents in the index should be for a
+   path added with "git add -N" yet, so "git grep --cached" should not
+   show hits (or show lack of hits, with -L) in such a path, but that
+   logic does not apply to "git grep", i.e. searching in the working
+   tree files.  But we did so by mistake, which has been corrected.
+
+ * "git rebase -i --autostash" did not restore the auto-stashed change
+   when the operation was aborted.
+
+ * "git commit --amend --allow-empty-message -S" for a commit without
+   any message body could have misidentified where the header of the
+   commit object ends.
+
+ * More mark-up updates to typeset strings that are expected to
+   literally typed by the end user in fixed-width font.
+
+ * For a long time, we carried an in-code comment that said our
+   colored output would work only when we use fprintf/fputs on
+   Windows, which no longer is the case for the past few years.
+
+ * "gc.autoPackLimit" when set to 1 should not trigger a repacking
+   when there is only one pack, but the code counted poorly and did
+   so.
+
+ * One part of "git am" had an oddball helper function that called
+   stuff from outside "his" as opposed to calling what we have "ours",
+   which was not gender-neutral and also inconsistent with the rest of
+   the system where outside stuff is usuall called "theirs" in
+   contrast to "ours".
+
+ * The test framework learned a new helper test_match_signal to
+   check an exit code from getting killed by an expected signal.
+
+ * "git blame -M" missed a single line that was moved within the file.
+
+ * Fix recently introduced codepaths that are involved in parallel
+   submodule operations, which gave up on reading too early, and
+   could have wasted CPU while attempting to write under a corner
+   case condition.
+
+ * "git grep -i" has been taught to fold case in non-ascii locales
+   correctly.
+
+ * A test that unconditionally used "mktemp" learned that the command
+   is not necessarily available everywhere.
+
+ * "git blame file" allowed the lineage of lines in the uncommitted,
+   unadded contents of "file" to be inspected, but it refused when
+   "file" did not appear in the current commit.  When "file" was
+   created by renaming an existing file (but the change has not been
+   committed), this restriction was unnecessarily tight.
+
+ * "git add -N dir/file && git write-tree" produced an incorrect tree
+   when there are other paths in the same directory that sorts after
+   "file".
+
+ * "git fetch http://user:pass@host/repo..." scrubbed the userinfo
+   part, but "git push" didn't.
+
+ * An age old bug that caused "git diff --ignore-space-at-eol"
+   misbehave has been fixed.
+
+ * "git notes merge" had a code to see if a path exists (and fails if
+   it does) and then open the path for writing (when it doesn't).
+   Replace it with open with O_EXCL.
+
+ * "git pack-objects" and "git index-pack" mostly operate with off_t
+   when talking about the offset of objects in a packfile, but there
+   were a handful of places that used "unsigned long" to hold that
+   value, leading to an unintended truncation.
+
+ * Recent update to "git daemon" tries to enable the socket-level
+   KEEPALIVE, but when it is spawned via inetd, the standard input
+   file descriptor may not necessarily be connected to a socket.
+   Suppress an ENOTSOCK error from setsockopt().
+
+ * Recent FreeBSD stopped making perl available at /usr/bin/perl;
+   switch the default the built-in path to /usr/local/bin/perl on not
+   too ancient FreeBSD releases.
+
+ * "git status" learned to suggest "merge --abort" during a conflicted
+   merge, just like it already suggests "rebase --abort" during a
+   conflicted rebase.
+
+ * The .c/.h sources are marked as such in our .gitattributes file so
+   that "git diff -W" and friends would work better.
+
+ * Existing autoconf generated test for the need to link with pthread
+   library did not check all the functions from pthread libraries;
+   recent FreeBSD has some functions in libc but not others, and we
+   mistakenly thought linking with libc is enough when it is not.
+
+ * Allow http daemon tests in Travis CI tests.
+
+ * Users of the parse_options_concat() API function need to allocate
+   extra slots in advance and fill them with OPT_END() when they want
+   to decide the set of supported options dynamically, which makes the
+   code error-prone and hard to read.  This has been corrected by tweaking
+   the API to allocate and return a new copy of "struct option" array.
+
+ * The use of strbuf in "git rm" to build filename to remove was a bit
+   suboptimal, which has been fixed.
+
+ * "git commit --help" said "--no-verify" is only about skipping the
+   pre-commit hook, and failed to say that it also skipped the
+   commit-msg hook.
+
+ * "git merge" in Git v2.9 was taught to forbid merging an unrelated
+   lines of history by default, but that is exactly the kind of thing
+   the "--rejoin" mode of "git subtree" (in contrib/) wants to do.
+   "git subtree" has been taught to use the "--allow-unrelated-histories"
+   option to override the default.
+
+ * The build procedure for "git persistent-https" helper (in contrib/)
+   has been updated so that it can be built with more recent versions
+   of Go.
+
+ * There is an optimization used in "git diff $treeA $treeB" to borrow
+   an already checked-out copy in the working tree when it is known to
+   be the same as the blob being compared, expecting that open/mmap of
+   such a file is faster than reading it from the object store, which
+   involves inflating and applying delta.  This however kicked in even
+   when the checked-out copy needs to go through the convert-to-git
+   conversion (including the clean filter), which defeats the whole
+   point of the optimization.  The optimization has been disabled when
+   the conversion is necessary.
+
+ * "git -c grep.patternType=extended log --basic-regexp" misbehaved
+   because the internal API to access the grep machinery was not
+   designed well.
+
+ * Windows port was failing some tests in t4130, due to the lack of
+   inum in the returned values by its lstat(2) emulation.
+
+ * The characters in the label shown for tags/refs for commits in
+   "gitweb" output are now properly escaped for proper HTML output.
+
+ * FreeBSD can lie when asked mtime of a directory, which made the
+   untracked cache code to fall back to a slow-path, which in turn
+   caused tests in t7063 to fail because it wanted to verify the
+   behaviour of the fast-path.
+
+ * Squelch compiler warnings for netmalloc (in compat/) library.
+
+ * The API documentation for hashmap was unclear if hashmap_entry
+   can be safely discarded without any other consideration.  State
+   that it is safe to do so.
+
+ * Not-so-recent rewrite of "git am" that started making internal
+   calls into the commit machinery had an unintended regression, in
+   that no matter how many seconds it took to apply many patches, the
+   resulting committer timestamp for the resulting commits were all
+   the same.
+
+ * "git difftool <paths>..." started in a subdirectory failed to
+   interpret the paths relative to that directory, which has been
+   fixed.
+
+Also contains minor documentation updates and code clean-ups.
diff --git a/Documentation/RelNotes/2.9.4.txt b/Documentation/RelNotes/2.9.4.txt
new file mode 100644 (file)
index 0000000..01e8642
--- /dev/null
@@ -0,0 +1,83 @@
+Git v2.9.4 Release Notes
+========================
+
+Fixes since v2.9.3
+------------------
+
+ * There are certain house-keeping tasks that need to be performed at
+   the very beginning of any Git program, and programs that are not
+   built-in commands had to do them exactly the same way as "git"
+   potty does.  It was easy to make mistakes in one-off standalone
+   programs (like test helpers).  A common "main()" function that
+   calls cmd_main() of individual program has been introduced to
+   make it harder to make mistakes.
+
+ * "git merge" with renormalization did not work well with
+   merge-recursive, due to "safer crlf" conversion kicking in when it
+   shouldn't.
+
+ * The reflog output format is documented better, and a new format
+   --date=unix to report the seconds-since-epoch (without timezone)
+   has been added.
+
+ * "git push --force-with-lease" already had enough logic to allow
+   ensuring that such a push results in creation of a ref (i.e. the
+   receiving end did not have another push from sideways that would be
+   discarded by our force-pushing), but didn't expose this possibility
+   to the users.  It does so now.
+
+ * "import-tars" fast-import script (in contrib/) used to ignore a
+   hardlink target and replaced it with an empty file, which has been
+   corrected to record the same blob as the other file the hardlink is
+   shared with.
+
+ * "git mv dir non-existing-dir/" did not work in some environments
+   the same way as existing mainstream platforms.  The code now moves
+   "dir" to "non-existing-dir", without relying on rename("A", "B/")
+   that strips the trailing slash of '/'.
+
+ * The "t/" hierarchy is prone to get an unusual pathname; "make test"
+   has been taught to make sure they do not contain paths that cannot
+   be checked out on Windows (and the mechanism can be reusable to
+   catch pathnames that are not portable to other platforms as need
+   arises).
+
+ * When "git merge-recursive" works on history with many criss-cross
+   merges in "verbose" mode, the names the command assigns to the
+   virtual merge bases could have overwritten each other by unintended
+   reuse of the same piece of memory.
+
+ * "git checkout --detach <branch>" used to give the same advice
+   message as that is issued when "git checkout <tag>" (or anything
+   that is not a branch name) is given, but asking with "--detach" is
+   an explicit enough sign that the user knows what is going on.  The
+   advice message has been squelched in this case.
+
+ * "git difftool" by default ignores the error exit from the backend
+   commands it spawns, because often they signal that they found
+   differences by exiting with a non-zero status code just like "diff"
+   does; the exit status codes 126 and above however are special in
+   that they are used to signal that the command is not executable,
+   does not exist, or killed by a signal.  "git difftool" has been
+   taught to notice these exit status codes.
+
+ * On Windows, help.browser configuration variable used to be ignored,
+   which has been corrected.
+
+ * The "git -c var[=val] cmd" facility to append a configuration
+   variable definition at the end of the search order was described in
+   git(1) manual page, but not in git-config(1), which was more likely
+   place for people to look for when they ask "can I make a one-shot
+   override, and if so how?"
+
+ * The tempfile (hence its user lockfile) API lets the caller to open
+   a file descriptor to a temporary file, write into it and then
+   finalize it by first closing the filehandle and then either
+   removing or renaming the temporary file.  When the process spawns a
+   subprocess after obtaining the file descriptor, and if the
+   subprocess has not exited when the attempt to remove or rename is
+   made, the last step fails on Windows, because the subprocess has
+   the file descriptor still open.  Open tempfile with O_CLOEXEC flag
+   to avoid this (on Windows, this is mapped to O_NOINHERIT).
+
+Also contains minor documentation updates and code clean-ups.
index 98fc4cc1d002f3db2fc064bbc87d567503dc2624..08352deaae4763791b70bd172682c1fe5380f7b4 100644 (file)
@@ -61,23 +61,28 @@ Make sure that you have tests for the bug you are fixing.  See
 t/README for guidance.
 
 When adding a new feature, make sure that you have new tests to show
-the feature triggers the new behaviour when it should, and to show the
-feature does not trigger when it shouldn't.  Also make sure that the
-test suite passes after your commit.  Do not forget to update the
-documentation to describe the updated behaviour.
-
-Speaking of the documentation, it is currently a liberal mixture of US
-and UK English norms for spelling and grammar, which is somewhat
-unfortunate.  A huge patch that touches the files all over the place
-only to correct the inconsistency is not welcome, though.  Potential
-clashes with other changes that can result from such a patch are not
-worth it.  We prefer to gradually reconcile the inconsistencies in
-favor of US English, with small and easily digestible patches, as a
-side effect of doing some other real work in the vicinity (e.g.
-rewriting a paragraph for clarity, while turning en_UK spelling to
-en_US).  Obvious typographical fixes are much more welcomed ("teh ->
-"the"), preferably submitted as independent patches separate from
-other documentation changes.
+the feature triggers the new behavior when it should, and to show the
+feature does not trigger when it shouldn't.  After any code change, make
+sure that the entire test suite passes.
+
+If you have an account at GitHub (and you can get one for free to work
+on open source projects), you can use their Travis CI integration to
+test your changes on Linux, Mac (and hopefully soon Windows).  See
+GitHub-Travis CI hints section for details.
+
+Do not forget to update the documentation to describe the updated
+behavior and make sure that the resulting documentation set formats
+well. It is currently a liberal mixture of US and UK English norms for
+spelling and grammar, which is somewhat unfortunate.  A huge patch that
+touches the files all over the place only to correct the inconsistency
+is not welcome, though.  Potential clashes with other changes that can
+result from such a patch are not worth it.  We prefer to gradually
+reconcile the inconsistencies in favor of US English, with small and
+easily digestible patches, as a side effect of doing some other real
+work in the vicinity (e.g. rewriting a paragraph for clarity, while
+turning en_UK spelling to en_US).  Obvious typographical fixes are much
+more welcomed ("teh -> "the"), preferably submitted as independent
+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
@@ -116,6 +121,16 @@ its behaviour.  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.
 
+If you want to reference a previous commit in the history of a stable
+branch, use the format "abbreviated sha1 (subject, date)",
+with the subject enclosed in a pair of double-quotes, like this:
+
+    Commit f86a374 ("pack-bitmap.c: fix a memleak", 2015-03-30)
+    noticed that ...
+
+The "Copy commit summary" command of gitk can be used to obtain this
+format.
+
 
 (3) Generate your patch using Git tools out of your commits.
 
@@ -370,6 +385,47 @@ Know the status of your patch after submission
   entitled "What's cooking in git.git" and "What's in git.git" giving
   the status of various proposed changes.
 
+--------------------------------------------------
+GitHub-Travis CI hints
+
+With an account at GitHub (you can get one for free to work on open
+source projects), you can use Travis CI to test your changes on Linux,
+Mac (and hopefully soon Windows).  You can find a successful example
+test build here: https://travis-ci.org/git/git/builds/120473209
+
+Follow these steps for the initial setup:
+
+ (1) Fork https://github.com/git/git to your GitHub account.
+     You can find detailed instructions how to fork here:
+     https://help.github.com/articles/fork-a-repo/
+
+ (2) Open the Travis CI website: https://travis-ci.org
+
+ (3) Press the "Sign in with GitHub" button.
+
+ (4) Grant Travis CI permissions to access your GitHub account.
+     You can find more information about the required permissions here:
+     https://docs.travis-ci.com/user/github-oauth-scopes
+
+ (5) Open your Travis CI profile page: https://travis-ci.org/profile
+
+ (6) Enable Travis CI builds for your Git fork.
+
+After the initial setup, Travis CI will run whenever you push new changes
+to your fork of Git on GitHub.  You can monitor the test state of all your
+branches here: https://travis-ci.org/<Your GitHub handle>/git/branches
+
+If a branch did not pass all test cases then it is marked with a red
+cross.  In that case you can click on the failing Travis CI job and
+scroll all the way down in the log.  Find the line "<-- Click here to see
+detailed test output!" and click on the triangle next to the log line
+number to expand the detailed test output.  Here is such a failing
+example: https://travis-ci.org/git/git/jobs/122676187
+
+Fix the problem and push your fix to your Git fork.  This will trigger
+a new Travis CI build to ensure all tests pass.
+
+
 ------------------------------------------------
 MUA specific hints
 
index 02cb6845cd96194b655c9898189c4d5f24ca6a92..2669b87c9d59a80e5e4f3d0ade1893ec8e5b3f30 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::
index 2cd6bdd7d2bc2816c1a9aed1c6a26bbd3285777c..febf95d6c663d723a66a30d936bd49b1a02b467a 100644 (file)
@@ -81,13 +81,16 @@ 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
 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. The value of `include.path` is subject to tilde expansion: `~/`
-is expanded to the value of `$HOME`, and `~user/` to the specified
-user's home directory. See below for examples.
+found.  See below for examples.
+
 
 Example
 ~~~~~~~
@@ -114,7 +117,7 @@ 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 ; expand "foo" in your `$HOME` directory
 
 
 Values
@@ -137,7 +140,7 @@ boolean::
        false;; Boolean false can be spelled as `no`, `off`,
                `false`, or `0`.
 +
-When converting value to the canonical form using '--bool' type
+When converting value to the canonical form using `--bool` type
 specifier; 'git config' will ensure that the output is "true" or
 "false" (spelled in lowercase).
 
@@ -147,27 +150,41 @@ integer::
        1024", "by 1024x1024", etc.
 
 color::
-       The value for a variables that takes a color is a list of
-       colors (at most two) and attributes (at most one), separated
-       by spaces.  The colors accepted are `normal`, `black`,
-       `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and
-       `white`; the attributes are `bold`, `dim`, `ul`, `blink` and
-       `reverse`.  The first color given is the foreground; the
-       second is the background.  The position of the attribute, if
-       any, doesn't matter. Attributes may be turned off specifically
-       by prefixing them with `no` (e.g., `noreverse`, `noul`, etc).
-+
-Colors (foreground and background) may also be given as numbers between
-0 and 255; these use ANSI 256-color mode (but note that not all
-terminals may support this).  If your terminal supports it, you may also
-specify 24-bit RGB values as hex, like `#ff0ab3`.
-+
-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 plain `black`, even if the previous
-thing on the same output line (e.g. opening parenthesis before the
-list of branch names in `log --decorate` output) is set to be
-painted with `bold` or some other attribute.
+       The value for a variable that takes a color is a list of
+       colors (at most two, one for foreground and one for background)
+       and attributes (as many as you want), separated by spaces.
++
+The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
+`blue`, `magenta`, `cyan` and `white`.  The first color given is the
+foreground; the second is the background.
++
+Colors may also be given as numbers between 0 and 255; these use ANSI
+256-color mode (but note that not all terminals may support this).  If
+your terminal supports it, you may also specify 24-bit RGB values as
+hex, like `#ff0ab3`.
++
+The accepted attributes are `bold`, `dim`, `ul`, `blink`, `reverse`,
+`italic`, and `strike` (for crossed-out or "strikethrough" letters).
+The position of any attributes with respect to the colors
+(before, after, or in between), doesn't matter. Specific attributes may
+be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
+`no-ul`, etc).
++
+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
+plain `black`, even if the previous thing on the same output line (e.g.
+opening parenthesis before the list of branch names in `log --decorate`
+output) is set to be painted with `bold` or some other attribute.
+However, custom log formats may do more complicated and layered
+coloring, and the negated forms may be useful there.
+
+pathname::
+       A variable that takes a pathname value can be given a
+       string that begins with "`~/`" or "`~user/`", and the usual
+       tilde expansion happens to such a string: `~/`
+       is expanded to the value of `$HOME`, and `~user/` to the
+       specified user's home directory.
 
 
 Variables
@@ -269,6 +286,12 @@ See linkgit:git-update-index[1].
 +
 The default is true (when core.filemode is not specified in the config file).
 
+core.hideDotFiles::
+       (Windows-only) If true, mark newly-created directories and files whose
+       name starts with a dot as hidden.  If 'dotGitOnly', only the `.git/`
+       directory is hidden, but no other files starting with a dot.  The
+       default mode is 'dotGitOnly'.
+
 core.ignoreCase::
        If true, this option enables various workarounds to enable
        Git to work better on filesystems that are not case sensitive,
@@ -337,9 +360,9 @@ core.quotePath::
 
 core.eol::
        Sets the line ending type to use in the working directory for
-       files that have the `text` property set.  Alternatives are
-       'lf', 'crlf' and 'native', which uses the platform's native
-       line ending.  The default value is `native`.  See
+       files that have the `text` property set when core.autocrlf is false.
+       Alternatives are 'lf', 'crlf' and 'native', which uses the platform's
+       native line ending.  The default value is `native`.  See
        linkgit:gitattributes[5] for more information on end-of-line
        conversion.
 
@@ -389,13 +412,11 @@ file with mixed line endings would be reported by the `core.safecrlf`
 mechanism.
 
 core.autocrlf::
-       Setting this variable to "true" is almost the same as setting
-       the `text` attribute to "auto" on all files except that text
-       files are not guaranteed to be normalized: files that contain
-       `CRLF` in the repository will not be touched.  Use this
-       setting if you want to have `CRLF` line endings in your
-       working directory even though the repository does not have
-       normalized line endings.  This variable can be set to 'input',
+       Setting this variable to "true" is the same as setting
+       the `text` attribute to "auto" on all files and core.eol to "crlf".
+       Set to true if you want to have `CRLF` line endings in your
+       working directory and the repository has LF line endings.
+       This variable can be set to 'input',
        in which case no output conversion is performed.
 
 core.symlinks::
@@ -418,7 +439,7 @@ core.gitProxy::
        may be set multiple times and is matched in the given order;
        the first match wins.
 +
-Can be overridden by the 'GIT_PROXY_COMMAND' environment variable
+Can be overridden by the `GIT_PROXY_COMMAND` environment variable
 (which always applies universally, without the special "for"
 handling).
 +
@@ -427,6 +448,13 @@ specify that no proxy be used for a given domain pattern.
 This is useful for excluding servers inside a firewall from
 proxy use, while defaulting to a common proxy for external domains.
 
+core.sshCommand::
+       If this variable is set, `git fetch` and `git push` will
+       use the specified command instead of `ssh` when they need to
+       connect to a remote system. The command is in the same form as
+       the `GIT_SSH_COMMAND` environment variable and is overridden
+       when the environment variable is set.
+
 core.ignoreStat::
        If true, Git will avoid using lstat() calls to detect if files have
        changed by setting the "assume-unchanged" bit for those tracked files
@@ -462,10 +490,10 @@ false), while all other repositories are assumed to be bare (bare
 
 core.worktree::
        Set the path to the root of the working tree.
-       If GIT_COMMON_DIR environment variable is set, core.worktree
+       If `GIT_COMMON_DIR` environment variable is set, core.worktree
        is ignored and not used for determining the root of working tree.
-       This can be overridden by the GIT_WORK_TREE environment
-       variable and the '--work-tree' command-line option.
+       This can be overridden by the `GIT_WORK_TREE` environment
+       variable and the `--work-tree` command-line option.
        The value can be an absolute path or relative to the path to
        the .git directory, which is either specified by --git-dir
        or GIT_DIR, or automatically discovered.
@@ -486,10 +514,10 @@ repository's usual working tree).
 
 core.logAllRefUpdates::
        Enable the reflog. Updates to a ref <ref> is logged to the file
-       "$GIT_DIR/logs/<ref>", by appending the new and old
+       "`$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.
@@ -529,7 +557,7 @@ core.compression::
        -1 is the zlib default. 0 means no compression,
        and 1..9 are various speed/size tradeoffs, 9 being slowest.
        If set, this provides a default to other compression variables,
-       such as 'core.looseCompression' and 'pack.compression'.
+       such as `core.looseCompression` and `pack.compression`.
 
 core.looseCompression::
        An integer -1..9, indicating the compression level for objects that
@@ -593,20 +621,19 @@ be delta compressed, but larger binary media files won't be.
 Common unit suffixes of 'k', 'm', or 'g' are supported.
 
 core.excludesFile::
-       In addition to '.gitignore' (per-directory) and
-       '.git/info/exclude', Git looks into this file for patterns
-       of files which are not meant to be tracked.  "`~/`" is expanded
-       to the value of `$HOME` and "`~user/`" to the specified user's
-       home directory. Its default value is $XDG_CONFIG_HOME/git/ignore.
-       If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore
+       Specifies the pathname to the file that contains patterns to
+       describe paths that are not meant to be tracked, in addition
+       to '.gitignore' (per-directory) and '.git/info/exclude'.
+       Defaults to `$XDG_CONFIG_HOME/git/ignore`.
+       If `$XDG_CONFIG_HOME` is either not set or empty, `$HOME/.config/git/ignore`
        is used instead. See linkgit:gitignore[5].
 
 core.askPass::
        Some commands (e.g. svn and http interfaces) that interactively
        ask for a password can be told to use an external program given
-       via the value of this variable. Can be overridden by the 'GIT_ASKPASS'
+       via the value of this variable. Can be overridden by the `GIT_ASKPASS`
        environment variable. If not set, fall back to the value of the
-       'SSH_ASKPASS' environment variable or, failing that, a simple password
+       `SSH_ASKPASS` environment variable or, failing that, a simple password
        prompt. The external program shall be given a suitable prompt as
        command-line argument and write the password on its STDOUT.
 
@@ -615,8 +642,25 @@ core.attributesFile::
        '.git/info/attributes', Git looks into this file for attributes
        (see linkgit:gitattributes[5]). Path expansions are made the same
        way as for `core.excludesFile`. Its default value is
-       $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not
-       set or empty, $HOME/.config/git/attributes is used instead.
+       `$XDG_CONFIG_HOME/git/attributes`. If `$XDG_CONFIG_HOME` is either not
+       set or empty, `$HOME/.config/git/attributes` is used instead.
+
+core.hooksPath::
+       By default Git will look for your hooks in the
+       '$GIT_DIR/hooks' directory. Set this to different path,
+       e.g. '/etc/git/hooks', and Git will try to find your hooks in
+       that directory, e.g. '/etc/git/hooks/pre-receive' instead of
+       in '$GIT_DIR/hooks/pre-receive'.
++
+The path can be either absolute or relative. A relative path is
+taken as relative to the directory where the hooks are run (see
+the "DESCRIPTION" section of linkgit:githooks[5]).
++
+This configuration variable is useful in cases where you'd like to
+centrally configure your Git hooks instead of configuring them on a
+per-repository basis, or as a more flexible and centralized
+alternative to having an `init.templateDir` where you've changed
+default hooks.
 
 core.editor::
        Commands such as `commit` and `tag` that lets you edit
@@ -732,7 +776,7 @@ core.notesRef::
        notes should be printed.
 +
 This setting defaults to "refs/notes/commits", and it can be overridden by
-the 'GIT_NOTES_REF' environment variable.  See linkgit:git-notes[1].
+the `GIT_NOTES_REF` environment variable.  See linkgit:git-notes[1].
 
 core.sparseCheckout::
        Enable "sparse checkout" feature. See section "Sparse checkout" in
@@ -747,7 +791,7 @@ core.abbrev::
 add.ignoreErrors::
 add.ignore-errors (deprecated)::
        Tells 'git add' to continue adding files when some files cannot be
-       added due to indexing errors. Equivalent to the '--ignore-errors'
+       added due to indexing errors. Equivalent to the `--ignore-errors`
        option of linkgit:git-add[1].  `add.ignore-errors` is deprecated,
        as it does not follow the usual naming convention for configuration
        variables.
@@ -768,14 +812,14 @@ it will be treated as a shell command.  For example, defining
 "gitk --all --not ORIG_HEAD".  Note that shell commands will be
 executed from the top-level directory of a repository, which may
 not necessarily be the current directory.
-'GIT_PREFIX' is set as returned by running 'git rev-parse --show-prefix'
+`GIT_PREFIX` is set as returned by running 'git rev-parse --show-prefix'
 from the original current directory. See linkgit:git-rev-parse[1].
 
 am.keepcr::
        If true, git-am will call git-mailsplit for patches in mbox format
-       with parameter '--keep-cr'. In this case git-mailsplit will
+       with parameter `--keep-cr`. In this case git-mailsplit will
        not remove `\r` from lines ending with `\r\n`. Can be overridden
-       by giving '--no-keep-cr' from the command line.
+       by giving `--no-keep-cr` from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
 
 am.threeWay::
@@ -788,7 +832,7 @@ am.threeWay::
 
 apply.ignoreWhitespace::
        When set to 'change', tells 'git apply' to ignore changes in
-       whitespace, in the same way as the '--ignore-space-change'
+       whitespace, in the same way as the `--ignore-space-change`
        option.
        When set to one of: no, none, never, false tells 'git apply' to
        respect all whitespace differences.
@@ -796,7 +840,7 @@ apply.ignoreWhitespace::
 
 apply.whitespace::
        Tells 'git apply' how to handle whitespaces, in the same way
-       as the '--whitespace' option. See linkgit:git-apply[1].
+       as the `--whitespace` option. See linkgit:git-apply[1].
 
 branch.autoSetupMerge::
        Tells 'git branch' and 'git checkout' to set up new branches
@@ -898,7 +942,7 @@ browser.<tool>.cmd::
 
 browser.<tool>.path::
        Override the path for the given tool that may be used to
-       browse HTML help (see '-w' option in linkgit:git-help[1]) or a
+       browse HTML help (see `-w` option in linkgit:git-help[1]) or a
        working repository in gitweb (see linkgit:git-instaweb[1]).
 
 clean.requireForce::
@@ -909,7 +953,8 @@ color.branch::
        A boolean to enable/disable color in the output of
        linkgit:git-branch[1]. May be set to `always`,
        `false` (or `never`) or `auto` (or `true`), in which case colors are used
-       only when the output is to a terminal. Defaults to false.
+       only when the output is to a terminal. If unset, then the
+       value of `color.ui` is used (`auto` by default).
 
 color.branch.<slot>::
        Use customized color for branch coloration. `<slot>` is one of
@@ -924,7 +969,8 @@ color.diff::
        linkgit:git-log[1], and linkgit:git-show[1] will use color
        for all patches.  If it is set to `true` or `auto`, those
        commands will only use color when output is to the terminal.
-       Defaults to false.
+       If unset, then the value of `color.ui` is used (`auto` by
+       default).
 +
 This does not affect linkgit:git-format-patch[1] or the
 'git-diff-{asterisk}' plumbing commands.  Can be overridden on the
@@ -947,7 +993,8 @@ color.decorate.<slot>::
 color.grep::
        When set to `always`, always highlight matches.  When `false` (or
        `never`), never.  When set to `true` or `auto`, use color only
-       when the output is written to the terminal.  Defaults to `false`.
+       when the output is written to the terminal.  If unset, then the
+       value of `color.ui` is used (`auto` by default).
 
 color.grep.<slot>::
        Use customized color for grep colorization.  `<slot>` specifies which
@@ -980,7 +1027,8 @@ color.interactive::
        and displays (such as those used by "git-add --interactive" and
        "git-clean --interactive"). When false (or `never`), never.
        When set to `true` or `auto`, use colors only when the output is
-       to the terminal. Defaults to false.
+       to the terminal. If unset, then the value of `color.ui` is
+       used (`auto` by default).
 
 color.interactive.<slot>::
        Use customized color for 'git add --interactive' and 'git clean
@@ -996,13 +1044,15 @@ color.showBranch::
        A boolean to enable/disable color in the output of
        linkgit:git-show-branch[1]. May be set to `always`,
        `false` (or `never`) or `auto` (or `true`), in which case colors are used
-       only when the output is to a terminal. Defaults to false.
+       only when the output is to a terminal. If unset, then the
+       value of `color.ui` is used (`auto` by default).
 
 color.status::
        A boolean to enable/disable color in the output of
        linkgit:git-status[1]. May be set to `always`,
        `false` (or `never`) or `auto` (or `true`), in which case colors are used
-       only when the output is to a terminal. Defaults to false.
+       only when the output is to a terminal. If unset, then the
+       value of `color.ui` is used (`auto` by default).
 
 color.status.<slot>::
        Use customized color for status colorization. `<slot>` is
@@ -1106,15 +1156,19 @@ commit.status::
        message.  Defaults to true.
 
 commit.template::
-       Specify a file to use as the template for new commit messages.
-       "`~/`" is expanded to the value of `$HOME` and "`~user/`" to the
-       specified user's home directory.
+       Specify the pathname of a file to use as the template for
+       new commit messages.
+
+commit.verbose::
+       A boolean or int to specify the level of verbose with `git commit`.
+       See linkgit:git-commit[1].
 
 credential.helper::
        Specify an external helper to be called when a username or
        password credential is needed; the helper may consult external
-       storage to avoid prompting the user for the credentials. See
-       linkgit:gitcredentials[7] for details.
+       storage to avoid prompting the user for the credentials. Note
+       that multiple helpers may be defined. See linkgit:gitcredentials[7]
+       for details.
 
 credential.useHttpPath::
        When acquiring credentials, consider the "path" component of an http
@@ -1153,6 +1207,15 @@ difftool.<tool>.cmd::
 difftool.prompt::
        Prompt before each invocation of the diff tool.
 
+fastimport.unpackLimit::
+       If the number of objects imported by linkgit:git-fast-import[1]
+       is below this limit, then the objects will be unpacked into
+       loose object files.  However if the number of imported objects
+       equals or exceeds this limit then the pack will be stored as a
+       pack.  Storing the pack from a fast-import can make the import
+       operation complete faster, especially on slow filesystems.  If
+       not set, the value of `transfer.unpackLimit` is used instead.
+
 fetch.recurseSubmodules::
        This option can be either set to a boolean value or to 'on-demand'.
        Setting it to a boolean changes the behavior of fetch and pull to
@@ -1184,6 +1247,11 @@ fetch.prune::
        If true, fetch will automatically behave as if the `--prune`
        option was given on the command line.  See also `remote.<name>.prune`.
 
+fetch.output::
+       Control how ref update status is printed. Valid values are
+       `full` and `compact`. Default value is `full`. See section
+       OUTPUT in linkgit:git-fetch[1] for detail.
+
 format.attach::
        Enable multipart/mixed attachments as the default for
        'format-patch'.  The value can also be a double quoted string
@@ -1191,6 +1259,16 @@ format.attach::
        value as the boundary.  See the --attach option in
        linkgit:git-format-patch[1].
 
+format.from::
+       Provides the default value for the `--from` option to format-patch.
+       Accepts a boolean value, or a name and email address.  If false,
+       format-patch defaults to `--no-from`, using commit authors directly in
+       the "From:" field of patch mails.  If true, format-patch defaults to
+       `--from`, using your committer identity in the "From:" field of patch
+       mails and including a "From:" field in the body of the patch mail if
+       different.  If set to a non-boolean value, format-patch uses that
+       value instead of your committer identity.  Defaults to false.
+
 format.numbered::
        A boolean which can enable or disable sequence numbers in patch
        subjects.  It defaults to "auto" which enables it only if there
@@ -1258,6 +1336,10 @@ format.outputDirectory::
        Set a custom directory to store the resulting files instead of the
        current working directory.
 
+format.useAutoBase::
+       A boolean value which lets you enable the `--base=auto` option of
+       format-patch by default.
+
 filter.<driver>.clean::
        The command which is used to convert the content of a worktree
        file to a blob upon checkin.  See linkgit:gitattributes[5] for
@@ -1290,7 +1372,7 @@ fsck.skipList::
 gc.aggressiveDepth::
        The depth parameter used in the delta compression
        algorithm used by 'git gc --aggressive'.  This defaults
-       to 250.
+       to 50.
 
 gc.aggressiveWindow::
        The window size parameter used in the delta compression
@@ -1334,7 +1416,7 @@ gc.worktreePruneExpire::
        'git worktree prune --expire 3.months.ago'.
        This config variable can be used to set a different grace
        period. The value "now" may be used to disable the grace
-       period and prune $GIT_DIR/worktrees immediately, or "never"
+       period and prune `$GIT_DIR/worktrees` immediately, or "never"
        may be used to suppress pruning.
 
 gc.reflogExpire::
@@ -1380,24 +1462,24 @@ gitcvs.logFile::
 
 gitcvs.usecrlfattr::
        If true, the server will look up the end-of-line conversion
-       attributes for files to determine the '-k' modes to use. If
+       attributes for files to determine the `-k` modes to use. If
        the attributes force Git to treat a file as text,
-       the '-k' mode will be left blank so CVS clients will
+       the `-k` mode will be left blank so CVS clients will
        treat it as text. If they suppress text conversion, the file
        will be set with '-kb' mode, which suppresses any newline munging
        the client might otherwise do. If the attributes do not allow
-       the file type to be determined, then 'gitcvs.allBinary' is
+       the file type to be determined, then `gitcvs.allBinary` is
        used. See linkgit:gitattributes[5].
 
 gitcvs.allBinary::
-       This is used if 'gitcvs.usecrlfattr' does not resolve
+       This is used if `gitcvs.usecrlfattr` does not resolve
        the correct '-kb' mode to use. If true, all
        unresolved files are sent to the client in
        mode '-kb'. This causes the client to treat them
        as binary files, which suppresses any newline munging it
        otherwise might do. Alternatively, if it is set to "guess",
        then the contents of the file are examined to decide if
-       it is binary, similar to 'core.autocrlf'.
+       it is binary, similar to `core.autocrlf`.
 
 gitcvs.dbName::
        Database used by git-cvsserver to cache revision information
@@ -1416,7 +1498,7 @@ gitcvs.dbDriver::
        See linkgit:git-cvsserver[1].
 
 gitcvs.dbUser, gitcvs.dbPass::
-       Database user and password. Only useful if setting 'gitcvs.dbDriver',
+       Database user and password. Only useful if setting `gitcvs.dbDriver`,
        since SQLite has no concept of database users and/or passwords.
        'gitcvs.dbUser' supports variable substitution (see
        linkgit:git-cvsserver[1] for details).
@@ -1428,8 +1510,8 @@ gitcvs.dbTableNamePrefix::
        linkgit:git-cvsserver[1] for details).  Any non-alphabetic
        characters will be replaced with underscores.
 
-All gitcvs variables except for 'gitcvs.usecrlfattr' and
-'gitcvs.allBinary' can also be specified as
+All gitcvs variables except for `gitcvs.usecrlfattr` and
+`gitcvs.allBinary` can also be specified as
 'gitcvs.<access_method>.<varname>' (where 'access_method'
 is one of "ext" and "pserver") to make them apply only for the given
 access method.
@@ -1452,17 +1534,17 @@ gitweb.snapshot::
        See linkgit:gitweb.conf[5] for description.
 
 grep.lineNumber::
-       If set to true, enable '-n' option by default.
+       If set to true, enable `-n` option by default.
 
 grep.patternType::
        Set the default matching behavior. Using a value of 'basic', 'extended',
-       'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
-       '--fixed-strings', or '--perl-regexp' option accordingly, while the
+       'fixed', or 'perl' will enable the `--basic-regexp`, `--extended-regexp`,
+       `--fixed-strings`, or `--perl-regexp` option accordingly, while the
        value 'default' will return to the default matching behavior.
 
 grep.extendedRegexp::
-       If set to true, enable '--extended-regexp' option by default. This
-       option is ignored when the 'grep.patternType' option is set to a value
+       If set to true, enable `--extended-regexp` option by default. This
+       option is ignored when the `grep.patternType` option is set to a value
        other than 'default'.
 
 grep.threads::
@@ -1474,13 +1556,13 @@ grep.fallbackToNoIndex::
        is executed outside of a git repository.  Defaults to false.
 
 gpg.program::
-       Use this custom program instead of "gpg" found on $PATH when
+       Use this custom program instead of "`gpg`" found on `$PATH` when
        making or verifying a PGP signature. The program must support the
        same command-line interface as GPG, namely, to verify a detached
-       signature, "gpg --verify $file - <$signature" is run, and the
+       signature, "`gpg --verify $file - <$signature`" is run, and the
        program is expected to signal a good signature by exiting with
        code 0, and to generate an ASCII-armored detached signature, the
-       standard input of "gpg -bsau $key" is fed with the contents to be
+       standard input of "`gpg -bsau $key`" is fed with the contents to be
        signed, and the program is expected to send the result to its
        standard output.
 
@@ -1493,7 +1575,7 @@ gui.diffContext::
        made by the linkgit:git-gui[1]. The default is "5".
 
 gui.displayUntracked::
-       Determines if linkgit::git-gui[1] shows untracked files
+       Determines if linkgit:git-gui[1] shows untracked files
        in the file list. The default is "true".
 
 gui.encoding::
@@ -1547,7 +1629,7 @@ guitool.<name>.cmd::
        of the linkgit:git-gui[1] `Tools` menu is invoked. This option is
        mandatory for every tool. The command is executed from the root of
        the working directory, and in the environment it receives the name of
-       the tool as 'GIT_GUITOOL', the name of the currently selected file as
+       the tool as `GIT_GUITOOL`, the name of the currently selected file as
        'FILENAME', and the name of the current branch as 'CUR_BRANCH' (if
        the head is detached, 'CUR_BRANCH' is empty).
 
@@ -1568,7 +1650,7 @@ guitool.<name>.confirm::
 
 guitool.<name>.argPrompt::
        Request a string argument from the user, and pass it to the tool
-       through the 'ARGS' environment variable. Since requesting an
+       through the `ARGS` environment variable. Since requesting an
        argument implies confirmation, the 'confirm' option has no effect
        if this is enabled. If the option is set to 'true', 'yes', or '1',
        the dialog uses a built-in generic prompt; otherwise the exact
@@ -1576,7 +1658,7 @@ guitool.<name>.argPrompt::
 
 guitool.<name>.revPrompt::
        Request a single valid revision from the user, and set the
-       'REVISION' environment variable. In other aspects this option
+       `REVISION` environment variable. In other aspects this option
        is similar to 'argPrompt', and can be used together with it.
 
 guitool.<name>.revUnmerged::
@@ -1632,7 +1714,7 @@ http.proxyAuthMethod::
        only takes effect if the configured proxy string contains a user name part
        (i.e. is of the form 'user@host' or 'user@host:port'). This can be
        overridden on a per-remote basis; see `remote.<name>.proxyAuthMethod`.
-       Both can be overridden by the 'GIT_HTTP_PROXY_AUTHMETHOD' environment
+       Both can be overridden by the `GIT_HTTP_PROXY_AUTHMETHOD` environment
        variable.  Possible values are:
 +
 --
@@ -1654,12 +1736,33 @@ 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
+       headers.  To allow overriding the settings inherited from the system
+       config, an empty value will reset the extra headers to the empty list.
+
 http.cookieFile::
-       File containing previously stored cookie lines which should be used
+       The pathname of a file containing previously stored cookie lines,
+       which should be used
        in the Git http session, if they match the server. The file format
        of the file to read cookies from should be plain HTTP headers or
-       the Netscape/Mozilla cookie file format (see linkgit:curl[1]).
-       NOTE that the file specified with http.cookieFile is only used as
+       the Netscape/Mozilla cookie file format (see `curl(1)`).
+       NOTE that the file specified with http.cookieFile is used only as
        input unless http.saveCookies is set.
 
 http.saveCookies::
@@ -1684,9 +1787,9 @@ http.sslVersion::
        - tlsv1.2
 
 +
-Can be overridden by the 'GIT_SSL_VERSION' environment variable.
+Can be overridden by the `GIT_SSL_VERSION` environment variable.
 To force git to use libcurl's default ssl version and ignore any
-explicit http.sslversion option, set 'GIT_SSL_VERSION' to the
+explicit http.sslversion option, set `GIT_SSL_VERSION` to the
 empty string.
 
 http.sslCipherList::
@@ -1697,41 +1800,41 @@ http.sslCipherList::
   option; see the libcurl documentation for more details on the format
   of this list.
 +
-Can be overridden by the 'GIT_SSL_CIPHER_LIST' environment variable.
+Can be overridden by the `GIT_SSL_CIPHER_LIST` environment variable.
 To force git to use libcurl's default cipher list and ignore any
-explicit http.sslCipherList option, set 'GIT_SSL_CIPHER_LIST' to the
+explicit http.sslCipherList option, set `GIT_SSL_CIPHER_LIST` to the
 empty string.
 
 http.sslVerify::
        Whether to verify the SSL certificate when fetching or pushing
-       over HTTPS. Can be overridden by the 'GIT_SSL_NO_VERIFY' environment
+       over HTTPS. Can be overridden by the `GIT_SSL_NO_VERIFY` environment
        variable.
 
 http.sslCert::
        File containing the SSL certificate when fetching or pushing
-       over HTTPS. Can be overridden by the 'GIT_SSL_CERT' environment
+       over HTTPS. Can be overridden by the `GIT_SSL_CERT` environment
        variable.
 
 http.sslKey::
        File containing the SSL private key when fetching or pushing
-       over HTTPS. Can be overridden by the 'GIT_SSL_KEY' environment
+       over HTTPS. Can be overridden by the `GIT_SSL_KEY` environment
        variable.
 
 http.sslCertPasswordProtected::
        Enable Git's password prompt for the SSL certificate.  Otherwise
        OpenSSL will prompt the user, possibly many times, if the
        certificate or private key is encrypted.  Can be overridden by the
-       'GIT_SSL_CERT_PASSWORD_PROTECTED' environment variable.
+       `GIT_SSL_CERT_PASSWORD_PROTECTED` environment variable.
 
 http.sslCAInfo::
        File containing the certificates to verify the peer with when
        fetching or pushing over HTTPS. Can be overridden by the
-       'GIT_SSL_CAINFO' environment variable.
+       `GIT_SSL_CAINFO` environment variable.
 
 http.sslCAPath::
        Path containing files with the CA certificates to verify the peer
        with when fetching or pushing over HTTPS. Can be overridden
-       by the 'GIT_SSL_CAPATH' environment variable.
+       by the `GIT_SSL_CAPATH` environment variable.
 
 http.pinnedpubkey::
        Public key of the https service. It may either be the filename of
@@ -1751,7 +1854,7 @@ http.sslTry::
 
 http.maxRequests::
        How many HTTP requests to launch in parallel. Can be overridden
-       by the 'GIT_HTTP_MAX_REQUESTS' environment variable. Default is 5.
+       by the `GIT_HTTP_MAX_REQUESTS` environment variable. Default is 5.
 
 http.minSessions::
        The number of curl sessions (counted across slots) to be kept across
@@ -1770,13 +1873,13 @@ http.postBuffer::
 http.lowSpeedLimit, http.lowSpeedTime::
        If the HTTP transfer speed is less than 'http.lowSpeedLimit'
        for longer than 'http.lowSpeedTime' seconds, the transfer is aborted.
-       Can be overridden by the 'GIT_HTTP_LOW_SPEED_LIMIT' and
-       'GIT_HTTP_LOW_SPEED_TIME' environment variables.
+       Can be overridden by the `GIT_HTTP_LOW_SPEED_LIMIT` and
+       `GIT_HTTP_LOW_SPEED_TIME` environment variables.
 
 http.noEPSV::
        A boolean which disables using of EPSV ftp command by curl.
        This can helpful with some "poor" ftp servers which don't
-       support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV'
+       support EPSV mode. Can be overridden by the `GIT_CURL_FTP_NO_EPSV`
        environment variable. Default is false (curl will use EPSV).
 
 http.userAgent::
@@ -1786,7 +1889,17 @@ http.userAgent::
        such as Mozilla/4.0.  This may be necessary, for instance, if
        connecting through a firewall that restricts HTTP connections to a set
        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.
+       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.
@@ -1886,6 +1999,14 @@ interactive.singleKey::
        setting is silently ignored if portable keystroke input
        is not available; requires the Perl module Term::ReadKey.
 
+interactive.diffFilter::
+       When an interactive command (such as `git add --patch`) shows
+       a colorized diff, git will pipe the diff through the shell
+       command defined by this configuration variable. The command may
+       mark up the diff further for human consumption, provided that it
+       retains a one-to-one correspondence with the lines in the
+       original diff. Defaults to disabled (no filtering).
+
 log.abbrevCommit::
        If true, makes linkgit:git-log[1], linkgit:git-show[1], and
        linkgit:git-whatchanged[1] assume `--abbrev-commit`. You may
@@ -1901,7 +2022,10 @@ log.decorate::
        command. If 'short' is specified, the ref name prefixes 'refs/heads/',
        'refs/tags/' and 'refs/remotes/' will not be printed. If 'full' is
        specified, the full ref name (including prefix) will be printed.
-       This is the same as the log commands '--decorate' option.
+       If 'auto' is specified, then if the output is going to a terminal,
+       the ref names are shown as if 'short' were given, otherwise no ref
+       names are shown. This is the same as the `--decorate` option
+       of the `git log`.
 
 log.follow::
        If `true`, `git log` will act as if the `--follow` option was used when
@@ -2147,8 +2271,11 @@ pack.packSizeLimit::
        The maximum size of a pack.  This setting only affects
        packing to a file when repacking, i.e. the git:// protocol
        is unaffected.  It can be overridden by the `--max-pack-size`
-       option of linkgit:git-repack[1]. The minimum size allowed is
-       limited to 1 MiB. The default is unlimited.
+       option of linkgit:git-repack[1].  Reaching this limit results
+       in the creation of multiple packfiles; which in turn prevents
+       bitmaps from being created.
+       The minimum size allowed is limited to 1 MiB.
+       The default is unlimited.
        Common unit suffixes of 'k', 'm', or 'g' are
        supported.
 
@@ -2280,16 +2407,16 @@ new default).
 --
 
 push.followTags::
-       If set to true enable '--follow-tags' option by default.  You
+       If set to true enable `--follow-tags` option by default.  You
        may override this configuration at time of push by specifying
-       '--no-follow-tags'.
+       `--no-follow-tags`.
 
 push.gpgSign::
        May be set to a boolean value, or the string 'if-asked'. A true
-       value causes all pushes to be GPG signed, as if '--signed' is
+       value causes all pushes to be GPG signed, as if `--signed` is
        passed to linkgit:git-push[1]. The string 'if-asked' causes
        pushes to be signed if the server supports it, as if
-       '--signed=if-asked' is passed to 'git push'. A false value may
+       `--signed=if-asked` is passed to 'git push'. A false value may
        override a value from a lower-priority config file. An explicit
        command-line flag always overrides this config option.
 
@@ -2312,7 +2439,7 @@ rebase.stat::
        rebase. False by default.
 
 rebase.autoSquash::
-       If set to true enable '--autosquash' option by default.
+       If set to true enable `--autosquash` option by default.
 
 rebase.autoStash::
        When set to true, automatically create a temporary stash
@@ -2333,15 +2460,20 @@ rebase.missingCommitsCheck::
        command in the todo-list.
        Defaults to "ignore".
 
-rebase.instructionFormat
+rebase.instructionFormat::
        A format string, as specified in linkgit:git-log[1], to be used for
        the instruction list during an interactive rebase.  The format will automatically
        have the long commit hash prepended to the format.
 
 receive.advertiseAtomic::
        By default, git-receive-pack will advertise the atomic push
-       capability to its clients. If you don't want to this capability
-       to be advertised, set this variable to false.
+       capability to its clients. If you don't want to advertise this
+       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.
 
 receive.autogc::
        By default, git-receive-pack will run "git-gc --auto" after
@@ -2396,6 +2528,15 @@ receive.fsck.skipList::
        can be safely ignored such as invalid committer email addresses.
        Note: corrupt objects cannot be skipped with this setting.
 
+receive.keepAlive::
+       After receiving the pack from the client, `receive-pack` may
+       produce no output (if `--quiet` was specified) while processing
+       the pack, causing some networks to drop the TCP connection.
+       With this option set, if `receive-pack` does not transmit
+       any data in this phase for `receive.keepAlive` seconds, it will
+       send a short keepalive packet.  The default is 5 seconds; set
+       to 0 to disable keepalives entirely.
+
 receive.unpackLimit::
        If the number of objects received in a push is below this
        limit then the objects will be unpacked into loose object
@@ -2406,6 +2547,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.
@@ -2548,8 +2695,9 @@ repack.writeBitmaps::
        objects to disk (e.g., when `git repack -a` is run).  This
        index can speed up the "counting objects" phase of subsequent
        packs created for clones and fetches, at the cost of some disk
-       space and extra time spent on the initial repack.  Defaults to
-       false.
+       space and extra time spent on the initial repack.  This has
+       no effect if multiple packfiles are created.
+       Defaults to false.
 
 rerere.autoUpdate::
        When set to true, `git-rerere` updates the index with the
@@ -2568,7 +2716,7 @@ sendemail.identity::
        A configuration identity. When given, causes values in the
        'sendemail.<identity>' subsection to take precedence over
        values in the 'sendemail' section. The default identity is
-       the value of 'sendemail.identity'.
+       the value of `sendemail.identity`.
 
 sendemail.smtpEncryption::
        See linkgit:git-send-email[1] for description.  Note that this
@@ -2585,7 +2733,7 @@ sendemail.<identity>.*::
        Identity-specific versions of the 'sendemail.*' parameters
        found below, taking precedence over those when the this
        identity is selected, through command-line or
-       'sendemail.identity'.
+       `sendemail.identity`.
 
 sendemail.aliasesFile::
 sendemail.aliasFileType::
@@ -2615,7 +2763,7 @@ sendemail.xmailer::
        See linkgit:git-send-email[1] for description.
 
 sendemail.signedoffcc (deprecated)::
-       Deprecated alias for 'sendemail.signedoffbycc'.
+       Deprecated alias for `sendemail.signedoffbycc`.
 
 showbranch.default::
        The default set of branches for linkgit:git-show-branch[1].
@@ -2687,12 +2835,13 @@ stash.showStat::
        option will show diffstat of the stash.  Defaults to true.
        See description of 'show' command in linkgit:git-stash[1].
 
-submodule.<name>.path::
 submodule.<name>.url::
-       The path within this project and URL for a submodule. These
-       variables are initially populated by 'git submodule init'. See
-       linkgit:git-submodule[1] and linkgit:gitmodules[5] for
-       details.
+       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.
+       See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
 
 submodule.<name>.update::
        The default update procedure for a submodule. This variable
@@ -2729,6 +2878,29 @@ submodule.<name>.ignore::
        "--ignore-submodules" option. The 'git submodule' commands are not
        affected by this setting.
 
+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
+       precedence over this option.
+
 tag.sort::
        This variable controls the sort ordering of tags when displayed by
        linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
@@ -2799,6 +2971,11 @@ uploadpack.allowReachableSHA1InWant::
        calculating object reachability is computationally expensive.
        Defaults to `false`.
 
+uploadpack.allowAnySHA1InWant::
+       Allow `upload-pack` to accept a fetch request that asks for any
+       object at all.
+       Defaults to `false`.
+
 uploadpack.keepAlive::
        When `upload-pack` has started `pack-objects`, there may be a
        quiet period while `pack-objects` prepares the pack. Normally
@@ -2810,6 +2987,21 @@ uploadpack.keepAlive::
        `uploadpack.keepAlive` seconds. Setting this option to 0
        disables keepalive packets entirely. The default is 5 seconds.
 
+uploadpack.packObjectsHook::
+       If this option is set, when `upload-pack` would run
+       `git pack-objects` to create a packfile for a client, it will
+       run this shell command instead.  The `pack-objects` command and
+       arguments it _would_ have run (including the `git pack-objects`
+       at the beginning) are appended to the shell command. The stdin
+       and stdout of the hook are treated as if `pack-objects` itself
+       was run. I.e., `upload-pack` will feed input intended for
+       `pack-objects` to the hook, and expects a completed packfile on
+       stdout.
++
+Note that this configuration variable is ignored if it is seen in the
+repository-level config (this is a safety measure against fetching from
+untrusted repositories).
+
 url.<base>.insteadOf::
        Any URL that starts with this value will be rewritten to
        start, instead, with <base>. In cases where some site serves a
@@ -2836,17 +3028,17 @@ url.<base>.pushInsteadOf::
 
 user.email::
        Your email address to be recorded in any newly created commits.
-       Can be overridden by the 'GIT_AUTHOR_EMAIL', 'GIT_COMMITTER_EMAIL', and
-       'EMAIL' environment variables.  See linkgit:git-commit-tree[1].
+       Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and
+       `EMAIL` environment variables.  See linkgit:git-commit-tree[1].
 
 user.name::
        Your full name to be recorded in any newly created commits.
-       Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME'
+       Can be overridden by the `GIT_AUTHOR_NAME` and `GIT_COMMITTER_NAME`
        environment variables.  See linkgit:git-commit-tree[1].
 
 user.useConfigOnly::
-       Instruct Git to avoid trying to guess defaults for 'user.email'
-       and 'user.name', and instead retrieve the values only from the
+       Instruct Git to avoid trying to guess defaults for `user.email`
+       and `user.name`, and instead retrieve the values only from the
        configuration. For example, if you have multiple email addresses
        and would like to use a different one for each repository, then
        with this configuration option set to `true` in the global config
index ccd1fc8122a74be4ac04fd7be905ebf881f7413b..35e8da201005dee34b75c87aebf720a8f7300a9c 100644 (file)
@@ -1,7 +1,7 @@
 DATE FORMATS
 ------------
 
-The GIT_AUTHOR_DATE, GIT_COMMITTER_DATE environment variables
+The `GIT_AUTHOR_DATE`, `GIT_COMMITTER_DATE` environment variables
 ifdef::git-commit[]
 and the `--date` option
 endif::git-commit[]
index 6eaa45271c9ff2d1200e4299c3040d52952a2ec4..58f4bd6afa12240f9e416860ac12d82776815ee9 100644 (file)
@@ -75,7 +75,7 @@ diff.ignoreSubmodules::
        commands such as 'git diff-files'. 'git checkout' also honors
        this setting when reporting uncommitted changes. Setting it to
        'all' disables the submodule summary normally shown by 'git commit'
-       and 'git status' when 'status.submoduleSummary' is set unless it is
+       and 'git status' when `status.submoduleSummary` is set unless it is
        overridden by using the --ignore-submodules command-line option.
        The 'git submodule' commands are not affected by this setting.
 
@@ -105,12 +105,16 @@ diff.orderFile::
 
 diff.renameLimit::
        The number of files to consider when performing the copy/rename
-       detection; equivalent to the 'git diff' option '-l'.
+       detection; equivalent to the 'git diff' option `-l`.
 
 diff.renames::
-       Tells Git to detect renames.  If set to any boolean value, it
-       will enable basic rename detection.  If set to "copies" or
-       "copy", it will detect copies, as well.
+       Whether and how Git detects renames.  If set to "false",
+       rename detection is disabled. If set to "true", basic rename
+       detection is enabled.  If set to "copies" or "copy", Git will
+       detect copies, as well.  Defaults to true.  Note that this
+       affects only 'git diff' Porcelain like linkgit:git-diff[1] and
+       linkgit:git-log[1], and not lower level commands such as
+       linkgit:git-diff-files[1].
 
 diff.suppressBlankEmpty::
        A boolean to inhibit the standard behavior of printing a space
@@ -118,10 +122,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"
@@ -166,6 +171,12 @@ diff.tool::
 
 include::mergetools-diff.txt[]
 
+diff.indentHeuristic::
+diff.compactionHeuristic::
+       Set one of these options to `true` to enable one of two
+       experimental heuristics that shift diff hunk boundaries to
+       make patches easier to read.
+
 diff.algorithm::
        Choose a diff algorithm.  The variants are as follows:
 +
@@ -182,3 +193,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 85b08909ce25acc5f9deae9a3e0ade2bd679bc94..cf5262622f6a7f82b3989cbcb4ee1ebd4652b220 100644 (file)
@@ -46,11 +46,11 @@ That is, from the left to the right:
 . sha1 for "dst"; 0\{40\} if creation, unmerged or "look at work tree".
 . a space.
 . status, followed by optional "score" number.
-. a tab or a NUL when '-z' option is used.
+. a tab or a NUL when `-z` option is used.
 . path for "src"
-. a tab or a NUL when '-z' option is used; only exists for C or R.
+. a tab or a NUL when `-z` option is used; only exists for C or R.
 . path for "dst"; only exists for C or R.
-. an LF or a NUL when '-z' option is used, to terminate the record.
+. an LF or a NUL when `-z` option is used, to terminate the record.
 
 Possible status letters are:
 
@@ -86,7 +86,7 @@ diff format for merges
 ----------------------
 
 "git-diff-tree", "git-diff-files" and "git-diff --raw"
-can take '-c' or '--cc' option
+can take `-c` or `--cc` option
 to generate diff output also for merge commits.  The output differs
 from the format described above in the following way:
 
index bcf54da82a8c11367354a86efd8c802f58a6e502..d2a7ff56e860b92c4dd346a0ea1eb2eb9f7fde79 100644 (file)
@@ -2,11 +2,11 @@ Generating patches with -p
 --------------------------
 
 When "git-diff-index", "git-diff-tree", or "git-diff-files" are run
-with a '-p' option, "git diff" without the '--raw' option, or
+with a `-p` option, "git diff" without the `--raw` option, or
 "git log" with the "-p" option, they
 do not produce the output described above; instead they produce a
 patch file.  You can customize the creation of such patches via the
-GIT_EXTERNAL_DIFF and the GIT_DIFF_OPTS environment variables.
+`GIT_EXTERNAL_DIFF` and the `GIT_DIFF_OPTS` environment variables.
 
 What the -p option produces is slightly different from the traditional
 diff format:
@@ -114,11 +114,11 @@ index fabadb8,cc95eb0..4866510
 ------------
 
 1.   It is preceded with a "git diff" header, that looks like
-     this (when '-c' option is used):
+     this (when `-c` option is used):
 
        diff --combined file
 +
-or like this (when '--cc' option is used):
+or like this (when `--cc` option is used):
 
        diff --cc file
 
diff --git a/Documentation/diff-heuristic-options.txt b/Documentation/diff-heuristic-options.txt
new file mode 100644 (file)
index 0000000..36cb549
--- /dev/null
@@ -0,0 +1,7 @@
+--indent-heuristic::
+--no-indent-heuristic::
+--compaction-heuristic::
+--no-compaction-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 306b7e360409255a7aafaa3860d6d6c0412fb870..e6215c372c3c3c876125c8ac363a446fd840e112 100644 (file)
@@ -26,12 +26,12 @@ ifndef::git-format-patch[]
 ifdef::git-diff[]
        This is the default.
 endif::git-diff[]
-endif::git-format-patch[]
 
 -s::
 --no-patch::
        Suppress diff output. Useful for commands like `git show` that
        show the patch by default, or to cancel the effect of `--patch`.
+endif::git-format-patch[]
 
 -U<n>::
 --unified=<n>::
@@ -63,6 +63,8 @@ ifndef::git-format-patch[]
        Synonym for `-p --raw`.
 endif::git-format-patch[]
 
+include::diff-heuristic-options.txt[]
+
 --minimal::
        Spend extra time to make sure the smallest possible
        diff is produced.
@@ -203,13 +205,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.
@@ -271,7 +276,7 @@ For example, `--word-diff-regex=.` will treat each character as a word
 and, correspondingly, show differences character by character.
 +
 The regex can also be set via a diff driver or configuration option, see
-linkgit:gitattributes[1] or linkgit:git-config[1].  Giving it explicitly
+linkgit:gitattributes[5] or linkgit:git-config[1].  Giving it explicitly
 overrides any diff driver or configuration setting.  Diff drivers
 override configuration settings.
 
@@ -286,8 +291,8 @@ endif::git-format-patch[]
 
 ifndef::git-format-patch[]
 --check::
-       Warn if changes introduce whitespace errors.  What are
-       considered whitespace errors is controlled by `core.whitespace`
+       Warn if changes introduce conflict markers or whitespace errors.
+       What are considered whitespace errors is controlled by `core.whitespace`
        configuration.  By default, trailing whitespaces (including
        lines that solely consist of whitespaces) and a space character
        that is immediately followed by a tab character inside the
@@ -303,6 +308,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[]
 
@@ -412,6 +419,9 @@ ifndef::git-format-patch[]
        paths are selected if there is any file that matches
        other criteria in the comparison; if there is no file
        that matches other criteria, nothing is selected.
++
+Also, these upper-case letters can be downcased to exclude.  E.g.
+`--diff-filter=ad` excludes added and deleted paths.
 
 -S<string>::
        Look for differences that change the number of occurrences of
@@ -559,5 +569,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 c5047d8f9be9db6c776cca34361732e6c286d2fc..ae555bd47e123544c03a7480ed8000a73610029f 100644 (file)
@@ -1,7 +1,7 @@
 Everyday Git With 20 Commands Or So
 ===================================
 
-This document has been moved to linkgit:giteveryday[1].
+This document has been moved to linkgit:giteveryday[7].
 
 Please let the owners of the referring site know so that they can update the
 link you clicked to get here.
index 036edfb099c367262f34d2c1275ac5079a1e0914..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
@@ -52,7 +66,7 @@ ifndef::git-pull[]
 
 -p::
 --prune::
-       After fetching, remove any remote-tracking references that no
+       Before fetching, remove any remote-tracking references that no
        longer exist on the remote.  Tags are not subject to pruning
        if they are fetched only because of the default tag
        auto-following or due to a --tags option.  However, if tags
@@ -88,7 +102,7 @@ ifndef::git-pull[]
        to whatever else would otherwise be fetched.  Using this
        option alone does not subject tags to pruning, even if --prune
        is used (though tags may be pruned anyway if they are also the
-       destination of an explicit refspec; see '--prune').
+       destination of an explicit refspec; see `--prune`).
 
 --recurse-submodules[=yes|on-demand|no]::
        This option controls if and under what conditions new commits of
@@ -110,7 +124,7 @@ ifndef::git-pull[]
 
 --no-recurse-submodules::
        Disable recursive fetching of submodules (this has the same effect as
-       using the '--recurse-submodules=no' option).
+       using the `--recurse-submodules=no` option).
 
 --submodule-prefix=<path>::
        Prepend <path> to paths printed in informative messages
@@ -137,7 +151,7 @@ endif::git-pull[]
 
 --upload-pack <upload-pack>::
        When given, and the repository to fetch from is handled
-       by 'git fetch-pack', '--exec=<upload-pack>' is passed to
+       by 'git fetch-pack', `--exec=<upload-pack>` is passed to
        the command to specify non-default path for the command
        run on the other end.
 
index 6a96a669c299ebd0408d3a1e34d8e42541f3a9e8..7ed63dce0b1f55325497b4fd6879422fe119eaf5 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 'git add' [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
          [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
          [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
-         [--] [<pathspec>...]
+         [--chmod=(+|-)x] [--] [<pathspec>...]
 
 DESCRIPTION
 -----------
@@ -165,6 +165,11 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files.
        be ignored, no matter if they are already present in the work
        tree or not.
 
+--chmod=(+|-)x::
+       Override the executable bit of the added files.  The executable
+       bit is only changed in the index, the files on disk are left
+       unchanged.
+
 \--::
        This option can be used to separate command-line options from
        the list of files, (useful when filenames might be mistaken
index 13cdd7f3b636dfadc262dcf099653775ec53cd5a..12879e4029a7710e2d78bae476f7ad7d9b0fe830 100644 (file)
@@ -116,7 +116,8 @@ default.   You can use `--no-utf8` to override this.
        By default the command will try to detect the patch format
        automatically. This option allows the user to bypass the automatic
        detection and specify the patch format that the patch(es) should be
-       interpreted as. Valid formats are mbox, stgit, stgit-series and hg.
+       interpreted as. Valid formats are mbox, mboxrd,
+       stgit, stgit-series and hg.
 
 -i::
 --interactive::
@@ -198,12 +199,12 @@ When initially invoking `git am`, you give it the names of the mailboxes
 to process.  Upon seeing the first patch that does not apply, it
 aborts in the middle.  You can recover from this in one of two ways:
 
-. skip the current patch by re-running the command with the '--skip'
+. skip the current patch by re-running the command with the `--skip`
   option.
 
 . hand resolve the conflict in the working directory, and update
   the index file to bring it into a state that the patch should
-  have produced.  Then run the command with the '--continue' option.
+  have produced.  Then run the command with the `--continue` option.
 
 The command refuses to process new mailboxes until the current
 operation is finished, so if you decide to start over from scratch,
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 d9ed6a1a4ea6dc0068144eac4c5e0f5ef33a04cb..8ddb207409df99825b561be42234e9c23707287d 100644 (file)
@@ -13,7 +13,7 @@ SYNOPSIS
          [--apply] [--no-add] [--build-fake-ancestor=<file>] [-R | --reverse]
          [--allow-binary-replacement | --binary] [--reject] [-z]
          [-p<n>] [-C<n>] [--inaccurate-eof] [--recount] [--cached]
-         [--ignore-space-change | --ignore-whitespace ]
+         [--ignore-space-change | --ignore-whitespace]
          [--whitespace=(nowarn|warn|fix|error|error-all)]
          [--exclude=<path>] [--include=<path>] [--directory=<root>]
          [--verbose] [--unsafe-paths] [<patch>...]
@@ -21,6 +21,8 @@ SYNOPSIS
 DESCRIPTION
 -----------
 Reads the supplied diff output (i.e. "a patch") and applies it to files.
+When running from a subdirectory in a repository, patched paths
+outside the directory are ignored.
 With the `--index` option the patch is also applied to the index, and
 with the `--cached` option the patch is only applied to the index.
 Without these options, the command applies the patch only to files,
index c06efbd42a6c1010f0a5ec17ba460e0ebcd91d9d..e015f5b3ccc7651def48b63466072ea51eaecaa0 100644 (file)
@@ -366,7 +366,7 @@ skip" to do the same thing. (In fact the special exit code 125 makes
 
 Or if you want more control, you can inspect the current state using
 for example "git bisect visualize". It will launch gitk (or "git log"
-if the DISPLAY environment variable is not set) to help you find a
+if the `DISPLAY` environment variable is not set) to help you find a
 better bisection point.
 
 Either way, if you have a string of untestable commits, it might
index 7e79aaedeb58632bca9edb6c1f7715c493139bb6..2bb9a577a2b4a4e95dcf950239c2ead8d424319f 100644 (file)
@@ -205,7 +205,7 @@ $ git bisect visualize
 
 `view` may also be used as a synonym for `visualize`.
 
-If the 'DISPLAY' environment variable is not set, 'git log' is used
+If the `DISPLAY` environment variable is not set, 'git log' is used
 instead.  You can also give command-line options such as `-p` and
 `--stat`.
 
@@ -358,7 +358,7 @@ OPTIONS
 --no-checkout::
 +
 Do not checkout the new working tree at each iteration of the bisection
-process. Instead just update a special reference named 'BISECT_HEAD' to make
+process. Instead just update a special reference named `BISECT_HEAD` to make
 it point to the commit that should be tested.
 +
 This option may be useful when the test you would perform in each step
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 4a7037f1c8eed24db05f00c4012aca420f98b73b..1fe73448f3f5a3ff48f939924156771cabfc1f77 100644 (file)
@@ -39,10 +39,10 @@ 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).
+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.
+which points to the current `HEAD`, or <start-point> if given.
 
 Note that this will create the new branch, but it will not switch the
 working tree to it; use "git checkout <newbranch>" to switch to the
@@ -172,7 +172,7 @@ This option is only applicable in non-verbose mode.
 +
 This behavior is the default when the start point is a remote-tracking branch.
 Set the branch.autoSetupMerge configuration variable to `false` if you
-want `git checkout` and `git branch` to always behave as if '--no-track'
+want `git checkout` and `git branch` to always behave as if `--no-track`
 were given. Set it to `always` if you want this behavior when the
 start-point is either a local or remote-tracking branch.
 
index eb3d6945a9e508c9a1d0af63e838a627311631bc..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").
+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` 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::
@@ -144,13 +164,13 @@ respectively print:
 
 OUTPUT
 ------
-If '-t' is specified, one of the <type>.
+If `-t` is specified, one of the <type>.
 
-If '-s' is specified, the size of the <object> in bytes.
+If `-s` is specified, the size of the <object> in bytes.
 
-If '-e' is specified, no output.
+If `-e` is specified, no output.
 
-If '-p' is specified, the contents of <object> are pretty-printed.
+If `-p` is specified, the contents of <object> are pretty-printed.
 
 If <type> is specified, the raw (though uncompressed) contents of the <object>
 will be returned.
index e94367a5ed8e8b94bca7036ff7616bc3cfa9ca97..611754f10bb86d62edcb3265cc29ccdc97c259ae 100644 (file)
@@ -112,7 +112,7 @@ EXIT STATUS
 SEE ALSO
 --------
 linkgit:gitignore[5]
-linkgit:gitconfig[5]
+linkgit:git-config[1]
 linkgit:git-ls-files[1]
 
 GIT
index 91a3622ee4e270a11c699e310fb4d544e37845c9..8611a99120eb1c7070b64f80b39b1526225a8019 100644 (file)
@@ -118,8 +118,8 @@ $ git check-ref-format --branch @{-1}
 * Determine the reference name to use for a new branch:
 +
 ------------
-$ ref=$(git check-ref-format --normalize "refs/heads/$newbranch") ||
-die "we do not like '$newbranch' as a branch name."
+$ ref=$(git check-ref-format --normalize "refs/heads/$newbranch")||
+{ echo "we do not like '$newbranch' as a branch name." >&2 ; exit 1 ; }
 ------------
 
 GIT
index 5e5273e073c351a3c845043a69916a1773cefd94..8e2c0662ddd72c1bc0765aadbbafd22b62b5adf6 100644 (file)
@@ -157,7 +157,7 @@ of it").
        When creating a new branch, set up "upstream" configuration. See
        "--track" in linkgit:git-branch[1] for details.
 +
-If no '-b' option is given, the name of the new branch will be
+If no `-b` option is given, the name of the new branch will be
 derived from the remote-tracking branch, by looking at the local part of
 the refspec configured for the corresponding remote, and then stripping
 the initial part up to the "*".
@@ -165,7 +165,7 @@ This would tell us to use "hack" as the local branch when branching
 off of "origin/hack" (or "remotes/origin/hack", or even
 "refs/remotes/origin/hack").  If the given name has no slash, or the above
 guessing results in an empty name, the guessing is aborted.  You can
-explicitly give a name with '-b' in such a case.
+explicitly give a name with `-b` in such a case.
 
 --no-track::
        Do not set up "upstream" configuration, even if the
@@ -419,6 +419,18 @@ $ git reflog -2 HEAD # or
 $ git log -g -2 HEAD
 ------------
 
+ARGUMENT DISAMBIGUATION
+-----------------------
+
+When there is only one argument given and it is not `--` (e.g. "git
+checkout abc"), and when the argument is both a valid `<tree-ish>`
+(e.g. a branch "abc" exists) and a valid `<pathspec>` (e.g. a file
+or a directory whose name is "abc" exists), Git would usually ask
+you to disambiguate.  Because checking out a branch is so common an
+operation, however, "git checkout abc" takes "abc" as a `<tree-ish>`
+in such a situation.  Use `git checkout -- <pathspec>` if you want
+to checkout these paths out of the index.
+
 EXAMPLES
 --------
 
index 6154e57238143b968b10deacf3ef6fb9d3ef1b86..d35d771fc8172e12958b4a9521c51a5f65cddebe 100644 (file)
@@ -47,7 +47,7 @@ OPTIONS
        For a more complete list of ways to spell commits, see
        linkgit:gitrevisions[7].
        Sets of commits can be passed but no traversal is done by
-       default, as if the '--no-walk' option was specified, see
+       default, as if the `--no-walk` option was specified, see
        linkgit:git-rev-list[1]. Note that specifying a range will
        feed all <commit>... arguments to a single revision walk
        (see a later example that uses 'maint master..next').
@@ -128,7 +128,7 @@ effect to your index in a row.
 
 --allow-empty-message::
        By default, cherry-picking a commit with an empty message will fail.
-       This option overrides that behaviour, allowing commits with empty
+       This option overrides that behavior, allowing commits with empty
        messages to be cherry picked.
 
 --keep-redundant-commits::
index 51a7e26a8ec178e7e9fd0b78c00bb7ce518cd049..03056dad0de5ab6121c1f7a506dc4dacf1f83c7c 100644 (file)
@@ -16,7 +16,7 @@ DESCRIPTION
 Cleans the working tree by recursively removing files that are not
 under version control, starting from the current directory.
 
-Normally, only files unknown to Git are removed, but if the '-x'
+Normally, only files unknown to Git are removed, but if the `-x`
 option is specified, ignored files are also removed. This can, for
 example, be useful to remove all build products.
 
index b7c467a001ad47de0bebd8c985df769fe4e63adc..35cc34b2fb9a0e696eb86e208416fa93aae3c0c5 100644 (file)
@@ -14,8 +14,8 @@ SYNOPSIS
          [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
          [--dissociate] [--separate-git-dir <git dir>]
          [--depth <depth>] [--[no-]single-branch]
-         [--recursive | --recurse-submodules] [--] <repository>
-         [<directory>]
+         [--recursive | --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.
@@ -191,7 +194,16 @@ objects from the source repository into a pack in the cloned repository.
        Create a 'shallow' clone with a history truncated to the
        specified number of commits. Implies `--single-branch` unless
        `--no-single-branch` is given to fetch the histories near the
-       tips of all branches.
+       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,
@@ -212,6 +224,9 @@ objects from the source repository into a pack in the cloned repository.
        repository does not have a worktree/checkout (i.e. if any of
        `--no-checkout`/`-n`, `--bare`, or `--mirror` is given)
 
+--[no-]shallow-submodules::
+       All submodules which are cloned will be shallow with a depth of 1.
+
 --separate-git-dir=<git dir>::
        Instead of placing the cloned repository where it is supposed
        to be, place the cloned repository at the specified directory,
@@ -219,6 +234,10 @@ objects from the source repository into a pack in the cloned repository.
        The result is Git repository can be separated from working
        tree.
 
+-j <n>::
+--jobs <n>::
+       The number of submodules fetched at the same time.
+       Defaults to the `submodule.fetchJobs` option.
 
 <repository>::
        The (possibly remote) repository to clone from.  See the
index 48c33d7ed7323c7fc4776ffeb98aad9b41b23744..002dae625e5ab7cb834fd548dc0b4c23072a0b1b 100644 (file)
@@ -44,7 +44,7 @@ OPTIONS
        An existing tree object
 
 -p <parent>::
-       Each '-p' indicates the id of a parent commit object.
+       Each `-p` indicates the id of a parent commit object.
 
 -m <message>::
        A paragraph in the commit log message. This can be given more than
@@ -61,8 +61,8 @@ OPTIONS
        stuck to the option without a space.
 
 --no-gpg-sign::
-       Countermand `commit.gpgSign` configuration variable that is
-       set to force each and every commit to be signed.
+       Do not GPG-sign commit, to countermand a `--gpg-sign` option
+       given earlier on the command line.
 
 
 Commit Information
index 9ec6b3cc17fd776b16f6410cf88c708831d4bca3..4f8f20a3606201b1835affc523ff2828549d0285 100644 (file)
@@ -29,7 +29,8 @@ The content to be added can be specified in several ways:
 2. by using 'git rm' to remove files from the working tree
    and the index, again before using the 'commit' command;
 
-3. by listing files as arguments to the 'commit' command, in which
+3. by listing files as arguments to the 'commit' command
+   (without --interactive or --patch switch), in which
    case the commit will ignore changes staged in the index, and instead
    record the current content of the listed files (which must already
    be known to Git);
@@ -41,7 +42,8 @@ The content to be added can be specified in several ways:
    actual commit;
 
 5. by using the --interactive or --patch switches with the 'commit' command
-   to decide one by one which files or hunks should be part of the commit,
+   to decide one by one which files or hunks should be part of the commit
+   in addition to contents in the index,
    before finalizing the operation. See the ``Interactive Mode'' section of
    linkgit:git-add[1] to learn how to operate these modes.
 
@@ -75,7 +77,7 @@ OPTIONS
 
 -c <commit>::
 --reedit-message=<commit>::
-       Like '-C', but with '-c' the editor is invoked, so that
+       Like '-C', but with `-c` the editor is invoked, so that
        the user can further edit the commit message.
 
 --fixup=<commit>::
@@ -201,7 +203,7 @@ default::
        Otherwise `whitespace`.
 --
 +
-The default can be changed by the 'commit.cleanup' configuration
+The default can be changed by the `commit.cleanup` configuration
 variable (see linkgit:git-config[1]).
 
 -e::
@@ -260,10 +262,11 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
        staged for other paths. This is the default mode of operation of
        'git commit' if any paths are given on the command line,
        in which case this option can be omitted.
-       If this option is specified together with '--amend', then
+       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>]::
@@ -290,7 +293,8 @@ configuration variable documented in linkgit:git-config[1].
        what changes the commit has.
        Note that this diff output doesn't have its
        lines prefixed with '#'. This diff will not be a part
-       of the commit message.
+       of the commit message. See the `commit.verbose` configuration
+       variable in linkgit:git-config[1].
 +
 If specified twice, show in addition the unified diff between
 what would be committed and the worktree files, i.e. the unstaged
@@ -449,8 +453,8 @@ include::i18n.txt[]
 ENVIRONMENT AND CONFIGURATION VARIABLES
 ---------------------------------------
 The editor used to edit the commit log message will be chosen from the
-GIT_EDITOR environment variable, the core.editor configuration variable, the
-VISUAL environment variable, or the EDITOR environment variable (in that
+`GIT_EDITOR` environment variable, the core.editor configuration variable, the
+`VISUAL` environment variable, or the `EDITOR` environment variable (in that
 order).  See linkgit:git-var[1] for details.
 
 HOOKS
index 153b2d89b551b5c249c6a56604726f8175b0b7c6..83f86b9231b012bbb4716dc27cd72291cb48126a 100644 (file)
@@ -31,40 +31,40 @@ You can query/set/replace/unset options with this command. The name is
 actually the section and the key separated by a dot, and the value will be
 escaped.
 
-Multiple lines can be added to an option by using the '--add' option.
+Multiple lines can be added to an option by using the `--add` option.
 If you want to update or unset an option which can occur on multiple
 lines, a POSIX regexp `value_regex` needs to be given.  Only the
 existing values that match the regexp are updated or unset.  If
 you want to handle the lines that do *not* match the regex, just
 prepend a single exclamation mark in front (see also <<EXAMPLES>>).
 
-The type specifier can be either '--int' or '--bool', to make
+The type specifier can be either `--int` or `--bool`, to make
 'git config' ensure that the variable(s) are of the given type and
 convert the value to the canonical form (simple decimal number for int,
-a "true" or "false" string for bool), or '--path', which does some
-path expansion (see '--path' below).  If no type specifier is passed, no
+a "true" or "false" string for bool), or `--path`, which does some
+path expansion (see `--path` below).  If no type specifier is passed, no
 checks or transformations are performed on the value.
 
 When reading, the values are read from the system, global and
 repository local configuration files by default, and options
-'--system', '--global', '--local' and '--file <filename>' can be
+`--system`, `--global`, `--local` and `--file <filename>` can be
 used to tell the command to read from only that location (see <<FILES>>).
 
 When writing, the new value is written to the repository local
-configuration file by default, and options '--system', '--global',
-'--file <filename>' can be used to tell the command to write to
-that location (you can say '--local' but that is the default).
+configuration file by default, and options `--system`, `--global`,
+`--file <filename>` can be used to tell the command to write to
+that location (you can say `--local` but that is the default).
 
 This command will fail with non-zero status upon error.  Some exit
 codes are:
 
-. The config file is invalid (ret=3),
-. can not write to the config file (ret=4),
-. no section or name was provided (ret=2),
-. the section or key is invalid (ret=1),
-. you try to unset an option which does not exist (ret=5),
-. you try to unset/set an option for which multiple lines match (ret=5), or
-. you try to use an invalid regexp (ret=6).
+- The section or key is invalid (ret=1),
+- no section or name was provided (ret=2),
+- the config file is invalid (ret=3),
+- the config file cannot be written (ret=4),
+- you try to unset an option which does not exist (ret=5),
+- you try to unset/set an option for which multiple lines match (ret=5), or
+- you try to use an invalid regexp (ret=6).
 
 On success, the command returns the exit code 0.
 
@@ -86,8 +86,7 @@ OPTIONS
        found and the last value if multiple key values were found.
 
 --get-all::
-       Like get, but does not fail if the number of values for the key
-       is not exactly one.
+       Like get, but returns all values for a multi-valued key.
 
 --get-regexp::
        Like --get-all, but interprets the name as a regular expression and
@@ -102,7 +101,7 @@ OPTIONS
        given URL is returned (if no such key exists, the value for
        section.key is used as a fallback).  When given just the
        section as name, do so for all the keys in the section and
-       list them.
+       list them.  Returns error code 1 if no value is found.
 
 --global::
        For writing options: write to global `~/.gitconfig` file
@@ -139,7 +138,7 @@ See also <<FILES>>.
        Use the given config file instead of the one specified by GIT_CONFIG.
 
 --blob blob::
-       Similar to '--file' but use the given blob instead of a file. E.g.
+       Similar to `--file` but use the given blob instead of a file. E.g.
        you can use 'master:.gitmodules' to read values from the file
        '.gitmodules' in the master branch. See "SPECIFYING REVISIONS"
        section in linkgit:gitrevisions[7] for a more complete list of
@@ -221,7 +220,7 @@ See also <<FILES>>.
 -e::
 --edit::
        Opens an editor to modify the specified config file; either
-       '--system', '--global', or repository (default).
+       `--system`, `--global`, or repository (default).
 
 --[no-]includes::
        Respect `include.*` directives in config files when looking up
@@ -233,7 +232,7 @@ See also <<FILES>>.
 FILES
 -----
 
-If not set explicitly with '--file', there are four files where
+If not set explicitly with `--file`, there are four files where
 'git config' will search for configuration options:
 
 $(prefix)/etc/gitconfig::
@@ -264,13 +263,16 @@ The files are read in the order given above, with last value found taking
 precedence over values read earlier.  When multiple values are taken then all
 values of a key from all files will be used.
 
+You may override individual configuration parameters when running any git
+command by using the `-c` option. See linkgit:git[1] for details.
+
 All writing options will per default write to the repository specific
-configuration file. Note that this also affects options like '--replace-all'
-and '--unset'. *'git config' will only ever change one file at a time*.
+configuration file. Note that this also affects options like `--replace-all`
+and `--unset`. *'git config' will only ever change one file at a time*.
 
 You can override these rules either by command-line options or by environment
-variables. The '--global' and the '--system' options will limit the file used
-to the global or system-wide file respectively. The GIT_CONFIG environment
+variables. The `--global` and the `--system` options will limit the file used
+to the global or system-wide file respectively. The `GIT_CONFIG` environment
 variable has a similar effect, but you can specify any filename you want.
 
 
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 e3c8f276b14ed188284536636d259974f46d755e..25fb963f4b06695bb0c5fcf9a1feed97dfc549ed 100644 (file)
@@ -44,7 +44,7 @@ OPTIONS
 FILES
 -----
 
-If not set explicitly with '--file', there are two files where
+If not set explicitly with `--file`, there are two files where
 git-credential-store will search for credentials in order of precedence:
 
 ~/.git-credentials::
index 00a0679a2866facb44d16f819ace2d0f115a899a..de1ebed67d7cbc5ba3859551300b76f20a580ef1 100644 (file)
@@ -22,7 +22,7 @@ DESCRIPTION
 deprecated; it does not work with cvsps version 3 and later.  If you are
 performing a one-shot import of a CVS repository consider using
 http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or
-https://github.com/BartMassey/parsecvs[parsecvs].
+http://www.catb.org/esr/cvs-fast-export/[cvs-fast-export].
 
 Imports a CVS repository into Git. It will either create a new
 repository, or incrementally import into an existing one.
@@ -74,10 +74,10 @@ OPTIONS
        akin to the way 'git clone' uses 'origin' by default.
 
 -o <branch-for-HEAD>::
-       When no remote is specified (via -r) the 'HEAD' branch
+       When no remote is specified (via -r) the `HEAD` branch
        from CVS is imported to the 'origin' branch within the Git
-       repository, as 'HEAD' already has a special meaning for Git.
-       When a remote is specified the 'HEAD' branch is named
+       repository, as `HEAD` already has a special meaning for Git.
+       When a remote is specified the `HEAD` branch is named
        remotes/<remote>/master mirroring 'git clone' behaviour.
        Use this option if you want to import into a different
        branch.
@@ -103,7 +103,7 @@ the old cvs2git tool.
 
 -p <options-for-cvsps>::
        Additional options for cvsps.
-       The options '-u' and '-A' are implicit and should not be used here.
+       The options `-u` and '-A' are implicit and should not be used here.
 +
 If you need to pass multiple options, separate them with a comma.
 
@@ -122,7 +122,7 @@ If you need to pass multiple options, separate them with a comma.
 
 -M <regex>::
        Attempt to detect merges based on the commit message with a custom
-       regex. It can be used with '-m' to enable the default regexes
+       regex. It can be used with `-m` to enable the default regexes
        as well. You must escape forward slashes.
 +
 The regex must capture the source branch name in $1.
@@ -186,7 +186,7 @@ messages, bug-tracking systems, email archives, and the like.
 
 OUTPUT
 ------
-If '-v' is specified, the script reports what it is doing.
+If `-v` is specified, the script reports what it is doing.
 
 Otherwise, success is indicated the Unix way, i.e. by simply exiting with
 a zero exit status.
index db4d7a917c5b375487df01816bac36ff30dff7c7..a336ae5f6fd5587aa8f778d2378783d0fe2e6dc4 100644 (file)
@@ -54,7 +54,7 @@ Print usage information and exit
 You can specify a list of allowed directories. If no directories
 are given, all are allowed. This is an additional restriction, gitcvs
 access still needs to be enabled by the `gitcvs.enabled` config option
-unless '--export-all' was given, too.
+unless `--export-all` was given, too.
 
 
 DESCRIPTION
@@ -332,7 +332,7 @@ To get a checkout with the Eclipse CVS client:
 3. Browse the 'modules' available. It will give you a list of the heads in
    the repository. You will not be able to browse the tree from there. Only
    the heads.
-4. Pick 'HEAD' when it asks what branch/tag to check out. Untick the
+4. Pick `HEAD` when it asks what branch/tag to check out. Untick the
    "launch commit wizard" to avoid committing the .project file.
 
 Protocol notes: If you are using anonymous access via pserver, just select that.
@@ -402,12 +402,12 @@ Exports and tagging (tags and branches) are not supported at this stage.
 CRLF Line Ending Conversions
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-By default the server leaves the '-k' mode blank for all files,
+By default the server leaves the `-k` mode blank for all files,
 which causes the CVS client to treat them as a text files, subject
 to end-of-line conversion on some platforms.
 
 You can make the server use the end-of-line conversion attributes to
-set the '-k' modes for files by setting the `gitcvs.usecrlfattr`
+set the `-k` modes for files by setting the `gitcvs.usecrlfattr`
 config variable.  See linkgit:gitattributes[5] for more information
 about end-of-line conversion.
 
@@ -415,9 +415,9 @@ Alternatively, if `gitcvs.usecrlfattr` config is not enabled
 or the attributes do not allow automatic detection for a filename, then
 the server uses the `gitcvs.allBinary` config for the default setting.
 If `gitcvs.allBinary` is set, then file not otherwise
-specified will default to '-kb' mode. Otherwise the '-k' mode
+specified will default to '-kb' mode. Otherwise the `-k` mode
 is left blank. But if `gitcvs.allBinary` is set to "guess", then
-the correct '-k' mode will be guessed based on the contents of
+the correct `-k` mode will be guessed based on the contents of
 the file.
 
 For best consistency with 'cvs', it is probably best to override the
index a69b3616ec3bdc9686114f4d0b7a851c0ce93339..3c91db7bed038f7ba28a4e7554cc6e63c5d91958 100644 (file)
@@ -30,7 +30,7 @@ that service if it is enabled.
 
 It verifies that the directory has the magic file "git-daemon-export-ok", and
 it will refuse to export any Git directory that hasn't explicitly been marked
-for export this way (unless the '--export-all' parameter is specified). If you
+for export this way (unless the `--export-all` parameter is specified). If you
 pass some directory paths as 'git daemon' arguments, you can further restrict
 the offers to a whitelist comprising of those.
 
@@ -90,10 +90,10 @@ OPTIONS
        is not supported, then --listen=hostname is also not supported and
        --listen must be given an IPv4 address.
        Can be given more than once.
-       Incompatible with '--inetd' option.
+       Incompatible with `--inetd` option.
 
 --port=<n>::
-       Listen on an alternative port.  Incompatible with '--inetd' option.
+       Listen on an alternative port.  Incompatible with `--inetd` option.
 
 --init-timeout=<n>::
        Timeout (in seconds) between the moment the connection is established
@@ -188,7 +188,7 @@ Git configuration files in that directory are readable by `<user>`.
        arguments. The external command can decide to decline the
        service by exiting with a non-zero status (or to allow it by
        exiting with a zero status).  It can also look at the $REMOTE_ADDR
-       and $REMOTE_PORT environment variables to learn about the
+       and `$REMOTE_PORT` environment variables to learn about the
        requestor when making this decision.
 +
 The external command can optionally write a single line to its
@@ -296,7 +296,7 @@ they correspond to these IP addresses.
 selectively enable/disable services per repository::
        To enable 'git archive --remote' and disable 'git fetch' against
        a repository, have the following in the configuration file in the
-       repository (that is the file 'config' next to 'HEAD', 'refs' and
+       repository (that is the file 'config' next to `HEAD`, 'refs' and
        'objects').
 +
 ----------------------------------------------------------------
index c8f28c8c864523c948763d7554f49def36156336..e4ac448ff565a0951444d0b1b98b2d5f86f01a9f 100644 (file)
@@ -154,7 +154,7 @@ is found, its name will be output and searching will stop.
 If an exact match was not found, 'git describe' will walk back
 through the commit history to locate an ancestor commit which
 has been tagged.  The ancestor's tag will be output along with an
-abbreviation of the input commit-ish's SHA-1. If '--first-parent' was
+abbreviation of the input commit-ish's SHA-1. If `--first-parent` was
 specified then the walk will only consider the first parent of each
 commit.
 
index a86cf62e68999f698c1a49edab207a9721c6dfaf..a1715069529eba9d143d527c058e962381efd743 100644 (file)
@@ -40,13 +40,13 @@ include::diff-format.txt[]
 Operating Modes
 ---------------
 You can choose whether you want to trust the index file entirely
-(using the '--cached' flag) or ask the diff logic to show any files
+(using the `--cached` flag) or ask the diff logic to show any files
 that don't match the stat state as being "tentatively changed".  Both
 of these operations are very useful indeed.
 
 Cached Mode
 -----------
-If '--cached' is specified, it allows you to ask:
+If `--cached` is specified, it allows you to ask:
 
        show me the differences between HEAD and the current index
        contents (the ones I'd write using 'git write-tree')
index 1439486e40ec4a8a1146310bf929d688eb01d533..7870e175b7683ffcdbdc98d3f669998c615c2ffd 100644 (file)
@@ -43,11 +43,11 @@ include::diff-options.txt[]
        show tree entry itself as well as subtrees.  Implies -r.
 
 --root::
-       When '--root' is specified the initial commit will be shown as a big
+       When `--root` is specified the initial commit will be shown as a big
        creation event. This is equivalent to a diff against the NULL tree.
 
 --stdin::
-       When '--stdin' is specified, the command does not take
+       When `--stdin` is specified, the command does not take
        <tree-ish> arguments from the command line.  Instead, it
        reads lines containing either two <tree>, one <commit>, or a
        list of <commit> from its standard input.  (Use a single space
@@ -70,13 +70,13 @@ commits (but not trees).
        By default, 'git diff-tree --stdin' does not show
        differences for merge commits.  With this flag, it shows
        differences to that commit from all of its parents. See
-       also '-c'.
+       also `-c`.
 
 -s::
        By default, 'git diff-tree --stdin' shows differences,
-       either in machine-readable form (without '-p') or in patch
-       form (with '-p').  This output can be suppressed.  It is
-       only useful with '-v' flag.
+       either in machine-readable form (without `-p`) or in patch
+       form (with `-p`).  This output can be suppressed.  It is
+       only useful with `-v` flag.
 
 -v::
        This flag causes 'git diff-tree --stdin' to also show
@@ -91,17 +91,17 @@ include::pretty-options.txt[]
 -c::
        This flag changes the way a merge commit is displayed
        (which means it is useful only when the command is given
-       one <tree-ish>, or '--stdin').  It shows the differences
+       one <tree-ish>, or `--stdin`).  It shows the differences
        from each of the parents to the merge result simultaneously
        instead of showing pairwise diff between a parent and the
-       result one at a time (which is what the '-m' option does).
+       result one at a time (which is what the `-m` option does).
        Furthermore, it lists only files which were modified
        from all parents.
 
 --cc::
        This flag changes the way a merge commit patch is displayed,
-       in a similar way to the '-c' option. It implies the '-c'
-       and '-p' options and further compresses the patch output
+       in a similar way to the `-c` option. It implies the `-c`
+       and `-p` options and further compresses the patch output
        by omitting uninteresting hunks whose the contents in the parents
        have only two variants and the merge result picks one of them
        without modification.  When all hunks are uninteresting, the commit
index 333cf6ff91c59fd96b587257ad413268df9a1458..224fb3090bba3f9dfd98448019a2ff6303b268f7 100644 (file)
@@ -98,7 +98,7 @@ instead.  `--no-symlinks` is the default on Windows.
        invoked diff tool returns a non-zero exit code.
 +
 'git-difftool' will forward the exit code of the invoked tool when
-'--trust-exit-code' is used.
+`--trust-exit-code` is used.
 
 See linkgit:git-diff[1] for the full list of supported options.
 
index 66910aa2faff1d78b71c5c552550a4f8e9d51832..2b762654bf4779b8579bf9b17e75b4aa0322f789 100644 (file)
@@ -136,6 +136,8 @@ Performance and Compression Tuning
        Maximum size of each output packfile.
        The default is unlimited.
 
+fastimport.unpackLimit::
+       See linkgit:git-config[1]
 
 Performance
 -----------
@@ -1054,7 +1056,7 @@ relative-marks::
 no-relative-marks::
 force::
        Act as though the corresponding command-line option with
-       a leading '--' was passed on the command line
+       a leading `--` was passed on the command line
        (see OPTIONS, above).
 
 import-marks::
@@ -1105,7 +1107,7 @@ options the user may specify to git fast-import itself.
 
 The `<option>` part of the command may contain any of the options
 listed in the OPTIONS section that do not change import semantics,
-without the leading '--' and is treated in the same way.
+without the leading `--` and is treated in the same way.
 
 Option commands must be the first commands on the input (not counting
 feature commands), to give an option command after any non-option
index 8680f45f8d635253576499453588308618afdc5f..f7ebe36a7b2c203e0b2f320309a5ce6250b12471 100644 (file)
@@ -41,13 +41,13 @@ OPTIONS
        option, then the refs from stdin are processed after those
        on the command line.
 +
-If '--stateless-rpc' is specified together with this option then
+If `--stateless-rpc` is specified together with this option then
 the list of refs must be in packet format (pkt-line). Each ref must
 be in a separate packet, and the list must end with a flush packet.
 
 -q::
 --quiet::
-       Pass '-q' flag to 'git unpack-objects'; this makes the
+       Pass `-q` flag to 'git unpack-objects'; this makes the
        cloning process less verbose.
 
 -k::
@@ -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.
 
@@ -104,6 +118,10 @@ be in a separate packet, and the list must end with a flush packet.
        The remote heads to update from. This is relative to
        $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`,
+`uploadpack.allowReachableSHA1InWant`, or `uploadpack.allowAnySHA1InWant`,
+they may alternatively be 40-hex sha1s present on the remote.
 
 SEE ALSO
 --------
index efe56e08085c70341149c546ab0848674a5bc33f..9e4216999d69f448b50d238d22e09289c6780661 100644 (file)
@@ -99,6 +99,57 @@ The latter use of the `remote.<repository>.fetch` values can be
 overridden by giving the `--refmap=<refspec>` parameter(s) on the
 command line.
 
+OUTPUT
+------
+
+The output of "git fetch" depends on the transport method used; this
+section describes the output when fetching over the Git protocol
+(either locally or via ssh) and Smart HTTP protocol.
+
+The status of the fetch is output in tabular form, with each line
+representing the status of a single ref. Each line is of the form:
+
+-------------------------------
+ <flag> <summary> <from> -> <to> [<reason>]
+-------------------------------
+
+The status of up-to-date refs is shown only if the --verbose option is
+used.
+
+In compact output mode, specified with configuration variable
+fetch.output, if either entire `<from>` or `<to>` is found in the
+other string, it will be substituted with `*` in the other string. For
+example, `master -> origin/master` becomes `master -> origin/*`.
+
+flag::
+       A single character indicating the status of the ref:
+(space);; for a successfully fetched fast-forward;
+`+`;; for a successful forced update;
+`-`;; for a successfully pruned ref;
+`t`;; for a successful tag update;
+`*`;; for a successfully fetched new ref;
+`!`;; for a ref that was rejected or failed to update; and
+`=`;; for a ref that was up to date and did not need fetching.
+
+summary::
+       For a successfully fetched ref, the summary shows the old and new
+       values of the ref in a form suitable for using as an argument to
+       `git log` (this is `<old>..<new>` in most cases, and
+       `<old>...<new>` for forced non-fast-forward updates).
+
+from::
+       The name of the remote ref being fetched from, minus its
+       `refs/<type>/` prefix. In the case of deletion, the name of
+       the remote ref is "(none)".
+
+to::
+       The name of the local ref being updated, minus its
+       `refs/<type>/` prefix.
+
+reason::
+       A human-readable explanation. In the case of successfully fetched
+       refs, no explanation is needed. For a failed ref, the reason for
+       failure is described.
 
 EXAMPLES
 --------
index 73fd9e8230a89a988bdf16497eb3686ab18dfb91..0a09698c033fb2e1cdf68aa33eed4f109a034d5f 100644 (file)
@@ -52,7 +52,7 @@ if different from the rewritten ones, will be stored in the namespace
 
 Note that since this operation is very I/O expensive, it might
 be a good idea to redirect the temporary directory off-disk with the
-'-d' option, e.g. on tmpfs.  Reportedly the speedup is very noticeable.
+`-d` option, e.g. on tmpfs.  Reportedly the speedup is very noticeable.
 
 
 Filters
@@ -61,7 +61,7 @@ Filters
 The filters are applied in the order as listed below.  The <command>
 argument is always evaluated in the shell context using the 'eval' command
 (with the notable exception of the commit filter, for technical reasons).
-Prior to that, the $GIT_COMMIT environment variable will be set to contain
+Prior to that, the `$GIT_COMMIT` environment variable will be set to contain
 the id of the commit being rewritten.  Also, GIT_AUTHOR_NAME,
 GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL,
 and GIT_COMMITTER_DATE are taken from the current commit and exported to
@@ -171,7 +171,7 @@ to other tags will be rewritten to point to the underlying commit.
        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
+       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.
@@ -197,7 +197,7 @@ to other tags will be rewritten to point to the underlying commit.
 <rev-list options>...::
        Arguments for 'git rev-list'.  All positive refs included by
        these options are rewritten.  You may also specify options
-       such as '--all', but you must use '--' to separate them from
+       such as `--all`, but you must use `--` to separate them from
        the 'git filter-branch' options. Implies <<Remap_to_ancestor>>.
 
 
@@ -205,7 +205,7 @@ to other tags will be rewritten to point to the underlying commit.
 Remap to ancestor
 ~~~~~~~~~~~~~~~~~
 
-By using linkgit:rev-list[1] arguments, e.g., path limiters, you can limit the
+By using linkgit:git-rev-list[1] arguments, e.g., path limiters, you can limit the
 set of revisions which get rewritten. However, positive refs on the command
 line are distinguished: we don't let them be excluded by such limiters. For
 this purpose, they are instead rewritten to point at the nearest ancestor that
index 6526b178e87f9cbf1c2032bd63023295cf1d190e..44892c447e79f1d06435357b30f4ddbbb465e5f1 100644 (file)
@@ -60,10 +60,10 @@ merge.summary::
 EXAMPLE
 -------
 
---
+---------
 $ git fetch origin master
 $ git fmt-merge-msg --log <$GIT_DIR/FETCH_HEAD
---
+---------
 
 Print a log message describing a merge of the "master" branch from
 the "origin" remote.
index 012e8f9a080d2dc386d2f878c2bc9812ba6113f8..f57e69bc83e33e3de3d02e339fd71066b93e7d4d 100644 (file)
@@ -76,7 +76,7 @@ OPTIONS
        specified commit (HEAD if not specified).
 
 --contains [<object>]::
-       Only list tags which contain the specified commit (HEAD if not
+       Only list refs which contain the specified commit (HEAD if not
        specified).
 
 FIELD NAMES
@@ -142,7 +142,7 @@ align::
        <width> and <position> used instead.  For instance,
        `%(align:<width>,<position>)`. If the contents length is more
        than the width then no alignment is performed. If used with
-       '--quote' everything in between %(align:...) and %(end) is
+       `--quote` everything in between %(align:...) and %(end) is
        quoted, but if nested then only the topmost level performs
        quoting.
 
@@ -179,7 +179,7 @@ returns an empty string instead.
 
 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).
+values the `--date` option to linkgit:git-rev-list[1] takes).
 
 
 EXAMPLES
index 6821441d7d7beedac1f5b322248c3012d23bb103..9b200b379bbc980f37033c68342a287637750583 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>]
@@ -58,7 +59,7 @@ output, unless the `--stdout` option is specified.
 
 If `-o` is specified, output files are created in <dir>.  Otherwise
 they are created in the current working directory. The default path
-can be set with the 'format.outputDirectory' configuration option.
+can be set with the `format.outputDirectory` configuration option.
 The `-o` option takes precedence over `format.outputDirectory`.
 To store patches in the current working directory even when
 `format.outputDirectory` points elsewhere, use `-o .`.
@@ -146,9 +147,9 @@ series, where the head is chosen from the cover letter, the
 `--in-reply-to`, and the first patch mail, in this order.  'deep'
 threading makes every mail a reply to the previous one.
 +
-The default is `--no-thread`, unless the 'format.thread' configuration
+The default is `--no-thread`, unless the `format.thread` configuration
 is set.  If `--thread` is specified without a style, it defaults to the
-style specified by 'format.thread' if any, or else `shallow`.
+style specified by `format.thread` if any, or else `shallow`.
 +
 Beware that the default for 'git send-email' is to thread emails
 itself.  If you want `git format-patch` to take care of threading, you
@@ -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
@@ -265,6 +271,11 @@ you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`.
   Output an all-zero hash in each patch's From header instead
   of the hash of the commit.
 
+--base=<commit>::
+       Record the base tree information to identify the state the
+       patch series applies to.  See the BASE TREE INFORMATION section
+       below for details.
+
 --root::
        Treat the revision argument as a <revision range>, even if it
        is just a single commit (that would normally be treated as a
@@ -520,6 +531,61 @@ This should help you to submit patches inline using KMail.
 5. Back in the compose window: add whatever other text you wish to the
    message, complete the addressing and subject fields, and press send.
 
+BASE TREE INFORMATION
+---------------------
+
+The base tree information block is used for maintainers or third party
+testers to know the exact state the patch series applies to. It consists
+of the 'base commit', which is a well-known commit that is part of the
+stable part of the project history everybody else works off of, and zero
+or more 'prerequisite patches', which are well-known patches in flight
+that is not yet part of the 'base commit' that need to be applied on top
+of 'base commit' in topological order before the patches can be applied.
+
+The 'base commit' is shown as "base-commit: " followed by the 40-hex of
+the commit object name.  A 'prerequisite patch' is shown as
+"prerequisite-patch-id: " followed by the 40-hex 'patch id', which can
+be obtained by passing the patch through the `git patch-id --stable`
+command.
+
+Imagine that on top of the public commit P, you applied well-known
+patches X, Y and Z from somebody else, and then built your three-patch
+series A, B, C, the history would be like:
+
+................................................
+---P---X---Y---Z---A---B---C
+................................................
+
+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
+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:
+
+------------
+base-commit: P
+prerequisite-patch-id: X
+prerequisite-patch-id: Y
+prerequisite-patch-id: Z
+------------
+
+For non-linear topology, such as
+
+................................................
+---P---X---A---M---C
+    \         /
+     Y---Z---B
+................................................
+
+You can also use `git format-patch --base=P -3 C` to generate patches
+for A, B and C, and the identifiers for P, X, Y, Z are appended at the
+end of the first message.
+
+If set `--base=auto` in cmdline, it will track base commit automatically,
+the base commit will be the merge base of tip commit of the remote-tracking
+branch and revision-range specified in cmdline.
+For a local branch, you need to track a remote branch by `git branch
+--set-upstream-to` before using this option.
 
 EXAMPLES
 --------
index 84ee92e15844588425111c1230b37ac3f0f03038..b9f060e3b207f981932957d8148dfcfcd912e33c 100644 (file)
@@ -11,7 +11,8 @@ SYNOPSIS
 [verse]
 'git fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
         [--[no-]full] [--strict] [--verbose] [--lost-found]
-        [--[no-]dangling] [--[no-]progress] [--connectivity-only] [<object>*]
+        [--[no-]dangling] [--[no-]progress] [--connectivity-only]
+        [--[no-]name-objects] [<object>*]
 
 DESCRIPTION
 -----------
@@ -82,6 +83,12 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
        a blob, the contents are written into the file, rather than
        its object name.
 
+--name-objects::
+       When displaying names of reachable objects, in addition to the
+       SHA-1 also display a name that describes *how* they are reachable,
+       compatible with linkgit:git-rev-parse[1], e.g.
+       `HEAD@{1234567890}~25^2:src/`.
+
 --[no-]progress::
        Progress status is reported on the standard error stream by
        default when it is attached to a terminal, unless
@@ -95,7 +102,7 @@ DISCUSSION
 git-fsck tests SHA-1 and general object sanity, and it does full tracking
 of the resulting reachability and everything else. It prints out any
 corruption it finds (missing or bad objects), and if you use the
-'--unreachable' flag it will also print out objects that exist but that
+`--unreachable` flag it will also print out objects that exist but that
 aren't reachable from any of the specified head nodes (or the default
 set, as mentioned above).
 
index fa1510480a1d55236f2c467a0d4e901bbc60dc84..bed60f471cd5736b173a2c636717cd566c1e4511 100644 (file)
@@ -82,13 +82,13 @@ automatic consolidation of packs.
 Configuration
 -------------
 
-The optional configuration variable 'gc.reflogExpire' can be
+The optional configuration variable `gc.reflogExpire` can be
 set to indicate how long historical entries within each branch's
 reflog should remain available in this repository.  The setting is
 expressed as a length of time, for example '90 days' or '3 months'.
 It defaults to '90 days'.
 
-The optional configuration variable 'gc.reflogExpireUnreachable'
+The optional configuration variable `gc.reflogExpireUnreachable`
 can be set to indicate how long historical reflog entries which
 are not part of the current branch should remain available in
 this repository.  These types of entries are generally created as
@@ -107,30 +107,30 @@ branches:
        reflogExpireUnreachable = 3 days
 ------------
 
-The optional configuration variable 'gc.rerereResolved' indicates
+The optional configuration variable `gc.rerereResolved` indicates
 how long records of conflicted merge you resolved earlier are
 kept.  This defaults to 60 days.
 
-The optional configuration variable 'gc.rerereUnresolved' indicates
+The optional configuration variable `gc.rerereUnresolved` indicates
 how long records of conflicted merge you have not resolved are
 kept.  This defaults to 15 days.
 
-The optional configuration variable 'gc.packRefs' determines if
+The optional configuration variable `gc.packRefs` determines if
 'git gc' runs 'git pack-refs'. This can be set to "notbare" to enable
 it within all non-bare repos or it can be set to a boolean value.
 This defaults to true.
 
-The optional configuration variable 'gc.aggressiveWindow' controls how
+The optional configuration variable `gc.aggressiveWindow` controls how
 much time is spent optimizing the delta compression of the objects in
 the repository when the --aggressive option is specified.  The larger
 the value, the more time is spent optimizing the delta compression.  See
 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'
+Similarly, the optional configuration variable `gc.aggressiveDepth`
 controls --depth option in linkgit:git-repack[1]. This defaults to 250.
 
-The optional configuration variable 'gc.pruneExpire' controls how old
+The optional configuration variable `gc.pruneExpire` controls how old
 the unreferenced loose objects have to be before they are pruned.  The
 default is "2 weeks ago".
 
index cb0f6cf6782c87d7a5b08e2b75de5b4ecb2969f9..0ecea6e4912f635e2825e8c02a14aef191cd91f1 100644 (file)
@@ -41,17 +41,17 @@ CONFIGURATION
 -------------
 
 grep.lineNumber::
-       If set to true, enable '-n' option by default.
+       If set to true, enable `-n` option by default.
 
 grep.patternType::
        Set the default matching behavior. Using a value of 'basic', 'extended',
-       'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
-       '--fixed-strings', or '--perl-regexp' option accordingly, while the
+       'fixed', or 'perl' will enable the `--basic-regexp`, `--extended-regexp`,
+       `--fixed-strings`, or `--perl-regexp` option accordingly, while the
        value 'default' will return to the default matching behavior.
 
 grep.extendedRegexp::
-       If set to true, enable '--extended-regexp' option by default. This
-       option is ignored when the 'grep.patternType' option is set to a value
+       If set to true, enable `--extended-regexp` option by default. This
+       option is ignored when the `grep.patternType` option is set to a value
        other than 'default'.
 
 grep.threads::
@@ -59,7 +59,7 @@ grep.threads::
        8 threads are used by default (for now).
 
 grep.fullName::
-       If set to true, enable '--full-name' option by default.
+       If set to true, enable `--full-name` option by default.
 
 grep.fallbackToNoIndex::
        If set to true, fall back to git grep --no-index if git grep
index 8144527ae026803a4ad87d4fc07b638b85f48075..c1a3e8bf073f7aef89989356e985861644530a86 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 (or `HEAD` by default).  Files selected through the
        browser are opened in the blame viewer.
 
 citool::
index 3956525218bf45f2968fe2039e4dfb75a6f2222b..40d328a4b3e7e03720cbefc5100ee8e752f6a586 100644 (file)
@@ -18,10 +18,10 @@ With no options and no COMMAND or GUIDE given, the synopsis of the 'git'
 command and a list of the most commonly used Git commands are printed
 on the standard output.
 
-If the option '--all' or '-a' is given, all available commands are
+If the option `--all` or `-a` is given, all available commands are
 printed on the standard output.
 
-If the option '--guide' or '-g' is given, a list of the useful
+If the option `--guide` or `-g` is given, a list of the useful
 Git guides is also printed on the standard output.
 
 If a command, or a guide, is given, a manual page for that command or
@@ -57,10 +57,10 @@ OPTIONS
 --man::
        Display manual page for the command in the 'man' format. This
        option may be used to override a value set in the
-       'help.format' configuration variable.
+       `help.format` configuration variable.
 +
 By default the 'man' program will be used to display the manual page,
-but the 'man.viewer' configuration variable may be used to choose
+but the `man.viewer` configuration variable may be used to choose
 other display programs (see below).
 
 -w::
@@ -69,7 +69,7 @@ other display programs (see below).
        format. A web browser will be used for that purpose.
 +
 The web browser can be specified using the configuration variable
-'help.browser', or 'web.browser' if the former is not set. If none of
+`help.browser`, or `web.browser` if the former is not set. If none of
 these config variables is set, the 'git web{litdd}browse' helper script
 (called by 'git help') will pick a suitable default. See
 linkgit:git-web{litdd}browse[1] for more information about this.
@@ -80,7 +80,7 @@ CONFIGURATION VARIABLES
 help.format
 ~~~~~~~~~~~
 
-If no command-line option is passed, the 'help.format' configuration
+If no command-line option is passed, the `help.format` configuration
 variable will be checked. The following values are supported for this
 variable; they make 'git help' behave as their corresponding command-
 line option:
@@ -92,7 +92,7 @@ line option:
 help.browser, web.browser and browser.<tool>.path
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The 'help.browser', 'web.browser' and 'browser.<tool>.path' will also
+The `help.browser`, `web.browser` and `browser.<tool>.path` will also
 be checked if the 'web' format is chosen (either by command-line
 option or configuration variable). See '-w|--web' in the OPTIONS
 section above and linkgit:git-web{litdd}browse[1].
@@ -100,7 +100,7 @@ section above and linkgit:git-web{litdd}browse[1].
 man.viewer
 ~~~~~~~~~~
 
-The 'man.viewer' configuration variable will be checked if the 'man'
+The `man.viewer` configuration variable will be checked if the 'man'
 format is chosen. The following values are currently supported:
 
 * "man": use the 'man' program as usual,
@@ -110,9 +110,9 @@ format is chosen. The following values are currently supported:
 tab (see 'Note about konqueror' below).
 
 Values for other tools can be used if there is a corresponding
-'man.<tool>.cmd' configuration entry (see below).
+`man.<tool>.cmd` configuration entry (see below).
 
-Multiple values may be given to the 'man.viewer' configuration
+Multiple values may be given to the `man.viewer` configuration
 variable. Their corresponding programs will be tried in the order
 listed in the configuration file.
 
@@ -128,14 +128,14 @@ will try to use konqueror first. But this may fail (for example, if
 DISPLAY is not set) and in that case emacs' woman mode will be tried.
 
 If everything fails, or if no viewer is configured, the viewer specified
-in the GIT_MAN_VIEWER environment variable will be tried.  If that
+in the `GIT_MAN_VIEWER` environment variable will be tried.  If that
 fails too, the 'man' program will be tried anyway.
 
 man.<tool>.path
 ~~~~~~~~~~~~~~~
 
 You can explicitly provide a full path to your preferred man viewer by
-setting the configuration variable 'man.<tool>.path'. For example, you
+setting the configuration variable `man.<tool>.path`. For example, you
 can configure the absolute path to konqueror by setting
 'man.konqueror.path'. Otherwise, 'git help' assumes the tool is
 available in PATH.
@@ -143,9 +143,9 @@ available in PATH.
 man.<tool>.cmd
 ~~~~~~~~~~~~~~
 
-When the man viewer, specified by the 'man.viewer' configuration
+When the man viewer, specified by the `man.viewer` configuration
 variables, is not among the supported ones, then the corresponding
-'man.<tool>.cmd' configuration variable will be looked up. If this
+`man.<tool>.cmd` configuration variable will be looked up. If this
 variable exists then the specified tool will be treated as a custom
 command and a shell eval will be used to run the command with the man
 page passed as arguments.
@@ -153,7 +153,7 @@ page passed as arguments.
 Note about konqueror
 ~~~~~~~~~~~~~~~~~~~~
 
-When 'konqueror' is specified in the 'man.viewer' configuration
+When 'konqueror' is specified in the `man.viewer` configuration
 variable, we launch 'kfmclient' to try to open the man page on an
 already opened konqueror in a new tab if possible.
 
@@ -176,7 +176,7 @@ Note about git config --global
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Note that all these configuration variables should probably be set
-using the '--global' flag, for example like this:
+using the `--global` flag, for example like this:
 
 ------------------------------------------------
 $ git config --global help.format web
index 9268fb6b1ea2de2b29fb077a1a675c727526abeb..bb0db195cebd6b8c3824fde4cc3ccdcec4d96543 100644 (file)
@@ -21,7 +21,7 @@ pushing using the smart HTTP protocol.
 It verifies that the directory has the magic file
 "git-daemon-export-ok", and it will refuse to export any Git directory
 that hasn't explicitly been marked for export this way (unless the
-GIT_HTTP_EXPORT_ALL environmental variable is set).
+`GIT_HTTP_EXPORT_ALL` environmental variable is set).
 
 By default, only the `upload-pack` service is enabled, which serves
 'git fetch-pack' and 'git ls-remote' clients, which are invoked from
@@ -241,7 +241,7 @@ $HTTP["url"] =~ "^/git/private" {
 
 ENVIRONMENT
 -----------
-'git http-backend' relies upon the CGI environment variables set
+'git http-backend' relies upon the `CGI` environment variables set
 by the invoking web server, including:
 
 * PATH_INFO (if GIT_PROJECT_ROOT is set, otherwise PATH_TRANSLATED)
@@ -251,7 +251,7 @@ by the invoking web server, including:
 * QUERY_STRING
 * REQUEST_METHOD
 
-The GIT_HTTP_EXPORT_ALL environmental variable may be passed to
+The `GIT_HTTP_EXPORT_ALL` environmental variable may be passed to
 'git-http-backend' to bypass the check for the "git-daemon-export-ok"
 file in each repository before allowing export of that repository.
 
@@ -269,7 +269,7 @@ GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
 ensuring that any reflogs created by 'git-receive-pack' contain some
 identifying information of the remote user who performed the push.
 
-All CGI environment variables are available to each of the hooks
+All `CGI` environment variables are available to each of the hooks
 invoked by the 'git-receive-pack'.
 
 GIT
index 2e67362bd4b60607e7ccfeafbfebdc4cf68058e7..2aceb6f26da2299d87afe6aeeaf54d18d1487488 100644 (file)
@@ -81,13 +81,13 @@ destination side.
      exist in the set of remote refs; the ref matched <src>
      locally is used as the name of the destination.
 
-Without '--force', the <src> ref is stored at the remote only if
+Without `--force`, the <src> ref is stored at the remote only if
 <dst> does not exist, or <dst> is a proper subset (i.e. an
 ancestor) of <src>.  This check, known as "fast-forward check",
 is performed in order to avoid accidentally overwriting the
 remote ref and lose other peoples' commits from there.
 
-With '--force', the fast-forward check is disabled for all refs.
+With `--force`, the fast-forward check is disabled for all refs.
 
 Optionally, a <ref> parameter can be prefixed with a plus '+' sign
 to disable the fast-forward check only on that ref.
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 8174d27efdc13b3f611b4aedda70086f39867d73..9d27197de8f63e2e7495976af944344436e48302 100644 (file)
@@ -47,7 +47,7 @@ Only print error and warning messages; all other output will be suppressed.
 
 --bare::
 
-Create a bare repository. If GIT_DIR environment is not set, it is set to the
+Create a bare repository. If `GIT_DIR` environment is not set, it is set to the
 current working directory.
 
 --template=<template_directory>::
@@ -130,7 +130,12 @@ The template directory will be one of the following (in order):
  - the default template directory: `/usr/share/git-core/templates`.
 
 The default template directory includes some directory structure, suggested
-"exclude patterns" (see linkgit:gitignore[5]), and sample hook files (see linkgit:githooks[5]).
+"exclude patterns" (see linkgit:gitignore[5]), and sample hook files.
+
+The sample hooks are all disabled by default, To enable one of the
+sample hooks rename it by removing its `.sample` suffix.
+
+See linkgit:githooks[5] for more general info on hook execution.
 
 EXAMPLES
 --------
index cc75b2502288f74a6503b22d6a9abfdd799f97d3..e8ecdbf927ba5e7af79d3852a9a939c10052e45f 100644 (file)
@@ -80,8 +80,8 @@ You may specify configuration in your .git/config
 
 -----------------------------------------------------------------------
 
-If the configuration variable 'instaweb.browser' is not set,
-'web.browser' will be used instead if it is defined. See
+If the configuration variable `instaweb.browser` is not set,
+`web.browser` will be used instead if it is defined. See
 linkgit:git-web{litdd}browse[1] for more information about this.
 
 SEE ALSO
index a77b901f1d7b5e75c66b4c1e032f35c989614cc7..09074c75a46b148485f836e1e10d7590f98d54b6 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
 -------
@@ -219,7 +222,7 @@ Signed-off-by: Alice <alice@example.com>
 Signed-off-by: Bob <bob@example.com>
 ------------
 
-* Use the '--in-place' option to edit a message file in place:
+* Use the `--in-place` option to edit a message file in place:
 +
 ------------
 $ cat msg.txt
index 03f958029ad7a35ec29f111217cd76ba21de9b5e..32246fdb007e9b25f414cff092b9bf0426c55d15 100644 (file)
@@ -29,12 +29,14 @@ OPTIONS
        (works only for a single file).
 
 --no-decorate::
---decorate[=short|full|no]::
+--decorate[=short|full|auto|no]::
        Print out the ref names of any commits that are shown. If 'short' is
        specified, the ref name prefixes 'refs/heads/', 'refs/tags/' and
        'refs/remotes/' will not be printed. If 'full' is specified, the
-       full ref name (including prefix) will be printed. The default option
-       is 'short'.
+       full ref name (including prefix) will be printed. If 'auto' is
+       specified, then if the output is going to a terminal, the ref names
+       are shown as if 'short' were given, otherwise no ref names are
+       shown. The default option is 'short'.
 
 --source::
        Print out the ref name given on the command line by which each
@@ -196,12 +198,16 @@ log.showRoot::
        `git log -p` output would be shown without a diff attached.
        The default is `true`.
 
+log.showSignature::
+       If `true`, `git log` and related commands will act as if the
+       `--show-signature` option was passed to them.
+
 mailmap.*::
        See linkgit:git-shortlog[1].
 
 notes.displayRef::
        Which refs, in addition to the default set by `core.notesRef`
-       or 'GIT_NOTES_REF', to read notes from when showing commit
+       or `GIT_NOTES_REF`, to read notes from when showing commit
        messages with the `log` family of commands.  See
        linkgit:git-notes[1].
 +
@@ -210,7 +216,7 @@ multiple times.  A warning will be issued for refs that do not exist,
 but a glob that does not match any refs is silently ignored.
 +
 This setting can be disabled by the `--no-notes` option,
-overridden by the 'GIT_NOTES_DISPLAY_REF' environment variable,
+overridden by the `GIT_NOTES_DISPLAY_REF` environment variable,
 and overridden by the `--notes=<ref>` option.
 
 GIT
index 75c3f4157d845876a91f04f955878a3affc9bd6e..446209e2062df8d0b1c99a25eaaf4dc6f15bce3c 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
 -----------
@@ -137,6 +138,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.
@@ -159,8 +164,7 @@ not accessible in the working tree.
 +
 <eolattr> is the attribute that is used when checking out or committing,
 it is either "", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf".
-Note: Currently Git does not support "text=auto eol=lf" or "text=auto eol=crlf",
-that may change in the future.
+Since Git 2.10 "text=auto eol=lf" and "text=auto eol=crlf" are supported.
 +
 Both the <eolinfo> in the index ("i/<eolinfo>")
 and in the working tree ("w/<eolinfo>") are shown for regular files,
@@ -175,7 +179,7 @@ followed by the  ("attr/<eolattr>").
 
 Output
 ------
-'git ls-files' just outputs the filenames unless '--stage' is specified in
+'git ls-files' just outputs the filenames unless `--stage` is specified in
 which case it outputs:
 
         [<tag> ]<mode> <object> <stage> <file>
index 16e87fd6dd548d462715d394df0586bd9cb5d3ec..dbc91f98ffbee198bed7d2eeeb2758687c17adf8 100644 (file)
@@ -20,16 +20,16 @@ in the current working directory.  Note that:
 
  - the behaviour is slightly different from that of "/bin/ls" in that the
    '<path>' denotes just a list of patterns to match, e.g. so specifying
-   directory name (without '-r') will behave differently, and order of the
+   directory name (without `-r`) will behave differently, and order of the
    arguments does not matter.
 
  - the behaviour is similar to that of "/bin/ls" in that the '<path>' is
    taken as relative to the current working directory.  E.g. when you are
    in a directory 'sub' that has a directory 'dir', you can run 'git
    ls-tree -r HEAD dir' to list the contents of the tree (that is
-   'sub/dir' in 'HEAD').  You don't want to give a tree that is not at the
+   'sub/dir' in `HEAD`).  You don't want to give a tree that is not at the
    root level (e.g. `git ls-tree -r HEAD:sub dir`) in this case, as that
-   would result in asking for 'sub/sub/dir' in the 'HEAD' commit.
+   would result in asking for 'sub/sub/dir' in the `HEAD` commit.
    However, the current working directory can be ignored by passing
    --full-tree option.
 
@@ -46,7 +46,7 @@ OPTIONS
 
 -t::
        Show tree entries even when going to recurse them. Has no effect
-       if '-r' was not passed. '-d' implies '-t'.
+       if `-r` was not passed. `-d` implies `-t`.
 
 -l::
 --long::
index 0947084140f217a4e7fe1d6fa203e4d7e9a36ffe..3bbc731f67e50bdd65dd361cd9ca249ff706728f 100644 (file)
@@ -85,7 +85,7 @@ with comments and suggestions on the message you are responding to, and to
 conclude it with a patch submission, separating the discussion and the
 beginning of the proposed commit log message with a scissors line.
 +
-This can enabled by default with the configuration option mailinfo.scissors.
+This can be enabled by default with the configuration option mailinfo.scissors.
 
 --no-scissors::
        Ignore scissors lines. Useful for overriding mailinfo.scissors settings.
index 4d1b871d96177ca36e7fadd115685316292dc727..e3b2a88c4b75f1f6e23feb8a09030469468d9ca8 100644 (file)
@@ -8,7 +8,8 @@ git-mailsplit - Simple UNIX mbox splitter program
 SYNOPSIS
 --------
 [verse]
-'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] -o<directory> [--] [(<mbox>|<Maildir>)...]
+'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] [--mboxrd]
+               -o<directory> [--] [(<mbox>|<Maildir>)...]
 
 DESCRIPTION
 -----------
@@ -47,6 +48,10 @@ OPTIONS
 --keep-cr::
        Do not remove `\r` from lines ending with `\r\n`.
 
+--mboxrd::
+       Input is of the "mboxrd" format and "^>+From " line escaping is
+       reversed.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index 808426faac5b9b607810777a718113e77b836715..b968b64c380b4fbe2663da42355fc9e8fdd24679 100644 (file)
@@ -80,8 +80,8 @@ which is reachable from both 'A' and 'B' through the parent relationship.
 
 For example, with this topology:
 
-                o---o---o---B
-               /
+                o---o---o---B
+               /
        ---o---1---o---o---o---A
 
 the merge base between 'A' and 'B' is '1'.
@@ -116,11 +116,11 @@ the best common ancestor of all commits.
 When the history involves criss-cross merges, there can be more than one
 'best' common ancestor for two commits.  For example, with this topology:
 
-       ---1---o---A
-          \ /
-           X
-          / \
-       ---2---o---o---B
+       ---1---o---A
+           \ /
+            X
+           / \
+       ---2---o---o---B
 
 both '1' and '2' are merge-bases of A and B.  Neither one is better than
 the other (both are 'best' merge bases).  When the `--all` option is not given,
@@ -154,13 +154,13 @@ topic origin/master`, the history of remote-tracking branch
 `origin/master` may have been rewound and rebuilt, leading to a
 history of this shape:
 
-                        o---B1
-                       /
+                        o---B1
+                       /
        ---o---o---B2--o---o---o---B (origin/master)
-               \
-                B3
-                 \
-                  Derived (topic)
+               \
+                B3
+                 \
+                  Derived (topic)
 
 where `origin/master` used to point at commits B3, B2, B1 and now it
 points at B, and your `topic` branch was started on top of it back
index 07f7295ec8b603fcbd907e780d4ed1109ac5b358..b758d5556caaeeb0a439d67c46100e5fa0d34cd4 100644 (file)
@@ -11,6 +11,7 @@ SYNOPSIS
 [verse]
 'git merge' [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
        [-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
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 5c6ebdfad93ea87f973194b2fe31e784033dc3c6..c3616e7711aef80ee7e2bd3bb90ea5cee7dd1d4b 100644 (file)
@@ -32,7 +32,7 @@ OPTIONS
 --batch::
        Allow building of more than one tree object before exiting.  Each
        tree is separated by as single blank line. The final new-line is
-       optional.  Note - if the '-z' option is used, lines are terminated
+       optional.  Note - if the `-z` option is used, lines are terminated
        with NUL.
 
 GIT
index e4531325cd0e00000670692ee3e5a26387460d9e..79449bf98fe56b10f80a2d106dcfb7a3289da555 100644 (file)
@@ -32,10 +32,10 @@ OPTIONS
 --force::
        Force renaming or moving of a file even if the target exists
 -k::
-        Skip move or rename actions which would lead to an error
+       Skip move or rename actions which would lead to an error
        condition. An error happens when a source is neither existing nor
        controlled by Git, or when it would overwrite an existing
-        file unless '-f' is given.
+       file unless `-f` is given.
 -n::
 --dry-run::
        Do nothing; only show what would happen
index 8de349968a3be4ea7e65a4a254041b0f0fb63347..be7db3048d4776200c6ed8781b25ffccb68a41eb 100644 (file)
@@ -152,7 +152,7 @@ OPTIONS
 
 -c <object>::
 --reedit-message=<object>::
-       Like '-C', but with '-c' the editor is invoked, so that
+       Like '-C', but with `-c` the editor is invoked, so that
        the user can further edit the note message.
 
 --allow-empty::
@@ -161,7 +161,7 @@ OPTIONS
 
 --ref <ref>::
        Manipulate the notes tree in <ref>.  This overrides
-       'GIT_NOTES_REF' and the "core.notesRef" configuration.  The ref
+       `GIT_NOTES_REF` and the "core.notesRef" configuration.  The ref
        specifies the full refname when it begins with `refs/notes/`; when it
        begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed
        to form a full name of the ref.
@@ -333,10 +333,10 @@ notes.<name>.mergeStrategy::
 notes.displayRef::
        Which ref (or refs, if a glob or specified more than once), in
        addition to the default set by `core.notesRef` or
-       'GIT_NOTES_REF', to read notes from when showing commit
+       `GIT_NOTES_REF`, to read notes from when showing commit
        messages with the 'git log' family of commands.
        This setting can be overridden on the command line or by the
-       'GIT_NOTES_DISPLAY_REF' environment variable.
+       `GIT_NOTES_DISPLAY_REF` environment variable.
        See linkgit:git-log[1].
 
 notes.rewrite.<command>::
@@ -345,7 +345,7 @@ notes.rewrite.<command>::
        notes from the original to the rewritten commit.  Defaults to
        `true`.  See also "`notes.rewriteRef`" below.
 +
-This setting can be overridden by the 'GIT_NOTES_REWRITE_REF'
+This setting can be overridden by the `GIT_NOTES_REWRITE_REF`
 environment variable.
 
 notes.rewriteMode::
@@ -366,33 +366,33 @@ notes.rewriteRef::
 Does not have a default value; you must configure this variable to
 enable note rewriting.
 +
-Can be overridden with the 'GIT_NOTES_REWRITE_REF' environment variable.
+Can be overridden with the `GIT_NOTES_REWRITE_REF` environment variable.
 
 
 ENVIRONMENT
 -----------
 
-'GIT_NOTES_REF'::
+`GIT_NOTES_REF`::
        Which ref to manipulate notes from, instead of `refs/notes/commits`.
        This overrides the `core.notesRef` setting.
 
-'GIT_NOTES_DISPLAY_REF'::
+`GIT_NOTES_DISPLAY_REF`::
        Colon-delimited list of refs or globs indicating which refs,
        in addition to the default from `core.notesRef` or
-       'GIT_NOTES_REF', to read notes from when showing commit
+       `GIT_NOTES_REF`, to read notes from when showing commit
        messages.
        This overrides the `notes.displayRef` setting.
 +
 A warning will be issued for refs that do not exist, but a glob that
 does not match any refs is silently ignored.
 
-'GIT_NOTES_REWRITE_MODE'::
+`GIT_NOTES_REWRITE_MODE`::
        When copying notes during a rewrite, what to do if the target
        commit already has a note.
        Must be one of `overwrite`, `concatenate`, `cat_sort_uniq`, or `ignore`.
        This overrides the `core.rewriteMode` setting.
 
-'GIT_NOTES_REWRITE_REF'::
+`GIT_NOTES_REWRITE_REF`::
        When rewriting commits, which notes to copy from the original
        to the rewritten commit.  Must be a colon-delimited list of
        refs or globs.
@@ -402,4 +402,4 @@ on the `notes.rewrite.<command>` and `notes.rewriteRef` settings.
 
 GIT
 ---
-Part of the linkgit:git[7] suite
+Part of the linkgit:git[1] suite
index 35e31709181d42f2e20bb2e818601628c03b7168..c83aaf39c33505ead72d523f278620fcc6f8f757 100644 (file)
@@ -104,7 +104,7 @@ $ git p4 sync //path/in/your/perforce/depot
 ------------
 This imports the specified depot into
 'refs/remotes/p4/master' in an existing Git repository.  The
-'--branch' option can be used to specify a different branch to
+`--branch` option can be used to specify a different branch to
 be used for the p4 content.
 
 If a Git repository includes branches 'refs/remotes/origin/p4', these
@@ -114,7 +114,7 @@ from a Git remote, this can be useful in a multi-developer environment.
 
 If there are multiple branches, doing 'git p4 sync' will automatically
 use the "BRANCH DETECTION" algorithm to try to partition new changes
-into the right branch.  This can be overridden with the '--branch'
+into the right branch.  This can be overridden with the `--branch`
 option to specify just a single branch to update.
 
 
@@ -134,7 +134,7 @@ Submit
 ~~~~~~
 Submitting changes from a Git repository back to the p4 repository
 requires a separate p4 client workspace.  This should be specified
-using the 'P4CLIENT' environment variable or the Git configuration
+using the `P4CLIENT` environment variable or the Git configuration
 variable 'git-p4.client'.  The p4 client must exist, but the client root
 will be created and populated if it does not already exist.
 
@@ -150,10 +150,10 @@ $ git p4 submit topicbranch
 ------------
 
 The upstream reference is generally 'refs/remotes/p4/master', but can
-be overridden using the '--origin=' command-line option.
+be overridden using the `--origin=` command-line option.
 
 The p4 changes will be created as the user invoking 'git p4 submit'. The
-'--preserve-user' option will cause ownership to be modified
+`--preserve-user` option will cause ownership to be modified
 according to the author of the Git commit.  This option requires admin
 privileges in p4, which can be granted using 'p4 protect'.
 
@@ -166,7 +166,7 @@ General options
 All commands except clone accept these options.
 
 --git-dir <dir>::
-       Set the 'GIT_DIR' environment variable.  See linkgit:git[1].
+       Set the `GIT_DIR` environment variable.  See linkgit:git[1].
 
 -v::
 --verbose::
@@ -221,7 +221,7 @@ Git repository:
        where they will be treated as remote-tracking branches by
        linkgit:git-branch[1] and other commands.  This option instead
        puts p4 branches in 'refs/heads/p4/'.  Note that future
-       sync operations must specify '--import-local' as well so that
+       sync operations must specify `--import-local` as well so that
        they can find the p4 branches in refs/heads.
 
 --max-changes <n>::
@@ -245,7 +245,7 @@ Git repository:
        default, involves removing the entire depot path.  With this
        option, the full p4 depot path is retained in Git.  For example,
        path '//depot/main/foo/bar.c', when imported from
-       '//depot/main/', becomes 'foo/bar.c'.  With '--keep-path', the
+       '//depot/main/', becomes 'foo/bar.c'.  With `--keep-path`, the
        Git path is instead 'depot/main/foo/bar.c'.
 
 --use-client-spec::
@@ -275,7 +275,7 @@ These options can be used to modify 'git p4 submit' behavior.
 --origin <commit>::
        Upstream location from which commits are identified to submit to
        p4.  By default, this is the most recent p4 commit reachable
-       from 'HEAD'.
+       from `HEAD`.
 
 -M::
        Detect renames.  See linkgit:git-diff[1].  Renames will be
@@ -341,7 +341,7 @@ p4 revision specifier on the end:
     Import all changes from both named depot paths into a single
     repository.  Only files below these directories are included.
     There is not a subdirectory in Git for each "proj1" and "proj2".
-    You must use the '--destination' option when specifying more
+    You must use the `--destination` option when specifying more
     than one depot path.  The revision specifier must be specified
     identically on each depot path.  If there are files in the
     depot paths with the same name, the path with the most recently
@@ -355,7 +355,7 @@ CLIENT SPEC
 The p4 client specification is maintained with the 'p4 client' command
 and contains among other fields, a View that specifies how the depot
 is mapped into the client repository.  The 'clone' and 'sync' commands
-can consult the client spec when given the '--use-client-spec' option or
+can consult the client spec when given the `--use-client-spec` option or
 when the useClientSpec variable is true.  After 'git p4 clone', the
 useClientSpec variable is automatically set in the repository
 configuration file.  This allows future 'git p4 submit' commands to
@@ -390,7 +390,7 @@ different areas in the tree, and indicate related content.  'git p4'
 can use these mappings to determine branch relationships.
 
 If you have a repository where all the branches of interest exist as
-subdirectories of a single depot path, you can use '--detect-branches'
+subdirectories of a single depot path, you can use `--detect-branches`
 when cloning or syncing to have 'git p4' automatically find
 subdirectories in p4, and to generate these as branches in Git.
 
@@ -507,7 +507,7 @@ git-p4.labelImportRegexp::
 git-p4.useClientSpec::
        Specify that the p4 client spec should be used to identify p4
        depot paths of interest.  This is equivalent to specifying the
-       option '--use-client-spec'.  See the "CLIENT SPEC" section above.
+       option `--use-client-spec`.  See the "CLIENT SPEC" section above.
        This variable is a boolean, not the name of a p4 client.
 
 git-p4.pathEncoding::
@@ -551,6 +551,17 @@ git-p4.keepEmptyCommits::
        A changelist that contains only excluded files will be imported
        as an empty commit if this boolean option is set to true.
 
+git-p4.mapUser::
+       Map a P4 user to a name and email address in Git. Use a string
+       with the following format to create a mapping:
++
+-------------
+git config --add git-p4.mapUser "p4user = First Last <mail@address.com>"
+-------------
++
+A mapping will override any user information from P4. Mappings for
+multiple P4 user can be defined.
+
 Submit variables
 ~~~~~~~~~~~~~~~~
 git-p4.detectRenames::
index bbea5294ca9680dd7efee9caeea861711dafc3a5..8973510a41c1e31319dad85d4987b3f0dfd7d8ca 100644 (file)
@@ -104,13 +104,14 @@ base-name::
        out of memory with a large window, but still be able to take
        advantage of the large window for the smaller objects.  The
        size can be suffixed with "k", "m", or "g".
-       `--window-memory=0` makes memory usage unlimited, which is the
-       default.
+       `--window-memory=0` makes memory usage unlimited.  The default
+       is taken from the `pack.windowMemory` configuration variable.
 
 --max-pack-size=<n>::
        Maximum size of each output pack file. The size can be suffixed with
        "k", "m", or "g". The minimum size allowed is limited to 1 MiB.
-       If specified,  multiple packfiles may be created.
+       If specified, multiple packfiles may be created, which also
+       prevents the creation of a bitmap index.
        The default is unlimited, unless the config variable
        `pack.packSizeLimit` is set.
 
index a62a2a615d0e0146d538213571d7f41bd02488cf..d033b258e5ee7c6e16c7d96c6339282a849b1b02 100644 (file)
@@ -128,6 +128,15 @@ unless you have read linkgit:git-rebase[1] carefully.
 --no-rebase::
        Override earlier --rebase.
 
+--autostash::
+--no-autostash::
+       Before starting rebase, stash local modifications away (see
+       linkgit:git-stash[1]) if needed, and apply the stash when
+       done. `--no-autostash` is useful to override the `rebase.autoStash`
+       configuration variable (see linkgit:git-config[1]).
++
+This option is only valid when "--rebase" is used.
+
 Options related to fetching
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index cf6ee4a4df5f91f585591c314854ed1a332d8909..47b77e693bca1675a4887bddb5147077d60805a0 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 [verse]
 'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
           [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
-          [-u | --set-upstream]
+          [-u | --set-upstream] [--push-option=<string>]
           [--[no-]signed|--sign=(true|false|if-asked)]
           [--force-with-lease[=<refname>[:<expect>]]]
           [--no-verify] [<repository> [<refspec>...]]
@@ -137,8 +137,8 @@ already exists on the remote side.
        and also push annotated tags in `refs/tags` that are missing
        from the remote but are pointing at commit-ish that are
        reachable from the refs being pushed.  This can also be specified
-       with configuration variable 'push.followTags'.  For more
-       information, see 'push.followTags' in linkgit:git-config[1].
+       with configuration variable `push.followTags`.  For more
+       information, see `push.followTags` in linkgit:git-config[1].
 
 --[no-]signed::
 --sign=(true|false|if-asked)::
@@ -156,6 +156,12 @@ already exists on the remote side.
        Either all refs are updated, or on error, no refs are updated.
        If the server does not support atomic pushes the push will fail.
 
+-o::
+--push-option::
+       Transmit the given string to the server, which passes them to
+       the pre-receive as well as the post-receive hook. The given string
+       must not contain a NUL or LF character.
+
 --receive-pack=<git-receive-pack>::
 --exec=<git-receive-pack>::
        Path to the 'git-receive-pack' program on the remote
@@ -198,10 +204,11 @@ branch we have for it.
 +
 `--force-with-lease=<refname>:<expect>` will protect the named ref (alone),
 if it is going to be updated, by requiring its current value to be
-the same as the specified value <expect> (which is allowed to be
+the same as the specified value `<expect>` (which is allowed to be
 different from the remote-tracking branch we have for the refname,
 or we do not even have to have such a remote-tracking branch when
-this form is used).
+this form is used).  If `<expect>` is the empty string, then the named ref
+must not already exist.
 +
 Note that all forms other than `--force-with-lease=<refname>:<expect>`
 that specifies the expected current value of the ref explicitly are
@@ -240,7 +247,7 @@ origin +master` to force a push to the `master` branch). See the
        For every branch that is up to date or successfully pushed, add
        upstream (tracking) reference, used by argument-less
        linkgit:git-pull[1] and other commands. For more information,
-       see 'branch.<name>.merge' in linkgit:git-config[1].
+       see `branch.<name>.merge` in linkgit:git-config[1].
 
 --[no-]thin::
        These options are passed to linkgit:git-send-pack[1]. A thin transfer
@@ -275,7 +282,7 @@ origin +master` to force a push to the `master` branch). See the
        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
+       'no' or using `--no-recurse-submodules` can be used to override the
        push.recurseSubmodules configuration variable when no submodule
        recursion is required.
 
index ff633b0db7d54d8db12c4af248fc2bd3939b6f9c..8cf952b4de669ea3e7275c5d10087005548574eb 100644 (file)
@@ -46,14 +46,14 @@ OPTIONS
        The directory to find the quilt patches.
 +
 The default for the patch directory is patches
-or the value of the $QUILT_PATCHES environment
+or the value of the `$QUILT_PATCHES` environment
 variable.
 
 --series <file>::
        The quilt series file.
 +
 The default for the series file is <patches>/series
-or the value of the $QUILT_SERIES environment
+or the value of the `$QUILT_SERIES` environment
 variable.
 
 GIT
index 6ed610a031eeec7320adbbb4a627dc4997499e56..de222c81af98c96678841f258342fe2cc3c426a8 100644 (file)
@@ -208,10 +208,10 @@ rebase.stat::
        rebase. False by default.
 
 rebase.autoSquash::
-       If set to true enable '--autosquash' option by default.
+       If set to true enable `--autosquash` option by default.
 
 rebase.autoStash::
-       If set to true enable '--autostash' option by default.
+       If set to true enable `--autostash` option by default.
 
 rebase.missingCommitsCheck::
        If set to "warn", print warnings about removed commits in
@@ -220,7 +220,7 @@ rebase.missingCommitsCheck::
        done. "ignore" by default.
 
 rebase.instructionFormat::
-       Custom commit list format to use during an '--interactive' rebase.
+       Custom commit list format to use during an `--interactive` rebase.
 
 OPTIONS
 -------
@@ -391,9 +391,6 @@ idea unless you know what you are doing (see BUGS below).
        final history. <cmd> will be interpreted as one or more shell
        commands.
 +
-This option can only be used with the `--interactive` option
-(see INTERACTIVE MODE below).
-+
 You may execute several commands by either using one instance of `--exec`
 with several commands:
 +
@@ -406,6 +403,9 @@ or by giving more than one `--exec`:
 If `--autosquash` is used, "exec" lines will not be appended for
 the intermediate commits, and will only appear at the end of each
 squash/fixup series.
++
+This uses the `--interactive` machinery internally, but it can be run
+without an explicit `--interactive`.
 
 --root::
        Rebase all commits reachable from <branch>, instead of
@@ -428,9 +428,9 @@ squash/fixup series.
        "fixup! " or "squash! " after the first, in case you referred to an
        earlier fixup/squash with `git commit --fixup/--squash`.
 +
-This option is only valid when the '--interactive' option is used.
+This option is only valid when the `--interactive` option is used.
 +
-If the '--autosquash' option is enabled by default using the
+If the `--autosquash` option is enabled by default using the
 configuration variable `rebase.autoSquash`, this option can be
 used to override and disable this setting.
 
index 000ee8dba2ab3069e0459defe3df9d7140541a59..0ccd5fbc781deb3adcca4d28ec8a4ed0d9db9977 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>::
index e700bafa473007e42d8f0af8d35d15841e6e3988..80afca866c0f819ca4b66a9c8a311859e875ffa8 100644 (file)
@@ -17,7 +17,7 @@ fetch, push or archive.
 
 If only <infd> is given, it is assumed to be a bidirectional socket connected
 to remote Git server (git-upload-pack, git-receive-pack or
-git-upload-achive). If both <infd> and <outfd> are given, they are assumed
+git-upload-archive). If both <infd> and <outfd> are given, they are assumed
 to be pipes connected to a remote Git server (<infd> being the inbound pipe
 and <outfd> being the outbound pipe.
 
index 1d7eceaa9355bd4651bda867c998fe66ae069d1a..577b969c1bda2bfd95fd28e3ffc4bbbc96c5d16c 100644 (file)
@@ -137,9 +137,9 @@ branches, adds to that list.
 Retrieves the URLs for a remote. Configurations for `insteadOf` and
 `pushInsteadOf` are expanded here. By default, only the first URL is listed.
 +
-With '--push', push URLs are queried rather than fetch URLs.
+With `--push`, push URLs are queried rather than fetch URLs.
 +
-With '--all', all URLs for the remote will be listed.
+With `--all`, all URLs for the remote will be listed.
 
 'set-url'::
 
@@ -147,11 +147,11 @@ Changes URLs for the remote. Sets first URL for remote <name> that matches
 regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If
 <oldurl> doesn't match any URL, an error occurs and nothing is changed.
 +
-With '--push', push URLs are manipulated instead of fetch URLs.
+With `--push`, push URLs are manipulated instead of fetch URLs.
 +
-With '--add', instead of changing existing URLs, new URL is added.
+With `--add`, instead of changing existing URLs, new URL is added.
 +
-With '--delete', instead of changing existing URLs, all URLs matching
+With `--delete`, instead of changing existing URLs, all URLs matching
 regex <url> are deleted for remote <name>.  Trying to delete all
 non-push URLs is an error.
 +
index af230d06475eedf99ee4a27eab5f1cc204f71aa1..26afe6ed549002f83296e76d8be6502332bc7edf 100644 (file)
@@ -33,7 +33,7 @@ OPTIONS
        pack everything referenced into a single pack.
        Especially useful when packing a repository that is used
        for private development. Use
-       with '-d'.  This will clean up the objects that `git prune`
+       with `-d`.  This will clean up the objects that `git prune`
        leaves behind, but `git fsck --full --dangling` shows as
        dangling.
 +
@@ -42,7 +42,7 @@ whole new pack in order to get any contained object, no matter how many
 other objects in that pack they already have locally.
 
 -A::
-       Same as `-a`, unless '-d' is used.  Then any unreachable
+       Same as `-a`, unless `-d` is used.  Then any unreachable
        objects in a previous pack become loose, unpacked objects,
        instead of being left in the old pack.  Unreachable objects
        are never intentionally added to a pack, even when repacking.
@@ -100,13 +100,16 @@ other objects in that pack they already have locally.
        out of memory with a large window, but still be able to take
        advantage of the large window for the smaller objects.  The
        size can be suffixed with "k", "m", or "g".
-       `--window-memory=0` makes memory usage unlimited, which is the
-       default.
+       `--window-memory=0` makes memory usage unlimited.  The default
+       is taken from the `pack.windowMemory` configuration variable.
+       Note that the actual memory usage will be the limit multiplied
+       by the number of threads used by linkgit:git-pack-objects[1].
 
 --max-pack-size=<n>::
        Maximum size of each output pack file. The size can be suffixed with
        "k", "m", or "g". The minimum size allowed is limited to 1 MiB.
-       If specified,  multiple packfiles may be created.
+       If specified, multiple packfiles may be created, which also
+       prevents the creation of a bitmap index.
        The default is unlimited, unless the config variable
        `pack.packSizeLimit` is set.
 
@@ -115,7 +118,8 @@ other objects in that pack they already have locally.
        Write a reachability bitmap index as part of the repack. This
        only makes sense when used with `-a` or `-A`, as the bitmaps
        must be able to refer to all reachable objects. This option
-       overrides the setting of `pack.writeBitmaps`.
+       overrides the setting of `repack.writeBitmaps`.  This option
+       has no effect if multiple packfiles are created.
 
 --pack-kept-objects::
        Include objects in `.keep` files when repacking.  Note that we
@@ -123,9 +127,22 @@ other objects in that pack they already have locally.
        This means that we may duplicate objects, but this makes the
        option safe to use when there are concurrent pushes or fetches.
        This option is generally only useful if you are writing bitmaps
-       with `-b` or `pack.writeBitmaps`, as it ensures that the
+       with `-b` or `repack.writeBitmaps`, as it ensures that the
        bitmapped packfile has the necessary objects.
 
+--unpack-unreachable=<when>::
+       When loosening unreachable objects, do not bother loosening any
+       objects older than `<when>`. This can be used to optimize out
+       the write of any objects that would be immediately pruned by
+       a follow-up `git prune`.
+
+-k::
+--keep-unreachable::
+       When used with `-ad`, any unreachable objects from existing
+       packs will be appended to the end of the packfile instead of
+       being removed. In addition, any unreachable loose objects will
+       be packed (and their loose counterparts removed).
+
 Configuration
 -------------
 
index 8fff598fd6e86c3e4a3e30e3c41f1c63ffb6a212..e5c57ae6ef4afd71944e23f895e9a0f354eaf6b1 100644 (file)
@@ -51,7 +51,7 @@ $ git cat-file commit foo
 
 shows information about commit 'bar'.
 
-The 'GIT_NO_REPLACE_OBJECTS' environment variable can be set to
+The `GIT_NO_REPLACE_OBJECTS` environment variable can be set to
 achieve the same effect as the `--no-replace-objects` option.
 
 OPTIONS
index 573616a04aec4ca5a768f0b26470489955bbf505..837707a8fdb1760f224cc777f6b2b833a6b90a79 100644 (file)
@@ -24,7 +24,7 @@ from the HEAD commit).
 Note: 'git revert' is used to record some new commits to reverse the
 effect of some earlier commits (often only a faulty one).  If you want to
 throw away all uncommitted changes in your working directory, you
-should see linkgit:git-reset[1], particularly the '--hard' option.  If
+should see linkgit:git-reset[1], particularly the `--hard` option.  If
 you want to extract specific files as they were in another commit, you
 should see linkgit:git-checkout[1], specifically the `git checkout
 <commit> -- <filename>` syntax.  Take care with these alternatives as
@@ -37,7 +37,7 @@ OPTIONS
        For a more complete list of ways to spell commit names, see
        linkgit:gitrevisions[7].
        Sets of commits can also be given but no traversal is done by
-       default, see linkgit:git-rev-list[1] and its '--no-walk'
+       default, see linkgit:git-rev-list[1] and its `--no-walk`
        option.
 
 -e::
index 771a7b5b09157cc1ac19d1f998600f96f1f9a470..642d0ef199c72160ca74238122fafdbdfee9a0c7 100644 (file)
@@ -47,18 +47,18 @@ Composing
 
 --annotate::
        Review and edit each patch you're about to send. Default is the value
-       of 'sendemail.annotate'. See the CONFIGURATION section for
-       'sendemail.multiEdit'.
+       of `sendemail.annotate`. See the CONFIGURATION section for
+       `sendemail.multiEdit`.
 
 --bcc=<address>,...::
        Specify a "Bcc:" value for each email. Default is the value of
-       'sendemail.bcc'.
+       `sendemail.bcc`.
 +
 This option may be specified multiple times.
 
 --cc=<address>,...::
        Specify a starting "Cc:" value for each email.
-       Default is the value of 'sendemail.cc'.
+       Default is the value of `sendemail.cc`.
 +
 This option may be specified multiple times.
 
@@ -66,7 +66,7 @@ This option may be specified multiple times.
        Invoke a text editor (see GIT_EDITOR in linkgit:git-var[1])
        to edit an introductory message for the patch series.
 +
-When '--compose' is used, git send-email will use the From, Subject, and
+When `--compose` is used, git send-email will use the From, Subject, and
 In-Reply-To headers specified in the message. If the body of the message
 (what you type after the headers and a blank line) only contains blank
 (or Git: prefixed) lines, the summary won't be sent, but From, Subject,
@@ -74,12 +74,12 @@ and In-Reply-To headers will be used unless they are removed.
 +
 Missing From or In-Reply-To headers will be prompted for.
 +
-See the CONFIGURATION section for 'sendemail.multiEdit'.
+See the CONFIGURATION section for `sendemail.multiEdit`.
 
 --from=<address>::
        Specify the sender of the emails.  If not specified on the command line,
-       the value of the 'sendemail.from' configuration option is used.  If
-       neither the command-line option nor 'sendemail.from' are set, then the
+       the value of the `sendemail.from` configuration option is used.  If
+       neither the command-line option nor `sendemail.from` are set, then the
        user will be prompted for the value.  The default for the prompt will be
        the value of GIT_AUTHOR_IDENT, or GIT_COMMITTER_IDENT if that is not
        set, as returned by "git var -l".
@@ -114,7 +114,7 @@ is not set, this will be prompted for.
 --to=<address>,...::
        Specify the primary recipient of the emails generated. Generally, this
        will be the upstream maintainer of the project involved. Default is the
-       value of the 'sendemail.to' configuration value; if that is unspecified,
+       value of the `sendemail.to` configuration value; if that is unspecified,
        and --to-cmd is not specified, this will be prompted for.
 +
 This option may be specified multiple times.
@@ -138,7 +138,7 @@ Note that no attempts whatsoever are made to validate the encoding.
        can be useful when the repository contains files that contain carriage
        returns, but makes the raw patch email file (as saved from a MUA) much
        harder to inspect manually.  base64 is even more fool proof, but also
-       even more opaque.  Default is the value of the 'sendemail.transferEncoding'
+       even more opaque.  Default is the value of the `sendemail.transferEncoding`
        configuration value; if that is unspecified, git will use 8bit and not
        add a Content-Transfer-Encoding header.
 
@@ -157,20 +157,20 @@ Sending
        subscribed to a list. In order to use the 'From' address, set the
        value to "auto". If you use the sendmail binary, you must have
        suitable privileges for the -f parameter.  Default is the value of the
-       'sendemail.envelopeSender' configuration variable; if that is
+       `sendemail.envelopeSender` configuration variable; if that is
        unspecified, choosing the envelope sender is left to your MTA.
 
 --smtp-encryption=<encryption>::
        Specify the encryption to use, either 'ssl' or 'tls'.  Any other
        value reverts to plain SMTP.  Default is the value of
-       'sendemail.smtpEncryption'.
+       `sendemail.smtpEncryption`.
 
 --smtp-domain=<FQDN>::
        Specifies the Fully Qualified Domain Name (FQDN) used in the
        HELO/EHLO command to the SMTP server.  Some servers require the
        FQDN to match your IP address.  If not set, git send-email attempts
        to determine your FQDN automatically.  Default is the value of
-       'sendemail.smtpDomain'.
+       `sendemail.smtpDomain`.
 
 --smtp-auth=<mechanisms>::
        Whitespace-separated list of allowed SMTP-AUTH mechanisms. This setting
@@ -182,19 +182,19 @@ $ git send-email --smtp-auth="PLAIN LOGIN GSSAPI" ...
 +
 If at least one of the specified mechanisms matches the ones advertised by the
 SMTP server and if it is supported by the utilized SASL library, the mechanism
-is used for authentication. If neither 'sendemail.smtpAuth' nor '--smtp-auth'
+is used for authentication. If neither 'sendemail.smtpAuth' nor `--smtp-auth`
 is specified, all mechanisms supported by the SASL library can be used.
 
 --smtp-pass[=<password>]::
        Password for SMTP-AUTH. The argument is optional: If no
        argument is specified, then the empty string is used as
-       the password. Default is the value of 'sendemail.smtpPass',
-       however '--smtp-pass' always overrides this value.
+       the password. Default is the value of `sendemail.smtpPass`,
+       however `--smtp-pass` always overrides this value.
 +
 Furthermore, passwords need not be specified in configuration files
 or on the command line. If a username has been specified (with
-'--smtp-user' or a 'sendemail.smtpUser'), but no password has been
-specified (with '--smtp-pass' or 'sendemail.smtpPass'), then
+`--smtp-user` or a `sendemail.smtpUser`), but no password has been
+specified (with `--smtp-pass` or `sendemail.smtpPass`), then
 a password is obtained using 'git-credential'.
 
 --smtp-server=<host>::
@@ -202,7 +202,7 @@ a password is obtained using 'git-credential'.
        `smtp.example.com` or a raw IP address).  Alternatively it can
        specify a full pathname of a sendmail-like program instead;
        the program must support the `-i` option.  Default value can
-       be specified by the 'sendemail.smtpServer' configuration
+       be specified by the `sendemail.smtpServer` configuration
        option; the built-in default is `/usr/sbin/sendmail` or
        `/usr/lib/sendmail` if such program is available, or
        `localhost` otherwise.
@@ -213,11 +213,11 @@ a password is obtained using 'git-credential'.
        submission port 587, or the common SSL smtp port 465);
        symbolic port names (e.g. "submission" instead of 587)
        are also accepted. The port can also be set with the
-       'sendemail.smtpServerPort' configuration variable.
+       `sendemail.smtpServerPort` configuration variable.
 
 --smtp-server-option=<option>::
        If set, specifies the outgoing SMTP server option to use.
-       Default value can be specified by the 'sendemail.smtpServerOption'
+       Default value can be specified by the `sendemail.smtpServerOption`
        configuration option.
 +
 The --smtp-server-option option must be repeated for each option you want
@@ -234,13 +234,13 @@ must be used for each option.
        certificates concatenated together: see verify(1) -CAfile and
        -CApath for more information on these). Set it to an empty string
        to disable certificate verification. Defaults to the value of the
-       'sendemail.smtpsslcertpath' configuration variable, if set, or the
+       `sendemail.smtpsslcertpath` configuration variable, if set, or the
        backing SSL library's compiled-in default otherwise (which should
        be the best choice on most platforms).
 
 --smtp-user=<user>::
-       Username for SMTP-AUTH. Default is the value of 'sendemail.smtpUser';
-       if a username is not specified (with '--smtp-user' or 'sendemail.smtpUser'),
+       Username for SMTP-AUTH. Default is the value of `sendemail.smtpUser`;
+       if a username is not specified (with `--smtp-user` or `sendemail.smtpUser`),
        then authentication is not attempted.
 
 --smtp-debug=0|1::
@@ -261,25 +261,25 @@ Automating
        Specify a command to execute once per patch file which
        should generate patch file specific "Cc:" entries.
        Output of this command must be single email address per line.
-       Default is the value of 'sendemail.ccCmd' configuration value.
+       Default is the value of `sendemail.ccCmd` configuration value.
 
 --[no-]chain-reply-to::
        If this is set, each email will be sent as a reply to the previous
        email sent.  If disabled with "--no-chain-reply-to", all emails after
        the first will be sent as replies to the first email sent.  When using
        this, it is recommended that the first file given be an overview of the
-       entire patch series. Disabled by default, but the 'sendemail.chainReplyTo'
+       entire patch series. Disabled by default, but the `sendemail.chainReplyTo`
        configuration variable can be used to enable it.
 
 --identity=<identity>::
        A configuration identity. When given, causes values in the
        'sendemail.<identity>' subsection to take precedence over
        values in the 'sendemail' section. The default identity is
-       the value of 'sendemail.identity'.
+       the value of `sendemail.identity`.
 
 --[no-]signed-off-by-cc::
        If this is set, add emails found in Signed-off-by: or Cc: lines to the
-       cc list. Default is the value of 'sendemail.signedoffbycc' configuration
+       cc list. Default is the value of `sendemail.signedoffbycc` configuration
        value; if that is unspecified, default to --signed-off-by-cc.
 
 --[no-]cc-cover::
@@ -312,13 +312,13 @@ Automating
 - 'all' will suppress all auto cc values.
 --
 +
-Default is the value of 'sendemail.suppresscc' configuration value; if
+Default is the value of `sendemail.suppresscc` configuration value; if
 that is unspecified, default to 'self' if --suppress-from is
 specified, as well as 'body' if --no-signed-off-cc is specified.
 
 --[no-]suppress-from::
        If this is set, do not add the From: address to the cc: list.
-       Default is the value of 'sendemail.suppressFrom' configuration
+       Default is the value of `sendemail.suppressFrom` configuration
        value; if that is unspecified, default to --no-suppress-from.
 
 --[no-]thread::
@@ -330,7 +330,7 @@ specified, as well as 'body' if --no-signed-off-cc is specified.
 +
 If disabled with "--no-thread", those headers will not be added
 (unless specified with --in-reply-to).  Default is the value of the
-'sendemail.thread' configuration value; if that is unspecified,
+`sendemail.thread` configuration value; if that is unspecified,
 default to --thread.
 +
 It is up to the user to ensure that no In-Reply-To header already
@@ -355,7 +355,7 @@ Administering
 - 'auto' is equivalent to 'cc' + 'compose'
 --
 +
-Default is the value of 'sendemail.confirm' configuration value; if that
+Default is the value of `sendemail.confirm` configuration value; if that
 is unspecified, default to 'auto' unless any of the suppress options
 have been specified, in which case default to 'compose'.
 
@@ -364,8 +364,8 @@ have been specified, in which case default to 'compose'.
 
 --[no-]format-patch::
        When an argument may be understood either as a reference or as a file name,
-       choose to understand it as a format-patch argument ('--format-patch')
-       or as a file name ('--no-format-patch'). By default, when such a conflict
+       choose to understand it as a format-patch argument (`--format-patch`)
+       or as a file name (`--no-format-patch`). By default, when such a conflict
        occurs, git send-email will fail.
 
 --quiet::
@@ -381,8 +381,8 @@ have been specified, in which case default to 'compose'.
                        is due to SMTP limits as described by http://www.ietf.org/rfc/rfc2821.txt.
 --
 +
-Default is the value of 'sendemail.validate'; if this is not set,
-default to '--validate'.
+Default is the value of `sendemail.validate`; if this is not set,
+default to `--validate`.
 
 --force::
        Send emails even if safety checks would prevent it.
@@ -403,7 +403,7 @@ CONFIGURATION
 
 sendemail.aliasesFile::
        To avoid typing long email addresses, point this to one or more
-       email aliases files.  You must also supply 'sendemail.aliasFileType'.
+       email aliases files.  You must also supply `sendemail.aliasFileType`.
 
 sendemail.aliasFileType::
        Format of the file(s) specified in sendemail.aliasesFile. Must be
@@ -428,13 +428,13 @@ sendmail;;
 
 sendemail.multiEdit::
        If true (default), a single editor instance will be spawned to edit
-       files you have to edit (patches when '--annotate' is used, and the
-       summary when '--compose' is used). If false, files will be edited one
+       files you have to edit (patches when `--annotate` is used, and the
+       summary when `--compose` is used). If false, files will be edited one
        after the other, spawning a new editor each time.
 
 sendemail.confirm::
        Sets the default for whether to confirm before sending. Must be
-       one of 'always', 'never', 'cc', 'compose', or 'auto'. See '--confirm'
+       one of 'always', 'never', 'cc', 'compose', or 'auto'. See `--confirm`
        in the previous section for the meaning of these values.
 
 EXAMPLE
@@ -450,6 +450,19 @@ edit ~/.gitconfig to specify your account settings:
                smtpUser = yourname@gmail.com
                smtpServerPort = 587
 
+If you have multifactor authentication setup on your gmail account, you will
+need to generate an app-specific password for use with 'git send-email'. Visit
+https://security.google.com/settings/security/apppasswords to setup an
+app-specific password.  Once setup, you can store it with the credentials
+helper:
+
+       $ git credential fill
+       protocol=smtp
+       host=smtp.gmail.com
+       username=youname@gmail.com
+       password=app-password
+
+
 Once your commits are ready to be sent to the mailing list, run the
 following commands:
 
index 6aa91e830cbb033635d8c875e0ea5f8f487c7af4..a831dd0288306d3355bb5607bc6f36229563c8f7 100644 (file)
@@ -44,7 +44,7 @@ OPTIONS
        option, then the refs from stdin are processed after those
        on the command line.
 +
-If '--stateless-rpc' is specified together with this option then
+If `--stateless-rpc` is specified together with this option then
 the list of refs must be in packet format (pkt-line). Each ref must
 be in a separate packet, and the list must end with a flush packet.
 
@@ -99,11 +99,11 @@ Specifying the Refs
 There are three ways to specify which refs to update on the
 remote end.
 
-With '--all' flag, all refs that exist locally are transferred to
+With `--all` flag, all refs that exist locally are transferred to
 the remote side.  You cannot specify any '<ref>' if you use
 this flag.
 
-Without '--all' and without any '<ref>', the heads that exist
+Without `--all` and without any '<ref>', the heads that exist
 both on the local side and on the remote side are updated.
 
 When one or more '<ref>' are specified explicitly (whether on the
@@ -134,13 +134,13 @@ name. See linkgit:git-rev-parse[1].
      exist in the set of remote refs; the ref matched <src>
      locally is used as the name of the destination.
 
-Without '--force', the <src> ref is stored at the remote only if
+Without `--force`, the <src> ref is stored at the remote only if
 <dst> does not exist, or <dst> is a proper subset (i.e. an
 ancestor) of <src>.  This check, known as "fast-forward check",
 is performed in order to avoid accidentally overwriting the
 remote ref and lose other peoples' commits from there.
 
-With '--force', the fast-forward check is disabled for all refs.
+With `--force`, the fast-forward check is disabled for all refs.
 
 Optionally, a <ref> parameter can be prefixed with a plus '+' sign
 to disable the fast-forward check only on that ref.
index 4f67c4cde679cf03e8cc43ac0630a45b5e68aa2d..8632612c31d07818659ff4f68ee567c789e5cd48 100644 (file)
@@ -41,7 +41,7 @@ usage::
        die with the usage message.
 
 set_reflog_action::
-       Set GIT_REFLOG_ACTION environment to a given string (typically
+       Set `GIT_REFLOG_ACTION` environment to a given string (typically
        the name of the program) unless it is already set.  Whenever
        the script runs a `git` command that updates refs, a reflog
        entry is created using the value of this string to leave the
index e4bdd2235ca4ea9b853e1b568203411da1cc3b84..2e30a3e42d4e4e2bab580b0dcb5701ca3b33aeed 100644 (file)
@@ -24,7 +24,7 @@ named `git-shell-commands` in the user's home directory.
 COMMANDS
 --------
 
-'git shell' accepts the following commands after the '-c' option:
+'git shell' accepts the following commands after the `-c` option:
 
 'git receive-pack <argument>'::
 'git upload-pack <argument>'::
@@ -43,7 +43,7 @@ directory.
 INTERACTIVE USE
 ---------------
 
-By default, the commands above can be executed only with the '-c'
+By default, the commands above can be executed only with the `-c`
 option; the shell is not interactive.
 
 If a `~/git-shell-commands` directory is present, 'git shell'
index b91d4e545b07e21931ac44a04cffea8824c8c7a2..7818e0f09853f9c2a2ad0923d1fc13b698cad065 100644 (file)
@@ -60,7 +60,7 @@ OPTIONS
         are shown before their parents).
 
 --date-order::
-       This option is similar to '--topo-order' in the sense that no
+       This option is similar to `--topo-order` in the sense that no
        parent comes before all of its children, but otherwise commits
        are ordered according to their commit date.
 
index 3a324519842bd709a8ad440905fb9a9e7eaa889d..c0aa871c9e8b06ea297e0a723167767338081453 100644 (file)
@@ -60,7 +60,7 @@ OPTIONS
 
        Enable stricter reference checking by requiring an exact ref path.
        Aside from returning an error code of 1, it will also print an error
-       message if '--quiet' was not specified.
+       message if `--quiet` was not specified.
 
 --abbrev[=<n>]::
 
@@ -70,7 +70,7 @@ OPTIONS
 -q::
 --quiet::
 
-       Do not print any results to stdout. When combined with '--verify' this
+       Do not print any results to stdout. When combined with `--verify` this
        can be used to silently check if a reference exists.
 
 --exclude-existing[=<pattern>]::
@@ -134,7 +134,7 @@ use:
 This will show "refs/heads/master" but also "refs/remote/other-repo/master",
 if such references exists.
 
-When using the '--verify' flag, the command requires an exact path:
+When using the `--verify` flag, the command requires an exact path:
 
 -----------------------------------------------------------------------------
        git show-ref --verify refs/heads/master
index 92df596e5fe9757fee399078e05e3ba44196fda3..2e9cef06e64376e973eeb74e338d93dd99ae40ee 100644 (file)
@@ -39,7 +39,8 @@ 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
 -------
index e1e8f57cdd217b43b9b04bc54381e9b155d9cbde..725065ef2d7b6b3c7c6c29a434a8996a7e1ae559 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::
@@ -180,12 +183,12 @@ in which case `XY` are `!!`.
 
 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 +210,124 @@ field from the first filename).  Third, filenames containing special
 characters are not specially formatted; no quoting or
 backslash-escaping is performed.
 
+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.
+
+Otherwise, all pathnames will be "C-quoted" if they contain any tab,
+linefeed, double quote, or backslash characters. In C-quoting, these
+characters will be replaced with the corresponding C-style escape
+sequences and the resulting pathname will be double quoted.
+
+
 CONFIGURATION
 -------------
 
index 1572f058f59ad1f75c4b5ed6e34fae9110414bad..d8415734753e0d03f3f6d37bd4b76369d37f5fb0 100644 (file)
@@ -13,10 +13,11 @@ SYNOPSIS
              [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]
 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] init [--] [<path>...]
-'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
+'git submodule' [--quiet] deinit [-f|--force] (--all|[--] <path>...)
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
-             [-f|--force] [--rebase|--merge] [--reference <repository>]
-             [--depth <depth>] [--recursive] [--] [<path>...]
+             [--[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] foreach [--recursive] <command>
@@ -140,12 +141,15 @@ deinit::
        tree. Further calls to `git submodule update`, `git submodule foreach`
        and `git submodule sync` will skip any unregistered submodules until
        they are initialized again, so use this command if you don't want to
-       have a local checkout of the submodule in your work tree anymore. If
+       have a local checkout of the submodule in your working tree anymore. If
        you really want to remove a submodule from the repository and commit
        that use linkgit:git-rm[1] instead.
 +
-If `--force` is specified, the submodule's work tree will be removed even if
-it contains local modifications.
+When the command is run without pathspec, it errors out,
+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::
 +
@@ -247,18 +251,24 @@ OPTIONS
 --quiet::
        Only print error messages.
 
+--all::
+       This option is only valid for the deinit command. Unregister all
+       submodules in the working tree.
+
 -b::
 --branch::
        Branch of repository to add as submodule.
        The name of the branch is recorded as `submodule.<name>.branch` in
-       `.gitmodules` for `update --remote`.
+       `.gitmodules` for `update --remote`.  A special value of `.` is used to
+       indicate that the name of the branch in the submodule should be the
+       same name as the current branch in the current repository.
 
 -f::
 --force::
        This option is only valid for add, deinit and update commands.
        When running add, allow adding an otherwise ignored submodule path.
-       When running deinit the submodule work trees will be removed even if
-       they contain local changes.
+       When running deinit the submodule working trees will be removed even
+       if they contain local changes.
        When running update (only effective with the checkout procedure),
        throw away local changes in submodules when switching to a
        different commit; and always run a checkout operation in the
@@ -377,6 +387,17 @@ for linkgit:git-clone[1]'s `--reference` and `--shared` options carefully.
        clone with a history truncated to the specified number of revisions.
        See linkgit:git-clone[1]
 
+--[no-]recommend-shallow::
+       This option is only valid for the update command.
+       The initial clone of a submodule will use the recommended
+       `submodule.<name>.shallow` as provided by the .gitmodules file
+       by default. To ignore the suggestions use `--no-recommend-shallow`.
+
+-j <n>::
+--jobs <n>::
+       This option is only valid for the update command.
+       Clone new submodules in parallel with as many jobs.
+       Defaults to the `submodule.fetchJobs` option.
 
 <path>...::
        Paths to submodule(s). When specified this will restrict the command
index fb23a98a17df5eae1811d8b674ebcfd56122196a..5f9e65b0c4de117942babf0a14d255922d02b4ad 100644 (file)
@@ -98,11 +98,11 @@ your Perl's Getopt::Long is < v2.37).
 --ignore-paths=<regex>;;
        When passed to 'init' or 'clone' this regular expression will
        be preserved as a config key.  See 'fetch' for a description
-       of '--ignore-paths'.
+       of `--ignore-paths`.
 --include-paths=<regex>;;
        When passed to 'init' or 'clone' this regular expression will
        be preserved as a config key.  See 'fetch' for a description
-       of '--include-paths'.
+       of `--include-paths`.
 --no-minimize-url;;
        When tracking multiple directories (using --stdlayout,
        --branches, or --tags options), git svn will attempt to connect
@@ -110,7 +110,7 @@ your Perl's Getopt::Long is < v2.37).
        repository.  This default allows better tracking of history if
        entire projects are moved within a repository, but may cause
        issues on repositories where read access restrictions are in
-       place.  Passing '--no-minimize-url' will allow git svn to
+       place.  Passing `--no-minimize-url` will allow git svn to
        accept URLs as-is without attempting to connect to a higher
        level directory.  This option is off by default when only
        one URL/branch is tracked (it would do little good).
@@ -141,7 +141,7 @@ the same local time zone.
 --ignore-paths=<regex>;;
        This allows one to specify a Perl regular expression that will
        cause skipping of all matching paths from checkout from SVN.
-       The '--ignore-paths' option should match for every 'fetch'
+       The `--ignore-paths` option should match for every 'fetch'
        (including automatic fetches due to 'clone', 'dcommit',
        'rebase', etc) on a given repository.
 +
@@ -170,10 +170,10 @@ Skip "branches" and "tags" of first level directories;;
 --include-paths=<regex>;;
        This allows one to specify a Perl regular expression that will
        cause the inclusion of only matching paths from checkout from SVN.
-       The '--include-paths' option should match for every 'fetch'
+       The `--include-paths` option should match for every 'fetch'
        (including automatic fetches due to 'clone', 'dcommit',
-       'rebase', etc) on a given repository. '--ignore-paths' takes
-       precedence over '--include-paths'.
+       'rebase', etc) on a given repository. `--ignore-paths` takes
+       precedence over `--include-paths`.
 +
 [verse]
 config key: svn-remote.<name>.include-paths
@@ -191,7 +191,7 @@ config key: svn-remote.<name>.include-paths
        or if a second argument is passed; it will create a directory
        and work within that.  It accepts all arguments that the
        'init' and 'fetch' commands accept; with the exception of
-       '--fetch-all' and '--parent'.  After a repository is cloned,
+       `--fetch-all` and `--parent`.  After a repository is cloned,
        the 'fetch' command will be able to update revisions without
        affecting the working tree; and the 'rebase' command will be
        able to update the working tree with the latest changes.
@@ -216,7 +216,7 @@ it preserves linear history with 'git rebase' instead of
 'git merge' for ease of dcommitting with 'git svn'.
 +
 This accepts all options that 'git svn fetch' and 'git rebase'
-accept.  However, '--fetch-all' only fetches from the current
+accept.  However, `--fetch-all` only fetches from the current
 [svn-remote], and not all [svn-remote] definitions.
 +
 Like 'git rebase'; this requires that the working tree be clean
@@ -459,6 +459,20 @@ Any other arguments are passed directly to 'git log'
        Gets the Subversion property given as the first argument, for a
        file.  A specific revision can be specified with -r/--revision.
 
+'propset'::
+       Sets the Subversion property given as the first argument, to the
+       value given as the second argument for the file given as the
+       third argument.
++
+Example:
++
+------------------------------------------------------------------------
+git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile
+------------------------------------------------------------------------
++
+This will set the property 'svn:keywords' to 'FreeBSD=%H' for the file
+'devel/py-tipper/Makefile'.
+
 'show-externals'::
        Shows the Subversion externals.  Use -r/--revision to specify a
        specific revision.
@@ -611,6 +625,9 @@ config key: svn.authorsfile
        with the committer name as the first argument.  The program is
        expected to return a single line of the form "Name <email>",
        which will be treated as if included in the authors file.
++
+[verse]
+config key: svn.authorsProg
 
 -q::
 --quiet::
@@ -748,7 +765,7 @@ svn-remote.<name>.rewriteUUID::
 
 svn-remote.<name>.pushurl::
 
-       Similar to Git's 'remote.<name>.pushurl', this key is designed
+       Similar to Git's `remote.<name>.pushurl`, this key is designed
        to be used in cases where 'url' points to an SVN repository
        via a read-only transport, to provide an alternate read/write
        transport. It is assumed that both keys point to the same
@@ -905,7 +922,7 @@ parent of the branch. However, it is possible that there is no suitable
 Git commit to serve as parent.  This will happen, among other reasons,
 if the SVN branch is a copy of a revision that was not fetched by 'git
 svn' (e.g. because it is an old revision that was skipped with
-'--revision'), or if in SVN a directory was copied that is not tracked
+`--revision`), or if in SVN a directory was copied that is not tracked
 by 'git svn' (such as a branch that is not tracked at all, or a
 subdirectory of a tracked branch). In these cases, 'git svn' will still
 create a Git branch, but instead of using an existing Git commit as the
@@ -982,12 +999,12 @@ directories in the working copy.  While this is the easiest way to get a
 copy of a complete repository, for projects with many branches it will
 lead to a working copy many times larger than just the trunk. Thus for
 projects using the standard directory structure (trunk/branches/tags),
-it is recommended to clone with option '--stdlayout'. If the project
+it is recommended to clone with option `--stdlayout`. If the project
 uses a non-standard structure, and/or if branches and tags are not
 required, it is easiest to only clone one directory (typically trunk),
 without giving any repository layout options.  If the full history with
-branches and tags is required, the options '--trunk' / '--branches' /
-'--tags' must be used.
+branches and tags is required, the options `--trunk` / `--branches` /
+`--tags` must be used.
 
 When using multiple --branches or --tags, 'git svn' does not automatically
 handle name collisions (for example, if two branches from different paths have
index abab4814ec984db62dff6b493c3eb93398a36afa..80019c584b11b35b2b14da83a31f326634bc6708 100644 (file)
@@ -78,7 +78,7 @@ OPTIONS
 
 -v::
 --verify::
-       Verify the gpg signature of the given tag names.
+       Verify the GPG signature of the given tag names.
 
 -n<num>::
        <num> specifies how many lines from the annotation, if any,
@@ -104,7 +104,7 @@ OPTIONS
        order can also be affected by the
        "versionsort.prereleaseSuffix" 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'
+       Sort order defaults to the value configured for the `tag.sort`
        variable if it exists, or lexicographic order otherwise. See
        linkgit:git-config[1].
 
@@ -167,7 +167,7 @@ This option is only applicable when listing tags without annotation lines.
 
 --[no-]merged [<commit>]::
        Only list tags whose tips are reachable, or not reachable
-       if '--no-merged' is used, from the specified commit ('HEAD'
+       if `--no-merged` is used, from the specified commit (`HEAD`
        if not specified).
 
 CONFIGURATION
@@ -253,9 +253,8 @@ On Automatic following
 ~~~~~~~~~~~~~~~~~~~~~~
 
 If you are following somebody else's tree, you are most likely
-using remote-tracking branches (`refs/heads/origin` in traditional
-layout, or `refs/remotes/origin/master` in the separate-remote
-layout).  You usually want the tags from the other end.
+using remote-tracking branches (eg. `refs/remotes/origin/master`).
+You usually want the tags from the other end.
 
 On the other hand, if you are fetching because you would want a
 one-shot merge from somebody else, you typically do not want to
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 c6cbed189ceddd294361502b861f37c29a8adbf1..7386c931627f1c2bd1303407075db9831ec4045c 100644 (file)
@@ -102,7 +102,7 @@ thus, in case the assumed-untracked file is changed upstream,
 you will need to handle the situation manually.
 
 --really-refresh::
-       Like '--refresh', but checks stat information unconditionally,
+       Like `--refresh`, but checks stat information unconditionally,
        without regard to the "assume unchanged" setting.
 
 --[no-]skip-worktree::
@@ -211,7 +211,7 @@ will remove the intended effect of the option.
 
 Using --refresh
 ---------------
-'--refresh' does not calculate a new sha1 file or bring the index
+`--refresh` does not calculate a new sha1 file or bring the index
 up-to-date for mode/content changes. But what it *does* do is to
 "re-match" the stat information of a file with the index, so that you
 can refresh the index for a file that hasn't been changed but where
@@ -222,7 +222,7 @@ up the stat index details with the proper files.
 
 Using --cacheinfo or --info-only
 --------------------------------
-'--cacheinfo' is used to register a file that is not in the
+`--cacheinfo` is used to register a file that is not in the
 current working directory.  This is useful for minimum-checkout
 merging.
 
@@ -232,12 +232,12 @@ To pretend you have a file with mode and sha1 at path, say:
 $ git update-index --cacheinfo <mode>,<sha1>,<path>
 ----------------
 
-'--info-only' is used to register files without placing them in the object
+`--info-only` is used to register files without placing them in the object
 database.  This is useful for status-only repositories.
 
-Both '--cacheinfo' and '--info-only' behave similarly: the index is updated
-but the object database isn't.  '--cacheinfo' is useful when the object is
-in the database but the file isn't available locally.  '--info-only' is
+Both `--cacheinfo` and `--info-only` behave similarly: the index is updated
+but the object database isn't.  `--cacheinfo` is useful when the object is
+in the database but the file isn't available locally.  `--info-only` is
 useful when the file is available, but you do not wish to update the
 object database.
 
index 0abc806ea9072e563a7bdc1905442180cbc6c27a..822ad593af973dd7a1217cffaef7106876d377c2 100644 (file)
@@ -9,8 +9,8 @@ git-upload-pack - Send objects packed back to git-fetch-pack
 SYNOPSIS
 --------
 [verse]
-'git-upload-pack' [--strict] [--timeout=<n>] <directory>
-
+'git-upload-pack' [--[no-]strict] [--timeout=<n>] [--stateless-rpc]
+                 [--advertise-refs] <directory>
 DESCRIPTION
 -----------
 Invoked by 'git fetch-pack', learns what
@@ -25,12 +25,22 @@ repository.  For push operations, see 'git send-pack'.
 OPTIONS
 -------
 
---strict::
+--[no-]strict::
        Do not try <directory>/.git/ if <directory> is no Git directory.
 
 --timeout=<n>::
        Interrupt transfer after <n> seconds of inactivity.
 
+--stateless-rpc::
+       Perform only a single read-write cycle with stdin and stdout.
+       This fits with the HTTP POST request processing model where
+       a program may read the request, write a response, and must exit.
+
+--advertise-refs::
+       Only the initial ref advertisement is output, and the program exits
+       immediately. This fits with the HTTP GET request model, where
+       no request content is received but a response must be produced.
+
 <directory>::
        The repository to sync from.
 
index ecf4da16cf0a270cda7916777524ac129b4bead1..92097f6673d8e72229b42c33227353ad5226f17e 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-Validates the gpg signature created by 'git commit -S'.
+Validates the GPG signature created by 'git commit -S'.
 
 OPTIONS
 -------
index 16ede5b4c36d3a231d6af3849f7eeb8f404daf98..2d6b09a43cd63e3ad768f9b49ba67f1deda05111 100644 (file)
@@ -62,14 +62,14 @@ CONF.VAR (from -c option) and web.browser
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The web browser can be specified using a configuration variable passed
-with the -c (or --config) command-line option, or the 'web.browser'
+with the -c (or --config) command-line option, or the `web.browser`
 configuration variable if the former is not used.
 
 browser.<tool>.path
 ~~~~~~~~~~~~~~~~~~~
 
 You can explicitly provide a full path to your preferred browser by
-setting the configuration variable 'browser.<tool>.path'. For example,
+setting the configuration variable `browser.<tool>.path`. For example,
 you can configure the absolute path to firefox by setting
 'browser.firefox.path'. Otherwise, 'git web{litdd}browse' assumes the tool
 is available in PATH.
@@ -79,7 +79,7 @@ browser.<tool>.cmd
 
 When the browser, specified by options or configuration variables, is
 not among the supported ones, then the corresponding
-'browser.<tool>.cmd' configuration variable will be looked up. If this
+`browser.<tool>.cmd` configuration variable will be looked up. If this
 variable exists then 'git web{litdd}browse' will treat the specified tool
 as a custom command and will use a shell eval to run the command with
 the URLs passed as arguments.
@@ -110,7 +110,7 @@ Note about git-config --global
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Note that these configuration variables should probably be set using
-the '--global' flag, for example like this:
+the `--global` flag, for example like this:
 
 ------------------------------------------------
 $ git config --global web.browser firefox
index 62c76c1c8945512009c6d0ca1179cf71ec50d04e..e257c19ebed96c3ab4877a752c3545e2d98c5d84 100644 (file)
@@ -9,9 +9,11 @@ git-worktree - Manage multiple working trees
 SYNOPSIS
 --------
 [verse]
-'git worktree add' [-f] [--detach] [-b <new-branch>] <path> [<branch>]
-'git worktree prune' [-n] [-v] [--expire <expire>]
+'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] <path> [<branch>]
 'git worktree list' [--porcelain]
+'git worktree lock' [--reason <string>] <worktree>
+'git worktree prune' [-n] [-v] [--expire <expire>]
+'git worktree unlock' <worktree>
 
 DESCRIPTION
 -----------
@@ -38,9 +40,8 @@ section "DETAILS" for more information.
 
 If a linked working tree is stored on a portable device or network share
 which is not always mounted, you can prevent its administrative files from
-being pruned by creating a file named 'locked' alongside the other
-administrative files, optionally containing a plain text reason that
-pruning should be suppressed. See section "DETAILS" for more information.
+being pruned by issuing the `git worktree lock` command, optionally
+specifying `--reason` to explain why the working tree is locked.
 
 COMMANDS
 --------
@@ -48,16 +49,13 @@ add <path> [<branch>]::
 
 Create `<path>` and checkout `<branch>` into it. The new working directory
 is linked to the current repository, sharing everything except working
-directory specific files such as HEAD, index, etc.
+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,
 then, as a convenience, a new branch based at HEAD is created automatically,
 as if `-b $(basename <path>)` was specified.
 
-prune::
-
-Prune working tree information in $GIT_DIR/worktrees.
-
 list::
 
 List details of each worktree.  The main worktree is listed first, followed by
@@ -65,6 +63,22 @@ each of the linked worktrees.  The output details include if the worktree is
 bare, the revision currently checked out, and the branch currently checked out
 (or 'detached HEAD' if none).
 
+lock::
+
+If a working tree is on a portable device or network share which
+is not always mounted, lock it to prevent its administrative
+files from being pruned automatically. This also prevents it from
+being moved or deleted. Optionally, specify a reason for the lock
+with `--reason`.
+
+prune::
+
+Prune working tree information in $GIT_DIR/worktrees.
+
+unlock::
+
+Unlock a working tree, allowing it to be pruned, moved or deleted.
+
 OPTIONS
 -------
 
@@ -87,6 +101,12 @@ OPTIONS
        With `add`, detach HEAD in the new working tree. See "DETACHED HEAD"
        in linkgit:git-checkout[1].
 
+--[no-]checkout::
+       By default, `add` checks out `<branch>`, however, `--no-checkout` can
+       be used to suppress checkout in order to make customizations,
+       such as configuring sparse-checkout. See "Sparse checkout"
+       in linkgit:git-read-tree[1].
+
 -n::
 --dry-run::
        With `prune`, do not remove anything; just report what it would
@@ -104,6 +124,18 @@ OPTIONS
 --expire <time>::
        With `prune`, only expire unused working trees older than <time>.
 
+--reason <string>::
+       With `lock`, an explanation why the working tree is locked.
+
+<worktree>::
+       Working trees can be identified by path, either relative or
+       absolute.
++
+If the last path components in the working tree's path is unique among
+working trees, it can be used to identify worktrees. For example if
+you only have two working trees, at "/abc/def/ghi" and "/abc/def/ggg",
+then "ghi" or "def/ghi" is enough to point to the former working tree.
+
 DETAILS
 -------
 Each linked working tree has a private sub-directory in the repository's
@@ -144,7 +176,8 @@ instead.
 
 To prevent a $GIT_DIR/worktrees entry from being pruned (which
 can be useful in some situations, such as when the
-entry's working tree is stored on a portable device), add a file named
+entry's working tree is stored on a portable device), use the
+`git worktree lock` command, which adds a file named
 'locked' to the entry's directory. The file contains the reason in
 plain text. For example, if a linked working tree's `.git` file points
 to `/path/main/.git/worktrees/test-next` then a file named
@@ -220,8 +253,6 @@ performed manually, such as:
 - `remove` to remove a linked working tree and its administrative files (and
   warn if the working tree is dirty)
 - `mv` to move or rename a working tree and update its administrative files
-- `lock` to prevent automatic pruning of administrative files (for instance,
-  for a working tree on a portable device)
 
 GIT
 ---
index adc940bf7591069c74c9b47aa5e5686e0438d606..98033302bb97ef802f7050e02a1727a878bb79aa 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
@@ -31,8 +32,8 @@ page to learn what commands Git offers.  You can learn more about
 individual Git commands with "git help command".  linkgit:gitcli[7]
 manual page gives you an overview of the command-line command syntax.
 
-Formatted and hyperlinked version of the latest Git documentation
-can be viewed at `http://git-htmldocs.googlecode.com/git/git.html`.
+A formatted and hyperlinked copy of the latest Git documentation
+can be viewed at `https://git.github.io/htmldocs/git.html`.
 
 ifdef::stalenotes[]
 [NOTE]
@@ -43,9 +44,33 @@ 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.8.0/git.html[documentation for release 2.8]
+* link:v2.11.0/git.html[documentation for release 2.11]
 
 * release notes for
+  link:RelNotes/2.11.0.txt[2.11].
+
+* link:v2.10.2/git.html[documentation for release 2.10.2]
+
+* release notes for
+  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.3/git.html[documentation for release 2.9.3]
+
+* release notes for
+  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.4/git.html[documentation for release 2.8.4]
+
+* release notes for
+  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.3/git.html[documentation for release 2.7.3]
@@ -504,7 +529,7 @@ OPTIONS
 
 --help::
        Prints the synopsis and a list of the most commonly used
-       commands. If the option '--all' or '-a' is given then all
+       commands. If the option `--all` or `-a` is given then all
        available commands are printed. If a Git command is named this
        option will bring up the manual page for that command.
 +
@@ -568,7 +593,7 @@ foo.bar= ...`) sets `foo.bar` to the empty string.
 
 --git-dir=<path>::
        Set the path to the repository. This can also be controlled by
-       setting the GIT_DIR environment variable. It can be an absolute
+       setting the `GIT_DIR` environment variable. It can be an absolute
        path or relative path to current working directory.
 
 --work-tree=<path>::
@@ -584,6 +609,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
@@ -818,46 +848,52 @@ These environment variables apply to 'all' core Git commands. Nb: it
 is worth noting that they may be used/overridden by SCMS sitting above
 Git so take care if using a foreign front-end.
 
-'GIT_INDEX_FILE'::
+`GIT_INDEX_FILE`::
        This environment allows the specification of an alternate
        index file. If not specified, the default of `$GIT_DIR/index`
        is used.
 
-'GIT_INDEX_VERSION'::
+`GIT_INDEX_VERSION`::
        This environment variable allows the specification of an index
        version for new repositories.  It won't affect existing index
        files.  By default index file version 2 or 3 is used. See
        linkgit:git-update-index[1] for more information.
 
-'GIT_OBJECT_DIRECTORY'::
+`GIT_OBJECT_DIRECTORY`::
        If the object storage directory is specified via this
        environment variable then the sha1 directories are created
        underneath - otherwise the default `$GIT_DIR/objects`
        directory is used.
 
-'GIT_ALTERNATE_OBJECT_DIRECTORIES'::
+`GIT_ALTERNATE_OBJECT_DIRECTORIES`::
        Due to the immutable nature of Git objects, old objects can be
        archived into shared, read-only directories. This variable
        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.
-
-'GIT_DIR'::
-       If the 'GIT_DIR' environment variable is set then it
++
+       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
        specifies a path to use instead of the default `.git`
        for the base of the repository.
-       The '--git-dir' command-line option also sets this value.
+       The `--git-dir` command-line option also sets this value.
 
-'GIT_WORK_TREE'::
+`GIT_WORK_TREE`::
        Set the path to the root of the working tree.
-       This can also be controlled by the '--work-tree' command-line
+       This can also be controlled by the `--work-tree` command-line
        option and the core.worktree configuration variable.
 
-'GIT_NAMESPACE'::
+`GIT_NAMESPACE`::
        Set the Git namespace; see linkgit:gitnamespaces[7] for details.
-       The '--namespace' command-line option also sets this value.
+       The `--namespace` command-line option also sets this value.
 
-'GIT_CEILING_DIRECTORIES'::
+`GIT_CEILING_DIRECTORIES`::
        This should be a colon-separated list of absolute paths.  If
        set, it is a list of directories that Git should not chdir up
        into while looking for a repository directory (useful for
@@ -870,19 +906,19 @@ Git so take care if using a foreign front-end.
        can add an empty entry to the list to tell Git that the
        subsequent entries are not symlinks and needn't be resolved;
        e.g.,
-       'GIT_CEILING_DIRECTORIES=/maybe/symlink::/very/slow/non/symlink'.
+       `GIT_CEILING_DIRECTORIES=/maybe/symlink::/very/slow/non/symlink`.
 
-'GIT_DISCOVERY_ACROSS_FILESYSTEM'::
+`GIT_DISCOVERY_ACROSS_FILESYSTEM`::
        When run in a directory that does not have ".git" repository
        directory, Git tries to find such a directory in the parent
        directories to find the top of the working tree, but by default it
        does not cross filesystem boundaries.  This environment variable
        can be set to true to tell Git not to stop at filesystem
-       boundaries.  Like 'GIT_CEILING_DIRECTORIES', this will not affect
-       an explicit repository directory set via 'GIT_DIR' or on the
+       boundaries.  Like `GIT_CEILING_DIRECTORIES`, this will not affect
+       an explicit repository directory set via `GIT_DIR` or on the
        command line.
 
-'GIT_COMMON_DIR'::
+`GIT_COMMON_DIR`::
        If this variable is set to a path, non-worktree files that are
        normally in $GIT_DIR will be taken from this path
        instead. Worktree-specific files such as HEAD or index are
@@ -893,28 +929,28 @@ Git so take care if using a foreign front-end.
 
 Git Commits
 ~~~~~~~~~~~
-'GIT_AUTHOR_NAME'::
-'GIT_AUTHOR_EMAIL'::
-'GIT_AUTHOR_DATE'::
-'GIT_COMMITTER_NAME'::
-'GIT_COMMITTER_EMAIL'::
-'GIT_COMMITTER_DATE'::
+`GIT_AUTHOR_NAME`::
+`GIT_AUTHOR_EMAIL`::
+`GIT_AUTHOR_DATE`::
+`GIT_COMMITTER_NAME`::
+`GIT_COMMITTER_EMAIL`::
+`GIT_COMMITTER_DATE`::
 'EMAIL'::
        see linkgit:git-commit-tree[1]
 
 Git Diffs
 ~~~~~~~~~
-'GIT_DIFF_OPTS'::
+`GIT_DIFF_OPTS`::
        Only valid setting is "--unified=??" or "-u??" to set the
        number of context lines shown when a unified diff is created.
        This takes precedence over any "-U" or "--unified" option
        value passed on the Git diff command line.
 
-'GIT_EXTERNAL_DIFF'::
-       When the environment variable 'GIT_EXTERNAL_DIFF' is set, the
+`GIT_EXTERNAL_DIFF`::
+       When the environment variable `GIT_EXTERNAL_DIFF` is set, the
        program named by it is called, instead of the diff invocation
        described above.  For a path that is added, removed, or modified,
-        'GIT_EXTERNAL_DIFF' is called with 7 parameters:
+       `GIT_EXTERNAL_DIFF` is called with 7 parameters:
 
        path old-file old-hex old-mode new-file new-hex new-mode
 +
@@ -928,49 +964,49 @@ where:
 The file parameters can point at the user's working file
 (e.g. `new-file` in "git-diff-files"), `/dev/null` (e.g. `old-file`
 when a new file is added), or a temporary file (e.g. `old-file` in the
-index).  'GIT_EXTERNAL_DIFF' should not worry about unlinking the
-temporary file --- it is removed when 'GIT_EXTERNAL_DIFF' exits.
+index).  `GIT_EXTERNAL_DIFF` should not worry about unlinking the
+temporary file --- it is removed when `GIT_EXTERNAL_DIFF` exits.
 +
-For a path that is unmerged, 'GIT_EXTERNAL_DIFF' is called with 1
+For a path that is unmerged, `GIT_EXTERNAL_DIFF` is called with 1
 parameter, <path>.
 +
-For each path 'GIT_EXTERNAL_DIFF' is called, two environment variables,
-'GIT_DIFF_PATH_COUNTER' and 'GIT_DIFF_PATH_TOTAL' are set.
+For each path `GIT_EXTERNAL_DIFF` is called, two environment variables,
+`GIT_DIFF_PATH_COUNTER` and `GIT_DIFF_PATH_TOTAL` are set.
 
-'GIT_DIFF_PATH_COUNTER'::
+`GIT_DIFF_PATH_COUNTER`::
        A 1-based counter incremented by one for every path.
 
-'GIT_DIFF_PATH_TOTAL'::
+`GIT_DIFF_PATH_TOTAL`::
        The total number of paths.
 
 other
 ~~~~~
-'GIT_MERGE_VERBOSITY'::
+`GIT_MERGE_VERBOSITY`::
        A number controlling the amount of output shown by
        the recursive merge strategy.  Overrides merge.verbosity.
        See linkgit:git-merge[1]
 
-'GIT_PAGER'::
+`GIT_PAGER`::
        This environment variable overrides `$PAGER`. If it is set
        to an empty string or to the value "cat", Git will not launch
        a pager.  See also the `core.pager` option in
        linkgit:git-config[1].
 
-'GIT_EDITOR'::
+`GIT_EDITOR`::
        This environment variable overrides `$EDITOR` and `$VISUAL`.
        It is used by several Git commands when, on interactive mode,
        an editor is to be launched. See also linkgit:git-var[1]
        and the `core.editor` option in linkgit:git-config[1].
 
-'GIT_SSH'::
-'GIT_SSH_COMMAND'::
+`GIT_SSH`::
+`GIT_SSH_COMMAND`::
        If either of these environment variables is set then 'git fetch'
        and 'git push' will use the specified command instead of 'ssh'
        when they need to connect to a remote system.
        The command will be given exactly two or four arguments: the
        'username@host' (or just 'host') from the URL and the shell
        command to execute on that remote system, optionally preceded by
-       '-p' (literally) and the 'port' from the URL when it specifies
+       `-p` (literally) and the 'port' from the URL when it specifies
        something other than the default SSH port.
 +
 `$GIT_SSH_COMMAND` takes precedence over `$GIT_SSH`, and is interpreted
@@ -983,18 +1019,18 @@ Usually it is easier to configure any desired options through your
 personal `.ssh/config` file.  Please consult your ssh documentation
 for further details.
 
-'GIT_ASKPASS'::
+`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)
        will call this program with a suitable prompt as command-line argument
-       and read the password from its STDOUT. See also the 'core.askPass'
+       and read the password from its STDOUT. See also the `core.askPass`
        option in linkgit:git-config[1].
 
-'GIT_TERMINAL_PROMPT'::
+`GIT_TERMINAL_PROMPT`::
        If this environment variable is set to `0`, git will not prompt
        on the terminal (e.g., when asking for HTTP authentication).
 
-'GIT_CONFIG_NOSYSTEM'::
+`GIT_CONFIG_NOSYSTEM`::
        Whether to skip reading settings from the system-wide
        `$(prefix)/etc/gitconfig` file.  This environment variable can
        be used along with `$HOME` and `$XDG_CONFIG_HOME` to create a
@@ -1002,7 +1038,7 @@ for further details.
        temporarily to avoid using a buggy `/etc/gitconfig` file while
        waiting for someone with sufficient permissions to fix it.
 
-'GIT_FLUSH'::
+`GIT_FLUSH`::
        If this environment variable is set to "1", then commands such
        as 'git blame' (in incremental mode), 'git rev-list', 'git log',
        'git check-attr' and 'git check-ignore' will
@@ -1013,7 +1049,7 @@ for further details.
        not set, Git will choose buffered or record-oriented flushing
        based on whether stdout appears to be redirected to a file or not.
 
-'GIT_TRACE'::
+`GIT_TRACE`::
        Enables general trace messages, e.g. alias expansion, built-in
        command execution and external command execution.
 +
@@ -1034,21 +1070,21 @@ into it.
 Unsetting the variable, or setting it to empty, "0" or
 "false" (case insensitive) disables trace messages.
 
-'GIT_TRACE_PACK_ACCESS'::
+`GIT_TRACE_PACK_ACCESS`::
        Enables trace messages for all accesses to any packs. For each
        access, the pack file name and an offset in the pack is
        recorded. This may be helpful for troubleshooting some
        pack-related performance problems.
-       See 'GIT_TRACE' for available trace output options.
+       See `GIT_TRACE` for available trace output options.
 
-'GIT_TRACE_PACKET'::
+`GIT_TRACE_PACKET`::
        Enables trace messages for all packets coming in or out of a
        given program. This can help with debugging object negotiation
        or other protocol issues. Tracing is turned off at a packet
-       starting with "PACK" (but see 'GIT_TRACE_PACKFILE' below).
-       See 'GIT_TRACE' for available trace output options.
+       starting with "PACK" (but see `GIT_TRACE_PACKFILE` below).
+       See `GIT_TRACE` for available trace output options.
 
-'GIT_TRACE_PACKFILE'::
+`GIT_TRACE_PACKFILE`::
        Enables tracing of packfiles sent or received by a
        given program. Unlike other trace output, this trace is
        verbatim: no headers, and no quoting of binary data. You almost
@@ -1059,22 +1095,30 @@ Unsetting the variable, or setting it to empty, "0" or
 Note that this is currently only implemented for the client side
 of clones and fetches.
 
-'GIT_TRACE_PERFORMANCE'::
+`GIT_TRACE_PERFORMANCE`::
        Enables performance related trace messages, e.g. total execution
        time of each Git command.
-       See 'GIT_TRACE' for available trace output options.
+       See `GIT_TRACE` for available trace output options.
 
-'GIT_TRACE_SETUP'::
+`GIT_TRACE_SETUP`::
        Enables trace messages printing the .git, working tree and current
        working directory after Git has completed its setup phase.
-       See 'GIT_TRACE' for available trace output options.
+       See `GIT_TRACE` for available trace output options.
 
-'GIT_TRACE_SHALLOW'::
+`GIT_TRACE_SHALLOW`::
        Enables trace messages that can help debugging fetching /
        cloning of shallow repositories.
-       See 'GIT_TRACE' for available trace output options.
+       See `GIT_TRACE` for available trace output options.
+
+`GIT_TRACE_CURL`::
+       Enables a curl full trace dump of all incoming and outgoing data,
+       including descriptive information, of the git transport protocol.
+       This is similar to doing curl `--trace-ascii` on the command line.
+       This option overrides setting the `GIT_CURL_VERBOSE` environment
+       variable.
+       See `GIT_TRACE` for available trace output options.
 
-'GIT_LITERAL_PATHSPECS'::
+`GIT_LITERAL_PATHSPECS`::
        Setting this variable to `1` will cause Git to treat all
        pathspecs literally, rather than as glob patterns. For example,
        running `GIT_LITERAL_PATHSPECS=1 git log -- '*.c'` will search
@@ -1083,19 +1127,19 @@ of clones and fetches.
        literal paths to Git (e.g., paths previously given to you by
        `git ls-tree`, `--raw` diff output, etc).
 
-'GIT_GLOB_PATHSPECS'::
+`GIT_GLOB_PATHSPECS`::
        Setting this variable to `1` will cause Git to treat all
        pathspecs as glob patterns (aka "glob" magic).
 
-'GIT_NOGLOB_PATHSPECS'::
+`GIT_NOGLOB_PATHSPECS`::
        Setting this variable to `1` will cause Git to treat all
        pathspecs as literal (aka "literal" magic).
 
-'GIT_ICASE_PATHSPECS'::
+`GIT_ICASE_PATHSPECS`::
        Setting this variable to `1` will cause Git to treat all
        pathspecs as case-insensitive.
 
-'GIT_REFLOG_ACTION'::
+`GIT_REFLOG_ACTION`::
        When a ref is updated, reflog entries are created to keep
        track of the reason why the ref was updated (which is
        typically the name of the high-level command that updated
@@ -1105,7 +1149,7 @@ of clones and fetches.
        variable when it is invoked as the top level command by the
        end user, to be recorded in the body of the reflog.
 
-'GIT_REF_PARANOIA'::
+`GIT_REF_PARANOIA`::
        If set to `1`, include broken or badly named refs when iterating
        over lists of refs. In a normal, non-corrupted repository, this
        does nothing. However, enabling it may help git to detect and
@@ -1116,7 +1160,7 @@ of clones and fetches.
        an operation has touched every ref (e.g., because you are
        cloning a repository to make a backup).
 
-'GIT_ALLOW_PROTOCOL'::
+`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
index e3b1de80335e713507875fb54c31c3ba5dab8c9f..976243a63e6ee4c4627a8a0db77bab2846d17f40 100644 (file)
@@ -115,6 +115,7 @@ text file is normalized, its line endings are converted to LF in the
 repository.  To control what line ending style is used in the working
 directory, use the `eol` attribute for a single file and the
 `core.eol` configuration variable for all text files.
+Note that `core.autocrlf` overrides `core.eol`
 
 Set::
 
@@ -130,8 +131,9 @@ Unset::
 Set to string value "auto"::
 
        When `text` is set to "auto", the path is marked for automatic
-       end-of-line normalization.  If Git decides that the content is
-       text, its line endings are normalized to LF on checkin.
+       end-of-line conversion.  If Git decides that the content is
+       text, its line endings are converted to LF on checkin.
+       When the file has been committed with CRLF, no conversion is done.
 
 Unspecified::
 
@@ -146,7 +148,7 @@ unspecified.
 ^^^^^
 
 This attribute sets a specific line-ending style to be used in the
-working directory.  It enables end-of-line normalization without any
+working directory.  It enables end-of-line conversion without any
 content checks, effectively setting the `text` attribute.
 
 Set to string value "crlf"::
@@ -180,60 +182,51 @@ While Git normally leaves file contents alone, it can be configured to
 normalize line endings to LF in the repository and, optionally, to
 convert them to CRLF when files are checked out.
 
-Here is an example that will make Git normalize .txt, .vcproj and .sh
-files, ensure that .vcproj files have CRLF and .sh files have LF in
-the working directory, and prevent .jpg files from being normalized
-regardless of their content.
-
-------------------------
-*.txt          text
-*.vcproj       eol=crlf
-*.sh           eol=lf
-*.jpg          -text
-------------------------
-
-Other source code management systems normalize all text files in their
-repositories, and there are two ways to enable similar automatic
-normalization in Git.
-
 If you simply want to have CRLF line endings in your working directory
 regardless of the repository you are working with, you can set the
-config variable "core.autocrlf" without changing any attributes.
+config variable "core.autocrlf" without using any attributes.
 
 ------------------------
 [core]
        autocrlf = true
 ------------------------
 
-This does not force normalization of all text files, but does ensure
+This does not force normalization of text files, but does ensure
 that text files that you introduce to the repository have their line
 endings normalized to LF when they are added, and that files that are
 already normalized in the repository stay normalized.
 
-If you want to interoperate with a source code management system that
-enforces end-of-line normalization, or you simply want all text files
-in your repository to be normalized, you should instead set the `text`
-attribute to "auto" for _all_ files.
+If you want to ensure that text files that any contributor introduces to
+the repository have their line endings normalized, you can set the
+`text` attribute to "auto" for _all_ files.
 
 ------------------------
 *      text=auto
 ------------------------
 
-This ensures that all files that Git considers to be text will have
-normalized (LF) line endings in the repository.  The `core.eol`
-configuration variable controls which line endings Git will use for
-normalized files in your working directory; the default is to use the
-native line ending for your platform, or CRLF if `core.autocrlf` is
-set.
+The attributes allow a fine-grained control, how the line endings
+are converted.
+Here is an example that will make Git normalize .txt, .vcproj and .sh
+files, ensure that .vcproj files have CRLF and .sh files have LF in
+the working directory, and prevent .jpg files from being normalized
+regardless of their content.
+
+------------------------
+*               text=auto
+*.txt          text
+*.vcproj       text eol=crlf
+*.sh           text eol=lf
+*.jpg          -text
+------------------------
+
+NOTE: When `text=auto` conversion is enabled in a cross-platform
+project using push and pull to a central repository the text files
+containing CRLFs should be normalized.
 
-NOTE: When `text=auto` normalization is enabled in an existing
-repository, any text files containing CRLFs should be normalized.  If
-they are not they will be normalized the next time someone tries to
-change them, causing unfortunate misattribution.  From a clean working
-directory:
+From a clean working directory:
 
 -------------------------------------------------
-$ echo "* text=auto" >>.gitattributes
+$ echo "* text=auto" >.gitattributes
 $ rm .git/index     # Remove the index to force Git to
 $ git reset         # re-scan the working directory
 $ git status        # Show files that will be normalized
@@ -300,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.
@@ -374,6 +375,158 @@ substitution.  For example:
        smudge = git-p4-filter --smudge %f
 ------------------------
 
+Note that "%f" is the name of the path that is being worked on. Depending
+on the version that is being filtered, the corresponding file on disk may
+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.
+------------------------
+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
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -525,6 +678,8 @@ patterns are available:
 
 - `csharp` suitable for source code in the C# language.
 
+- `css` suitable for cascading style sheets.
+
 - `fortran` suitable for source code in the Fortran language.
 
 - `fountain` suitable for Fountain documents.
index 15b3bfa8db143948629405a2ea9a72b7a83b31d5..4546fa0d751705c27c88448ec3e7beb954233280 100644 (file)
@@ -949,7 +949,7 @@ for details.
 [NOTE]
 If there were more commits on the 'master' branch after the merge, the
 merge commit itself would not be shown by 'git show-branch' by
-default.  You would need to provide '--sparse' option to make the
+default.  You would need to provide `--sparse` option to make the
 merge commit visible in this case.
 
 Now, let's pretend you are the one who did all the work in
index 1c75be080368a5975b609cd8b902d224eabc9bd8..f3a75d1ce1c5a2709b452faca76f5f6f1cdb7de0 100644 (file)
@@ -106,6 +106,11 @@ 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
 -------------------
index b06e852a85587ffd46820c9dfb832784cbf1dfd9..4c6143c511c06a1fd5f3854445a14533653fd752 100644 (file)
@@ -116,8 +116,12 @@ they create are writable and searchable by other group members.
 Importing a CVS archive
 -----------------------
 
+NOTE: These instructions use the `git-cvsimport` script which ships with
+git, but other importers may provide better results. See the note in
+linkgit:git-cvsimport[1] for other options.
+
 First, install version 2.1 or higher of cvsps from
-http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make
+https://github.com/andreyvit/cvsps[https://github.com/andreyvit/cvsps] and make
 sure it is in your path.  Then cd to a checked out CVS working directory
 of the project you are interested in and run linkgit:git-cvsimport[1]:
 
index c579593e55008b09ca1914270fb8b52a08476f72..08cf62278e87556bbf764c0a22f8354d0a462ebe 100644 (file)
@@ -28,8 +28,8 @@ The 'git diff-{asterisk}' family works by first comparing two sets of
 files:
 
  - 'git diff-index' compares contents of a "tree" object and the
-   working directory (when '--cached' flag is not used) or a
-   "tree" object and the index file (when '--cached' flag is
+   working directory (when `--cached` flag is not used) or a
+   "tree" object and the index file (when `--cached` flag is
    used);
 
  - 'git diff-files' compares contents of the index file and the
index a2f59b194c85f5dee4eaa530a7ab6d7533f126c6..9565dc3fda47d7c8a7290132c347b5a6f0d2422e 100644 (file)
@@ -7,24 +7,35 @@ githooks - Hooks used by Git
 
 SYNOPSIS
 --------
-$GIT_DIR/hooks/*
+$GIT_DIR/hooks/* (or \`git config core.hooksPath`/*)
 
 
 DESCRIPTION
 -----------
 
-Hooks are little scripts you can place in `$GIT_DIR/hooks`
-directory to trigger action at certain points.  When
-'git init' is run, a handful of example hooks are copied into the
-`hooks` directory of the new repository, but by default they are
-all disabled.  To enable a hook, rename it by removing its `.sample`
-suffix.
+Hooks are programs you can place in a hooks directory to trigger
+actions at certain points in git's execution. Hooks that don't have
+the executable bit set are ignored.
 
-NOTE: It is also a requirement for a given hook to be executable.
-However - in a freshly initialized repository - the `.sample` files are
-executable by default.
+By default the hooks directory is `$GIT_DIR/hooks`, but that can be
+changed via the `core.hooksPath` configuration variable (see
+linkgit:git-config[1]).
 
-This document describes the currently defined hooks.
+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.
+
+Hooks can get their arguments via the environment, command-line
+arguments, and stdin. See the documentation for each hook below for
+details.
+
+'git init' may copy hooks to the new repository, depending on its
+configuration. See the "TEMPLATE DIRECTORY" section in
+linkgit:git-init[1] for details. When the rest of this document refers
+to "default hooks" it's talking about the default template shipped
+with Git.
+
+The currently supported hooks are described below.
 
 HOOKS
 -----
@@ -32,15 +43,15 @@ HOOKS
 applypatch-msg
 ~~~~~~~~~~~~~~
 
-This hook is invoked by 'git am' script.  It takes a single
+This hook is invoked by 'git am'.  It takes a single
 parameter, the name of the file that holds the proposed commit
-log message.  Exiting with non-zero status causes
-'git am' to abort before applying the patch.
+log message.  Exiting with a non-zero status causes 'git am' to abort
+before applying the patch.
 
 The hook is allowed to edit the message file in place, and can
 be used to normalize the message into some project standard
-format (if the project has one). It can also be used to refuse
-the commit after inspecting the message file.
+format. It can also be used to refuse the commit after inspecting
+the message file.
 
 The default 'applypatch-msg' hook, when enabled, runs the
 'commit-msg' hook, if the latter is enabled.
@@ -73,10 +84,10 @@ pre-commit
 ~~~~~~~~~~
 
 This hook is invoked by 'git commit', and can be bypassed
-with `--no-verify` option.  It takes no parameter, and is
+with the `--no-verify` option.  It takes no parameters, and is
 invoked before obtaining the proposed commit log message and
-making a commit.  Exiting with non-zero status from this script
-causes the 'git commit' to abort.
+making a commit.  Exiting with non-zero status from this script
+causes the 'git commit' command to abort before creating a commit.
 
 The default 'pre-commit' hook, when enabled, catches introduction
 of lines with trailing whitespaces and aborts the commit when
@@ -115,15 +126,15 @@ commit-msg
 ~~~~~~~~~~
 
 This hook is invoked by 'git commit', and can be bypassed
-with `--no-verify` option.  It takes a single parameter, the
+with the `--no-verify` option.  It takes a single parameter, the
 name of the file that holds the proposed commit log message.
-Exiting with non-zero status causes the 'git commit' to
+Exiting with non-zero status causes the 'git commit' to
 abort.
 
-The hook is allowed to edit the message file in place, and can
-be used to normalize the message into some project standard
-format (if the project has one). It can also be used to refuse
-the commit after inspecting the message file.
+The hook is allowed to edit the message file in place, and can be used
+to normalize the message into some project standard format. It
+can also be used to refuse the commit after inspecting the message
+file.
 
 The default 'commit-msg' hook, when enabled, detects duplicate
 "Signed-off-by" lines, and aborts the commit if one is found.
@@ -131,8 +142,8 @@ The default 'commit-msg' hook, when enabled, detects duplicate
 post-commit
 ~~~~~~~~~~~
 
-This hook is invoked by 'git commit'.  It takes no
-parameter, and is invoked after a commit is made.
+This hook is invoked by 'git commit'. It takes no parameters, and is
+invoked after a commit is made.
 
 This hook is meant primarily for notification, and cannot affect
 the outcome of 'git commit'.
@@ -236,6 +247,15 @@ Both standard output and standard error output are forwarded to
 'git send-pack' on the other end, so you can simply `echo` messages
 for the user.
 
+The number of push options given on the command line of
+`git push --push-option=...` can be read from the environment
+variable `GIT_PUSH_OPTION_COUNT`, and the options themselves are
+found in `GIT_PUSH_OPTION_0`, `GIT_PUSH_OPTION_1`,...
+If it is negotiated to not use the push options phase, the
+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`.
+
 [[update]]
 update
 ~~~~~~
@@ -267,9 +287,11 @@ does not know the entire set of branches, so it would end up
 firing one e-mail per ref when used naively, though.  The
 <<post-receive,'post-receive'>> hook is more suited to that.
 
-Another use suggested on the mailing list is to use this hook to
-implement access control which is finer grained than the one
-based on filesystem group.
+In an environment that restricts the users' access only to git
+commands over the wire, this hook can be used to implement access
+control without relying on filesystem ownership and group
+membership. See linkgit:git-shell[1] for how you might use the login
+shell to restrict the user's access to only git commands.
 
 Both standard output and standard error output are forwarded to
 'git send-pack' on the other end, so you can simply `echo` messages
@@ -309,6 +331,15 @@ a sample script `post-receive-email` provided in the `contrib/hooks`
 directory in Git distribution, which implements sending commit
 emails.
 
+The number of push options given on the command line of
+`git push --push-option=...` can be read from the environment
+variable `GIT_PUSH_OPTION_COUNT`, and the options themselves are
+found in `GIT_PUSH_OPTION_0`, `GIT_PUSH_OPTION_1`,...
+If it is negotiated to not use the push options phase, the
+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`.
+
 [[post-update]]
 post-update
 ~~~~~~~~~~~
index 473623d6318a859c9ed2cf600222ea6cb4a25d4c..63260f0056491308cb35677917530a987c21c8a2 100644 (file)
@@ -38,7 +38,7 @@ precedence, the last matching pattern decides the outcome):
  * Patterns read from `$GIT_DIR/info/exclude`.
 
  * Patterns read from the file specified by the configuration
-   variable 'core.excludesFile'.
+   variable `core.excludesFile`.
 
 Which file to place a pattern in depends on how the pattern is meant to
 be used.
index 6ade00217606cd111811dcd5777df5c66bb9bf39..e382dd96dfded769a27c2295ebc096c15214713b 100644 (file)
@@ -70,7 +70,7 @@ linkgit:git-rev-list[1] for a complete list.
 
 --left-right::
 
-       Mark which side of a symmetric diff a commit is reachable
+       Mark which side of a symmetric difference a commit is reachable
        from.  Commits from the left side are prefixed with a `<`
        symbol and those from the right with a `>` symbol.
 
@@ -82,7 +82,7 @@ linkgit:git-rev-list[1] for a complete list.
 
 --simplify-merges::
 
-       Additional option to '--full-history' to remove some needless
+       Additional option to `--full-history` to remove some needless
        merges from the resulting history, as there are no selected
        commits contributing to this merge.  (See "History
        simplification" in linkgit:git-log[1] for a more detailed
index ac70eca321cd1747e2916646c691ac18cb4dbd97..8f7c50f330f36f625951db7f4cc4657a31fa7113 100644 (file)
@@ -19,7 +19,7 @@ of linkgit:git-config[1].
 
 The file contains one subsection per submodule, and the subsection value
 is the name of the submodule. The name is set to the path where the
-submodule has been added unless it was customized with the '--name'
+submodule has been added unless it was customized with the `--name`
 option of 'git submodule add'. Each submodule section also contains the
 following required keys:
 
@@ -50,8 +50,11 @@ submodule.<name>.update::
 
 submodule.<name>.branch::
        A remote branch name for tracking updates in the upstream submodule.
-       If the option is not specified, it defaults to 'master'.  See the
-       `--remote` documentation in linkgit:git-submodule[1] for details.
+       If the option is not specified, it defaults to 'master'.  A special
+       value of `.` is used to indicate that the name of the branch in the
+       submodule should be the same name as the current branch in the
+       current repository.  See the `--remote` documentation in
+       linkgit:git-submodule[1] for details.
 
 submodule.<name>.fetchRecurseSubmodules::
        This option can be used to control recursive fetching of this
@@ -79,6 +82,11 @@ submodule.<name>.ignore::
        "--ignore-submodule" option. The 'git submodule' commands are not
        affected by this setting.
 
+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.
+
 
 EXAMPLES
 --------
index 78e0b27c18b73a5b93f39b611191f8d1aaf3d06c..9e8681f9e1b554113e7d1881e214bc617af14109 100644 (file)
@@ -43,7 +43,7 @@ arguments. The first argument specifies a remote repository as in Git;
 it is either the name of a configured remote or a URL. The second
 argument specifies a URL; it is usually of the form
 '<transport>://<address>', but any arbitrary string is possible.
-The 'GIT_DIR' environment variable is set up for the remote helper
+The `GIT_DIR` environment variable is set up for the remote helper
 and can be used to determine where to store additional data or from
 which directory to invoke auxiliary Git commands.
 
@@ -61,10 +61,10 @@ argument. If such a URL is encountered directly on the command line,
 the first argument is '<address>', and if it is encountered in a
 configured remote, the first argument is the name of that remote.
 
-Additionally, when a configured remote has 'remote.<name>.vcs' set to
+Additionally, when a configured remote has `remote.<name>.vcs` set to
 '<transport>', Git explicitly invokes 'git remote-<transport>' with
 '<name>' as the first argument. If set, the second argument is
-'remote.<name>.url'; otherwise, the second argument is omitted.
+`remote.<name>.url`; otherwise, the second argument is omitted.
 
 INPUT FORMAT
 ------------
@@ -210,17 +210,17 @@ the remote repository.
 'export-marks' <file>::
        This modifies the 'export' capability, instructing Git to dump the
        internal marks table to <file> when complete. For details,
-       read up on '--export-marks=<file>' in linkgit:git-fast-export[1].
+       read up on `--export-marks=<file>` in linkgit:git-fast-export[1].
 
 'import-marks' <file>::
        This modifies the 'export' capability, instructing Git to load the
        marks specified in <file> before processing any input. For details,
-       read up on '--import-marks=<file>' in linkgit:git-fast-export[1].
+       read up on `--import-marks=<file>` in linkgit:git-fast-export[1].
 
 'signed-tags'::
        This modifies the 'export' capability, instructing Git to pass
-       '--signed-tags=verbatim' to linkgit:git-fast-export[1].  In the
-       absence of this capability, Git will use '--signed-tags=warn-strip'.
+       `--signed-tags=verbatim` to linkgit:git-fast-export[1].  In the
+       absence of this capability, Git will use `--signed-tags=warn-strip`.
 
 
 
@@ -298,7 +298,7 @@ Supported if the helper has the "fetch" capability.
        is followed by a blank line). For example, the following would
        be two batches of 'push', the first asking the remote-helper
        to push the local ref 'master' to the remote ref 'master' and
-       the local 'HEAD' to the remote 'branch', and the second
+       the local `HEAD` to the remote 'branch', and the second
        asking to push ref 'foo' to ref 'bar' (forced update requested
        by the '+').
 +
@@ -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
index 577ee844e0ed09e9f0339de55cf14a29ca7bdab2..a5f99cbb11ba3f7957b9fcd432354c08d99a32c1 100644 (file)
@@ -177,7 +177,7 @@ sharedindex.<SHA-1>::
 info::
        Additional information about the repository is recorded
        in this directory. This directory is ignored if $GIT_COMMON_DIR
-       is set and "$GIT_COMMON_DIR/index" will be used instead.
+       is set and "$GIT_COMMON_DIR/info" will be used instead.
 
 info/refs::
        This file helps dumb transports discover what refs are
index e903eb786049b4742e9d7c766b8448a503cbb6a3..27dec5b91d08bbdb114400dd3c86a8cf515e8774 100644 (file)
@@ -15,9 +15,9 @@ DESCRIPTION
 
 Many Git commands take revision parameters as arguments. Depending on
 the command, they denote a specific commit or, for commands which
-walk the revision graph (such as linkgit:git-log[1]), all commits which can
-be reached from that commit. In the latter case one can also specify a
-range of revisions explicitly.
+walk the revision graph (such as linkgit:git-log[1]), all commits which are
+reachable from that commit. For commands that walk the revision graph one can
+also specify a range of revisions explicitly.
 
 In addition, some Git commands (such as linkgit:git-show[1]) also take
 revision parameters which denote other objects than commits, e.g. blobs
index 8a42270074e3875c2919346f6c059e428aefa1ce..e6320891b118cc4ddf58293660f8877ac02232ad 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
@@ -376,7 +383,7 @@ $site_name::
        Name of your site or organization, to appear in page titles.  Set it
        to something descriptive for clearer bookmarks etc.  If this variable
        is not set or is, then gitweb uses the value of the `SERVER_NAME`
-       CGI environment variable, setting site name to "$SERVER_NAME Git",
+       `CGI` environment variable, setting site name to "$SERVER_NAME Git",
        or "Untitled Git" if this variable is not set (e.g. if running gitweb
        as standalone script).
 +
index cd9c8951b281207abfabecafefdebf7f0975a0a8..96156e5e1f5fe86cd793ad2a89b417f2bf6a2245 100644 (file)
@@ -206,8 +206,8 @@ $export_auth_hook = sub {
 Per-repository gitweb configuration
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 You can configure individual repositories shown in gitweb by creating file
-in the 'GIT_DIR' of Git repository, or by setting some repo configuration
-variable (in 'GIT_DIR/config', see linkgit:git-config[1]).
+in the `GIT_DIR` of Git repository, or by setting some repo configuration
+variable (in `GIT_DIR/config`, see linkgit:git-config[1]).
 
 You can use the following files in repository:
 
index cafc2843599102fae1dc070c484bc6987b84b367..8ad29e61a950c2cb1f33779977a33c63ae0df33b 100644 (file)
@@ -145,7 +145,7 @@ current branch integrates with) obviously do not work, as there is no
        A fast-forward is a special type of <<def_merge,merge>> where you have a
        <<def_revision,revision>> and you are "merging" another
        <<def_branch,branch>>'s changes that happen to be a descendant of what
-       you have. In such these cases, you do not make a new <<def_merge,merge>>
+       you have. In such a case, you do not make a new <<def_merge,merge>>
        <<def_commit,commit>> but instead just update to his
        revision. This will happen frequently on a
        <<def_remote_tracking_branch,remote-tracking branch>> of a remote
index 6d772bd9279b1564b66ad01c919b97569c9f2c0d..15a4c8031f1f3bee61ca77d4d37b7ae443d98d9c 100644 (file)
@@ -94,7 +94,7 @@ your language, document it in the INSTALL file.
 6. There is a file command-list.txt in the distribution main directory
 that categorizes commands by type, so they can be listed in appropriate
 subsections in the documentation's summary command list.  Add an entry
-for yours.  To understand the categories, look at git-commands.txt
+for yours.  To understand the categories, look at command-list.txt
 in the main directory.  If the new command is part of the typical Git
 workflow and you believe it common enough to be mentioned in 'git help',
 map this command to a common group in the column [common].
index 462255ed5d8053cbb4dadeec224cb81d14c4ada6..19f59cc88808a1751296af80a0b9700ccec54396 100644 (file)
@@ -30,7 +30,7 @@ The history immediately after the "revert of the merge" would look like
 this:
 
  ---o---o---o---M---x---x---W
-              /
+               /
        ---A---B
 
 where A and B are on the side development that was not so good, M is the
@@ -47,7 +47,7 @@ After the developers of the side branch fix their mistakes, the history
 may look like this:
 
  ---o---o---o---M---x---x---W---x
-              /
+               /
        ---A---B-------------------C---D
 
 where C and D are to fix what was broken in A and B, and you may already
@@ -81,7 +81,7 @@ In such a situation, you would want to first revert the previous revert,
 which would make the history look like this:
 
  ---o---o---o---M---x---x---W---x---Y
-              /
+               /
        ---A---B-------------------C---D
 
 where Y is the revert of W.  Such a "revert of the revert" can be done
@@ -93,14 +93,14 @@ This history would (ignoring possible conflicts between what W and W..Y
 changed) be equivalent to not having W or Y at all in the history:
 
  ---o---o---o---M---x---x-------x----
-              /
+               /
        ---A---B-------------------C---D
 
 and merging the side branch again will not have conflict arising from an
 earlier revert and revert of the revert.
 
  ---o---o---o---M---x---x-------x-------*
-              /                       /
+               /                       /
        ---A---B-------------------C---D
 
 Of course the changes made in C and D still can conflict with what was
@@ -111,13 +111,13 @@ faulty A and B, and redone the changes on top of the updated mainline
 after the revert, the history would have looked like this:
 
  ---o---o---o---M---x---x---W---x---x
-              /                 \
+               /                 \
        ---A---B                   A'--B'--C'
 
 If you reverted the revert in such a case as in the previous example:
 
  ---o---o---o---M---x---x---W---x---x---Y---*
-              /                 \         /
+               /                 \         /
        ---A---B                   A'--B'--C'
 
 where Y is the revert of W, A' and B' are rerolled A and B, and there may
@@ -129,7 +129,7 @@ lot of overlapping changes that result in conflicts.  So do not do "revert
 of revert" blindly without thinking..
 
  ---o---o---o---M---x---x---W---x---x
-              /                 \
+               /                 \
        ---A---B                   A'--B'--C'
 
 In the history with rebased side branch, W (and M) are behind the merge
diff --git a/Documentation/lint-gitlink.perl b/Documentation/lint-gitlink.perl
new file mode 100755 (executable)
index 0000000..476cc30
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/perl
+
+use File::Find;
+use Getopt::Long;
+
+my $basedir = ".";
+GetOptions("basedir=s" => \$basedir)
+       or die("Cannot parse command line arguments\n");
+
+my $found_errors = 0;
+
+sub report {
+       my ($where, $what, $error) = @_;
+       print "$where: $error: $what\n";
+       $found_errors = 1;
+}
+
+sub grab_section {
+       my ($page) = @_;
+       open my $fh, "<", "$basedir/$page.txt";
+       my $firstline = <$fh>;
+       chomp $firstline;
+       close $fh;
+       my ($section) = ($firstline =~ /.*\((\d)\)$/);
+       return $section;
+}
+
+sub lint {
+       my ($file) = @_;
+       open my $fh, "<", $file
+               or return;
+       while (<$fh>) {
+               my $where = "$file:$.";
+               while (s/linkgit:((.*?)\[(\d)\])//) {
+                       my ($target, $page, $section) = ($1, $2, $3);
+
+                       # De-AsciiDoc
+                       $page =~ s/{litdd}/--/g;
+
+                       if ($page !~ /^git/) {
+                               report($where, $target, "nongit link");
+                               next;
+                       }
+                       if (! -f "$basedir/$page.txt") {
+                               report($where, $target, "no such source");
+                               next;
+                       }
+                       $real_section = grab_section($page);
+                       if ($real_section != $section) {
+                               report($where, $target,
+                                       "wrong section (should be $real_section)");
+                               next;
+                       }
+               }
+       }
+       close $fh;
+}
+
+sub lint_it {
+       lint($File::Find::name) if -f && /\.txt$/;
+}
+
+if (!@ARGV) {
+       find({ wanted => \&lint_it, no_chdir => 1 }, $basedir);
+} else {
+       for (@ARGV) {
+               lint($_);
+       }
+}
+
+exit $found_errors;
index 002ca58c21e2f653ffd5651a8aedfe865400e166..df3ea3779be369ce0f935cfac945e79f08ff4b5a 100644 (file)
@@ -61,7 +61,7 @@ merge.verbosity::
        message if conflicts were detected. Level 1 outputs only
        conflicts, 2 outputs conflicts and file changes.  Level 5 and
        above outputs debugging information.  The default is level 2.
-       Can be overridden by the 'GIT_MERGE_VERBOSITY' environment variable.
+       Can be overridden by the `GIT_MERGE_VERBOSITY` environment variable.
 
 merge.<driver>.name::
        Defines a human-readable name for a custom low-level
index f08e9b80c562faa1de2408cd4cfdb7253d3be1f2..5b4a62e93624bc8289c835631aab5d5f13dff708 100644 (file)
@@ -89,8 +89,11 @@ option can be used to override --squash.
 
 --verify-signatures::
 --no-verify-signatures::
-       Verify that the commits being merged have good and trusted GPG signatures
-       and abort the merge in case they do not.
+       Verify that the tip commit of the side branch being merged is
+       signed with a valid key, i.e. a key that has a valid uid: in the
+       default trust model, this means the signing key has been signed by
+       a trusted key.  If the tip commit of the side branch is not signed
+       with a valid key, the merge is aborted.
 
 --summary::
 --no-summary::
@@ -114,3 +117,11 @@ ifndef::git-pull[]
        reporting.
 
 endif::git-pull[]
+
+--allow-unrelated-histories::
+       By default, `git merge` command refuses to merge histories
+       that do not share a common ancestor.  This option can be
+       used to override this safety when merging histories of two
+       projects that started their lives independently. As that is
+       a very rare occasion, no configuration variable to enable
+       this by default exists and will not be added.
index 671cebd95c36f2dc6e17fb599219e305a567bc55..3bcee2ddb1244c7ef52888d1de2654a688f6702f 100644 (file)
@@ -143,12 +143,24 @@ 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 signature, "B" for a Bad signature, "U" for a good,
-  untrusted signature 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}`
-- '%gd': shortened reflog selector, e.g., `stash@{1}`
+- '%gD': reflog selector, e.g., `refs/stash@{1}` or
+  `refs/stash@{2 minutes ago`}; the format follows the rules described
+  for the `-g` option. The portion before the `@` is the refname as
+  given on the command line (so `git log -g refs/heads/master` would
+  yield `refs/heads/master@{0}`).
+- '%gd': shortened reflog selector; same as `%gD`, but the refname
+  portion is shortened for human readability (so `refs/heads/master`
+  becomes just `master`).
 - '%gn': reflog identity name
 - '%gN': reflog identity name (respecting .mailmap, see
   linkgit:git-shortlog[1] or linkgit:git-blame[1])
@@ -160,13 +172,14 @@ endif::git-rev-list[]
 - '%Cgreen': switch color to green
 - '%Cblue': switch color to blue
 - '%Creset': reset color
-- '%C(...)': color specification, as described in color.branch.* config option;
+- '%C(...)': color specification, as described under Values in the
+  "CONFIGURATION FILE" section of linkgit:git-config[1];
   adding `auto,` at the beginning will emit color only when colors are
   enabled for log output (by `color.diff`, `color.ui`, or `--color`, and
   respecting the `auto` settings of the former if we are going to a
   terminal). `auto` alone (i.e. `%C(auto)`) will turn on auto coloring
   on the next placeholders until the color is switched again.
-- '%m': left, right or boundary mark
+- '%m': left (`<`), right (`>`) or boundary (`-`) mark
 - '%n': newline
 - '%%': a raw '%'
 - '%x00': print a byte from a hex code
index 54b88b6dcaaa5df06fc8dad2e5f5172682269bc9..e44fc8f7388d9a187416a573cc82c8a1d35897c5 100644 (file)
@@ -26,7 +26,7 @@ people using 80-column terminals.
 --no-abbrev-commit::
        Show the full 40-byte hexadecimal commit object name. This negates
        `--abbrev-commit` and those options which imply it such as
-       "--oneline". It also overrides the 'log.abbrevCommit' variable.
+       "--oneline". It also overrides the `log.abbrevCommit` variable.
 
 --oneline::
        This is a shorthand for "--pretty=oneline --abbrev-commit"
@@ -42,6 +42,20 @@ people using 80-column terminals.
        verbatim; this means that invalid sequences in the original
        commit may be copied to the output.
 
+--expand-tabs=<n>::
+--expand-tabs::
+--no-expand-tabs::
+       Perform a tab expansion (replace each tab with enough spaces
+       to fill to the next display column that is multiple of '<n>')
+       in the log message before showing it in the output.
+       `--expand-tabs` is a short-hand for `--expand-tabs=8`, and
+       `--no-expand-tabs` is a short-hand for `--expand-tabs=0`,
+       which disables tab expansion.
++
+By default, tabs are expanded in pretty formats that indent the log
+message by 4 spaces (i.e.  'medium', which is the default, 'full',
+and 'fuller').
+
 ifndef::git-rev-list[]
 --notes[=<treeish>]::
        Show the notes (see linkgit:git-notes[1]) that annotate the
@@ -51,7 +65,7 @@ ifndef::git-rev-list[]
        on the command line.
 +
 By default, the notes shown are from the notes refs listed in the
-'core.notesRef' and 'notes.displayRef' variables (or corresponding
+`core.notesRef` and `notes.displayRef` variables (or corresponding
 environment overrides). See linkgit:git-config[1] for more details.
 +
 With an optional '<treeish>' argument, use the treeish to find the notes
index 4f009d44240e3725e25bc8a9a3acd999d69cc487..5da7cf5a8d02d6fd52993f042f29efe4cc749051 100644 (file)
@@ -193,7 +193,7 @@ endif::git-rev-list[]
 
 --stdin::
        In addition to the '<commit>' listed on the command
-       line, read them from the standard input. If a '--' separator is
+       line, read them from the standard input. If a `--` separator is
        seen, stop reading commits and start reading paths to limit the
        result.
 
@@ -225,7 +225,7 @@ excluded from the output.
 
 --left-only::
 --right-only::
-       List only commits on the respective side of a symmetric range,
+       List only commits on the respective side of a symmetric difference,
        i.e. only those which would be marked `<` resp. `>` by
        `--left-right`.
 +
@@ -252,10 +252,25 @@ list.
 +
 With `--pretty` format other than `oneline` (for obvious reasons),
 this causes the output to have two extra lines of information
-taken from the reflog.  By default, 'commit@\{Nth}' notation is
-used in the output.  When the starting commit is specified as
-'commit@\{now}', output also uses 'commit@\{timestamp}' notation
-instead.  Under `--pretty=oneline`, the commit message is
+taken from the reflog.  The reflog designator in the output may be shown
+as `ref@{Nth}` (where `Nth` is the reverse-chronological index in the
+reflog) or as `ref@{timestamp}` (with the timestamp for that entry),
+depending on a few rules:
++
+--
+1. If the starting point is specified as `ref@{Nth}`, show the index
+format.
++
+2. If the starting point was specified as `ref@{now}`, show the
+timestamp format.
++
+3. If neither was used, but `--date` was given on the command line, show
+the timestamp in the format requested by `--date`.
++
+4. Otherwise, show the index format.
+--
++
+Under `--pretty=oneline`, the commit message is
 prefixed with this information on the same line.
 This option cannot be combined with `--reverse`.
 See also linkgit:git-reflog[1].
@@ -274,6 +289,10 @@ ifdef::git-rev-list[]
        Try to speed up the traversal using the pack bitmap index (if
        one is available). Note that when traversing with `--objects`,
        trees and blobs will not have their associated path printed.
+
+--progress=<header>::
+       Show progress reports on stderr as objects are considered. The
+       `<header>` text will be printed with each progress update.
 endif::git-rev-list[]
 
 --
@@ -638,8 +657,9 @@ avoid showing the commits from two parallel development track mixed
 together.
 
 --reverse::
-       Output the commits in reverse order.
-       Cannot be combined with `--walk-reflogs`.
+       Output the commits chosen to be shown (see Commit Limiting
+       section above) in reverse order. Cannot be combined with
+       `--walk-reflogs`.
 
 Object Traversal
 ~~~~~~~~~~~~~~~~
@@ -710,8 +730,8 @@ include::pretty-options.txt[]
        `iso-local`), the user's local time zone is used instead.
 +
 `--date=relative` shows dates relative to the current time,
-e.g. ``2 hours ago''. The `-local` option cannot be used with
-`--raw` or `--relative`.
+e.g. ``2 hours ago''. The `-local` option has no effect for
+`--date=relative`.
 +
 `--date=local` is an alias for `--date=default-local`.
 +
@@ -731,7 +751,18 @@ format, often found in email messages.
 +
 `--date=short` shows only the date, but not the time, in `YYYY-MM-DD` format.
 +
-`--date=raw` shows the date in the internal raw Git format `%s %z` format.
+`--date=raw` shows the date as seconds since the epoch (1970-01-01
+00:00:00 UTC), followed by a space, and then the timezone as an offset
+from UTC (a `+` or `-` with four digits; the first two are hours, and
+the second two are minutes). I.e., as if the timestamp were formatted
+with `strftime("%s %z")`).
+Note that the `-local` option does not affect the seconds-since-epoch
+value (which is always measured in UTC), but does switch the accompanying
+timezone value.
++
+`--date=unix` shows the date as a Unix epoch timestamp (seconds since
+1970).  As with `--raw`, this is always in UTC and therefore `-local`
+has no effect.
 +
 `--date=format:...` feeds the format `...` to your system `strftime`.
 Use `--date=format:%c` to show the date in your system locale's
@@ -766,7 +797,7 @@ ifdef::git-rev-list[]
 endif::git-rev-list[]
 
 --left-right::
-       Mark which side of a symmetric diff a commit is reachable from.
+       Mark which side of a symmetric difference a commit is reachable from.
        Commits from the left side are prefixed with `<` and those from
        the right with `>`.  If combined with `--boundary`, those
        commits are prefixed with `-`.
index 19314e3b7f3eb7616be5ab88580020206285f880..ba11b9c95e3a6efef461e5cadc4834ce232896b1 100644 (file)
@@ -28,8 +28,8 @@ blobs contained in a commit.
   first match in the following rules:
 
   . If '$GIT_DIR/<refname>' exists, that is what you mean (this is usually
-    useful only for 'HEAD', 'FETCH_HEAD', 'ORIG_HEAD', 'MERGE_HEAD'
-    and 'CHERRY_PICK_HEAD');
+    useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD`, `MERGE_HEAD`
+    and `CHERRY_PICK_HEAD`);
 
   . otherwise, 'refs/<refname>' if it exists;
 
@@ -41,16 +41,16 @@ blobs contained in a commit.
 
   . otherwise, 'refs/remotes/<refname>/HEAD' if it exists.
 +
-'HEAD' names the commit on which you based the changes in the working tree.
-'FETCH_HEAD' records the branch which you fetched from a remote repository
+`HEAD` names the commit on which you based the changes in the working tree.
+`FETCH_HEAD` records the branch which you fetched from a remote repository
 with your last `git fetch` invocation.
-'ORIG_HEAD' is created by commands that move your 'HEAD' in a drastic
-way, to record the position of the 'HEAD' before their operation, so that
+`ORIG_HEAD` is created by commands that move your `HEAD` in a drastic
+way, to record the position of the `HEAD` before their operation, so that
 you can easily change the tip of the branch back to the state before you ran
 them.
-'MERGE_HEAD' records the commit(s) which you are merging into your branch
+`MERGE_HEAD` records the commit(s) which you are merging into your branch
 when you run `git merge`.
-'CHERRY_PICK_HEAD' records the commit which you are cherry-picking
+`CHERRY_PICK_HEAD` records the commit which you are cherry-picking
 when you run `git cherry-pick`.
 +
 Note that any of the 'refs/*' cases above may come either from
@@ -59,7 +59,7 @@ While the ref name encoding is unspecified, UTF-8 is preferred as
 some output processing may assume ref names in UTF-8.
 
 '@'::
-  '@' alone is a shortcut for 'HEAD'.
+  '@' alone is a shortcut for `HEAD`.
 
 '<refname>@{<date>}', e.g. 'master@\{yesterday\}', 'HEAD@{5 minutes ago}'::
   A ref followed by the suffix '@' with a date specification
@@ -71,7 +71,7 @@ some output processing may assume ref names in UTF-8.
   existing log ('$GIT_DIR/logs/<ref>'). Note that this looks up the state
   of your *local* ref at a given time; e.g., what was in your local
   'master' branch last week. If you want to look at commits made during
-  certain times, see '--since' and '--until'.
+  certain times, see `--since` and `--until`.
 
 '<refname>@{<n>}', e.g. 'master@\{1\}'::
   A ref followed by the suffix '@' with an ordinal specification
@@ -101,7 +101,7 @@ some output processing may assume ref names in UTF-8.
 '<branchname>@\{push\}', e.g. 'master@\{push\}', '@\{push\}'::
   The suffix '@\{push}' reports the branch "where we would push to" if
   `git push` were run while `branchname` was checked out (or the current
-  'HEAD' if no branchname is specified). Since our push destination is
+  `HEAD` if no branchname is specified). Since our push destination is
   in a remote repository, of course, we report the local tracking branch
   that corresponds to that branch (i.e., something in 'refs/remotes/').
 +
@@ -237,58 +237,91 @@ SPECIFYING RANGES
 -----------------
 
 History traversing commands such as `git log` operate on a set
-of commits, not just a single commit.  To these commands,
-specifying a single revision with the notation described in the
-previous section means the set of commits reachable from that
-commit, following the commit ancestry chain.
-
-To exclude commits reachable from a commit, a prefix '{caret}'
-notation is used.  E.g. '{caret}r1 r2' means commits reachable
-from 'r2' but exclude the ones reachable from 'r1'.
-
-This set operation appears so often that there is a shorthand
-for it.  When you have two commits 'r1' and 'r2' (named according
-to the syntax explained in SPECIFYING REVISIONS above), you can ask
-for commits that are reachable from r2 excluding those that are reachable
-from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'.
-
-A similar notation 'r1\...r2' is called symmetric difference
-of 'r1' and 'r2' and is defined as
-'r1 r2 --not $(git merge-base --all r1 r2)'.
-It is the set of commits that are reachable from either one of
-'r1' or 'r2' but not from both.
-
-In these two shorthands, you can omit one end and let it default to HEAD.
+of commits, not just a single commit.
+
+For these commands,
+specifying a single revision, using the notation described in the
+previous section, means the set of commits `reachable` from the given
+commit.
+
+A commit's reachable set is the commit itself and the commits in
+its ancestry chain.
+
+
+Commit Exclusions
+~~~~~~~~~~~~~~~~~
+
+'{caret}<rev>' (caret) Notation::
+ To exclude commits reachable from a commit, a prefix '{caret}'
+ notation is used.  E.g. '{caret}r1 r2' means commits reachable
+ from 'r2' but exclude the ones reachable from 'r1' (i.e. 'r1' and
+ its ancestors).
+
+Dotted Range Notations
+~~~~~~~~~~~~~~~~~~~~~~
+
+The '..' (two-dot) Range Notation::
+ The '{caret}r1 r2' set operation appears so often that there is a shorthand
+ for it.  When you have two commits 'r1' and 'r2' (named according
+ to the syntax explained in SPECIFYING REVISIONS above), you can ask
+ for commits that are reachable from r2 excluding those that are reachable
+ from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'.
+
+The '...' (three dot) Symmetric Difference Notation::
+ A similar notation 'r1\...r2' is called symmetric difference
+ of 'r1' and 'r2' and is defined as
+ 'r1 r2 --not $(git merge-base --all r1 r2)'.
+ It is the set of commits that are reachable from either one of
+ 'r1' (left side) or 'r2' (right side) but not from both.
+
+In these two shorthand notations, you can omit one end and let it default to HEAD.
 For example, 'origin..' is a shorthand for 'origin..HEAD' and asks "What
 did I do since I forked from the origin branch?"  Similarly, '..origin'
 is a shorthand for 'HEAD..origin' and asks "What did the origin do since
 I forked from them?"  Note that '..' would mean 'HEAD..HEAD' which is an
 empty range that is both reachable and unreachable from HEAD.
 
-Two other shorthands for naming a set that is formed by a commit
-and its parent commits exist.  The 'r1{caret}@' notation means all
-parents of 'r1'.  'r1{caret}!' includes commit 'r1' but excludes
-all of its parents.
+Other <rev>{caret} Parent Shorthand Notations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+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'.
+
+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
+three notations also consider its parents. For example you can say
+'HEAD{caret}2{caret}@', however you cannot say 'HEAD{caret}@{caret}2'.
 
-To summarize:
+Revision Range Summary
+----------------------
 
 '<rev>'::
-       Include commits that are reachable from (i.e. ancestors of)
-       <rev>.
+       Include commits that are reachable from <rev> (i.e. <rev> and its
+       ancestors).
 
 '{caret}<rev>'::
-       Exclude commits that are reachable from (i.e. ancestors of)
-       <rev>.
+       Exclude commits that are reachable from <rev> (i.e. <rev> and its
+       ancestors).
 
 '<rev1>..<rev2>'::
        Include commits that are reachable from <rev2> but exclude
        those that are reachable from <rev1>.  When either <rev1> or
-       <rev2> is omitted, it defaults to 'HEAD'.
+       <rev2> is omitted, it defaults to `HEAD`.
 
 '<rev1>\...<rev2>'::
        Include commits that are reachable from either <rev1> or
        <rev2> but exclude those that are reachable from both.  When
-       either <rev1> or <rev2> is omitted, it defaults to 'HEAD'.
+       either <rev1> or <rev2> is omitted, it defaults to `HEAD`.
 
 '<rev>{caret}@', e.g. 'HEAD{caret}@'::
   A suffix '{caret}' followed by an at sign is the same as listing
@@ -300,16 +333,33 @@ To summarize:
   as giving commit '<rev>' and then all its parents prefixed with
   '{caret}' to exclude them (and their ancestors).
 
-Here are a handful of examples:
-
-   D                G H D
-   D F              G H I J D F
-   ^G D             H D
-   ^D B             E I J F B
-   B..C             C
-   B...C            G H D E B C
-   ^D B C           E I J F B C
-   C                I J F C
-   C^@              I J F
-   C^!              C
-   F^! D            G H D F
+'<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:
+
+   Args   Expanded arguments    Selected commits
+   D                            G H D
+   D F                          G H I J D F
+   ^G D                         H D
+   ^D B                         E I J F B
+   ^D B C                       E I J F B C
+   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
+         = D E F               D G H E F I J
+   C^!    = C ^C^@
+         = C ^C^1
+         = C ^F                C
+   B^!    = B ^B^@
+         = B ^B^1 ^B^2 ^B^3
+         = B ^D ^E ^F          B
+   F^! D  = F ^I ^J D           G H D F
index 0d8b99b368aea13a322382314d88229acda0b1db..20741f345e459f41d357039496f7d6be30edab06 100644 (file)
@@ -63,13 +63,6 @@ parse for configuration, rather than looking in the usual files. Regular
 Specify whether include directives should be followed in parsed files.
 Regular `git_config` defaults to `1`.
 
-There is a special version of `git_config` called `git_config_early`.
-This version takes an additional parameter to specify the repository
-config, instead of having it looked up via `git_path`. This is useful
-early in a Git program before the repository has been found. Unless
-you're working with early setup code, you probably don't want to use
-this.
-
 Reading Specific Files
 ----------------------
 
index e44426dd041516b8d9220ce9f1b2413be0319703..75368f26ca28a4afd381c5ab180a5b90a8368c84 100644 (file)
@@ -243,7 +243,7 @@ appended to its command line, which is one of:
 The details of the credential will be provided on the helper's stdin
 stream. The exact format is the same as the input/output format of the
 `git credential` plumbing command (see the section `INPUT/OUTPUT
-FORMAT` in linkgit:git-credential[7] for a detailed specification).
+FORMAT` in linkgit:git-credential[1] for a detailed specification).
 
 For a `get` operation, the helper should produce a list of attributes
 on stdout in the same format. A helper is free to produce a subset, or
@@ -268,4 +268,4 @@ See also
 
 linkgit:gitcredentials[7]
 
-linkgit:git-config[5] (See configuration variables `credential.*`)
+linkgit:git-config[1] (See configuration variables `credential.*`)
index ad7a5bddd24d91ceda78d430fd86a204b21fd005..28f5a8b71574916820cdb1f1a023e27cb45ed6e6 100644 (file)
@@ -104,6 +104,11 @@ If `free_entries` is true, each hashmap_entry in the map is freed as well
 `entry` points to the entry to initialize.
 +
 `hash` is the hash code of the entry.
++
+The hashmap_entry structure does not hold references to external resources,
+and it is safe to just discard it once you are done with it (i.e. if
+your structure was allocated with xmalloc(), you can just free(3) it,
+and if it is on stack, you can just let it go out of scope).
 
 `void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata)`::
 
index 5f0757dcc965fc89b96f18e31732390b1afeb84e..27bd701c0d6862f38c700fbfc02c24b135bd6c0e 100644 (file)
@@ -144,8 +144,12 @@ There are some macros to easily define options:
 
 `OPT_COUNTUP(short, long, &int_var, description)`::
        Introduce a count-up option.
-       `int_var` is incremented on each use of `--option`, and
-       reset to zero with `--no-option`.
+       Each use of `--option` increments `int_var`, starting from zero
+       (even if initially negative), and `--no-option` resets it to
+       zero. To determine if `--option` or `--no-option` was encountered at
+       all, initialize `int_var` to a negative value, and if it is still
+       negative after parse_options(), then neither `--option` nor
+       `--no-option` was seen.
 
 `OPT_BIT(short, long, &int_var, description, mask)`::
        Introduce a boolean option.
@@ -231,6 +235,13 @@ There are some macros to easily define options:
        pass the command-line option, which can be specified multiple times,
        to another command.
 
+`OPT_CMDMODE(short, long, &int_var, description, enum_val)`::
+       Define an "operation mode" option, only one of which in the same
+       group of "operating mode" options that share the same `int_var`
+       can be given by the user. `enum_val` is set to `int_var` when the
+       option is used, but an error is reported if other "operating mode"
+       option has already set its value to the same `int_var`.
+
 
 The last element of the array must be `OPT_END()`.
 
index 3e75497a37d696d534c16ff0270a808b57ac9180..dcc52943a5da7dbbfe8d42cdcc7d593ec1ba1416 100644 (file)
@@ -38,16 +38,20 @@ Functions
 `sha1_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 unsigned char sha1[20],
                    void *data)
 {
        printf("%s\n", sha1_to_hex(sha1));
+       return 0; /* always continue */
 }
 
 void some_func(void)
index 097a651d9680ea31c1a5a0e522a77ccec96c6b69..fadb5979c48b6c128f71db1588412bf0a8204677 100644 (file)
@@ -28,7 +28,7 @@ static struct trace_key trace_foo = TRACE_KEY_INIT(FOO);
 
 static void trace_print_foo(const char *message)
 {
-       trace_print_key(&trace_foo, message);
+       trace_printf_key(&trace_foo, "%s", message);
 }
 ------------
 +
@@ -95,3 +95,46 @@ for (;;) {
 }
 trace_performance(t, "frotz");
 ------------
+
+Bugs & Caveats
+--------------
+
+GIT_TRACE_* environment variables can be used to tell Git to show
+trace output to its standard error stream. Git can often spawn a pager
+internally to run its subcommand and send its standard output and
+standard error to it.
+
+Because GIT_TRACE_PERFORMANCE trace is generated only at the very end
+of the program with atexit(), which happens after the pager exits, it
+would not work well if you send its log to the standard error output
+and let Git spawn the pager at the same time.
+
+As a work around, you can for example use '--no-pager', or set
+GIT_TRACE_PERFORMANCE to another file descriptor which is redirected
+to stderr, or set GIT_TRACE_PERFORMANCE to a file specified by its
+absolute path.
+
+For example instead of the following command which by default may not
+print any performance information:
+
+------------
+GIT_TRACE_PERFORMANCE=2 git log -1
+------------
+
+you may want to use:
+
+------------
+GIT_TRACE_PERFORMANCE=2 git --no-pager log -1
+------------
+
+or:
+
+------------
+GIT_TRACE_PERFORMANCE=3 3>&2 git log -1
+------------
+
+or:
+
+------------
+GIT_TRACE_PERFORMANCE=/path/to/log/file git log -1
+------------
index c6977bbc5af9c9bcdd21dc26ddb93588686a38d8..c59ac9936a89e5e195b9a75bd4fd5d64a2385ffa 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)
@@ -307,7 +309,7 @@ In multi_ack mode:
     ready to make a packfile, it will blindly ACK all 'have' obj-ids
     back to the client.
 
-  * the server will then send a 'NACK' and then wait for another response
+  * the server will then send a 'NAK' and then wait for another response
     from the client - either a 'done' or another list of 'have' lines.
 
 In multi_ack_detailed mode:
@@ -454,7 +456,8 @@ The reference discovery phase is done nearly the same way as it is in the
 fetching protocol. Each reference obj-id and name on the server is sent
 in packet-line format to the client, followed by a flush-pkt.  The only
 real difference is that the capability listing is different - the only
-possible values are 'report-status', 'delete-refs' and 'ofs-delta'.
+possible values are 'report-status', 'delete-refs', 'ofs-delta' and
+'push-options'.
 
 Reference Update Request and Packfile Transfer
 ----------------------------------------------
@@ -465,9 +468,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 and then the packfile that should
-contain all the objects that the server will need to complete the new
-references.
+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.
 
 ----
   update-request    =  *shallow ( command-list | push-cert ) [packfile]
@@ -526,7 +530,7 @@ Push Certificate
 
 A push certificate begins with a set of header lines.  After the
 header and an empty line, the protocol commands follow, one per
-line. Note that the the trailing LF in push-cert PKT-LINEs is _not_
+line. Note that the trailing LF in push-cert PKT-LINEs is _not_
 optional; it must be present.
 
 Currently, the following header fields are defined:
index eaab6b4ac723c9f5d7dde9d70fe7e01d234e7734..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
 -----------
 
@@ -253,6 +278,15 @@ atomic pushes. If the pushing client requests this capability, the server
 will update the refs in one atomic transaction. Either all refs are
 updated or none.
 
+push-options
+------------
+
+If the server sends the 'push-options' capability it is able to accept
+push options after the update commands have been sent, but before the
+packfile is streamed. If the pushing client requests this capability,
+the server will pass the options to the pre- and post- receive hooks
+that process this push request.
+
 allow-tip-sha1-in-want
 ----------------------
 
index bf30167ae3590c97100beaea7070645a6da124a3..ecedb34bba54ecf8105336d5a98ca349ff35c63c 100644 (file)
@@ -67,9 +67,9 @@ with non-binary data the same whether or not they contain the trailing
 LF (stripping the LF if present, and not complaining when it is
 missing).
 
-The maximum length of a pkt-line's data component is 65520 bytes.
-Implementations MUST NOT send pkt-line whose length exceeds 65524
-(65520 bytes of payload + 4 bytes of length data).
+The maximum length of a pkt-line's data component is 65516 bytes.
+Implementations MUST NOT send pkt-line whose length exceeds 65520
+(65516 bytes of payload + 4 bytes of length data).
 
 Implementations SHOULD NOT send an empty pkt-line ("0004").
 
diff --git a/Documentation/technical/signature-format.txt b/Documentation/technical/signature-format.txt
new file mode 100644 (file)
index 0000000..2c9406a
--- /dev/null
@@ -0,0 +1,186 @@
+Git signature format
+====================
+
+== Overview
+
+Git uses cryptographic signatures in various places, currently objects (tags,
+commits, mergetags) and transactions (pushes). In every case, the command which
+is about to create an object or transaction determines a payload from that,
+calls gpg to obtain a detached signature for the payload (`gpg -bsa`) and
+embeds the signature into the object or transaction.
+
+Signatures always begin with `-----BEGIN PGP SIGNATURE-----`
+and end with `-----END PGP SIGNATURE-----`, unless gpg is told to
+produce RFC1991 signatures which use `MESSAGE` instead of `SIGNATURE`.
+
+The signed payload and the way the signature is embedded depends
+on the type of the object resp. transaction.
+
+== Tag signatures
+
+- created by: `git tag -s`
+- payload: annotated tag object
+- embedding: append the signature to the unsigned tag object
+- example: tag `signedtag` with subject `signed tag`
+
+----
+object 04b871796dc0420f8e7561a895b52484b701d51a
+type commit
+tag signedtag
+tagger C O Mitter <committer@example.com> 1465981006 +0000
+
+signed tag
+
+signed tag message body
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn
+rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh
+8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods
+q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0
+rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x
+lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E=
+=jpXa
+-----END PGP SIGNATURE-----
+----
+
+- verify with: `git verify-tag [-v]` or `git tag -v`
+
+----
+gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189
+gpg: Good signature from "Eris Discordia <discord@example.net>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg:          There is no indication that the signature belongs to the owner.
+Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA  29A4 6109 2E85 B722 7189
+object 04b871796dc0420f8e7561a895b52484b701d51a
+type commit
+tag signedtag
+tagger C O Mitter <committer@example.com> 1465981006 +0000
+
+signed tag
+
+signed tag message body
+----
+
+== Commit signatures
+
+- created by: `git commit -S`
+- payload: commit object
+- embedding: header entry `gpgsig`
+  (content is preceded by a space)
+- example: commit with subject `signed commit`
+
+----
+tree eebfed94e75e7760540d1485c740902590a00332
+parent 04b871796dc0420f8e7561a895b52484b701d51a
+author A U Thor <author@example.com> 1465981137 +0000
+committer C O Mitter <committer@example.com> 1465981137 +0000
+gpgsig -----BEGIN PGP SIGNATURE-----
+ Version: GnuPG v1
+
+ iQEcBAABAgAGBQJXYRjRAAoJEGEJLoW3InGJ3IwIAIY4SA6GxY3BjL60YyvsJPh/
+ HRCJwH+w7wt3Yc/9/bW2F+gF72kdHOOs2jfv+OZhq0q4OAN6fvVSczISY/82LpS7
+ DVdMQj2/YcHDT4xrDNBnXnviDO9G7am/9OE77kEbXrp7QPxvhjkicHNwy2rEflAA
+ zn075rtEERDHr8nRYiDh8eVrefSO7D+bdQ7gv+7GsYMsd2auJWi1dHOSfTr9HIF4
+ HJhWXT9d2f8W+diRYXGh4X0wYiGg6na/soXc+vdtDYBzIxanRqjg8jCAeo1eOTk1
+ EdTwhcTZlI0x5pvJ3H0+4hA2jtldVtmPM4OTB0cTrEWBad7XV6YgiyuII73Ve3I=
+ =jKHM
+ -----END PGP SIGNATURE-----
+
+signed commit
+
+signed commit message body
+----
+
+- verify with: `git verify-commit [-v]` (or `git show --show-signature`)
+
+----
+gpg: Signature made Wed Jun 15 10:58:57 2016 CEST using RSA key ID B7227189
+gpg: Good signature from "Eris Discordia <discord@example.net>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg:          There is no indication that the signature belongs to the owner.
+Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA  29A4 6109 2E85 B722 7189
+tree eebfed94e75e7760540d1485c740902590a00332
+parent 04b871796dc0420f8e7561a895b52484b701d51a
+author A U Thor <author@example.com> 1465981137 +0000
+committer C O Mitter <committer@example.com> 1465981137 +0000
+
+signed commit
+
+signed commit message body
+----
+
+== Mergetag signatures
+
+- created by: `git merge` on signed tag
+- payload/embedding: the whole signed tag object is embedded into
+  the (merge) commit object as header entry `mergetag`
+- example: merge of the signed tag `signedtag` as above
+
+----
+tree c7b1cff039a93f3600a1d18b82d26688668c7dea
+parent c33429be94b5f2d3ee9b0adad223f877f174b05d
+parent 04b871796dc0420f8e7561a895b52484b701d51a
+author A U Thor <author@example.com> 1465982009 +0000
+committer C O Mitter <committer@example.com> 1465982009 +0000
+mergetag object 04b871796dc0420f8e7561a895b52484b701d51a
+ type commit
+ tag signedtag
+ tagger C O Mitter <committer@example.com> 1465981006 +0000
+
+ signed tag
+
+ signed tag message body
+ -----BEGIN PGP SIGNATURE-----
+ Version: GnuPG v1
+
+ iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn
+ rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh
+ 8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods
+ q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0
+ rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x
+ lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E=
+ =jpXa
+ -----END PGP SIGNATURE-----
+
+Merge tag 'signedtag' into downstream
+
+signed tag
+
+signed tag message body
+
+# gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189
+# gpg: Good signature from "Eris Discordia <discord@example.net>"
+# gpg: WARNING: This key is not certified with a trusted signature!
+# gpg:          There is no indication that the signature belongs to the owner.
+# Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA  29A4 6109 2E85 B722 7189
+----
+
+- verify with: verification is embedded in merge commit message by default,
+  alternatively with `git show --show-signature`:
+
+----
+commit 9863f0c76ff78712b6800e199a46aa56afbcbd49
+merged tag 'signedtag'
+gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189
+gpg: Good signature from "Eris Discordia <discord@example.net>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg:          There is no indication that the signature belongs to the owner.
+Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA  29A4 6109 2E85 B722 7189
+Merge: c33429b 04b8717
+Author: A U Thor <author@example.com>
+Date:   Wed Jun 15 09:13:29 2016 +0000
+
+    Merge tag 'signedtag' into downstream
+
+    signed tag
+
+    signed tag message body
+
+    # gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189
+    # gpg: Good signature from "Eris Discordia <discord@example.net>"
+    # gpg: WARNING: This key is not certified with a trusted signature!
+    # gpg:          There is no indication that the signature belongs to the owner.
+    # Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA  29A4 6109 2E85 B722 7189
+----
index 4e9450b3ae0c403820f0166435c52c4ea74e7451..520d6e66ec9f14ac1a2dedc84411398d8916ad15 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.8.0
+DEF_VER=v2.11.0
 
 LF='
 '
index 2249baba1d96636d9f14459b0fd25b32bea6ef01..f53fcc90d71b7e0ba95b94e9baf67d559085863c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -296,7 +296,13 @@ all::
 # Define USE_NED_ALLOCATOR if you want to replace the platforms default
 # memory allocators with the nedmalloc allocator written by Niall Douglas.
 #
-# Define NO_REGEX if you have no or inferior regex support in your C library.
+# Define OVERRIDE_STRDUP to override the libc version of strdup(3).
+# This is necessary when using a custom allocator in order to avoid
+# crashes due to allocation and free working on different 'heaps'.
+# It's defined automatically if USE_NED_ALLOCATOR is set.
+#
+# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
+# feature.
 #
 # Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
 # user.
@@ -351,12 +357,12 @@ all::
 # Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
 # return NULL when it receives a bogus time_t.
 #
-# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime in librt.
+# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
 #
-# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC in librt.
+# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC.
 #
-# Define NO_HMAC_CTX_CLEANUP if your OpenSSL is version 0.9.6b or earlier to
-# cleanup the HMAC context with the older HMAC_cleanup function.
+# Define NEEDS_LIBRT if your platform requires linking with librt (glibc version
+# before 2.17) for clock_gettime and CLOCK_MONOTONIC.
 #
 # Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
 # compiles the following initialization:
@@ -370,6 +376,14 @@ all::
 # Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
 #
 # Define HAVE_GETDELIM if your system has the getdelim() function.
+#
+# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
+# default environment variables to be passed when a pager is spawned, e.g.
+#
+#    PAGER_ENV = LESS=FRX LV=-c
+#
+# to say "export LESS=FRX (and LV=-c) if the environment variable
+# LESS (and LV) is not set, respectively".
 
 GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -378,13 +392,7 @@ GIT-VERSION-FILE: FORCE
 # CFLAGS and LDFLAGS are for the users to override from the command line.
 
 CFLAGS = -g -O2 -Wall
-LDFLAGS =
-ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
-ALL_LDFLAGS = $(LDFLAGS)
-STRIP ?= strip
-
-ifdef DEVELOPER
-CFLAGS += -Werror \
+DEVELOPER_CFLAGS = -Werror \
        -Wdeclaration-after-statement \
        -Wno-format-zero-length \
        -Wold-style-definition \
@@ -393,7 +401,10 @@ CFLAGS += -Werror \
        -Wstrict-prototypes \
        -Wunused \
        -Wvla
-endif
+LDFLAGS =
+ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
+ALL_LDFLAGS = $(LDFLAGS)
+STRIP ?= strip
 
 # Create as necessary, replace existing, make ranlib unneeded.
 ARFLAGS = rcs
@@ -443,7 +454,6 @@ DIFF = diff
 TAR = tar
 FIND = find
 INSTALL = install
-RPMBUILD = rpmbuild
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
@@ -452,10 +462,12 @@ CURL_CONFIG = curl-config
 PTHREAD_LIBS = -lpthread
 PTHREAD_CFLAGS =
 GCOV = gcov
+SPATCH = spatch
 
 export TCL_PATH TCLTK_PATH
 
 SPARSE_FLAGS =
+SPATCH_FLAGS = --all-includes
 
 
 
@@ -624,7 +636,7 @@ TEST_PROGRAMS_NEED_X += test-svn-fe
 TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
 TEST_PROGRAMS_NEED_X += test-wildmatch
 
-TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
+TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
 
 # List built-in command $C whose implementation cmd_$C() is not in
 # builtin/$C.o but is linked in as part of some other command.
@@ -687,6 +699,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
@@ -725,6 +738,7 @@ LIB_OBJS += diff-lib.o
 LIB_OBJS += diff-no-index.o
 LIB_OBJS += diff.o
 LIB_OBJS += dir.o
+LIB_OBJS += dir-iterator.o
 LIB_OBJS += editor.o
 LIB_OBJS += entry.o
 LIB_OBJS += environment.o
@@ -758,6 +772,7 @@ LIB_OBJS += merge.o
 LIB_OBJS += merge-blobs.o
 LIB_OBJS += merge-recursive.o
 LIB_OBJS += mergesort.o
+LIB_OBJS += mru.o
 LIB_OBJS += name-hash.o
 LIB_OBJS += notes.o
 LIB_OBJS += notes-cache.o
@@ -789,6 +804,7 @@ LIB_OBJS += read-cache.o
 LIB_OBJS += reflog-walk.o
 LIB_OBJS += refs.o
 LIB_OBJS += refs/files-backend.o
+LIB_OBJS += refs/iterator.o
 LIB_OBJS += ref-filter.o
 LIB_OBJS += remote.o
 LIB_OBJS += replace_object.o
@@ -816,6 +832,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
@@ -946,7 +963,7 @@ BUILTIN_OBJS += builtin/verify-tag.o
 BUILTIN_OBJS += builtin/worktree.o
 BUILTIN_OBJS += builtin/write-tree.o
 
-GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
+GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
 EXTLIBS =
 
 GIT_USER_AGENT = git/$(GIT_VERSION)
@@ -955,6 +972,10 @@ include config.mak.uname
 -include config.mak.autogen
 -include config.mak
 
+ifdef DEVELOPER
+CFLAGS += $(DEVELOPER_CFLAGS)
+endif
+
 ifndef sysconfdir
 ifeq ($(prefix),/usr)
 sysconfdir = /etc
@@ -1026,6 +1047,7 @@ ifeq ($(uname_S),Darwin)
                endif
        endif
        ifndef NO_APPLE_COMMON_CRYPTO
+               NO_OPENSSL = YesPlease
                APPLE_COMMON_CRYPTO = YesPlease
                COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
        endif
@@ -1138,9 +1160,6 @@ ifndef NO_OPENSSL
        ifdef NEEDS_CRYPTO_WITH_SSL
                OPENSSL_LIBSSL += -lcrypto
        endif
-       ifdef NO_HMAC_CTX_CLEANUP
-               BASIC_CFLAGS += -DNO_HMAC_CTX_CLEANUP
-       endif
 else
        BASIC_CFLAGS += -DNO_OPENSSL
        BLK_SHA1 = 1
@@ -1448,8 +1467,14 @@ ifdef NATIVE_CRLF
 endif
 
 ifdef USE_NED_ALLOCATOR
-       COMPAT_CFLAGS += -Icompat/nedmalloc
-       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
+       COMPAT_CFLAGS += -Icompat/nedmalloc
+       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
+       OVERRIDE_STRDUP = YesPlease
+endif
+
+ifdef OVERRIDE_STRDUP
+       COMPAT_CFLAGS += -DOVERRIDE_STRDUP
+       COMPAT_OBJS += compat/strdup.o
 endif
 
 ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
@@ -1471,13 +1496,16 @@ endif
 
 ifdef HAVE_CLOCK_GETTIME
        BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
-       EXTLIBS += -lrt
 endif
 
 ifdef HAVE_CLOCK_MONOTONIC
        BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
 endif
 
+ifdef NEEDS_LIBRT
+       EXTLIBS += -lrt
+endif
+
 ifdef HAVE_BSD_SYSCTL
        BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
 endif
@@ -1498,6 +1526,10 @@ ifeq ($(PYTHON_PATH),)
 NO_PYTHON = NoThanks
 endif
 
+ifndef PAGER_ENV
+PAGER_ENV = LESS=FRX LV=-c
+endif
+
 QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
 QUIET_SUBDIR1  =
 
@@ -1578,7 +1610,15 @@ TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
 DIFF_SQ = $(subst ','\'',$(DIFF))
 PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
 
-LIBS = $(GITLIBS) $(EXTLIBS)
+# We must filter out any object files from $(GITLIBS),
+# as it is typically used like:
+#
+#   foo: foo.o $(GITLIBS)
+#      $(CC) $(filter %.o,$^) $(LIBS)
+#
+# where we use it as a dependency. Since we also pull object files
+# 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)
@@ -1619,6 +1659,11 @@ ifdef DEFAULT_HELP_FORMAT
 BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
 endif
 
+PAGER_ENV_SQ = $(subst ','\'',$(PAGER_ENV))
+PAGER_ENV_CQ = "$(subst ",\",$(subst \,\\,$(PAGER_ENV)))"
+PAGER_ENV_CQ_SQ = $(subst ','\'',$(PAGER_ENV_CQ))
+BASIC_CFLAGS += -DPAGER_ENV='$(PAGER_ENV_CQ_SQ)'
+
 ALL_CFLAGS += $(BASIC_CFLAGS)
 ALL_LDFLAGS += $(BASIC_LDFLAGS)
 
@@ -1714,8 +1759,8 @@ git.sp git.s git.o: EXTRA_CPPFLAGS = \
        '-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
 
 git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
-       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) git.o \
-               $(BUILTIN_OBJS) $(LIBS)
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
+               $(filter %.o,$^) $(LIBS)
 
 help.sp help.s help.o: common-cmds.h
 
@@ -1743,7 +1788,7 @@ common-cmds.h: $(wildcard Documentation/git-*.txt)
 
 SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
        $(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
-       $(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP)
+       $(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
 define cmd_munge_script
 $(RM) $@ $@+ && \
 sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
@@ -1756,6 +1801,7 @@ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
     -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
     -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
     -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
+    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
     $@.sh >$@+
 endef
 
@@ -1904,10 +1950,11 @@ VCSSVN_OBJS += vcs-svn/fast_export.o
 VCSSVN_OBJS += vcs-svn/svndiff.o
 VCSSVN_OBJS += vcs-svn/svndump.o
 
-TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
+TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
 OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
        $(XDIFF_OBJS) \
        $(VCSSVN_OBJS) \
+       common-main.o \
        git.o
 ifndef NO_CURL
        OBJECTS += http.o http-walker.o remote-curl.o
@@ -1999,7 +2046,7 @@ endif
 
 ifdef USE_NED_ALLOCATOR
 compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
-       -DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
+       -DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
 compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
 endif
 
@@ -2069,7 +2116,10 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
        --keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
 LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
-LOCALIZED_SH = $(SCRIPT_SH) git-parse-remote.sh
+LOCALIZED_SH = $(SCRIPT_SH)
+LOCALIZED_SH += git-parse-remote.sh
+LOCALIZED_SH += git-rebase--interactive.sh
+LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
 
 ifdef XGETTEXT_INCLUDE_TESTS
@@ -2159,6 +2209,7 @@ GIT-BUILD-OPTIONS: FORCE
        @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
        @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
        @echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
+       @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
 ifdef TEST_OUTPUT_DIRECTORY
        @echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
 endif
@@ -2211,7 +2262,7 @@ bin-wrappers/%: wrap-for-bin.sh
        @mkdir -p bin-wrappers
        $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
             -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
-            -e 's|@@PROG@@|$(@F)|' < $< > $@ && \
+            -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
        chmod +x $@
 
 # GNU make supports exporting all variables by "export" without parameters.
@@ -2231,25 +2282,17 @@ perf: all
 
 .PHONY: test perf
 
-test-ctype$X: ctype.o
+t/helper/test-line-buffer$X: $(VCSSVN_LIB)
 
-test-date$X: date.o ctype.o
-
-test-delta$X: diff-delta.o patch-delta.o
-
-test-line-buffer$X: vcs-svn/lib.a
-
-test-parse-options$X: parse-options.o parse-options-cb.o
-
-test-svn-fe$X: vcs-svn/lib.a
+t/helper/test-svn-fe$X: $(VCSSVN_LIB)
 
 .PRECIOUS: $(TEST_OBJS)
 
-test-%$X: test-%.o GIT-LDFLAGS $(GITLIBS)
+t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
 
-check-sha1:: test-sha1$X
-       ./test-sha1.sh
+check-sha1:: t/helper/test-sha1$X
+       t/helper/test-sha1.sh
 
 SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))
 
@@ -2263,13 +2306,25 @@ sparse: $(SP_OBJ)
 check: common-cmds.h
        @if sparse; \
        then \
-               echo 2>&1 "Use 'make sparse' instead"; \
+               echo >&2 "Use 'make sparse' instead"; \
                $(MAKE) --no-print-directory sparse; \
        else \
-               echo 2>&1 "Did you mean 'make test'?"; \
+               echo >&2 "Did you mean 'make test'?"; \
                exit 1; \
        fi
 
+C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
+%.cocci.patch: %.cocci $(C_SOURCES)
+       @echo '    ' SPATCH $<; \
+       for f in $(C_SOURCES); do \
+               $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS); \
+       done >$@ 2>$@.log; \
+       if test -s $@; \
+       then \
+               echo '    ' SPATCH result: $@; \
+       fi
+coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))
+
 ### Installation rules
 
 ifneq ($(filter /%,$(firstword $(template_dir))),)
@@ -2396,31 +2451,25 @@ quick-install-html:
 
 ### Maintainer's dist rules
 
-git.spec: git.spec.in GIT-VERSION-FILE
-       sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
-       mv $@+ $@
-
 GIT_TARNAME = git-$(GIT_VERSION)
-dist: git.spec git-archive$(X) configure
+dist: git-archive$(X) configure
        ./git-archive --format=tar \
                --prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
        @mkdir -p $(GIT_TARNAME)
-       @cp git.spec configure $(GIT_TARNAME)
+       @cp configure $(GIT_TARNAME)
        @echo $(GIT_VERSION) > $(GIT_TARNAME)/version
        @$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
        $(TAR) rf $(GIT_TARNAME).tar \
-               $(GIT_TARNAME)/git.spec \
                $(GIT_TARNAME)/configure \
                $(GIT_TARNAME)/version \
                $(GIT_TARNAME)/git-gui/version
        @$(RM) -r $(GIT_TARNAME)
        gzip -f -9 $(GIT_TARNAME).tar
 
-rpm: dist
-       $(RPMBUILD) \
-               --define "_source_filedigest_algorithm md5" \
-               --define "_binary_filedigest_algorithm md5" \
-               -ta $(GIT_TARNAME).tar.gz
+rpm::
+       @echo >&2 "Use distro packaged sources to run rpmbuild"
+       @false
+.PHONY: rpm
 
 htmldocs = git-htmldocs-$(GIT_VERSION)
 manpages = git-manpages-$(GIT_VERSION)
@@ -2456,8 +2505,8 @@ profile-clean:
        $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
 
 clean: profile-clean coverage-clean
-       $(RM) *.o *.res refs/*.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
-       $(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o
+       $(RM) *.res
+       $(RM) $(OBJECTS)
        $(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
        $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
        $(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
@@ -2467,6 +2516,7 @@ clean: profile-clean coverage-clean
        $(RM) -r $(GIT_TARNAME) .doc-tmp-dir
        $(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
        $(RM) $(htmldocs).tar.gz $(manpages).tar.gz
+       $(RM) contrib/coccinelle/*.cocci.patch*
        $(MAKE) -C Documentation/ clean
 ifndef NO_PERL
        $(MAKE) -C gitweb clean
@@ -2496,6 +2546,7 @@ ALL_COMMANDS += git-gui git-citool
 
 .PHONY: check-docs
 check-docs::
+       $(MAKE) -C Documentation lint-docs
        @(for v in $(ALL_COMMANDS); \
        do \
                case "$$v" in \
index d1ffbb61702ee1c51f38ee7f65800147d514d084..bd8a918a9bcbd46590078d98a66f3d7e939df3fb 100644 (file)
--- a/README.md
+++ b/README.md
@@ -17,14 +17,14 @@ including full documentation and Git related tools.
 
 See [Documentation/gittutorial.txt][] to get started, then see
 [Documentation/giteveryday.txt][] for a useful minimum set of commands, and
-[Documentation/git-commandname.txt][] for documentation of each command.
+Documentation/git-<commandname>.txt for documentation of each command.
 If git has been correctly installed, then the tutorial can also be
-read with "man gittutorial" or "git help tutorial", and the
-documentation of each command with "man git-commandname" or "git help
-commandname".
+read with `man gittutorial` or `git help tutorial`, and the
+documentation of each command with `man git-<commandname>` or `git help
+<commandname>`.
 
 CVS users may also want to read [Documentation/gitcvs-migration.txt][]
-("man gitcvs-migration" or "git help cvs-migration" if git is
+(`man gitcvs-migration` or `git help cvs-migration` if git is
 installed).
 
 The user discussion and development of Git take place on the Git
@@ -57,6 +57,5 @@ and the name as (depending on your mood):
 [INSTALL]: INSTALL
 [Documentation/gittutorial.txt]: Documentation/gittutorial.txt
 [Documentation/giteveryday.txt]: Documentation/giteveryday.txt
-[Documentation/git-commandname.txt]: Documentation/git-commandname.txt
 [Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt
 [Documentation/SubmittingPatches]: Documentation/SubmittingPatches
index 7db30403c3471e15f4f15a5e68016d7926b3e3de..b54330f7cdb37630dc47d6bdb71e847b8a947c17 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.8.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.11.0.txt
\ No newline at end of file
index 5edb4e78162ca6646ef42ad2c8abc36872cd75a5..2825de85912fc730d9a40fa66f4f83b6250a4171 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -167,7 +167,6 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
        strbuf_add(&path, pfx, pfx_len);
        strbuf_addstr(&path, arg);
 #else
-       char *p;
        /* don't add prefix to absolute paths, but still replace '\' by '/' */
        strbuf_reset(&path);
        if (is_absolute_path(arg))
@@ -175,9 +174,7 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
        else if (pfx_len)
                strbuf_add(&path, pfx, pfx_len);
        strbuf_addstr(&path, arg);
-       for (p = path.buf + pfx_len; *p; p++)
-               if (*p == '\\')
-                       *p = '/';
+       convert_slashes(path.buf + pfx_len);
 #endif
        return path.buf;
 }
index 4dc5cf10a8533b1bfc3bd1483e91df115aa8f868..b84ae4960f11af10d01667d01eb0bb27f52ecb14 100644 (file)
--- a/advice.c
+++ b/advice.c
@@ -79,7 +79,20 @@ int git_default_advice_config(const char *var, const char *value)
 
 int error_resolve_conflict(const char *me)
 {
-       error("%s is not possible because you have unmerged files.", me);
+       if (!strcmp(me, "cherry-pick"))
+               error(_("Cherry-picking is not possible because you have unmerged files."));
+       else if (!strcmp(me, "commit"))
+               error(_("Committing is not possible because you have unmerged files."));
+       else if (!strcmp(me, "merge"))
+               error(_("Merging is not possible because you have unmerged files."));
+       else if (!strcmp(me, "pull"))
+               error(_("Pulling is not possible because you have unmerged files."));
+       else if (!strcmp(me, "revert"))
+               error(_("Reverting is not possible because you have unmerged files."));
+       else
+               error(_("It is not possible to %s because you have unmerged files."),
+                       me);
+
        if (advice_resolve_conflict)
                /*
                 * Message used both when 'git commit' fails and when
@@ -93,7 +106,7 @@ int error_resolve_conflict(const char *me)
 void NORETURN die_resolve_conflict(const char *me)
 {
        error_resolve_conflict(me);
-       die("Exiting because of an unresolved conflict.");
+       die(_("Exiting because of an unresolved conflict."));
 }
 
 void NORETURN die_conclude_merge(void)
@@ -106,14 +119,14 @@ void NORETURN die_conclude_merge(void)
 
 void detach_advice(const char *new_name)
 {
-       const char fmt[] =
-       "Note: checking out '%s'.\n\n"
+       const char *fmt =
+       _("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";
+       "  git checkout -b <new-branch-name>\n\n");
 
        fprintf(stderr, fmt, new_name);
 }
diff --git a/apply.c b/apply.c
new file mode 100644 (file)
index 0000000..705cf56
--- /dev/null
+++ b/apply.c
@@ -0,0 +1,4988 @@
+/*
+ * 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;
+       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 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);
+                       int res;
+                       if (len < oplen || memcmp(p->str, line, oplen))
+                               continue;
+                       res = p->fn(state, line + oplen, patch);
+                       if (res < 0)
+                               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->is_delete && !patch->new_name) {
+                               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 = 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.
+ *
+ * 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;
+}
+
+#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_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, 1);
+       }
+
+       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];
+               int fd;
+
+               if (!strcmp(arg, "-")) {
+                       res = apply_patch(state, 0, "<stdin>", options);
+                       if (res < 0)
+                               goto end;
+                       errs |= res;
+                       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) {
+                       error(_("can't open patch '%s': %s"), arg, strerror(errno));
+                       res = -128;
+                       goto end;
+               }
+               read_stdin = 0;
+               set_default_whitespace_mode(state);
+               res = apply_patch(state, fd, arg, options);
+               close(fd);
+               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 501ca97760b1f62ada876d372bd1abbbc41c6cd0..380e3aedd23c02da9ba70d9c5a258550a9637c71 100644 (file)
@@ -18,6 +18,21 @@ static int tar_umask = 002;
 static int write_tar_filter_archive(const struct archiver *ar,
                                    struct archiver_args *args);
 
+/*
+ * This is the max value that a ustar size header can specify, as it is fixed
+ * at 11 octal digits. POSIX specifies that we switch to extended headers at
+ * this size.
+ *
+ * Likewise for the mtime (which happens to use a buffer of the same size).
+ */
+#if ULONG_MAX == 0xFFFFFFFF
+#define USTAR_MAX_SIZE ULONG_MAX
+#define USTAR_MAX_MTIME ULONG_MAX
+#else
+#define USTAR_MAX_SIZE 077777777777UL
+#define USTAR_MAX_MTIME 077777777777UL
+#endif
+
 /* writes out the whole block, but only if it is full */
 static void write_if_needed(void)
 {
@@ -137,6 +152,20 @@ static void strbuf_append_ext_header(struct strbuf *sb, const char *keyword,
        strbuf_addch(sb, '\n');
 }
 
+/*
+ * Like strbuf_append_ext_header, but for numeric values.
+ */
+static void strbuf_append_ext_header_uint(struct strbuf *sb,
+                                         const char *keyword,
+                                         uintmax_t value)
+{
+       char buf[40]; /* big enough for 2^128 in decimal, plus NUL */
+       int len;
+
+       len = xsnprintf(buf, sizeof(buf), "%"PRIuMAX, value);
+       strbuf_append_ext_header(sb, keyword, buf, len);
+}
+
 static unsigned int ustar_header_chksum(const struct ustar_header *header)
 {
        const unsigned char *p = (const unsigned char *)header;
@@ -181,12 +210,12 @@ static void prepare_header(struct archiver_args *args,
        memcpy(header->magic, "ustar", 6);
        memcpy(header->version, "00", 2);
 
-       snprintf(header->chksum, sizeof(header->chksum), "%07o", ustar_header_chksum(header));
+       xsnprintf(header->chksum, sizeof(header->chksum), "%07o", ustar_header_chksum(header));
 }
 
-static int write_extended_header(struct archiver_args *args,
-                                const unsigned char *sha1,
-                                const void *buffer, unsigned long size)
+static void write_extended_header(struct archiver_args *args,
+                                 const unsigned char *sha1,
+                                 const void *buffer, unsigned long size)
 {
        struct ustar_header header;
        unsigned int mode;
@@ -197,7 +226,6 @@ static int write_extended_header(struct archiver_args *args,
        prepare_header(args, &header, mode, size);
        write_blocked(&header, sizeof(header));
        write_blocked(buffer, size);
-       return 0;
 }
 
 static int write_tar_entry(struct archiver_args *args,
@@ -208,7 +236,7 @@ static int write_tar_entry(struct archiver_args *args,
        struct ustar_header header;
        struct strbuf ext_header = STRBUF_INIT;
        unsigned int old_mode = mode;
-       unsigned long size;
+       unsigned long size, size_in_header;
        void *buffer;
        int err = 0;
 
@@ -267,15 +295,17 @@ static int write_tar_entry(struct archiver_args *args,
                        memcpy(header.linkname, buffer, size);
        }
 
-       prepare_header(args, &header, mode, size);
+       size_in_header = size;
+       if (S_ISREG(mode) && size > USTAR_MAX_SIZE) {
+               size_in_header = 0;
+               strbuf_append_ext_header_uint(&ext_header, "size", size);
+       }
+
+       prepare_header(args, &header, mode, size_in_header);
 
        if (ext_header.len > 0) {
-               err = write_extended_header(args, sha1, ext_header.buf,
-                                           ext_header.len);
-               if (err) {
-                       free(buffer);
-                       return err;
-               }
+               write_extended_header(args, sha1, ext_header.buf,
+                                     ext_header.len);
        }
        strbuf_release(&ext_header);
        write_blocked(&header, sizeof(header));
@@ -289,15 +319,25 @@ static int write_tar_entry(struct archiver_args *args,
        return err;
 }
 
-static int write_global_extended_header(struct archiver_args *args)
+static void write_global_extended_header(struct archiver_args *args)
 {
        const unsigned char *sha1 = args->commit_sha1;
        struct strbuf ext_header = STRBUF_INIT;
        struct ustar_header header;
        unsigned int mode;
-       int err = 0;
 
-       strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40);
+       if (sha1)
+               strbuf_append_ext_header(&ext_header, "comment",
+                                        sha1_to_hex(sha1), 40);
+       if (args->time > USTAR_MAX_MTIME) {
+               strbuf_append_ext_header_uint(&ext_header, "mtime",
+                                             args->time);
+               args->time = USTAR_MAX_MTIME;
+       }
+
+       if (!ext_header.len)
+               return;
+
        memset(&header, 0, sizeof(header));
        *header.typeflag = TYPEFLAG_GLOBAL_HEADER;
        mode = 0100666;
@@ -306,7 +346,6 @@ static int write_global_extended_header(struct archiver_args *args)
        write_blocked(&header, sizeof(header));
        write_blocked(ext_header.buf, ext_header.len);
        strbuf_release(&ext_header);
-       return err;
 }
 
 static struct archiver **tar_filters;
@@ -382,10 +421,8 @@ static int write_tar_archive(const struct archiver *ar,
 {
        int err = 0;
 
-       if (args->commit_sha1)
-               err = write_global_extended_header(args);
-       if (!err)
-               err = write_archive_entries(args, write_tar_entry);
+       write_global_extended_header(args);
+       err = write_archive_entries(args, write_tar_entry);
        if (!err)
                write_trailer();
        return err;
index 5d735ae6039f0d9708d61a27a490953ff27badf5..01751e574bc10c1211d0253d215917ecc4ce82dd 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -322,7 +322,7 @@ static int path_exists(struct tree *tree, const char *path)
        pathspec.recursive = 1;
        ret = read_tree_recursive(tree, "", 0, 0, &pathspec,
                                  reject_entry, &pathspec);
-       free_pathspec(&pathspec);
+       clear_pathspec(&pathspec);
        return ret != 0;
 }
 
@@ -458,11 +458,11 @@ static int parse_archive_args(int argc, const char **argv,
        argc = parse_options(argc, argv, NULL, opts, archive_usage, 0);
 
        if (remote)
-               die("Unexpected option --remote");
+               die(_("Unexpected option --remote"));
        if (exec)
-               die("Option --exec can only be used together with --remote");
+               die(_("Option --exec can only be used together with --remote"));
        if (output)
-               die("Unexpected option --output");
+               die(_("Unexpected option --output"));
 
        if (!base)
                base = "";
@@ -484,14 +484,14 @@ static int parse_archive_args(int argc, const char **argv,
                usage_with_options(archive_usage, opts);
        *ar = lookup_archiver(format);
        if (!*ar || (is_remote && !((*ar)->flags & ARCHIVER_REMOTE)))
-               die("Unknown archive format '%s'", format);
+               die(_("Unknown archive format '%s'"), format);
 
        args->compression_level = Z_DEFAULT_COMPRESSION;
        if (compression_level != -1) {
                if ((*ar)->flags & ARCHIVER_WANT_COMPRESSION_LEVELS)
                        args->compression_level = compression_level;
                else {
-                       die("Argument not supported for format '%s': -%d",
+                       die(_("Argument not supported for format '%s': -%d"),
                                        format, compression_level);
                }
        }
@@ -504,15 +504,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 +516,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 6537a433da201e866208ab23bf32bcafee037683..1fcf042b87c8a39fb967e07c5acb81c0c364d136 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -122,7 +122,7 @@ struct pattern {
        const char *pattern;
        int patternlen;
        int nowildcardlen;
-       int flags;              /* EXC_FLAG_* */
+       unsigned flags;         /* EXC_FLAG_* */
 };
 
 /*
@@ -531,7 +531,11 @@ static void bootstrap_attr_stack(void)
                debug_push(elem);
        }
 
-       elem = read_attr_from_file(git_path_info_attributes(), 1);
+       if (startup_info->have_repository)
+               elem = read_attr_from_file(git_path_info_attributes(), 1);
+       else
+               elem = NULL;
+
        if (!elem)
                elem = xcalloc(1, sizeof(*elem));
        elem->origin = NULL;
index 7996c2907b0e571578f2ce18095c83c134a503b3..21bc6daa4393cb33994ba2eb305354e56d166cc0 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -215,7 +215,7 @@ 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);
@@ -438,12 +438,12 @@ static void read_bisect_paths(struct argv_array *array)
        FILE *fp = fopen(filename, "r");
 
        if (!fp)
-               die_errno("Could not open file '%s'", filename);
+               die_errno(_("Could not open file '%s'"), filename);
 
        while (strbuf_getline_lf(&str, fp) != EOF) {
                strbuf_trim(&str);
                if (sq_dequote_to_argv_array(str.buf, array))
-                       die("Badly quoted content in file '%s': %s",
+                       die(_("Badly quoted content in file '%s': %s"),
                            filename, str.buf);
        }
 
@@ -646,10 +646,13 @@ static void exit_if_skipped_commits(struct commit_list *tried,
 
        printf("There are only 'skip'ped commits left to test.\n"
               "The first %s commit could be any of:\n", term_bad);
-       print_commit_list(tried, "%s\n", "%s\n");
+
+       for ( ; tried; tried = tried->next)
+               printf("%s\n", oid_to_hex(&tried->item->object.oid));
+
        if (bad)
                printf("%s\n", oid_to_hex(bad));
-       printf("We cannot bisect more!\n");
+       printf(_("We cannot bisect more!\n"));
        exit(2);
 }
 
@@ -702,7 +705,7 @@ static struct commit *get_commit_reference(const unsigned char *sha1)
 {
        struct commit *r = lookup_commit_reference(sha1);
        if (!r)
-               die("Not a valid commit name %s", sha1_to_hex(sha1));
+               die(_("Not a valid commit name %s"), sha1_to_hex(sha1));
        return r;
 }
 
@@ -726,27 +729,27 @@ static void handle_bad_merge_base(void)
                char *bad_hex = oid_to_hex(current_bad_oid);
                char *good_hex = join_sha1_array_hex(&good_revs, ' ');
                if (!strcmp(term_bad, "bad") && !strcmp(term_good, "good")) {
-                       fprintf(stderr, "The merge base %s is bad.\n"
+                       fprintf(stderr, _("The merge base %s is bad.\n"
                                "This means the bug has been fixed "
-                               "between %s and [%s].\n",
+                               "between %s and [%s].\n"),
                                bad_hex, bad_hex, good_hex);
                } else if (!strcmp(term_bad, "new") && !strcmp(term_good, "old")) {
-                       fprintf(stderr, "The merge base %s is new.\n"
+                       fprintf(stderr, _("The merge base %s is new.\n"
                                "The property has changed "
-                               "between %s and [%s].\n",
+                               "between %s and [%s].\n"),
                                bad_hex, bad_hex, good_hex);
                } else {
-                       fprintf(stderr, "The merge base %s is %s.\n"
+                       fprintf(stderr, _("The merge base %s is %s.\n"
                                "This means the first '%s' commit is "
-                               "between %s and [%s].\n",
+                               "between %s and [%s].\n"),
                                bad_hex, term_bad, term_good, bad_hex, good_hex);
                }
                exit(3);
        }
 
-       fprintf(stderr, "Some %s revs are not ancestor of the %s rev.\n"
+       fprintf(stderr, _("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",
+               "Maybe you mistook %s and %s revs?\n"),
                term_good, term_bad, term_good, term_bad);
        exit(1);
 }
@@ -754,14 +757,14 @@ static void handle_bad_merge_base(void)
 static void handle_skipped_merge_base(const unsigned char *mb)
 {
        char *mb_hex = sha1_to_hex(mb);
-       char *bad_hex = sha1_to_hex(current_bad_oid->hash);
+       char *bad_hex = oid_to_hex(current_bad_oid);
        char *good_hex = join_sha1_array_hex(&good_revs, ' ');
 
-       warning("the merge base between %s and [%s] "
+       warning(_("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.",
+               "We continue anyway."),
                bad_hex, good_hex, term_bad, mb_hex, bad_hex);
        free(good_hex);
 }
@@ -792,7 +795,7 @@ static void check_merge_bases(int no_checkout)
                } else if (0 <= sha1_array_lookup(&skipped_revs, mb)) {
                        handle_skipped_merge_base(mb);
                } else {
-                       printf("Bisecting: a merge base must be tested\n");
+                       printf(_("Bisecting: a merge base must be tested\n"));
                        exit(bisect_checkout(mb, no_checkout));
                }
        }
@@ -843,7 +846,7 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
        int fd;
 
        if (!current_bad_oid)
-               die("a %s revision is needed", term_bad);
+               die(_("a %s revision is needed"), term_bad);
 
        /* Check if file BISECT_ANCESTORS_OK exists. */
        if (!stat(filename, &st) && S_ISREG(st.st_mode))
@@ -860,8 +863,8 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
        /* Create file BISECT_ANCESTORS_OK. */
        fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
        if (fd < 0)
-               warning("could not create file '%s': %s",
-                       filename, strerror(errno));
+               warning_errno(_("could not create file '%s'"),
+                             filename);
        else
                close(fd);
  done:
@@ -890,6 +893,7 @@ static void show_diff_tree(const char *prefix, struct commit *commit)
        if (!opt.diffopt.output_format)
                opt.diffopt.output_format = DIFF_FORMAT_RAW;
 
+       setup_revisions(0, NULL, &opt, NULL);
        log_tree_commit(&opt, commit);
 }
 
@@ -910,8 +914,7 @@ void read_bisect_terms(const char **read_bad, const char **read_good)
                        *read_good = "good";
                        return;
                } else {
-                       die("could not read file '%s': %s", filename,
-                               strerror(errno));
+                       die_errno(_("could not read file '%s'"), filename);
                }
        } else {
                strbuf_getline_lf(&str, fp);
@@ -937,10 +940,11 @@ 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];
 
        read_bisect_terms(&term_bad, &term_good);
        if (read_bisect_refs())
-               die("reading bisect refs failed");
+               die(_("reading bisect refs failed"));
 
        check_good_are_ancestors_of_bad(prefix, no_checkout);
 
@@ -960,7 +964,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
                 */
                exit_if_skipped_commits(tried, NULL);
 
-               printf("%s was both %s and %s\n",
+               printf(_("%s was both %s and %s\n"),
                       oid_to_hex(current_bad_oid),
                       term_good,
                       term_bad);
@@ -968,8 +972,8 @@ int bisect_next_all(const char *prefix, int no_checkout)
        }
 
        if (!all) {
-               fprintf(stderr, "No testable commit found.\n"
-                       "Maybe you started with bad path parameters?\n");
+               fprintf(stderr, _("No testable commit found.\n"
+                       "Maybe you started with bad path parameters?\n"));
                exit(4);
        }
 
@@ -986,9 +990,14 @@ int bisect_next_all(const char *prefix, int no_checkout)
 
        nr = all - reaches - 1;
        steps = estimate_bisect_steps(all);
-       printf("Bisecting: %d revision%s left to test after this "
-              "(roughly %d step%s)\n", nr, (nr == 1 ? "" : "s"),
-              steps, (steps == 1 ? "" : "s"));
+       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 */
+       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);
 
        return bisect_checkout(bisect_rev, no_checkout);
 }
index c50ea42172ceadd2a76d12833631301223607067..c431cbf6a9f08dedc791317cc1a357730bdf3515 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -228,8 +228,7 @@ N_("\n"
 "will track its remote counterpart, you may want to use\n"
 "\"git push -u\" to set the upstream config as you push.");
 
-void create_branch(const char *head,
-                  const char *name, const char *start_name,
+void create_branch(const char *name, const char *start_name,
                   int force, int reflog, int clobber_head,
                   int quiet, enum branch_track track)
 {
@@ -334,13 +333,38 @@ void remove_branch_state(void)
        unlink(git_path_squash_msg());
 }
 
-void die_if_checked_out(const char *branch)
+void die_if_checked_out(const char *branch, int ignore_current_worktree)
 {
-       char *existing;
+       const struct worktree *wt;
 
-       existing = find_shared_symref("HEAD", branch);
-       if (existing) {
-               skip_prefix(branch, "refs/heads/", &branch);
-               die(_("'%s' is already checked out at '%s'"), branch, existing);
+       wt = find_shared_symref("HEAD", branch);
+       if (!wt || (ignore_current_worktree && wt->is_current))
+               return;
+       skip_prefix(branch, "refs/heads/", &branch);
+       die(_("'%s' is already checked out at '%s'"),
+           branch, wt->path);
+}
+
+int replace_each_worktree_head_symref(const char *oldref, const char *newref)
+{
+       int ret = 0;
+       struct worktree **worktrees = get_worktrees(0);
+       int i;
+
+       for (i = 0; worktrees[i]; i++) {
+               if (worktrees[i]->is_detached)
+                       continue;
+               if (strcmp(oldref, worktrees[i]->head_ref))
+                       continue;
+
+               if (set_worktree_head_symref(get_worktree_git_dir(worktrees[i]),
+                                            newref)) {
+                       ret = -1;
+                       error(_("HEAD of working tree %s is not updated"),
+                             worktrees[i]->path);
+               }
        }
+
+       free_worktrees(worktrees);
+       return ret;
 }
index 78ad4387cd326ca01f228b109b446e2049f29ee7..3103eb9add31e08600f9fa158303417e36d3b229 100644 (file)
--- a/branch.h
+++ b/branch.h
@@ -4,15 +4,21 @@
 /* Functions for acting on the information about branches. */
 
 /*
- * Creates a new branch, where head is the branch currently checked
- * out, name is the new branch name, start_name is the name of the
- * existing branch that the new branch should start from, force
- * enables overwriting an existing (non-head) branch, reflog creates a
- * reflog for the branch, and track causes the new branch to be
- * configured to merge the remote branch that start_name is a tracking
- * branch for (if any).
+ * Creates a new branch, where:
+ *
+ *   - name is the new branch name
+ *
+ *   - start_name is the name of the existing branch that the new branch should
+ *     start from
+ *
+ *   - force enables overwriting an existing (non-head) branch
+ *
+ *   - reflog creates a reflog for the branch
+ *
+ *   - track causes the new branch to be configured to merge the remote branch
+ *     that start_name is a tracking branch for (if any).
  */
-void create_branch(const char *head, const char *name, const char *start_name,
+void create_branch(const char *name, const char *start_name,
                   int force, int reflog,
                   int clobber_head, int quiet, enum branch_track track);
 
@@ -58,6 +64,13 @@ extern int read_branch_desc(struct strbuf *, const char *branch_name);
  * worktree and die (with a message describing its checkout location) if
  * it is.
  */
-extern void die_if_checked_out(const char *branch);
+extern void die_if_checked_out(const char *branch, int ignore_current_worktree);
+
+/*
+ * Update all per-worktree HEADs pointing at the old ref to point the new ref.
+ * 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);
 
 #endif
index 6b95006a0a38d8bec522342fb72a5edeb0af7f07..b9122bc5f497ea2030aa4d5348c44da1a3bd8995 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);
 
index 145f06ef97afd1e9e8d5cbe13da82cffa504e32c..e8fb80b36e7386fa9a9da91a61893c14ec696be4 100644 (file)
@@ -30,6 +30,21 @@ struct update_callback_data {
        int add_errors;
 };
 
+static void chmod_pathspec(struct pathspec *pathspec, int force_mode)
+{
+       int i;
+
+       for (i = 0; i < active_nr; i++) {
+               struct cache_entry *ce = active_cache[i];
+
+               if (pathspec && !ce_path_match(ce, pathspec, NULL))
+                       continue;
+
+               if (chmod_cache_entry(ce, force_mode) < 0)
+                       fprintf(stderr, "cannot chmod '%s'", ce->name);
+       }
+}
+
 static int fix_unmerged_status(struct diff_filepair *p,
                               struct update_callback_data *data)
 {
@@ -65,7 +80,7 @@ static void update_callback(struct diff_queue_struct *q,
                        die(_("unexpected diff status %c"), p->status);
                case DIFF_STATUS_MODIFIED:
                case DIFF_STATUS_TYPE_CHANGED:
-                       if (add_file_to_index(&the_index, path, data->flags)) {
+                       if (add_file_to_index(&the_index, path, data->flags)) {
                                if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
                                        die(_("updating files failed"));
                                data->add_errors++;
@@ -238,6 +253,8 @@ static int ignore_add_errors, intent_to_add, ignore_missing;
 static int addremove = ADDREMOVE_DEFAULT;
 static int addremove_explicit = -1; /* unspecified */
 
+static char *chmod_arg;
+
 static int ignore_removal_cb(const struct option *opt, const char *arg, int unset)
 {
        /* if we are told to ignore, we are not adding removals */
@@ -263,6 +280,7 @@ static struct option builtin_add_options[] = {
        OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
        OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
        OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
+       OPT_STRING( 0 , "chmod", &chmod_arg, N_("(+/-)x"), N_("override the executable bit of the listed files")),
        OPT_END(),
 };
 
@@ -289,7 +307,7 @@ static int add_files(struct dir_struct *dir, int flags)
        }
 
        for (i = 0; i < dir->nr; i++)
-               if (add_file_to_cache(dir->entries[i]->name, flags)) {
+               if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
                        if (!ignore_add_errors)
                                die(_("adding files failed"));
                        exit_status = 1;
@@ -336,6 +354,10 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (!show_only && ignore_missing)
                die(_("Option --ignore-missing can only be used together with --dry-run"));
 
+       if (chmod_arg && ((chmod_arg[0] != '-' && chmod_arg[0] != '+') ||
+                         chmod_arg[1] != 'x' || chmod_arg[2]))
+               die(_("--chmod param '%s' must be either -x or +x"), chmod_arg);
+
        add_new_files = !take_worktree_changes && !refresh_only;
        require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
 
@@ -431,6 +453,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (add_new_files)
                exit_status |= add_files(&dir, flags);
 
+       if (chmod_arg && pathspec.nr)
+               chmod_pathspec(&pathspec, chmod_arg[0]);
        unplug_bulk_checkin();
 
 finish:
index d003939bc5c65947451de4a6e1817eb0f184211f..826f18ba12d9c58ceb3e8d6998412c234b33bcfe 100644 (file)
@@ -28,6 +28,8 @@
 #include "rerere.h"
 #include "prompt.h"
 #include "mailinfo.h"
+#include "apply.h"
+#include "string-list.h"
 
 /**
  * Returns 1 if the file is empty or does not exist, 0 otherwise.
@@ -70,7 +72,8 @@ enum patch_format {
        PATCH_FORMAT_MBOX,
        PATCH_FORMAT_STGIT,
        PATCH_FORMAT_STGIT_SERIES,
-       PATCH_FORMAT_HG
+       PATCH_FORMAT_HG,
+       PATCH_FORMAT_MBOXRD
 };
 
 enum keep_type {
@@ -107,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;
@@ -183,22 +186,22 @@ static inline const char *am_path(const struct am_state *state, const char *path
 /**
  * For convenience to call write_file()
  */
-static int write_state_text(const struct am_state *state,
-                           const char *name, const char *string)
+static void write_state_text(const struct am_state *state,
+                            const char *name, const char *string)
 {
-       return write_file(am_path(state, name), "%s", string);
+       write_file(am_path(state, name), "%s", string);
 }
 
-static int write_state_count(const struct am_state *state,
-                            const char *name, int value)
+static void write_state_count(const struct am_state *state,
+                             const char *name, int value)
 {
-       return write_file(am_path(state, name), "%d", value);
+       write_file(am_path(state, name), "%d", value);
 }
 
-static int write_state_bool(const struct am_state *state,
-                           const char *name, int value)
+static void write_state_bool(const struct am_state *state,
+                            const char *name, int value)
 {
-       return write_state_text(state, name, value ? "t" : "f");
+       write_state_text(state, name, value ? "t" : "f");
 }
 
 /**
@@ -257,38 +260,29 @@ static int read_state_file(struct strbuf *sb, const struct am_state *state,
 }
 
 /**
- * Reads a KEY=VALUE shell variable assignment from `fp`, returning the VALUE
- * as a newly-allocated string. VALUE must be a quoted string, and the KEY must
- * match `key`. Returns NULL on failure.
- *
- * This is used by read_author_script() to read the GIT_AUTHOR_* variables from
- * the author-script.
+ * Take a series of KEY='VALUE' lines where VALUE part is
+ * sq-quoted, and append <KEY, VALUE> at the end of the string list
  */
-static char *read_shell_var(FILE *fp, const char *key)
+static int parse_key_value_squoted(char *buf, struct string_list *list)
 {
-       struct strbuf sb = STRBUF_INIT;
-       const char *str;
-
-       if (strbuf_getline_lf(&sb, fp))
-               goto fail;
-
-       if (!skip_prefix(sb.buf, key, &str))
-               goto fail;
-
-       if (!skip_prefix(str, "=", &str))
-               goto fail;
-
-       strbuf_remove(&sb, 0, str - sb.buf);
-
-       str = sq_dequote(sb.buf);
-       if (!str)
-               goto fail;
-
-       return strbuf_detach(&sb, NULL);
-
-fail:
-       strbuf_release(&sb);
-       return NULL;
+       while (*buf) {
+               struct string_list_item *item;
+               char *np;
+               char *cp = strchr(buf, '=');
+               if (!cp)
+                       return -1;
+               np = strchrnul(cp, '\n');
+               *cp++ = '\0';
+               item = string_list_append(list, buf);
+
+               buf = np + (*np == '\n');
+               *np = '\0';
+               cp = sq_dequote(cp);
+               if (!cp)
+                       return -1;
+               item->util = xstrdup(cp);
+       }
+       return 0;
 }
 
 /**
@@ -310,44 +304,39 @@ fail:
 static int read_author_script(struct am_state *state)
 {
        const char *filename = am_path(state, "author-script");
-       FILE *fp;
+       struct strbuf buf = STRBUF_INIT;
+       struct string_list kv = STRING_LIST_INIT_DUP;
+       int retval = -1; /* assume failure */
+       int fd;
 
        assert(!state->author_name);
        assert(!state->author_email);
        assert(!state->author_date);
 
-       fp = fopen(filename, "r");
-       if (!fp) {
+       fd = open(filename, O_RDONLY);
+       if (fd < 0) {
                if (errno == ENOENT)
                        return 0;
                die_errno(_("could not open '%s' for reading"), filename);
        }
+       strbuf_read(&buf, fd, 0);
+       close(fd);
+       if (parse_key_value_squoted(buf.buf, &kv))
+               goto finish;
 
-       state->author_name = read_shell_var(fp, "GIT_AUTHOR_NAME");
-       if (!state->author_name) {
-               fclose(fp);
-               return -1;
-       }
-
-       state->author_email = read_shell_var(fp, "GIT_AUTHOR_EMAIL");
-       if (!state->author_email) {
-               fclose(fp);
-               return -1;
-       }
-
-       state->author_date = read_shell_var(fp, "GIT_AUTHOR_DATE");
-       if (!state->author_date) {
-               fclose(fp);
-               return -1;
-       }
-
-       if (fgetc(fp) != EOF) {
-               fclose(fp);
-               return -1;
-       }
-
-       fclose(fp);
-       return 0;
+       if (kv.nr != 3 ||
+           strcmp(kv.items[0].string, "GIT_AUTHOR_NAME") ||
+           strcmp(kv.items[1].string, "GIT_AUTHOR_EMAIL") ||
+           strcmp(kv.items[2].string, "GIT_AUTHOR_DATE"))
+               goto finish;
+       state->author_name = kv.items[0].util;
+       state->author_email = kv.items[1].util;
+       state->author_date = kv.items[2].util;
+       retval = 0;
+finish:
+       string_list_clear(&kv, !!retval);
+       strbuf_release(&buf);
+       return retval;
 }
 
 /**
@@ -402,13 +391,8 @@ static int read_commit_msg(struct am_state *state)
  */
 static void write_commit_msg(const struct am_state *state)
 {
-       int fd;
        const char *filename = am_path(state, "final-commit");
-
-       fd = xopen(filename, O_WRONLY | O_CREAT, 0666);
-       if (write_in_full(fd, state->msg, state->msg_len) < 0)
-               die_errno(_("could not write to %s"), filename);
-       close(fd);
+       write_file_buf(filename, state->msg, state->msg_len);
 }
 
 /**
@@ -432,8 +416,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);
@@ -559,14 +543,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;
                }
@@ -576,14 +560,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:
@@ -712,7 +696,8 @@ done:
  * Splits out individual email patches from `paths`, where each path is either
  * a mbox file or a Maildir. Returns 0 on success, -1 on failure.
  */
-static int split_mail_mbox(struct am_state *state, const char **paths, int keep_cr)
+static int split_mail_mbox(struct am_state *state, const char **paths,
+                               int keep_cr, int mboxrd)
 {
        struct child_process cp = CHILD_PROCESS_INIT;
        struct strbuf last = STRBUF_INIT;
@@ -724,6 +709,8 @@ static int split_mail_mbox(struct am_state *state, const char **paths, int keep_
        argv_array_push(&cp.args, "-b");
        if (keep_cr)
                argv_array_push(&cp.args, "--keep-cr");
+       if (mboxrd)
+               argv_array_push(&cp.args, "--mboxrd");
        argv_array_push(&cp.args, "--");
        argv_array_pushv(&cp.args, paths);
 
@@ -769,15 +756,15 @@ static int split_mail_conv(mail_conv_fn fn, struct am_state *state,
                        in = fopen(*paths, "r");
 
                if (!in)
-                       return error(_("could not open '%s' for reading: %s"),
-                                       *paths, strerror(errno));
+                       return error_errno(_("could not open '%s' for reading"),
+                                          *paths);
 
                mail = mkpath("%s/%0*d", state->dir, state->prec, i + 1);
 
                out = fopen(mail, "w");
                if (!out)
-                       return error(_("could not open '%s' for writing: %s"),
-                                       mail, strerror(errno));
+                       return error_errno(_("could not open '%s' for writing"),
+                                          mail);
 
                ret = fn(out, in, keep_cr);
 
@@ -857,8 +844,7 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths,
 
        fp = fopen(*paths, "r");
        if (!fp)
-               return error(_("could not open '%s' for reading: %s"), *paths,
-                               strerror(errno));
+               return error_errno(_("could not open '%s' for reading"), *paths);
 
        while (!strbuf_getline_lf(&sb, fp)) {
                if (*sb.buf == '#')
@@ -966,13 +952,15 @@ static int split_mail(struct am_state *state, enum patch_format patch_format,
 
        switch (patch_format) {
        case PATCH_FORMAT_MBOX:
-               return split_mail_mbox(state, paths, keep_cr);
+               return split_mail_mbox(state, paths, keep_cr, 0);
        case PATCH_FORMAT_STGIT:
                return split_mail_conv(stgit_patch_to_mail, state, paths, keep_cr);
        case PATCH_FORMAT_STGIT_SERIES:
                return split_mail_stgit_series(state, paths, keep_cr);
        case PATCH_FORMAT_HG:
                return split_mail_conv(hg_patch_to_mail, state, paths, keep_cr);
+       case PATCH_FORMAT_MBOXRD:
+               return split_mail_mbox(state, paths, keep_cr, 1);
        default:
                die("BUG: invalid patch_format");
        }
@@ -985,7 +973,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;
 
@@ -1053,10 +1041,10 @@ 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", "");
@@ -1081,7 +1069,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;
@@ -1099,11 +1087,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", "");
 
@@ -1145,17 +1133,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)
@@ -1362,7 +1350,7 @@ 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");
@@ -1374,7 +1362,7 @@ static int get_mail_commit_sha1(unsigned char *commit_id, const char *mail)
        if (!skip_prefix(sb.buf, "From ", &x))
                return -1;
 
-       if (get_sha1_hex(x, commit_id) < 0)
+       if (get_oid_hex(x, commit_id) < 0)
                return -1;
 
        strbuf_release(&sb);
@@ -1464,12 +1452,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);
 
@@ -1499,19 +1487,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;
 }
@@ -1522,39 +1510,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;
 }
@@ -1578,48 +1586,19 @@ static int build_fake_ancestor(const struct am_state *state, const char *index_f
        return 0;
 }
 
-/**
- * Do the three-way merge using fake ancestor, his tree constructed
- * from the fake ancestor and the postimage of the patch, and our
- * state.
- */
-static int run_fallback_merge_recursive(const struct am_state *state,
-                                       unsigned char *orig_tree,
-                                       unsigned char *our_tree,
-                                       unsigned char *his_tree)
-{
-       struct child_process cp = CHILD_PROCESS_INIT;
-       int status;
-
-       cp.git_cmd = 1;
-
-       argv_array_pushf(&cp.env_array, "GITHEAD_%s=%.*s",
-                        sha1_to_hex(his_tree), linelen(state->msg), state->msg);
-       if (state->quiet)
-               argv_array_push(&cp.env_array, "GIT_MERGE_VERBOSITY=0");
-
-       argv_array_push(&cp.args, "merge-recursive");
-       argv_array_push(&cp.args, sha1_to_hex(orig_tree));
-       argv_array_push(&cp.args, "--");
-       argv_array_push(&cp.args, sha1_to_hex(our_tree));
-       argv_array_push(&cp.args, sha1_to_hex(his_tree));
-
-       status = run_command(&cp) ? (-1) : 0;
-       discard_cache();
-       read_cache();
-       return status;
-}
-
 /**
  * Attempt a threeway merge, using index_path as the temporary index.
  */
 static int fall_back_threeway(const struct am_state *state, const char *index_path)
 {
-       unsigned char orig_tree[GIT_SHA1_RAWSZ], his_tree[GIT_SHA1_RAWSZ],
-                     our_tree[GIT_SHA1_RAWSZ];
+       struct object_id orig_tree, their_tree, our_tree;
+       const struct object_id *bases[1] = { &orig_tree };
+       struct merge_options o;
+       struct commit *result;
+       char *their_tree_name;
 
-       if (get_sha1("HEAD", our_tree) < 0)
-               hashcpy(our_tree, EMPTY_TREE_SHA1_BIN);
+       if (get_oid("HEAD", &our_tree) < 0)
+               hashcpy(our_tree.hash, EMPTY_TREE_SHA1_BIN);
 
        if (build_fake_ancestor(state, index_path))
                return error("could not build fake ancestor");
@@ -1627,7 +1606,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
        discard_cache();
        read_cache_from(index_path);
 
-       if (write_index_as_tree(orig_tree, &the_index, index_path, 0, NULL))
+       if (write_index_as_tree(orig_tree.hash, &the_index, index_path, 0, NULL))
                return error(_("Repository lacks necessary blobs to fall back on 3-way merge."));
 
        say(state, stdout, _("Using index info to reconstruct a base tree..."));
@@ -1643,7 +1622,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
                init_revisions(&rev_info, NULL);
                rev_info.diffopt.output_format = DIFF_FORMAT_NAME_STATUS;
                diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1, rev_info.prefix);
-               add_pending_sha1(&rev_info, "HEAD", our_tree, 0);
+               add_pending_sha1(&rev_info, "HEAD", our_tree.hash, 0);
                diff_setup_done(&rev_info.diffopt);
                run_diff_index(&rev_info, 1);
        }
@@ -1652,7 +1631,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
                return error(_("Did you hand edit your patch?\n"
                                "It does not apply to blobs recorded in its index."));
 
-       if (write_index_as_tree(his_tree, &the_index, index_path, 0, NULL))
+       if (write_index_as_tree(their_tree.hash, &the_index, index_path, 0, NULL))
                return error("could not write tree");
 
        say(state, stdout, _("Falling back to patching base and 3-way merge..."));
@@ -1662,17 +1641,28 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 
        /*
         * This is not so wrong. Depending on which base we picked, orig_tree
-        * may be wildly different from ours, but his_tree has the same set of
+        * may be wildly different from ours, but their_tree has the same set of
         * wildly different changes in parts the patch did not touch, so
         * recursive ends up canceling them, saying that we reverted all those
         * changes.
         */
 
-       if (run_fallback_merge_recursive(state, orig_tree, our_tree, his_tree)) {
+       init_merge_options(&o);
+
+       o.branch1 = "HEAD";
+       their_tree_name = xstrfmt("%.*s", linelen(state->msg), state->msg);
+       o.branch2 = their_tree_name;
+
+       if (state->quiet)
+               o.verbosity = 0;
+
+       if (merge_recursive_generic(&o, &our_tree, &their_tree, 1, bases, &result)) {
                rerere(state->allow_rerere_autoupdate);
+               free(their_tree_name);
                return error(_("Failed to merge in the changes."));
        }
 
+       free(their_tree_name);
        return 0;
 }
 
@@ -1683,9 +1673,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;
@@ -1693,14 +1682,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"));
        }
 
@@ -1712,7 +1701,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"));
 
@@ -1723,14 +1712,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);
        }
 
@@ -1840,6 +1830,8 @@ static void am_run(struct am_state *state, int resume)
                const char *mail = am_path(state, msgnum(state));
                int apply_status;
 
+               reset_ident_date();
+
                if (!file_exists(mail))
                        goto next;
 
@@ -2049,30 +2041,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;
@@ -2100,14 +2092,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);
@@ -2125,24 +2117,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;
@@ -2153,7 +2145,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;
 
@@ -2164,20 +2156,20 @@ 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 = !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);
@@ -2202,6 +2194,8 @@ static int parse_opt_patchformat(const struct option *opt, const char *arg, int
                *opt_value = PATCH_FORMAT_STGIT_SERIES;
        else if (!strcmp(arg, "hg"))
                *opt_value = PATCH_FORMAT_HG;
+       else if (!strcmp(arg, "mboxrd"))
+               *opt_value = PATCH_FORMAT_MBOXRD;
        else
                return error(_("Invalid value for --patch-format: %s"), arg);
        return 0;
@@ -2236,7 +2230,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
        int in_progress;
 
        const char * const usage[] = {
-               N_("git am [<options>] [(<mbox>|<Maildir>)...]"),
+               N_("git am [<options>] [(<mbox> | <Maildir>)...]"),
                N_("git am [<options>] (--continue | --skip | --abort)"),
                NULL
        };
index 42c610e2ec180e789fdae4bc637dd96f533d1e10..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"
-
-/*
- *  --check turns on checking that the working tree matches the
- *    files that are being modified, but doesn't apply the patch
- *  --stat does just a diffstat, and doesn't actually apply
- *  --numstat does numeric diffstat, and doesn't actually apply
- *  --index-info shows the old and new index info for paths if available.
- *  --index updates the cache as well.
- *  --cached updates only the cache without ever touching the working tree.
- */
-static const char *prefix;
-static int prefix_length = -1;
-static int newfd = -1;
+#include "lockfile.h"
+#include "apply.h"
 
-static int unidiff_zero;
-static int p_value = 1;
-static int p_value_known;
-static int check_index;
-static int update_index;
-static int cached;
-static int diffstat;
-static int numstat;
-static int summary;
-static int check;
-static int apply = 1;
-static int apply_in_reverse;
-static int apply_with_reject;
-static int apply_verbosely;
-static int allow_overlap;
-static int no_add;
-static int threeway;
-static int unsafe_paths;
-static const char *fake_ancestor;
-static int line_termination = '\n';
-static unsigned int p_context = UINT_MAX;
 static const char * const apply_usage[] = {
        N_("git apply [<options>] [<patch>...]"),
        NULL
 };
 
-static enum ws_error_action {
-       nowarn_ws_error,
-       warn_on_ws_error,
-       die_on_ws_error,
-       correct_ws_error
-} ws_error_action = warn_on_ws_error;
-static int whitespace_error;
-static int squelch_whitespace_errors = 5;
-static int applied_after_fixing_ws;
-
-static enum ws_ignore {
-       ignore_ws_none,
-       ignore_ws_change
-} ws_ignore_action = ignore_ws_none;
-
-
-static const char *patch_input_file;
-static struct strbuf root = STRBUF_INIT;
-static int read_stdin = 1;
-static int options;
-
-static void parse_whitespace_option(const char *option)
-{
-       if (!option) {
-               ws_error_action = warn_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "warn")) {
-               ws_error_action = warn_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "nowarn")) {
-               ws_error_action = nowarn_ws_error;
-               return;
-       }
-       if (!strcmp(option, "error")) {
-               ws_error_action = die_on_ws_error;
-               return;
-       }
-       if (!strcmp(option, "error-all")) {
-               ws_error_action = die_on_ws_error;
-               squelch_whitespace_errors = 0;
-               return;
-       }
-       if (!strcmp(option, "strip") || !strcmp(option, "fix")) {
-               ws_error_action = correct_ws_error;
-               return;
-       }
-       die(_("unrecognized whitespace option '%s'"), option);
-}
-
-static void parse_ignorewhitespace_option(const char *option)
-{
-       if (!option || !strcmp(option, "no") ||
-           !strcmp(option, "false") || !strcmp(option, "never") ||
-           !strcmp(option, "none")) {
-               ws_ignore_action = ignore_ws_none;
-               return;
-       }
-       if (!strcmp(option, "change")) {
-               ws_ignore_action = ignore_ws_change;
-               return;
-       }
-       die(_("unrecognized whitespace ignore option '%s'"), option);
-}
-
-static void set_default_whitespace_mode(const char *whitespace_option)
-{
-       if (!whitespace_option && !apply_default_whitespace)
-               ws_error_action = (apply ? warn_on_ws_error : nowarn_ws_error);
-}
-
-/*
- * 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.
- */
-static int max_change, max_len;
-
-/*
- * Various "current state", notably line numbers and what
- * file (and how) we're patching right now.. The "is_xxxx"
- * things are flags, where -1 means "don't know yet".
- */
-static int linenr = 1;
-
-/*
- * 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;
-};
-
-/*
- * Records filenames that have been touched, in order to handle
- * the case where more than one patches touch the same file.
- */
-
-static struct string_list fn_table;
-
-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(const char *name, int namelen, 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(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 (root.len)
-               strbuf_insert(&name, 0, root.buf, 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(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(start, line-start, 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 (root.len) {
-               char *ret = xstrfmt("%s%.*s", root.buf, len, start);
-               return squash_slash(ret);
-       }
-
-       return squash_slash(xmemdupz(start, len));
-}
-
-static char *find_name(const char *line, char *def, int p_value, int terminate)
-{
-       if (*line == '"') {
-               char *name = find_name_gnu(line, def, p_value);
-               if (name)
-                       return name;
-       }
-
-       return find_name_common(line, def, p_value, NULL, terminate);
-}
-
-static char *find_name_traditional(const char *line, char *def, int p_value)
-{
-       size_t len;
-       size_t date_len;
-
-       if (*line == '"') {
-               char *name = find_name_gnu(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(line, def, p_value, NULL, TERM_TAB);
-       len -= date_len;
-
-       return find_name_common(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(const char *nameline)
-{
-       char *name, *cp;
-       int val = -1;
-
-       if (is_dev_null(nameline))
-               return -1;
-       name = find_name_traditional(nameline, NULL, 0);
-       if (!name)
-               return -1;
-       cp = strchr(name, '/');
-       if (!cp)
-               val = 0;
-       else if (prefix) {
-               /*
-                * Does it begin with "a/$our-prefix" and such?  Then this is
-                * very likely to apply to our directory.
-                */
-               if (!strncmp(name, prefix, prefix_length))
-                       val = count_slashes(prefix);
-               else {
-                       cp++;
-                       if (!strncmp(cp, prefix, prefix_length))
-                               val = count_slashes(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(const char *first, const char *second, struct patch *patch)
-{
-       char *name;
-
-       first += 4;     /* skip "--- " */
-       second += 4;    /* skip "+++ " */
-       if (!p_value_known) {
-               int p, q;
-               p = guess_p_value(first);
-               q = guess_p_value(second);
-               if (p < 0) p = q;
-               if (0 <= p && p == q) {
-                       p_value = p;
-                       p_value_known = 1;
-               }
-       }
-       if (is_dev_null(first)) {
-               patch->is_new = 1;
-               patch->is_delete = 0;
-               name = find_name_traditional(second, NULL, p_value);
-               patch->new_name = name;
-       } else if (is_dev_null(second)) {
-               patch->is_new = 0;
-               patch->is_delete = 1;
-               name = find_name_traditional(first, NULL, p_value);
-               patch->old_name = name;
-       } else {
-               char *first_name;
-               first_name = find_name_traditional(first, NULL, p_value);
-               name = find_name_traditional(second, first_name, 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"), linenr);
-}
-
-static int gitdiff_hdrend(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 char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, int side)
-{
-       if (!orig_name && !isnull)
-               return find_name(line, NULL, p_value, TERM_TAB);
-
-       if (orig_name) {
-               int len;
-               const char *name;
-               char *another;
-               name = orig_name;
-               len = strlen(name);
-               if (isnull)
-                       die(_("git apply: bad git-diff - expected /dev/null, got %s on line %d"), name, linenr);
-               another = find_name(line, NULL, 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"), linenr);
-               free(another);
-               return orig_name;
-       }
-       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"), linenr);
-               return NULL;
-       }
-}
-
-static int gitdiff_oldname(const char *line, struct patch *patch)
-{
-       char *orig = patch->old_name;
-       patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name,
-                                             DIFF_OLD_NAME);
-       if (orig != patch->old_name)
-               free(orig);
-       return 0;
-}
-
-static int gitdiff_newname(const char *line, struct patch *patch)
-{
-       char *orig = patch->new_name;
-       patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name,
-                                             DIFF_NEW_NAME);
-       if (orig != patch->new_name)
-               free(orig);
-       return 0;
-}
-
-static int gitdiff_oldmode(const char *line, struct patch *patch)
-{
-       patch->old_mode = strtoul(line, NULL, 8);
-       return 0;
-}
-
-static int gitdiff_newmode(const char *line, struct patch *patch)
-{
-       patch->new_mode = strtoul(line, NULL, 8);
-       return 0;
-}
-
-static int gitdiff_delete(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(line, patch);
-}
-
-static int gitdiff_newfile(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(line, patch);
-}
-
-static int gitdiff_copysrc(const char *line, struct patch *patch)
-{
-       patch->is_copy = 1;
-       free(patch->old_name);
-       patch->old_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_copydst(const char *line, struct patch *patch)
-{
-       patch->is_copy = 1;
-       free(patch->new_name);
-       patch->new_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_renamesrc(const char *line, struct patch *patch)
-{
-       patch->is_rename = 1;
-       free(patch->old_name);
-       patch->old_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_renamedst(const char *line, struct patch *patch)
-{
-       patch->is_rename = 1;
-       free(patch->new_name);
-       patch->new_name = find_name(line, NULL, p_value ? p_value - 1 : 0, 0);
-       return 0;
-}
-
-static int gitdiff_similarity(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(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(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(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(const char *line, int llen)
-{
-       int nslash;
-       int i;
-
-       if (!p_value)
-               return (llen && line[0] == '/') ? NULL : line;
-
-       nslash = 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;
-}
+static struct lock_file lock_file;
 
-/*
- * 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(const char *line, int llen)
+int cmd_apply(int argc, const char **argv, const char *prefix)
 {
-       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(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(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(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(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(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;
-               }
-       }
+       int force_apply = 0;
+       int options = 0;
+       int ret;
+       struct apply_state state;
 
-       /*
-        * 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(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);
-               }
-       }
-}
+       if (init_apply_state(&state, prefix, &lock_file))
+               exit(128);
 
-/* Verify that we recognize the lines following a git header */
-static int parse_git_header(const char *line, int len, unsigned int size, struct patch *patch)
-{
-       unsigned long offset;
+       argc = apply_parse_options(argc, argv,
+                                  &state, &force_apply, &options,
+                                  apply_usage);
 
-       /* A git diff has explicit new/delete information, so we don't guess */
-       patch->is_new = 0;
-       patch->is_delete = 0;
+       if (check_apply_state(&state, force_apply))
+               exit(128);
 
-       /*
-        * 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(line, len);
-       if (patch->def_name && root.len) {
-               char *s = xstrfmt("%s%s", root.buf, patch->def_name);
-               free(patch->def_name);
-               patch->def_name = s;
-       }
+       ret = apply_all_patches(&state, argc, argv, options);
 
-       line += len;
-       size -= len;
-       linenr++;
-       for (offset = len ; size > 0 ; offset += len, size -= len, line += len, linenr++) {
-               static const struct opentry {
-                       const char *str;
-                       int (*fn)(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(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(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, 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"),
-                           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(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)",
-                                              p_value),
-                                           p_value, 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)", 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(line, line+len, patch);
-               *hdrsize = len + nextlen;
-               linenr += 2;
-               return offset;
-       }
-       return -1;
-}
-
-static void record_ws_error(unsigned result, const char *line, int len, int linenr)
-{
-       char *err;
-
-       if (!result)
-               return;
-
-       whitespace_error++;
-       if (squelch_whitespace_errors &&
-           squelch_whitespace_errors < whitespace_error)
-               return;
-
-       err = whitespace_error_string(result);
-       fprintf(stderr, "%s:%d: %s.\n%.*s\n",
-               patch_input_file, linenr, err, len, line);
-       free(err);
-}
-
-static void check_whitespace(const char *line, int len, unsigned ws_rule)
-{
-       unsigned result = ws_check(line + 1, len - 1, ws_rule);
-
-       record_ws_error(result, line + 1, len - 2, 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(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;
-       linenr++;
-       added = deleted = 0;
-       for (offset = len;
-            0 < size;
-            offset += len, size -= len, line += len, 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 (!apply_in_reverse &&
-                           ws_error_action == correct_ws_error)
-                               check_whitespace(line, len, patch->ws_rule);
-                       break;
-               case '-':
-                       if (apply_in_reverse &&
-                           ws_error_action != nowarn_ws_error)
-                               check_whitespace(line, len, patch->ws_rule);
-                       deleted++;
-                       oldlines--;
-                       trailing = 0;
-                       break;
-               case '+':
-                       if (!apply_in_reverse &&
-                           ws_error_action != nowarn_ws_error)
-                               check_whitespace(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(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 = linenr;
-               len = parse_fragment(line, size, patch, fragment);
-               if (len <= 0)
-                       die(_("corrupt patch at line %d"), 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(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;
-
-       linenr++;
-       buffer += llen;
-       while (1) {
-               int byte_length, max_byte_length, newsize;
-               llen = linelen(buffer, size);
-               used += llen;
-               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"),
-             linenr-1, llen-1, buffer);
-       return NULL;
-}
-
-static int parse_binary(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(&buffer, &size, &status, &used);
-       if (!forward && !status)
-               /* there has to be one hunk (forward hunk) */
-               return error(_("unrecognized binary patch at line %d"), linenr-1);
-       if (status)
-               /* otherwise we already gave an error message */
-               return status;
-
-       reverse = parse_binary_hunk(&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(char **name)
-{
-       char *old_name = *name;
-       if (!old_name)
-               return;
-       *name = xstrdup(prefix_filename(prefix, prefix_length, *name));
-       free(old_name);
-}
-
-static void prefix_patch(struct patch *p)
-{
-       if (!prefix || p->is_toplevel_relative)
-               return;
-       prefix_one(&p->new_name);
-       prefix_one(&p->old_name);
-}
-
-/*
- * include/exclude
- */
-
-static struct string_list limit_by_name;
-static int has_include;
-static void add_name_limit(const char *name, int exclude)
-{
-       struct string_list_item *it;
-
-       it = string_list_append(&limit_by_name, name);
-       it->util = exclude ? NULL : (void *) 1;
-}
-
-static int use_patch(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 < prefix_length) {
-               int pathlen = strlen(pathname);
-               if (pathlen <= prefix_length ||
-                   memcmp(prefix, pathname, prefix_length))
-                       return 0;
-       }
-
-       /* See if it matches any of exclude/include rule */
-       for (i = 0; i < limit_by_name.nr; i++) {
-               struct string_list_item *it = &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 !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(char *buffer, unsigned long size, struct patch *patch)
-{
-       int hdrsize, patchsize;
-       int offset = find_header(buffer, size, &hdrsize, patch);
-
-       if (offset < 0)
-               return offset;
-
-       prefix_patch(patch);
-
-       if (!use_patch(patch))
-               patch->ws_rule = 0;
-       else
-               patch->ws_rule = whitespace_rule(patch->new_name
-                                                ? patch->new_name
-                                                : patch->old_name);
-
-       patchsize = parse_single_patch(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;
-                       linenr++;
-                       used = parse_binary(buffer + hd + llen,
-                                           size - hd - llen, patch);
-                       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)) {
-                                       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 ((apply || check) &&
-                   (!patch->is_binary && !metadata_changes(patch)))
-                       die(_("patch with only garbage at line %d"), 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 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 = 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 + max_change > 70 ? 70 - max : max_change;
-       add = patch->lines_added;
-       del = patch->lines_deleted;
-
-       if (max_change > 0) {
-               int total = ((add + del) * max + max_change / 2) / max_change;
-               add = (add * max + max_change / 2) / 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 len = postimage->line[i].len;
-               if (!(postimage->line[i].flag & LINE_COMMON)) {
-                       /* an added line -- no counterparts in preimage */
-                       memmove(new, old, len);
-                       old += len;
-                       new += len;
-                       continue;
-               }
-
-               /* a common context -- skip it in the original postimage */
-               old += 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 */
-               len = preimage->line[ctx].len;
-               memcpy(new, fixed, len);
-               new += len;
-               fixed += len;
-               postimage->line[i].len = 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 match_fragment(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 (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 (ws_ignore_action == ignore_ws_change) {
-               size_t imgoff = 0;
-               size_t preoff = 0;
-               size_t postlen = postimage->len;
-               size_t extra_chars;
-               char *preimage_eof;
-               char *preimage_end;
-               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;
-       }
-
-       if (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 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(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 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 (!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 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 (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 == '+' && no_add)
-                               break;
-
-                       start = newlines.len;
-                       if (first != '+' ||
-                           !whitespace_error ||
-                           ws_error_action != correct_ws_error) {
-                               strbuf_add(&newlines, patch + 1, plen);
-                       }
-                       else {
-                               ws_fix_copy(&newlines, patch + 1, plen, ws_rule, &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 (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 && !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 = !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(img, &preimage, &postimage, pos,
-                                      ws_rule, match_beginning, match_end);
-
-               if (applied_pos >= 0)
-                       break;
-
-               /* Am I at my context limits? */
-               if ((leading <= p_context) && (trailing <= 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) &&
-                   ws_error_action != nowarn_ws_error) {
-                       record_ws_error(WS_BLANK_AT_EOF, "+", 1,
-                                       found_new_blank_lines_at_end);
-                       if (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 (ws_error_action == die_on_ws_error)
-                               apply = 0;
-               }
-
-               if (apply_verbosely && applied_pos != pos) {
-                       int offset = applied_pos - pos;
-                       if (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(img, applied_pos, &preimage, &postimage);
-       } else {
-               if (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 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 (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 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(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 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(img, patch);
-
-       while (frag) {
-               nth++;
-               if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule, nth)) {
-                       error(_("patch failed: %s:%ld"), name, frag->oldpos);
-                       if (!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(const char *name)
-{
-       struct string_list_item *item;
-
-       if (name == NULL)
-               return NULL;
-
-       item = string_list_lookup(&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 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(&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(&fn_table, patch->old_name);
-               item->util = PATH_WAS_DELETED;
-       }
-}
-
-static void prepare_fn_table(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(&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 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(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 strbuf *buf,
-                            const struct cache_entry *ce,
-                            struct stat *st,
-                            const char *name,
-                            unsigned expected_mode)
-{
-       if (cached || check_index) {
-               if (read_file_or_gitlink(ce, buf))
-                       return error(_("read of %s failed"), 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(_("read of %s failed"), 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 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(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(&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(_("read of %s failed"), 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 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(&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 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(&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(&tmp_image, patch))
-                       return error("cannot read the current contents of '%s'",
-                                    patch->new_name);
-       } else {
-               if (load_preimage(&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 patch *patch, struct stat *st, const struct cache_entry *ce)
-{
-       struct image image;
-
-       if (load_preimage(&image, patch, st, ce) < 0)
-               return -1;
-
-       if (patch->direct_to_threeway ||
-           apply_fragments(&image, patch) < 0) {
-               /* Note: with --reject, apply_fragments() returns 0 */
-               if (!threeway || try_threeway(&image, patch, st, ce) < 0)
-                       return -1;
-       }
-       patch->result = image.buf;
-       patch->resultsize = image.len;
-       add_to_fn_table(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 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(patch, &status);
-
-       if (status)
-               return error(_("path %s has been renamed/deleted"), old_name);
-       if (previous) {
-               st_mode = previous->new_mode;
-       } else if (!cached) {
-               stat_ret = lstat(old_name, st);
-               if (stat_ret && errno != ENOENT)
-                       return error(_("%s: %s"), old_name, strerror(errno));
-       }
-
-       if (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 (!cached && verify_index_match(*ce, st))
-                       return error(_("%s: does not match index"), old_name);
-               if (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 (!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(const char *new_name, int ok_if_exists)
-{
-       struct stat nst;
-
-       if (check_index &&
-           cache_name_pos(new_name, strlen(new_name)) >= 0 &&
-           !ok_if_exists)
-               return EXISTS_IN_INDEX;
-       if (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;
-}
-
-/*
- * 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.
- */
-static struct string_list symlink_changes;
-#define SYMLINK_GOES_AWAY 01
-#define SYMLINK_IN_RESULT 02
-
-static uintptr_t register_symlink_changes(const char *path, uintptr_t what)
-{
-       struct string_list_item *ent;
-
-       ent = string_list_lookup(&symlink_changes, path);
-       if (!ent) {
-               ent = string_list_insert(&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(const char *path)
-{
-       struct string_list_item *ent;
-
-       ent = string_list_lookup(&symlink_changes, path);
-       if (!ent)
-               return 0;
-       return (uintptr_t)ent->util;
-}
-
-static void prepare_symlink_changes(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(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(patch->new_name, SYMLINK_IN_RESULT);
-       }
-}
-
-static int path_is_beyond_symlink_1(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(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 (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(const char *name_)
-{
-       int ret;
-       struct strbuf name = STRBUF_INIT;
-
-       assert(*name_ != '\0');
-       strbuf_addstr(&name, name_);
-       ret = path_is_beyond_symlink_1(&name);
-       strbuf_release(&name);
+       clear_apply_state(&state);
 
        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 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(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(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(new_name, ok_if_exists);
-
-               if (err && 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 (!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(patch->new_name))
-               return error(_("affected file '%s' is beyond a symbolic link"),
-                            patch->new_name);
-
-       if (apply_data(patch, &st, ce) < 0)
-               return error(_("%s: patch does not apply"), name);
-       patch->rejected = 0;
-       return 0;
-}
-
-static int check_patch_list(struct patch *patch)
-{
-       int err = 0;
-
-       prepare_symlink_changes(patch);
-       prepare_fn_table(patch);
-       while (patch) {
-               if (apply_verbosely)
-                       say_patch_name(stderr,
-                                      _("Checking patch %s..."), patch);
-               err |= check_patch(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 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(patch);
-       }
-
-       print_stat_summary(stdout, files, adds, dels);
-}
-
-static void numstat_patch_list(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, 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 patch *patch)
-{
-       int lines = patch->lines_added + patch->lines_deleted;
-
-       if (lines > max_change)
-               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 > max_len)
-                       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 > max_len)
-                       max_len = len;
-       }
-}
-
-static void remove_file(struct patch *patch, int rmdir_empty)
-{
-       if (update_index) {
-               if (remove_file_from_cache(patch->old_name) < 0)
-                       die(_("unable to remove %s from index"), patch->old_name);
-       }
-       if (!cached) {
-               if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) {
-                       remove_path(patch->old_name);
-               }
-       }
-}
-
-static void add_index_file(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 (!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 (!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(char *path, unsigned mode, const char *buf, unsigned long size)
-{
-       if (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 patch *patch)
-{
-       int stage, namelen;
-       unsigned ce_size, mode;
-       struct cache_entry *ce;
-
-       if (!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 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(path, mode, buf, size);
-
-       if (patch->conflicted_threeway)
-               add_conflicted_stages_file(patch);
-       else
-               add_index_file(path, mode, buf, size);
-}
-
-/* phase zero is to remove, phase one is to create */
-static void write_out_one_result(struct patch *patch, int phase)
-{
-       if (patch->is_delete > 0) {
-               if (phase == 0)
-                       remove_file(patch, 1);
-               return;
-       }
-       if (patch->is_new > 0 || patch->is_copy) {
-               if (phase == 1)
-                       create_file(patch);
-               return;
-       }
-       /*
-        * Rename or modification boils down to the same
-        * thing: remove the old, write the new
-        */
-       if (phase == 0)
-               remove_file(patch, patch->is_rename);
-       if (phase == 1)
-               create_file(patch);
-}
-
-static int write_out_one_reject(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 (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 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(l, phase);
-                               if (phase == 1) {
-                                       if (write_out_one_reject(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);
-       }
-
-       return errs;
-}
-
-static struct lock_file lock_file;
-
-#define INACCURATE_EOF (1<<0)
-#define RECOUNT                (1<<1)
-
-static int apply_patch(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;
-
-       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(buf.buf + offset, buf.len - offset, patch);
-               if (nr < 0)
-                       break;
-               if (apply_in_reverse)
-                       reverse_patches(patch);
-               if (use_patch(patch)) {
-                       patch_stats(patch);
-                       *listp = patch;
-                       listp = &patch->next;
-               }
-               else {
-                       free_patch(patch);
-                       skipped_patch++;
-               }
-               offset += nr;
-       }
-
-       if (!list && !skipped_patch)
-               die(_("unrecognized input"));
-
-       if (whitespace_error && (ws_error_action == die_on_ws_error))
-               apply = 0;
-
-       update_index = check_index && apply;
-       if (update_index && newfd < 0)
-               newfd = hold_locked_index(&lock_file, 1);
-
-       if (check_index) {
-               if (read_cache() < 0)
-                       die(_("unable to read index file"));
-       }
-
-       if ((check || apply) &&
-           check_patch_list(list) < 0 &&
-           !apply_with_reject)
-               exit(1);
-
-       if (apply && write_out_results(list)) {
-               if (apply_with_reject)
-                       exit(1);
-               /* with --3way, we still need to write the index out */
-               return 1;
-       }
-
-       if (fake_ancestor)
-               build_fake_ancestor(list, fake_ancestor);
-
-       if (diffstat)
-               stat_patch_list(list);
-
-       if (numstat)
-               numstat_patch_list(list);
-
-       if (summary)
-               summary_patch_list(list);
-
-       free_patch_list(list);
-       strbuf_release(&buf);
-       string_list_clear(&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)
-{
-       add_name_limit(arg, 1);
-       return 0;
-}
-
-static int option_parse_include(const struct option *opt,
-                               const char *arg, int unset)
-{
-       add_name_limit(arg, 0);
-       has_include = 1;
-       return 0;
-}
-
-static int option_parse_p(const struct option *opt,
-                         const char *arg, int unset)
-{
-       p_value = atoi(arg);
-       p_value_known = 1;
-       return 0;
-}
-
-static int option_parse_space_change(const struct option *opt,
-                         const char *arg, int unset)
-{
-       if (unset)
-               ws_ignore_action = ignore_ws_none;
-       else
-               ws_ignore_action = ignore_ws_change;
-       return 0;
-}
-
-static int option_parse_whitespace(const struct option *opt,
-                                  const char *arg, int unset)
-{
-       const char **whitespace_option = opt->value;
-
-       *whitespace_option = arg;
-       parse_whitespace_option(arg);
-       return 0;
-}
-
-static int option_parse_directory(const struct option *opt,
-                                 const char *arg, int unset)
-{
-       strbuf_reset(&root);
-       strbuf_addstr(&root, arg);
-       strbuf_complete(&root, '/');
-       return 0;
-}
-
-int cmd_apply(int argc, const char **argv, const char *prefix_)
-{
-       int i;
-       int errs = 0;
-       int is_not_gitdir = !startup_info->have_repository;
-       int force_apply = 0;
-
-       const char *whitespace_option = NULL;
-
-       struct option builtin_apply_options[] = {
-               { OPTION_CALLBACK, 0, "exclude", NULL, N_("path"),
-                       N_("don't apply changes matching the given path"),
-                       0, option_parse_exclude },
-               { OPTION_CALLBACK, 0, "include", NULL, N_("path"),
-                       N_("apply changes matching the given path"),
-                       0, option_parse_include },
-               { OPTION_CALLBACK, 'p', NULL, NULL, N_("num"),
-                       N_("remove <num> leading slashes from traditional diff paths"),
-                       0, option_parse_p },
-               OPT_BOOL(0, "no-add", &no_add,
-                       N_("ignore additions made by the patch")),
-               OPT_BOOL(0, "stat", &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", &numstat,
-                       N_("show number of added and deleted lines in decimal notation")),
-               OPT_BOOL(0, "summary", &summary,
-                       N_("instead of applying the patch, output a summary for the input")),
-               OPT_BOOL(0, "check", &check,
-                       N_("instead of applying the patch, see if the patch is applicable")),
-               OPT_BOOL(0, "index", &check_index,
-                       N_("make sure the patch is applicable to the current index")),
-               OPT_BOOL(0, "cached", &cached,
-                       N_("apply a patch without touching the working tree")),
-               OPT_BOOL(0, "unsafe-paths", &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", &threeway,
-                        N_( "attempt three-way merge if a patch does not apply")),
-               OPT_FILENAME(0, "build-fake-ancestor", &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, &line_termination,
-                       N_("paths are separated with NUL character"), '\0'),
-               OPT_INTEGER('C', NULL, &p_context,
-                               N_("ensure at least <n> lines of context match")),
-               { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, N_("action"),
-                       N_("detect new or modified lines that have whitespace errors"),
-                       0, option_parse_whitespace },
-               { OPTION_CALLBACK, 0, "ignore-space-change", NULL, NULL,
-                       N_("ignore changes in whitespace when finding context"),
-                       PARSE_OPT_NOARG, option_parse_space_change },
-               { OPTION_CALLBACK, 0, "ignore-whitespace", NULL, NULL,
-                       N_("ignore changes in whitespace when finding context"),
-                       PARSE_OPT_NOARG, option_parse_space_change },
-               OPT_BOOL('R', "reverse", &apply_in_reverse,
-                       N_("apply the patch in reverse")),
-               OPT_BOOL(0, "unidiff-zero", &unidiff_zero,
-                       N_("don't expect at least one line of context")),
-               OPT_BOOL(0, "reject", &apply_with_reject,
-                       N_("leave the rejected hunks in corresponding *.rej files")),
-               OPT_BOOL(0, "allow-overlap", &allow_overlap,
-                       N_("allow overlapping hunks")),
-               OPT__VERBOSE(&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", NULL, N_("root"),
-                       N_("prepend <root> to all filenames"),
-                       0, option_parse_directory },
-               OPT_END()
-       };
-
-       prefix = prefix_;
-       prefix_length = prefix ? strlen(prefix) : 0;
-       git_apply_config();
-       if (apply_default_whitespace)
-               parse_whitespace_option(apply_default_whitespace);
-       if (apply_default_ignorewhitespace)
-               parse_ignorewhitespace_option(apply_default_ignorewhitespace);
-
-       argc = parse_options(argc, argv, prefix, builtin_apply_options,
-                       apply_usage, 0);
-
-       if (apply_with_reject && threeway)
-               die("--reject and --3way cannot be used together.");
-       if (cached && threeway)
-               die("--cached and --3way cannot be used together.");
-       if (threeway) {
-               if (is_not_gitdir)
-                       die(_("--3way outside a repository"));
-               check_index = 1;
-       }
-       if (apply_with_reject)
-               apply = apply_verbosely = 1;
-       if (!force_apply && (diffstat || numstat || summary || check || fake_ancestor))
-               apply = 0;
-       if (check_index && is_not_gitdir)
-               die(_("--index outside a repository"));
-       if (cached) {
-               if (is_not_gitdir)
-                       die(_("--cached outside a repository"));
-               check_index = 1;
-       }
-       if (check_index)
-               unsafe_paths = 0;
-
-       for (i = 0; i < argc; i++) {
-               const char *arg = argv[i];
-               int fd;
-
-               if (!strcmp(arg, "-")) {
-                       errs |= apply_patch(0, "<stdin>", options);
-                       read_stdin = 0;
-                       continue;
-               } else if (0 < prefix_length)
-                       arg = prefix_filename(prefix, 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(whitespace_option);
-               errs |= apply_patch(fd, arg, options);
-               close(fd);
-       }
-       set_default_whitespace_mode(whitespace_option);
-       if (read_stdin)
-               errs |= apply_patch(0, "<stdin>", options);
-       if (whitespace_error) {
-               if (squelch_whitespace_errors &&
-                   squelch_whitespace_errors < whitespace_error) {
-                       int squelched =
-                               whitespace_error - squelch_whitespace_errors;
-                       warning(Q_("squelched %d whitespace error",
-                                  "squelched %d whitespace errors",
-                                  squelched),
-                               squelched);
-               }
-               if (ws_error_action == die_on_ws_error)
-                       die(Q_("%d line adds whitespace errors.",
-                              "%d lines add whitespace errors.",
-                              whitespace_error),
-                           whitespace_error);
-               if (applied_after_fixing_ws && apply)
-                       warning("%d line%s applied after"
-                               " fixing whitespace errors.",
-                               applied_after_fixing_ws,
-                               applied_after_fixing_ws == 1 ? "" : "s");
-               else if (whitespace_error)
-                       warning(Q_("%d line adds whitespace errors.",
-                                  "%d lines add whitespace errors.",
-                                  whitespace_error),
-                               whitespace_error);
-       }
-
-       if (update_index) {
-               if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
-                       die(_("Unable to write new index file"));
-       }
-
-       return !!errs;
-}
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 e982fb81379f57152e34eeda706a57fa1ea4c143..4ddfadb71f7ef93958e2f236e166212e8b6bda2b 100644 (file)
@@ -56,7 +56,7 @@ static int show_progress;
 static struct date_mode blame_date_mode = { DATE_ISO8601 };
 static size_t blame_date_width;
 
-static struct string_list mailmap;
+static struct string_list mailmap = STRING_LIST_INIT_NODUP;
 
 #ifndef DEBUG
 #define DEBUG 0
@@ -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
@@ -134,7 +134,7 @@ struct progress_info {
        int blamed_lines;
 };
 
-static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen,
+static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b,
                      xdl_emit_hunk_consume_func_t hunk_func, void *cb_data)
 {
        xpparam_t xpp = {0};
@@ -142,7 +142,6 @@ static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen,
        xdemitcb_t ecb = {NULL};
 
        xpp.flags = xdl_opts;
-       xecfg.ctxlen = ctxlen;
        xecfg.hunk_func = hunk_func;
        ecb.priv = cb_data;
        return xdi_diff(file_a, file_b, &xpp, &xecfg, &ecb);
@@ -155,8 +154,8 @@ static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen,
  */
 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)
 {
@@ -164,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);
@@ -189,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;
        }
@@ -509,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;
 }
@@ -573,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 {
                /*
@@ -599,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->sha1);
+                       oidcpy(&porigin->blob_oid, &p->one->oid);
                        porigin->mode = p->one->mode;
                        break;
                case 'A':
@@ -609,7 +609,7 @@ static struct origin *find_origin(struct scoreboard *sb,
                }
        }
        diff_flush(&diff_opts);
-       free_pathspec(&diff_opts.pathspec);
+       clear_pathspec(&diff_opts.pathspec);
        return porigin;
 }
 
@@ -645,13 +645,13 @@ 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->sha1);
+                       oidcpy(&porigin->blob_oid, &p->one->oid);
                        porigin->mode = p->one->mode;
                        break;
                }
        }
        diff_flush(&diff_opts);
-       free_pathspec(&diff_opts.pathspec);
+       clear_pathspec(&diff_opts.pathspec);
        return porigin;
 }
 
@@ -980,7 +980,7 @@ static void pass_blame_to_parent(struct scoreboard *sb,
        fill_origin_blob(&sb->revs->diffopt, target, &file_o);
        num_get_patch++;
 
-       if (diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d))
+       if (diff_hunks(&file_p, &file_o, blame_chunk_cb, &d))
                die("unable to generate diff (%s -> %s)",
                    oid_to_hex(&parent->commit->object.oid),
                    oid_to_hex(&target->commit->object.oid));
@@ -1129,7 +1129,7 @@ static void find_copy_in_blob(struct scoreboard *sb,
         * file_p partially may match that image.
         */
        memset(split, 0, sizeof(struct blame_entry [3]));
-       if (diff_hunks(file_p, &file_o, 1, handle_split_cb, &d))
+       if (diff_hunks(file_p, &file_o, handle_split_cb, &d))
                die("unable to generate diff (%s)",
                    oid_to_hex(&parent->commit->object.oid));
        /* remainder, if any, all match the preimage */
@@ -1309,7 +1309,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->sha1);
+                       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)
@@ -1343,7 +1343,7 @@ static void find_copy_in_parent(struct scoreboard *sb,
        } while (unblamed);
        target->suspects = reverse_blame(leftover, NULL);
        diff_flush(&diff_opts);
-       free_pathspec(&diff_opts.pathspec);
+       clear_pathspec(&diff_opts.pathspec);
 }
 
 /*
@@ -1459,15 +1459,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;
                                }
@@ -1942,7 +1941,7 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt)
        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)
@@ -2112,7 +2111,7 @@ static void find_alignment(struct scoreboard *sb, int *option)
        unsigned largest_score = 0;
        struct blame_entry *e;
        int compute_auto_abbrev = (abbrev < 0);
-       int auto_abbrev = default_abbrev;
+       int auto_abbrev = DEFAULT_ABBREV;
 
        for (e = sb->ent; e; e = e->next) {
                struct origin *suspect = e->suspect;
@@ -2221,6 +2220,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;
 
@@ -2230,26 +2231,35 @@ static int git_blame_config(const char *var, const char *value, void *cb)
 static void verify_working_tree_path(struct commit *work_tree, const char *path)
 {
        struct commit_list *parents;
+       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;
        }
-       die("no such path '%s' in HEAD", path);
+
+       pos = cache_name_pos(path, strlen(path));
+       if (pos >= 0)
+               ; /* path is in the index */
+       else if (-1 - pos < active_nr &&
+                !strcmp(active_cache[-1 - pos]->name, path))
+               ; /* path is in the index, unmerged */
+       else
+               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;
 }
 
@@ -2266,10 +2276,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);
@@ -2298,7 +2308,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;
@@ -2307,16 +2317,17 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        unsigned mode;
        struct strbuf msg = STRBUF_INIT;
 
+       read_cache();
        time(&now);
        commit = alloc_commit_node();
        commit->object.parsed = 1;
        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);
 
@@ -2357,7 +2368,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);
@@ -2379,7 +2390,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
@@ -2401,7 +2412,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;
@@ -2424,8 +2435,7 @@ static struct commit *find_single_final(struct rev_info *revs,
                struct object *obj = revs->pending.objects[i].item;
                if (obj->flags & UNINTERESTING)
                        continue;
-               while (obj->type == OBJ_TAG)
-                       obj = deref_tag(obj, NULL, 0);
+               obj = deref_tag(obj, NULL, 0);
                if (obj->type != OBJ_COMMIT)
                        die("Non commit %s?", revs->pending.objects[i].name);
                if (found)
@@ -2446,6 +2456,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;
@@ -2460,19 +2505,21 @@ static char *prepare_initial(struct scoreboard *sb)
                struct object *obj = revs->pending.objects[i].item;
                if (!(obj->flags & UNINTERESTING))
                        continue;
-               while (obj->type == OBJ_TAG)
-                       obj = deref_tag(obj, NULL, 0);
+               obj = deref_tag(obj, NULL, 0);
                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);
 }
 
@@ -2521,12 +2568,12 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
        enum object_type type;
        struct commit *final_commit = NULL;
 
-       static struct string_list range_list;
-       static int output_option = 0, opt = 0;
-       static int show_stats = 0;
-       static const char *revs_file = NULL;
-       static const char *contents_from = NULL;
-       static const struct option options[] = {
+       struct string_list range_list = STRING_LIST_INIT_NODUP;
+       int output_option = 0, opt = 0;
+       int show_stats = 0;
+       const char *revs_file = NULL;
+       const char *contents_from = NULL;
+       const struct option options[] = {
                OPT_BOOL(0, "incremental", &incremental, N_("Show blame entries as we find them, incrementally")),
                OPT_BOOL('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")),
                OPT_BOOL(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")),
@@ -2543,6 +2590,15 @@ 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 indent-based heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
+               { OPTION_LOWLEVEL_CALLBACK, 0, "compaction-heuristic", NULL, NULL, N_("Use an experimental blank-line-based 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")),
@@ -2589,12 +2645,13 @@ 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_COMPACTION_HEURISTIC | 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);
@@ -2627,6 +2684,9 @@ parse_done:
        case DATE_RAW:
                blame_date_width = sizeof("1161298804 -0700");
                break;
+       case DATE_UNIX:
+               blame_date_width = sizeof("1161298804");
+               break;
        case DATE_SHORT:
                blame_date_width = sizeof("2006-10-19");
                break;
@@ -2717,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;
@@ -2737,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"));
        }
 
        /*
@@ -2769,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)) {
@@ -2780,26 +2840,26 @@ 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++;
        lno = prepare_lines(&sb);
 
        if (lno && !range_list.nr)
-               string_list_append(&range_list, xstrdup("1"));
+               string_list_append(&range_list, "1");
 
        anchor = 1;
        range_set_init(&ranges, range_list.nr);
@@ -2810,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 32be954cee1720f4f6264bbc5696cd17b8789f66..475707528a83b2fc42518f9f1e23f14d8846cb38 100644 (file)
@@ -20,6 +20,7 @@
 #include "utf8.h"
 #include "wt-status.h"
 #include "ref-filter.h"
+#include "worktree.h"
 
 static const char * const builtin_branch_usage[] = {
        N_("git branch [<options>] [-r | -a] [--merged | --no-merged]"),
@@ -211,25 +212,30 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                        die(_("Couldn't look up commit object for HEAD"));
        }
        for (i = 0; i < argc; i++, strbuf_release(&bname)) {
-               const char *target;
+               char *target = NULL;
                int flags = 0;
 
                strbuf_branchname(&bname, argv[i]);
-               if (kinds == FILTER_REFS_BRANCHES && !strcmp(head, bname.buf)) {
-                       error(_("Cannot delete the branch '%s' "
-                             "which you are currently on."), bname.buf);
-                       ret = 1;
-                       continue;
-               }
-
                free(name);
-
                name = mkpathdup(fmt, bname.buf);
-               target = resolve_ref_unsafe(name,
-                                           RESOLVE_REF_READING
-                                           | RESOLVE_REF_NO_RECURSE
-                                           | RESOLVE_REF_ALLOW_BAD_NAME,
-                                           sha1, &flags);
+
+               if (kinds == FILTER_REFS_BRANCHES) {
+                       const struct worktree *wt =
+                               find_shared_symref("HEAD", name);
+                       if (wt) {
+                               error(_("Cannot delete branch '%s' "
+                                       "checked out at '%s'"),
+                                     bname.buf, wt->path);
+                               ret = 1;
+                               continue;
+                       }
+               }
+
+               target = resolve_refdup(name,
+                                       RESOLVE_REF_READING
+                                       | RESOLVE_REF_NO_RECURSE
+                                       | RESOLVE_REF_ALLOW_BAD_NAME,
+                                       sha1, &flags);
                if (!target) {
                        error(remote_branch
                              ? _("remote-tracking branch '%s' not found.")
@@ -242,7 +248,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                    check_branch_commit(bname.buf, name, sha1, head_rev, kinds,
                                        force)) {
                        ret = 1;
-                       continue;
+                       goto next;
                }
 
                if (delete_ref(name, is_null_sha1(sha1) ? NULL : sha1,
@@ -252,7 +258,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                              : _("Error deleting branch '%s'"),
                              bname.buf);
                        ret = 1;
-                       continue;
+                       goto next;
                }
                if (!quiet) {
                        printf(remote_branch
@@ -264,6 +270,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                               : find_unique_abbrev(sha1, DEFAULT_ABBREV));
                }
                delete_branch_config(bname.buf);
+
+       next:
+               free(target);
        }
 
        free(name);
@@ -395,22 +404,25 @@ static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
        int current = 0;
        int color;
        struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
-       const char *prefix = "";
+       const char *prefix_to_show = "";
+       const char *prefix_to_skip = NULL;
        const char *desc = item->refname;
        char *to_free = NULL;
 
        switch (item->kind) {
        case FILTER_REFS_BRANCHES:
-               skip_prefix(desc, "refs/heads/", &desc);
+               prefix_to_skip = "refs/heads/";
+               skip_prefix(desc, prefix_to_skip, &desc);
                if (!filter->detached && !strcmp(desc, head))
                        current = 1;
                else
                        color = BRANCH_COLOR_LOCAL;
                break;
        case FILTER_REFS_REMOTES:
-               skip_prefix(desc, "refs/remotes/", &desc);
+               prefix_to_skip = "refs/remotes/";
+               skip_prefix(desc, prefix_to_skip, &desc);
                color = BRANCH_COLOR_REMOTE;
-               prefix = remote_prefix;
+               prefix_to_show = remote_prefix;
                break;
        case FILTER_REFS_DETACHED_HEAD:
                desc = to_free = get_head_description();
@@ -427,7 +439,7 @@ static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
                color = BRANCH_COLOR_CURRENT;
        }
 
-       strbuf_addf(&name, "%s%s", prefix, desc);
+       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),
@@ -438,8 +450,10 @@ static void format_and_print_ref_item(struct ref_array_item *item, int maxwidth,
                            name.buf, branch_get_color(BRANCH_COLOR_RESET));
 
        if (item->symref) {
-               skip_prefix(item->symref, "refs/remotes/", &desc);
-               strbuf_addf(&out, " -> %s", desc);
+               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" */
@@ -515,6 +529,29 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
        ref_array_clear(&array);
 }
 
+static void reject_rebase_or_bisect_branch(const char *target)
+{
+       struct worktree **worktrees = get_worktrees(0);
+       int i;
+
+       for (i = 0; worktrees[i]; i++) {
+               struct worktree *wt = worktrees[i];
+
+               if (!wt->is_detached)
+                       continue;
+
+               if (is_worktree_being_rebased(wt, target))
+                       die(_("Branch %s is being rebased at %s"),
+                           target, wt->path);
+
+               if (is_worktree_being_bisected(wt, target))
+                       die(_("Branch %s is being bisected at %s"),
+                           target, wt->path);
+       }
+
+       free_worktrees(worktrees);
+}
+
 static void rename_branch(const char *oldname, const char *newname, int force)
 {
        struct strbuf oldref = STRBUF_INIT, newref = STRBUF_INIT, logmsg = STRBUF_INIT;
@@ -544,6 +581,8 @@ static void rename_branch(const char *oldname, const char *newname, int force)
 
        validate_new_branchname(newname, &newref, force, clobber_head_ok);
 
+       reject_rebase_or_bisect_branch(oldref.buf);
+
        strbuf_addf(&logmsg, "Branch: renamed %s to %s",
                 oldref.buf, newref.buf);
 
@@ -554,8 +593,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
        if (recovery)
                warning(_("Renamed a misnamed branch '%s' away"), oldref.buf + 11);
 
-       /* no need to pass logmsg here as HEAD didn't really move */
-       if (!strcmp(oldname, head) && create_symref("HEAD", newref.buf, NULL))
+       if (replace_each_worktree_head_symref(oldref.buf, newref.buf))
                die(_("Branch renamed to %s, but HEAD is not updated!"), newname);
 
        strbuf_addf(&oldsection, "branch.%s", oldref.buf + 11);
@@ -579,15 +617,11 @@ static int edit_branch_description(const char *branch_name)
        if (!buf.len || buf.buf[buf.len-1] != '\n')
                strbuf_addch(&buf, '\n');
        strbuf_commented_addf(&buf,
-                   "Please edit the description for the branch\n"
-                   "  %s\n"
-                   "Lines starting with '%c' will be stripped.\n",
+                   _("Please edit the description for the branch\n"
+                     "  %s\n"
+                     "Lines starting with '%c' will be stripped.\n"),
                    branch_name, comment_line_char);
-       if (write_file_gently(git_path(edit_description), "%s", buf.buf)) {
-               strbuf_release(&buf);
-               return error(_("could not write branch description template: %s"),
-                            strerror(errno));
-       }
+       write_file_buf(git_path(edit_description), buf.buf, buf.len);
        strbuf_reset(&buf);
        if (launch_editor(git_path(edit_description), &buf, NULL)) {
                strbuf_release(&buf);
@@ -623,7 +657,7 @@ 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),
@@ -773,7 +807,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                 * create_branch takes care of setting up the tracking
                 * info and making sure new_upstream is correct
                 */
-               create_branch(head, branch->name, new_upstream, 0, 0, 0, quiet, BRANCH_TRACK_OVERRIDE);
+               create_branch(branch->name, new_upstream, 0, 0, 0, quiet, BRANCH_TRACK_OVERRIDE);
        } else if (unset_upstream) {
                struct branch *branch = branch_get(argv[0]);
                struct strbuf buf = STRBUF_INIT;
@@ -819,7 +853,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                strbuf_release(&buf);
 
                branch_existed = ref_exists(branch->refname);
-               create_branch(head, argv[0], (argc == 2) ? argv[1] : head,
+               create_branch(argv[0], (argc == 2) ? argv[1] : head,
                              force, reflog, 0, quiet, track);
 
                /*
index 54db1184a003897294b6aaa46bc6bf29faa919bc..30383e9eb4befb31e0d165d5863615484bcc9da3 100644 (file)
@@ -17,32 +17,63 @@ 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, 0, 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 +84,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 +124,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 +134,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 +154,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:
@@ -128,12 +169,12 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
 }
 
 struct expand_data {
-       unsigned char sha1[20];
+       struct object_id oid;
        enum object_type type;
        unsigned long size;
-       unsigned long disk_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
@@ -154,6 +195,13 @@ struct expand_data {
         * elements above, so you can retrieve the response from there.
         */
        struct object_info info;
+
+       /*
+        * This flag will be true if the requested batch format and options
+        * don't require us to call sha1_object_info, which can then be
+        * optimized out.
+        */
+       unsigned skip_object_info : 1;
 };
 
 static int is_atom(const char *atom, const char *s, int slen)
@@ -169,7 +217,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;
@@ -184,7 +232,7 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len,
                if (data->mark_query)
                        data->info.disk_sizep = &data->disk_size;
                else
-                       strbuf_addf(sb, "%lu", data->disk_size);
+                       strbuf_addf(sb, "%"PRIuMAX, (uintmax_t)data->disk_size);
        } else if (is_atom("rest", atom, len)) {
                if (data->mark_query)
                        data->split_on_whitespace = 1;
@@ -192,9 +240,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);
 }
@@ -225,28 +274,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);
@@ -258,8 +332,10 @@ static void batch_object_write(const char *obj_name, struct batch_options *opt,
 {
        struct strbuf buf = STRBUF_INIT;
 
-       if (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));
+       if (!data->skip_object_info &&
+           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;
        }
@@ -282,7 +358,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:
@@ -325,11 +401,12 @@ 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 unsigned char sha1[20], void *vdata)
 {
        struct object_cb_data *data = vdata;
-       hashcpy(data->expand->sha1, sha1);
+       hashcpy(data->expand->oid.hash, sha1);
        batch_object_write(NULL, data->opt, data->expand);
+       return 0;
 }
 
 static int batch_loose_object(const unsigned char *sha1,
@@ -368,6 +445,14 @@ 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 = OBJECT_INFO_INIT;
+               if (!memcmp(&data.info, &empty, sizeof(empty)))
+                       data.skip_object_info = 1;
+       }
 
        /*
         * If we are printing out the object, then always fill in the type,
@@ -425,8 +510,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
 };
 
@@ -471,6 +556,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")),
@@ -489,10 +578,13 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
 
        git_config(git_cat_file_config, NULL);
 
+       batch.buffer_output = -1;
        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);
@@ -504,14 +596,31 @@ 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;
+
        if (batch.enabled)
                return batch_objects(&batch);
 
index 92c69672e96f6e7fc6bbe7b783c551474224f18b..30a49d9f424c0a1e04b321b5eb0a5e25462a53af 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)
 {
index efcbd8f6b5e0b7d551c88c02b6d7d3069a47944d..512492aad9099dd2a7aa85391b5c9a8e321c3bfe 100644 (file)
@@ -76,7 +76,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 +92,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;
@@ -154,8 +154,8 @@ static int check_stages(unsigned stages, const struct cache_entry *ce, int pos)
        return 0;
 }
 
-static int checkout_stage(int stage, struct cache_entry *ce, int pos,
-                         struct checkout *state)
+static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
+                         const struct checkout *state)
 {
        while (pos < active_nr &&
               !strcmp(active_cache[pos]->name, ce->name)) {
@@ -169,15 +169,15 @@ static int checkout_stage(int stage, struct cache_entry *ce, int pos,
                return error(_("path '%s' does not have their version"), ce->name);
 }
 
-static int checkout_merged(int pos, struct checkout *state)
+static int checkout_merged(int pos, const struct checkout *state)
 {
        struct cache_entry *ce = active_cache[pos];
        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 +186,18 @@ static int checkout_merged(int pos, 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
@@ -226,9 +226,9 @@ static int checkout_merged(int pos, struct checkout *state)
         * 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);
+       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);
@@ -239,10 +239,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];
-       int flag;
+       struct object_id rev;
        struct commit *head;
        int errs = 0;
        struct lock_file *lock_file;
@@ -277,7 +276,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 
        hold_locked_index(lock_file, 1);
        if (read_cache_preload(&opts->pathspec) < 0)
-               return error(_("corrupt index file"));
+               return error(_("index file corrupt"));
 
        if (opts->source_tree)
                read_tree_some(opts->source_tree, &opts->pathspec);
@@ -353,7 +352,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;
@@ -375,8 +373,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, &flag);
-       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;
@@ -471,7 +469,7 @@ static int merge_working_tree(const struct checkout_opts *opts,
 
        hold_locked_index(lock_file, 1);
        if (read_cache_preload(NULL) < 0)
-               return error(_("corrupt index file"));
+               return error(_("index file corrupt"));
 
        resolve_undo_clear();
        if (opts->force) {
@@ -568,10 +566,13 @@ static int merge_working_tree(const struct checkout_opts *opts,
                        o.ancestor = old->name;
                        o.branch1 = new->name;
                        o.branch2 = "local";
-                       merge_trees(&o, new->commit->tree, work,
+                       ret = merge_trees(&o, new->commit->tree, work,
                                old->commit->tree, &result);
+                       if (ret < 0)
+                               exit(128);
                        ret = reset_tree(new->commit->tree, opts, 0,
                                         writeout_error);
+                       strbuf_release(&o.obuf);
                        if (ret)
                                return ret;
                }
@@ -629,7 +630,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
                        }
                }
                else
-                       create_branch(old->name, opts->new_branch, new->name,
+                       create_branch(opts->new_branch, new->name,
                                      opts->new_branch_force ? 1 : 0,
                                      opts->new_branch_log,
                                      opts->new_branch_force ? 1 : 0,
@@ -656,7 +657,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
                update_ref(msg.buf, "HEAD", new->commit->object.oid.hash, NULL,
                           REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
                if (!opts->quiet) {
-                       if (old->path && advice_detached_head)
+                       if (old->path &&
+                           advice_detached_head && !opts->force_detach)
                                detach_advice(new->name);
                        describe_detached_head(_("HEAD is now at"), new->commit);
                }
@@ -704,8 +706,7 @@ static int add_pending_uninteresting_ref(const char *refname,
 static void describe_one_orphan(struct strbuf *sb, struct commit *commit)
 {
        strbuf_addstr(sb, "  ");
-       strbuf_addstr(sb,
-               find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV));
+       strbuf_add_unique_abbrev(sb, commit->object.oid.hash, DEFAULT_ABBREV);
        strbuf_addch(sb, ' ');
        if (!parse_commit(commit))
                pp_commit_easy(CMIT_FMT_ONELINE, commit, sb);
@@ -806,11 +807,11 @@ 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);
+       old.commit = lookup_commit_reference_gently(rev.hash, 1);
        if (!(flag & REF_ISSYMREF))
                old.path = NULL;
 
@@ -858,7 +859,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;
 };
 
@@ -869,7 +870,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;
        }
@@ -882,13 +883,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.dst_oid = oid;
        for_each_remote(check_tracking_name, &cb_data);
        if (cb_data.unique)
                return cb_data.dst_ref;
@@ -900,12 +901,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;
@@ -971,7 +972,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
@@ -983,7 +984,7 @@ static int parse_branchname_arg(int argc, const char **argv,
                int recover_with_dwim = dwim_new_local_branch_ok;
 
                if (!has_dash_dash &&
-                   (check_filename(NULL, arg) || !no_wildcard(arg)))
+                   (check_filename(opts->prefix, arg) || !no_wildcard(arg)))
                        recover_with_dwim = 0;
                /*
                 * Accept "git checkout foo" and "git checkout foo --"
@@ -1020,15 +1021,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;
@@ -1036,7 +1037,7 @@ static int parse_branchname_arg(int argc, const char **argv,
 
        if (!*source_tree)                   /* case (1): want a tree */
                die(_("reference is not a tree: %s"), arg);
-       if (!has_dash_dash) {/* case (3).(d) -> (1) */
+       if (!has_dash_dash) {   /* case (3).(d) -> (1) */
                /*
                 * Do not complain the most common case
                 *      git checkout branch
@@ -1044,7 +1045,7 @@ static int parse_branchname_arg(int argc, const char **argv,
                 * it would be extremely annoying.
                 */
                if (argc)
-                       verify_non_filename(NULL, arg);
+                       verify_non_filename(opts->prefix, arg);
        } else {
                argcount++;
                argv++;
@@ -1106,21 +1107,21 @@ 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);
+                       die_if_checked_out(new->path, 1);
                free(head_ref);
        }
 
        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);
@@ -1139,7 +1140,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                OPT_STRING('B', NULL, &opts.new_branch_force, N_("branch"),
                           N_("create/reset and checkout a branch")),
                OPT_BOOL('l', NULL, &opts.new_branch_log, N_("create reflog for new branch")),
-               OPT_BOOL(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")),
+               OPT_BOOL(0, "detach", &opts.force_detach, N_("detach HEAD at named commit")),
                OPT_SET_INT('t', "track",  &opts.track, N_("set upstream info for new branch"),
                        BRANCH_TRACK_EXPLICIT),
                OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new-branch"), N_("new unparented branch")),
@@ -1230,14 +1231,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;
        }
index 661639255c564acf3f811e20a0ca3141805cde5d..6c76a6ed66fef567ca06e3e864b37fc3bed151d5 100644 (file)
@@ -40,17 +40,22 @@ 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 char *option_template, *option_depth;
+static int option_shallow_submodules;
+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;
-static struct string_list option_reference;
+static struct string_list option_config = 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 option builtin_clone_options[] = {
        OPT__VERBOSITY(&option_verbosity),
@@ -73,10 +78,14 @@ static struct option builtin_clone_options[] = {
                    N_("initialize submodules in the clone")),
        OPT_BOOL(0, "recurse-submodules", &option_recursive,
                    N_("initialize submodules in the clone")),
+       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"),
@@ -87,8 +96,14 @@ 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 by 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,
+                   N_("any cloned submodules will be shallow")),
        OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
                   N_("separate git dir from working tree")),
        OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
@@ -100,10 +115,6 @@ static struct option builtin_clone_options[] = {
        OPT_END()
 };
 
-static const char *argv_submodule[] = {
-       "submodule", "update", "--init", "--recursive", NULL
-};
-
 static const char *get_repo_path_1(struct strbuf *path, int *is_bundle)
 {
        static char *suffix[] = { "/.git", "", ".git/.git", ".git" };
@@ -280,50 +291,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,
@@ -353,8 +351,11 @@ static void copy_alternates(struct strbuf *src, struct strbuf *dst,
                        continue;
                }
                abs_path = mkpathdup("%s/objects/%s", src_repo, line.buf);
-               normalize_path_copy(abs_path, abs_path);
-               add_to_alternates_file(abs_path);
+               if (!normalize_path_copy(abs_path, abs_path))
+                       add_to_alternates_file(abs_path);
+               else
+                       warning("skipping invalid relative alternate: %s/%s",
+                               src_repo, line.buf);
                free(abs_path);
        }
        strbuf_release(&line);
@@ -622,13 +623,13 @@ static void update_remote_refs(const struct ref *refs,
        const struct ref *rm = mapped_refs;
 
        if (check_connectivity) {
-               if (transport->progress)
-                       fprintf(stderr, _("Checking connectivity... "));
-               if (check_everything_connected_with_transport(iterate_ref_map,
-                                                             0, &rm, transport))
+               struct check_connected_options opt = CHECK_CONNECTED_INIT;
+
+               opt.transport = transport;
+               opt.progress = transport->progress;
+
+               if (check_connected(iterate_ref_map, &rm, &opt))
                        die(_("remote did not send all necessary objects"));
-               if (transport->progress)
-                       fprintf(stderr, _("done.\n"));
        }
 
        if (refs) {
@@ -678,7 +679,7 @@ 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];
        char *head;
@@ -732,8 +733,22 @@ static int checkout(void)
        err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
                           sha1_to_hex(sha1), "1", NULL);
 
-       if (!err && option_recursive)
-               err = run_command_v_opt(argv_submodule, RUN_GIT_CMD);
+       if (!err && option_recursive) {
+               struct argv_array args = ARGV_ARRAY_INIT;
+               argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL);
+
+               if (option_shallow_submodules == 1)
+                       argv_array_push(&args, "--depth=1");
+
+               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);
+       }
 
        return err;
 }
@@ -838,6 +853,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;
@@ -854,8 +870,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;
@@ -928,23 +946,40 @@ 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_recursive) {
+               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);
@@ -964,7 +999,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;
@@ -982,6 +1017,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"));
@@ -1000,6 +1039,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");
 
@@ -1007,7 +1052,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);
@@ -1077,6 +1122,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);
 
@@ -1086,7 +1139,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 3feeffeab1ccd51a5e30098c31b4daa62e7ef684..605017261c38dea1f5ada18c7d5b12446d6ea44f 100644 (file)
@@ -33,10 +33,6 @@ static int commit_tree_config(const char *var, const char *value, void *cb)
        int status = git_gpg_config(var, value, NULL);
        if (status)
                return status;
-       if (!strcmp(var, "commit.gpgsign")) {
-               sign_commit = git_config_bool(var, value) ? "" : NULL;
-               return 0;
-       }
        return git_default_config(var, value, cb);
 }
 
@@ -44,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);
@@ -56,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;
                }
 
@@ -109,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");
@@ -121,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 b3bd2d41813f80d848afc199c2fae92cae6b6c11..276c74034e278fe40975c6390839112d0493664d 100644 (file)
@@ -92,8 +92,9 @@ N_("If you wish to skip this commit, use:\n"
 "Then \"git cherry-pick --continue\" will resume cherry-picking\n"
 "the remaining commits.\n");
 
+static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
+
 static const char *use_message_buffer;
-static const char commit_editmsg[] = "COMMIT_EDITMSG";
 static struct lock_file index_lock; /* real index */
 static struct lock_file false_lock; /* used only for partial commits */
 static enum {
@@ -114,6 +115,7 @@ static char *fixup_message, *squash_message;
 static int all, also, interactive, patch_interactive, only, amend, signoff;
 static int edit_flag = -1; /* unspecified */
 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
+static int config_commit_verbose = -1; /* unspecified */
 static int no_post_rewrite, allow_empty_message;
 static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
 static char *sign_commit;
@@ -140,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;
+
+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);
 
-       STATUS_FORMAT_UNSPECIFIED
-} status_format = STATUS_FORMAT_UNSPECIFIED;
+       return 0;
+}
 
 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
 {
@@ -171,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
@@ -186,6 +198,7 @@ static void status_init_config(struct wt_status *s, config_fn_t fn)
        gitmodules_config();
        git_config(fn, s);
        determine_whence(s);
+       init_diff_ui_defaults();
        s->hints = advice_status_hints; /* must come after git_config() */
 }
 
@@ -497,24 +510,13 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int
        s->fp = fp;
        s->nowarn = nowarn;
        s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;
+       if (!s->is_initial)
+               hashcpy(s->sha1_commit, sha1);
+       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;
 }
@@ -694,7 +696,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                }
        }
 
-       if (message.len) {
+       if (have_option_m) {
                strbuf_addbuf(&sb, &message);
                hook_arg1 = "message";
        } else if (logfile && !strcmp(logfile, "-")) {
@@ -712,7 +714,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                char *buffer;
                buffer = strstr(use_message_buffer, "\n\n");
                if (buffer)
-                       strbuf_addstr(&sb, buffer + 2);
+                       strbuf_addstr(&sb, skip_blank_lines(buffer + 2));
                hook_arg1 = "commit";
                hook_arg2 = use_message;
        } else if (fixup_message) {
@@ -726,9 +728,18 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                                      &sb, &ctx);
                hook_arg1 = "message";
        } else if (!stat(git_path_merge_msg(), &statbuf)) {
+               /*
+                * prepend SQUASH_MSG here if it exists and a
+                * "merge --squash" was originally performed
+                */
+               if (!stat(git_path_squash_msg(), &statbuf)) {
+                       if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
+                               die_errno(_("could not read SQUASH_MSG"));
+                       hook_arg1 = "squash";
+               } else
+                       hook_arg1 = "merge";
                if (strbuf_read_file(&sb, git_path_merge_msg(), 0) < 0)
                        die_errno(_("could not read MERGE_MSG"));
-               hook_arg1 = "merge";
        } else if (!stat(git_path_squash_msg(), &statbuf)) {
                if (strbuf_read_file(&sb, git_path_squash_msg(), 0) < 0)
                        die_errno(_("could not read SQUASH_MSG"));
@@ -761,9 +772,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                hook_arg2 = "";
        }
 
-       s->fp = fopen_for_writing(git_path(commit_editmsg));
+       s->fp = fopen_for_writing(git_path_commit_editmsg());
        if (s->fp == NULL)
-               die_errno(_("could not open '%s'"), git_path(commit_editmsg));
+               die_errno(_("could not open '%s'"), git_path_commit_editmsg());
 
        /* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
        old_display_comment_prefix = s->display_comment_prefix;
@@ -883,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, sha1)) {
+                       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
@@ -899,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);
@@ -940,7 +956,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        }
 
        if (run_commit_hook(use_editor, index_file, "prepare-commit-msg",
-                           git_path(commit_editmsg), hook_arg1, hook_arg2, NULL))
+                           git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))
                return 0;
 
        if (use_editor) {
@@ -948,7 +964,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                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)) {
+               if (launch_editor(git_path_commit_editmsg(), NULL, env)) {
                        fprintf(stderr,
                        _("Please supply the message using either -m or -F option.\n"));
                        exit(1);
@@ -956,7 +972,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
        }
 
        if (!no_verify &&
-           run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) {
+           run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {
                return 0;
        }
 
@@ -1087,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,
@@ -1097,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) {
@@ -1162,9 +1179,9 @@ static int parse_and_validate_options(int argc, const char *argv[],
                f++;
        if (f > 1)
                die(_("Only one of -c/-C/-F/--fixup can be used."));
-       if (message.len && f > 0)
+       if (have_option_m && f > 0)
                die((_("Option -m cannot be combined with -c/-C/-F/--fixup.")));
-       if (f || message.len)
+       if (f || have_option_m)
                template_file = NULL;
        if (edit_message)
                use_message = edit_message;
@@ -1189,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"))
@@ -1324,9 +1339,9 @@ int cmd_status(int argc, const char **argv, const char *prefix)
                            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),
@@ -1368,7 +1383,13 @@ 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;
+       if (!s.is_initial)
+               hashcpy(s.sha1_commit, sha1);
+
        s.ignore_submodule_arg = ignore_submodule_arg;
+       s.status_format = status_format;
+       s.verbose = verbose;
+
        wt_status_collect(&s);
 
        if (0 <= fd)
@@ -1377,23 +1398,7 @@ 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;
 }
 
@@ -1505,6 +1510,11 @@ static int git_commit_config(const char *k, const char *v, void *cb)
                sign_commit = git_config_bool(k, v) ? "" : NULL;
                return 0;
        }
+       if (!strcmp(k, "commit.verbose")) {
+               int is_bool;
+               config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
+               return 0;
+       }
 
        status = git_gpg_config(k, v, NULL);
        if (status)
@@ -1600,7 +1610,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),
                OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),
                OPT_BOOL('o', "only", &only, N_("commit only specified files")),
-               OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
+               OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),
                OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),
                OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
                            STATUS_FORMAT_SHORT),
@@ -1630,7 +1640,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        const char *index_file, *reflog_msg;
        char *nl;
        unsigned char sha1[20];
-       struct commit_list *parents = NULL, **pptr = &parents;
+       struct commit_list *parents = NULL;
        struct stat statbuf;
        struct commit *current_head = NULL;
        struct commit_extra_header *extra = NULL;
@@ -1651,9 +1661,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                if (parse_commit(current_head))
                        die(_("could not parse HEAD commit"));
        }
+       verbose = -1; /* unspecified */
        argc = parse_and_validate_options(argc, argv, builtin_commit_options,
                                          builtin_commit_usage,
                                          prefix, current_head, &s);
+       if (verbose == -1)
+               verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
+
        if (dry_run)
                return dry_run_commit(argc, argv, prefix, current_head, &s);
        index_file = prepare_index(argc, argv, prefix, current_head, 0);
@@ -1672,20 +1686,18 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                if (!reflog_msg)
                        reflog_msg = "commit (initial)";
        } else if (amend) {
-               struct commit_list *c;
-
                if (!reflog_msg)
                        reflog_msg = "commit (amend)";
-               for (c = current_head->parents; c; c = c->next)
-                       pptr = &commit_list_insert(c->item, pptr)->next;
+               parents = copy_commit_list(current_head->parents);
        } else if (whence == FROM_MERGE) {
                struct strbuf m = STRBUF_INIT;
                FILE *fp;
                int allow_fast_forward = 1;
+               struct commit_list **pptr = &parents;
 
                if (!reflog_msg)
                        reflog_msg = "commit (merge)";
-               pptr = &commit_list_insert(current_head, pptr)->next;
+               pptr = commit_list_append(current_head, pptr);
                fp = fopen(git_path_merge_head(), "r");
                if (fp == NULL)
                        die_errno(_("could not open '%s' for reading"),
@@ -1696,7 +1708,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                        parent = get_merge_parent(m.buf);
                        if (!parent)
                                die(_("Corrupt MERGE_HEAD file (%s)"), m.buf);
-                       pptr = &commit_list_insert(parent, pptr)->next;
+                       pptr = commit_list_append(parent, pptr);
                }
                fclose(fp);
                strbuf_release(&m);
@@ -1713,12 +1725,12 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
                        reflog_msg = (whence == FROM_CHERRY_PICK)
                                        ? "commit (cherry-pick)"
                                        : "commit";
-               pptr = &commit_list_insert(current_head, pptr)->next;
+               commit_list_insert(current_head, &parents);
        }
 
        /* Finally, get the commit message */
        strbuf_reset(&sb);
-       if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) {
+       if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {
                int saved_errno = errno;
                rollback_index_files();
                die(_("could not read commit message: %s"), strerror(saved_errno));
index ca9f834ae648177a67e1c9fea9481dfe58ff3972..05843a0f96e4dc0dbf9fbc7310039794b57947e7 100644 (file)
@@ -25,7 +25,6 @@ static char term = '\n';
 static int use_global_config, use_system_config, use_local_config;
 static struct git_config_source given_config_source;
 static int actions, types;
-static const char *get_color_slot, *get_colorbool_slot;
 static int end_null;
 static int respect_includes = -1;
 static int show_origin;
@@ -417,6 +416,7 @@ static int urlmatch_collect_fn(const char *var, const char *value, void *cb)
 
 static int get_urlmatch(const char *var, const char *url)
 {
+       int ret;
        char *section_tail;
        struct string_list_item *item;
        struct urlmatch_config config = { STRING_LIST_INIT_DUP };
@@ -443,6 +443,8 @@ static int get_urlmatch(const char *var, const char *url)
        git_config_with_options(urlmatch_config_entry, &config,
                                &given_config_source, respect_includes);
 
+       ret = !values.nr;
+
        for_each_string_list_item(item, &values) {
                struct urlmatch_current_candidate_value *matched = item->util;
                struct strbuf buf = STRBUF_INIT;
@@ -459,7 +461,7 @@ static int get_urlmatch(const char *var, const char *url)
        free(config.url.url);
 
        free((void *)config.section);
-       return 0;
+       return ret;
 }
 
 static char *default_user_config(void)
@@ -601,7 +603,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                                      given_config_source.file : git_path("config"));
                if (use_global_config) {
                        int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666);
-                       if (fd) {
+                       if (fd >= 0) {
                                char *content = default_user_config();
                                write_str_in_full(fd, content);
                                free(content);
@@ -620,8 +622,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..a04b4f2ef337d4d9d8cb24de7288630ee8ab823c 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;
@@ -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..01490a157efc5d85626833c0b1c25b75fb7ee469 100644 (file)
@@ -352,7 +352,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);
index 8ed2eb8813a442b64c8f43ed23acbdbd1c0dd452..15c61fd8d1ef891b013404ea5e7cbe42befac7bd 100644 (file)
@@ -24,6 +24,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
        gitmodules_config();
        git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
        rev.abbrev = 0;
+       precompose_argv(argc, argv);
 
        argc = setup_revisions(argc, argv, &rev, NULL);
        while (1 < argc && argv[1][0] == '-') {
index d979824f9395a0cbc8ffffa9cede524589710d43..1af373d0021f56f539a1d261e908a60d92ff5b4f 100644 (file)
@@ -21,6 +21,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
        gitmodules_config();
        git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
        rev.abbrev = 0;
+       precompose_argv(argc, argv);
 
        argc = setup_revisions(argc, argv, &rev, NULL);
        for (i = 1; i < argc; i++) {
index 2a12b81e065bfb75f05baf6694e1a9d53129bc40..806dd7a885e9e7b87e19ca8acd2b6d0383b41d85 100644 (file)
@@ -114,6 +114,8 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
        opt->disable_stdin = 1;
        memset(&s_r_opt, 0, sizeof(s_r_opt));
        s_r_opt.tweak = diff_tree_tweak_rev;
+
+       precompose_argv(argc, argv);
        argc = setup_revisions(argc, argv, opt, &s_r_opt);
 
        while (--argc > 0) {
index 52c98a9217c60a60f0012dbdafbb193e78ec8a33..7f91f6d2267db962fb7c25e92983afd4e811d43e 100644 (file)
@@ -301,24 +301,27 @@ 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();
+       init_diff_ui_defaults();
        git_config(git_diff_ui_config, NULL);
+       precompose_argv(argc, argv);
 
        init_revisions(&rev, prefix);
 
index 8164b581a66f257c5b4a74abbf1b76546946e2cf..1e815b5577cc05a6133ded56dda4b84596f80514 100644 (file)
@@ -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;
@@ -368,7 +368,7 @@ static void show_filemodify(struct diff_queue_struct *q,
                        print_path(spec->path);
                        putchar('\n');
 
-                       if (!hashcmp(ospec->sha1, spec->sha1) &&
+                       if (!oidcmp(&ospec->oid, &spec->oid) &&
                            ospec->mode == spec->mode)
                                break;
                        /* fallthrough */
@@ -383,10 +383,10 @@ 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->sha1) :
-                                                  spec->sha1));
+                                                  anonymize_sha1(spec->oid.hash) :
+                                                  spec->oid.hash));
                        else {
-                               struct object *object = lookup_object(spec->sha1);
+                               struct object *object = lookup_object(spec->oid.hash);
                                printf("M %06o :%d ", spec->mode,
                                       get_object_mark(object));
                        }
@@ -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->sha1);
+                       export_blob(diff_queued_diff.queue[i]->two->oid.hash);
 
        refname = commit->util;
        if (anonymize) {
index 79a611fda1f8b344ce619dd9318695a69eebb695..cfe9e447c27469407ab439bacb540a4d0b68d4b4 100644 (file)
@@ -16,10 +16,20 @@ static void add_sought_entry(struct ref ***sought, int *nr, int *alloc,
        struct ref *ref;
        struct object_id oid;
 
-       if (!get_oid_hex(name, &oid) && name[GIT_SHA1_HEXSZ] == ' ')
-               name += GIT_SHA1_HEXSZ + 1;
-       else
+       if (!get_oid_hex(name, &oid)) {
+               if (name[GIT_SHA1_HEXSZ] == ' ') {
+                       /* <sha1> <ref>, find refname */
+                       name += GIT_SHA1_HEXSZ + 1;
+               } else if (name[GIT_SHA1_HEXSZ] == '\0') {
+                       ; /* <sha1>, leave sha1 as name */
+               } else {
+                       /* <ref>, clear cruft from oid */
+                       oidclr(&oid);
+               }
+       } else {
+               /* <ref>, clear cruft from get_oid_hex */
                oidclr(&oid);
+       }
 
        ref = alloc_ref(name);
        oidcpy(&ref->old_oid, &oid);
@@ -41,6 +51,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
        struct child_process *conn;
        struct fetch_pack_args args;
        struct sha1_array shallow = SHA1_ARRAY_INIT;
+       struct string_list deepen_not = STRING_LIST_INIT_DUP;
 
        packet_trace_identity("fetch-pack");
 
@@ -50,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)) {
@@ -91,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)) {
@@ -122,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++];
index e4639d8eb1d5fda586520f10271c05a0897f2ea5..b6a5597cbf332fc56b5feabfd29d03c98d4d6686 100644 (file)
@@ -15,6 +15,7 @@
 #include "submodule.h"
 #include "connected.h"
 #include "argv-array.h"
+#include "utf8.h"
 
 static const char * const builtin_fetch_usage[] = {
        N_("git fetch [<options>] [<repository> [<refspec>...]]"),
@@ -34,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 max_children = 1;
+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;
@@ -116,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 by 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 },
@@ -232,9 +241,10 @@ static void find_non_local_tags(struct transport *transport,
                 * as one to ignore by setting util to NULL.
                 */
                if (ends_with(ref->name, "^{}")) {
-                       if (item && !has_object_file(&ref->old_oid) &&
+                       if (item &&
+                           !has_object_file_with_flags(&ref->old_oid, HAS_SHA1_QUICK) &&
                            !will_fetch(head, ref->old_oid.hash) &&
-                           !has_sha1_file(item->util) &&
+                           !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) &&
                            !will_fetch(head, item->util))
                                item->util = NULL;
                        item = NULL;
@@ -247,7 +257,8 @@ static void find_non_local_tags(struct transport *transport,
                 * to check if it is a lightweight tag that we want to
                 * fetch.
                 */
-               if (item && !has_sha1_file(item->util) &&
+               if (item &&
+                   !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) &&
                    !will_fetch(head, item->util))
                        item->util = NULL;
 
@@ -267,7 +278,8 @@ static void find_non_local_tags(struct transport *transport,
         * We may have a final lightweight tag that needs to be
         * checked to see if it needs fetching.
         */
-       if (item && !has_sha1_file(item->util) &&
+       if (item &&
+           !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) &&
            !will_fetch(head, item->util))
                item->util = NULL;
 
@@ -449,12 +461,141 @@ fail:
                           : STORE_REF_ERROR_OTHER;
 }
 
-#define REFCOL_WIDTH  10
+static int refcol_width = 10;
+static int compact_format;
+
+static void adjust_refcol_width(const struct ref *ref)
+{
+       int max, rlen, llen, len;
+
+       /* uptodate lines are only shown on high verbosity level */
+       if (!verbosity && !oidcmp(&ref->peer_ref->old_oid, &ref->old_oid))
+               return;
+
+       max    = term_columns();
+       rlen   = utf8_strwidth(prettify_refname(ref->name));
+
+       llen   = utf8_strwidth(prettify_refname(ref->peer_ref->name));
+
+       /*
+        * rough estimation to see if the output line is too long and
+        * should not be counted (we can't do precise calculation
+        * anyway because we don't know if the error explanation part
+        * will be printed in update_local_ref)
+        */
+       if (compact_format) {
+               llen = 0;
+               max = max * 2 / 3;
+       }
+       len = 21 /* flag and summary */ + rlen + 4 /* -> */ + llen;
+       if (len >= max)
+               return;
+
+       /*
+        * Not precise calculation for compact mode because '*' can
+        * appear on the left hand side of '->' and shrink the column
+        * back.
+        */
+       if (refcol_width < rlen)
+               refcol_width = rlen;
+}
+
+static void prepare_format_display(struct ref *ref_map)
+{
+       struct ref *rm;
+       const char *format = "full";
+
+       git_config_get_string_const("fetch.output", &format);
+       if (!strcasecmp(format, "full"))
+               compact_format = 0;
+       else if (!strcasecmp(format, "compact"))
+               compact_format = 1;
+       else
+               die(_("configuration fetch.output contains invalid value %s"),
+                   format);
+
+       for (rm = ref_map; rm; rm = rm->next) {
+               if (rm->status == REF_STATUS_REJECT_SHALLOW ||
+                   !rm->peer_ref ||
+                   !strcmp(rm->name, "HEAD"))
+                       continue;
+
+               adjust_refcol_width(rm);
+       }
+}
+
+static void print_remote_to_local(struct strbuf *display,
+                                 const char *remote, const char *local)
+{
+       strbuf_addf(display, "%-*s -> %s", refcol_width, remote, local);
+}
+
+static int find_and_replace(struct strbuf *haystack,
+                           const char *needle,
+                           const char *placeholder)
+{
+       const char *p = strstr(haystack->buf, needle);
+       int plen, nlen;
+
+       if (!p)
+               return 0;
+
+       if (p > haystack->buf && p[-1] != '/')
+               return 0;
+
+       plen = strlen(p);
+       nlen = strlen(needle);
+       if (plen > nlen && p[nlen] != '/')
+               return 0;
+
+       strbuf_splice(haystack, p - haystack->buf, nlen,
+                     placeholder, strlen(placeholder));
+       return 1;
+}
+
+static void print_compact(struct strbuf *display,
+                         const char *remote, const char *local)
+{
+       struct strbuf r = STRBUF_INIT;
+       struct strbuf l = STRBUF_INIT;
+
+       if (!strcmp(remote, local)) {
+               strbuf_addf(display, "%-*s -> *", refcol_width, remote);
+               return;
+       }
+
+       strbuf_addstr(&r, remote);
+       strbuf_addstr(&l, local);
+
+       if (!find_and_replace(&r, local, "*"))
+               find_and_replace(&l, remote, "*");
+       print_remote_to_local(display, r.buf, l.buf);
+
+       strbuf_release(&r);
+       strbuf_release(&l);
+}
+
+static void format_display(struct strbuf *display, char code,
+                          const char *summary, const char *error,
+                          const char *remote, const char *local,
+                          int summary_width)
+{
+       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
+               print_compact(display, remote, local);
+       if (error)
+               strbuf_addf(display, "  (%s)", error);
+}
 
 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;
@@ -467,9 +608,8 @@ static int update_local_ref(struct ref *ref,
 
        if (!oidcmp(&ref->old_oid, &ref->new_oid)) {
                if (verbosity > 0)
-                       strbuf_addf(display, "= %-*s %-*s -> %s",
-                                   TRANSPORT_SUMMARY(_("[up to date]")),
-                                   REFCOL_WIDTH, remote, pretty_ref);
+                       format_display(display, '=', _("[up to date]"), NULL,
+                                      remote, pretty_ref, summary_width);
                return 0;
        }
 
@@ -481,10 +621,9 @@ static int update_local_ref(struct ref *ref,
                 * If this is the head, and it's not okay to update
                 * the head, and the old value of the head isn't empty...
                 */
-               strbuf_addf(display,
-                           _("! %-*s %-*s -> %s  (can't fetch in current branch)"),
-                           TRANSPORT_SUMMARY(_("[rejected]")),
-                           REFCOL_WIDTH, remote, pretty_ref);
+               format_display(display, '!', _("[rejected]"),
+                              _("can't fetch in current branch"),
+                              remote, pretty_ref, summary_width);
                return 1;
        }
 
@@ -492,11 +631,9 @@ static int update_local_ref(struct ref *ref,
            starts_with(ref->name, "refs/tags/")) {
                int r;
                r = s_update_ref("updating tag", ref, 0);
-               strbuf_addf(display, "%c %-*s %-*s -> %s%s",
-                           r ? '!' : '-',
-                           TRANSPORT_SUMMARY(_("[tag update]")),
-                           REFCOL_WIDTH, remote, pretty_ref,
-                           r ? _("  (unable to update local ref)") : "");
+               format_display(display, r ? '!' : 't', _("[tag update]"),
+                              r ? _("unable to update local ref") : NULL,
+                              remote, pretty_ref, summary_width);
                return r;
        }
 
@@ -527,11 +664,9 @@ static int update_local_ref(struct ref *ref,
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
                        check_for_new_submodule_commits(ref->new_oid.hash);
                r = s_update_ref(msg, ref, 0);
-               strbuf_addf(display, "%c %-*s %-*s -> %s%s",
-                           r ? '!' : '*',
-                           TRANSPORT_SUMMARY(what),
-                           REFCOL_WIDTH, remote, pretty_ref,
-                           r ? _("  (unable to update local ref)") : "");
+               format_display(display, r ? '!' : '*', what,
+                              r ? _("unable to update local ref") : NULL,
+                              remote, pretty_ref, summary_width);
                return r;
        }
 
@@ -545,11 +680,9 @@ static int update_local_ref(struct ref *ref,
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
                        check_for_new_submodule_commits(ref->new_oid.hash);
                r = s_update_ref("fast-forward", ref, 1);
-               strbuf_addf(display, "%c %-*s %-*s -> %s%s",
-                           r ? '!' : ' ',
-                           TRANSPORT_SUMMARY_WIDTH, quickref.buf,
-                           REFCOL_WIDTH, remote, pretty_ref,
-                           r ? _("  (unable to update local ref)") : "");
+               format_display(display, r ? '!' : ' ', quickref.buf,
+                              r ? _("unable to update local ref") : NULL,
+                              remote, pretty_ref, summary_width);
                strbuf_release(&quickref);
                return r;
        } else if (force || ref->force) {
@@ -562,18 +695,14 @@ static int update_local_ref(struct ref *ref,
                    (recurse_submodules != RECURSE_SUBMODULES_ON))
                        check_for_new_submodule_commits(ref->new_oid.hash);
                r = s_update_ref("forced-update", ref, 1);
-               strbuf_addf(display, "%c %-*s %-*s -> %s  (%s)",
-                           r ? '!' : '+',
-                           TRANSPORT_SUMMARY_WIDTH, quickref.buf,
-                           REFCOL_WIDTH, remote, pretty_ref,
-                           r ? _("unable to update local ref") : _("forced update"));
+               format_display(display, r ? '!' : '+', quickref.buf,
+                              r ? _("unable to update local ref") : _("forced update"),
+                              remote, pretty_ref, summary_width);
                strbuf_release(&quickref);
                return r;
        } else {
-               strbuf_addf(display, "! %-*s %-*s -> %s  %s",
-                           TRANSPORT_SUMMARY(_("[rejected]")),
-                           REFCOL_WIDTH, remote, pretty_ref,
-                           _("(non-fast-forward)"));
+               format_display(display, '!', _("[rejected]"), _("non-fast-forward"),
+                              remote, pretty_ref, summary_width);
                return 1;
        }
 }
@@ -604,10 +733,11 @@ 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)
-               return error(_("cannot open %s: %s\n"), filename, strerror(errno));
+               return error_errno(_("cannot open %s"), filename);
 
        if (raw_url)
                url = transport_anonymize_url(raw_url);
@@ -615,11 +745,13 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
                url = xstrdup("foreign");
 
        rm = ref_map;
-       if (check_everything_connected(iterate_ref_map, 0, &rm)) {
+       if (check_connected(iterate_ref_map, &rm, NULL)) {
                rc = error(_("%s did not send all necessary objects\n"), url);
                goto abort;
        }
 
+       prepare_format_display(ref_map);
+
        /*
         * We do a pass for each fetch_head_status type in their enum order, so
         * merged entries are written before not-for-merge. That lets readers
@@ -711,14 +843,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
-                               strbuf_addf(&note, "* %-*s %-*s -> FETCH_HEAD",
-                                           TRANSPORT_SUMMARY_WIDTH,
-                                           *kind ? kind : "branch",
-                                           REFCOL_WIDTH,
-                                           *what ? what : "HEAD");
+                               format_display(&note, '*',
+                                              *kind ? kind : "branch", NULL,
+                                              *what ? what : "HEAD",
+                                              "FETCH_HEAD", summary_width);
                        if (note.len) {
                                if (verbosity >= 0 && !shown_url) {
                                        fprintf(stderr, _("From %.*s\n"),
@@ -751,6 +883,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
 static int quickfetch(struct ref *ref_map)
 {
        struct ref *rm = ref_map;
+       struct check_connected_options opt = CHECK_CONNECTED_INIT;
 
        /*
         * If we are deepening a shallow clone we already have these
@@ -759,9 +892,10 @@ 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;
-       return check_everything_connected(iterate_ref_map, 1, &rm);
+       opt.quiet = 1;
+       return check_connected(iterate_ref_map, &rm, &opt);
 }
 
 static int fetch_refs(struct transport *transport, struct ref *ref_map)
@@ -783,6 +917,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)");
@@ -806,19 +941,22 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map,
                for (ref = stale_refs; ref; ref = ref->next)
                        string_list_append(&refnames, ref->name);
 
-               result = delete_refs(&refnames);
+               result = delete_refs(&refnames, 0);
                string_list_clear(&refnames, 0);
        }
 
        if (verbosity >= 0) {
                for (ref = stale_refs; ref; ref = ref->next) {
+                       struct strbuf sb = STRBUF_INIT;
                        if (!shown_url) {
                                fprintf(stderr, _("From %.*s\n"), url_len, url);
                                shown_url = 1;
                        }
-                       fprintf(stderr, " x %-*s %-*s -> %s\n",
-                               TRANSPORT_SUMMARY(_("[deleted]")),
-                               REFCOL_WIDTH, _("(none)"), prettify_refname(ref->name));
+                       format_display(&sb, '-', _("[deleted]"), NULL,
+                                      _("(none)"), prettify_refname(ref->name),
+                                      summary_width);
+                       fprintf(stderr, " %s\n",sb.buf);
+                       strbuf_release(&sb);
                        warn_dangling_symref(stderr, dangling_msg, ref->name);
                }
        }
@@ -848,7 +986,7 @@ static int truncate_fetch_head(void)
        FILE *fp = fopen_for_writing(filename);
 
        if (!fp)
-               return error(_("cannot open %s: %s\n"), filename, strerror(errno));
+               return error_errno(_("cannot open %s"), filename);
        fclose(fp);
        return 0;
 }
@@ -864,7 +1002,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);
@@ -876,6 +1014,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;
@@ -883,13 +1028,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) {
@@ -1005,7 +1162,7 @@ static int get_remote_group(const char *key, const char *value, void *priv)
                        size_t wordlen = strcspn(value, " \t\n");
 
                        if (wordlen >= 1)
-                               string_list_append(g->list,
+                               string_list_append_nodup(g->list,
                                                   xstrndup(value, wordlen));
                        value += wordlen + (value[wordlen] != '\0');
                }
@@ -1100,7 +1257,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 */
@@ -1143,7 +1300,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
 int cmd_fetch(int argc, const char **argv, const char *prefix)
 {
        int i;
-       struct string_list list = STRING_LIST_INIT_NODUP;
+       struct string_list list = STRING_LIST_INIT_DUP;
        struct remote *remote;
        int result = 0;
        struct argv_array argv_gc_auto = ARGV_ARRAY_INIT;
@@ -1160,6 +1317,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"));
@@ -1172,6 +1336,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) {
@@ -1226,8 +1392,6 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
                argv_array_clear(&options);
        }
 
-       /* All names were strdup()ed or strndup()ed */
-       list.strdup_strings = 1;
        string_list_clear(&list, 0);
 
        close_all_packs();
index e5658c320ee45c208d4087e2b9761f38e0aeca92..efab62fd85e314ccb6ec5becedead91823d03dde 100644 (file)
@@ -272,7 +272,7 @@ static int cmp_string_list_util_as_integral(const void *a_, const void *b_)
 static void add_people_count(struct strbuf *out, struct string_list *people)
 {
        if (people->nr == 1)
-               strbuf_addf(out, "%s", people->items[0].string);
+               strbuf_addstr(out, people->items[0].string);
        else if (people->nr == 2)
                strbuf_addf(out, "%s (%d) and %s (%d)",
                            people->items[0].string,
@@ -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');
@@ -395,7 +391,7 @@ static void shortlog(const char *name,
 
        for (i = 0; i < subjects.nr; i++)
                if (i >= limit)
-                       strbuf_addf(out, "  ...\n");
+                       strbuf_addstr(out, "  ...\n");
                else
                        strbuf_addf(out, "  %s\n", subjects.items[i].string);
 
index 55eac756f7c83e496daae7cb8874552caaa58ff5..f01b81eebfebc1c221e81c44e3f14a4e2781f0a7 100644 (file)
@@ -13,6 +13,7 @@
 #include "dir.h"
 #include "progress.h"
 #include "streaming.h"
+#include "decorate.h"
 
 #define REACHABLE 0x0001
 #define SEEN      0x0002
@@ -35,11 +36,26 @@ static int write_lost_and_found;
 static int verbose;
 static int show_progress = -1;
 static int show_dangling = 1;
+static int name_objects;
 #define ERROR_OBJECT 01
 #define ERROR_REACHABLE 02
 #define ERROR_PACK 04
 #define ERROR_REFS 010
 
+static const char *describe_object(struct object *obj)
+{
+       static struct strbuf buf = STRBUF_INIT;
+       char *name = name_objects ?
+               lookup_decoration(fsck_walk_options.object_names, obj) : NULL;
+
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, oid_to_hex(&obj->oid));
+       if (name)
+               strbuf_addf(&buf, " (%s)", name);
+
+       return buf.buf;
+}
+
 static int fsck_config(const char *var, const char *value, void *cb)
 {
        if (strcmp(var, "fsck.skiplist") == 0) {
@@ -67,7 +83,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), oid_to_hex(&obj->oid), err);
+               msg_type, typename(obj->type), describe_object(obj), err);
 }
 
 static int objerror(struct object *obj, const char *err)
@@ -77,7 +93,8 @@ static int objerror(struct object *obj, const char *err)
        return -1;
 }
 
-static int fsck_error_func(struct object *obj, int type, const char *message)
+static int fsck_error_func(struct fsck_options *o,
+       struct object *obj, int type, const char *message)
 {
        objreport(obj, (type == FSCK_WARN) ? "warning" : "error", message);
        return (type == FSCK_WARN) ? 0 : 1;
@@ -97,7 +114,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), oid_to_hex(&parent->oid));
+                          typename(parent->type), describe_object(parent));
                printf("broken link from %7s %s\n",
                           (type == OBJ_ANY ? "unknown" : typename(type)), "unknown");
                errors_found |= ERROR_REACHABLE;
@@ -114,9 +131,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), oid_to_hex(&parent->oid));
+                                typename(parent->type), describe_object(parent));
                        printf("              to %7s %s\n",
-                                typename(obj->type), oid_to_hex(&obj->oid));
+                                typename(obj->type), describe_object(obj));
                        errors_found |= ERROR_REACHABLE;
                }
                return 1;
@@ -190,7 +207,8 @@ static void check_reachable_object(struct object *obj)
                        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), oid_to_hex(&obj->oid));
+               printf("missing %s %s\n", typename(obj->type),
+                       describe_object(obj));
                errors_found |= ERROR_REACHABLE;
                return;
        }
@@ -215,7 +233,8 @@ 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), oid_to_hex(&obj->oid));
+               printf("unreachable %s %s\n", typename(obj->type),
+                       describe_object(obj));
                return;
        }
 
@@ -234,11 +253,11 @@ static void check_unreachable_object(struct object *obj)
        if (!obj->used) {
                if (show_dangling)
                        printf("dangling %s %s\n", typename(obj->type),
-                              oid_to_hex(&obj->oid));
+                              describe_object(obj));
                if (write_lost_and_found) {
                        char *filename = git_pathdup("lost-found/%s/%s",
                                obj->type == OBJ_COMMIT ? "commit" : "other",
-                               oid_to_hex(&obj->oid));
+                               describe_object(obj));
                        FILE *f;
 
                        if (safe_create_leading_directories_const(filename)) {
@@ -249,10 +268,10 @@ 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", oid_to_hex(&obj->oid));
+                               fprintf(f, "%s\n", describe_object(obj));
                        if (fclose(f))
                                die_errno("Could not finish '%s'",
                                          filename);
@@ -271,7 +290,7 @@ static void check_unreachable_object(struct object *obj)
 static void check_object(struct object *obj)
 {
        if (verbose)
-               fprintf(stderr, "Checking %s\n", oid_to_hex(&obj->oid));
+               fprintf(stderr, "Checking %s\n", describe_object(obj));
 
        if (obj->flags & REACHABLE)
                check_reachable_object(obj);
@@ -307,7 +326,7 @@ static int fsck_obj(struct object *obj)
 
        if (verbose)
                fprintf(stderr, "Checking %s %s\n",
-                       typename(obj->type), oid_to_hex(&obj->oid));
+                       typename(obj->type), describe_object(obj));
 
        if (fsck_walk(obj, NULL, &fsck_obj_options))
                objerror(obj, "broken links");
@@ -326,15 +345,17 @@ static int fsck_obj(struct object *obj)
                free_commit_buffer(commit);
 
                if (!commit->parents && show_root)
-                       printf("root %s\n", oid_to_hex(&commit->object.oid));
+                       printf("root %s\n", describe_object(&commit->object));
        }
 
        if (obj->type == OBJ_TAG) {
                struct tag *tag = (struct tag *) obj;
 
                if (show_tags && tag->tagged) {
-                       printf("tagged %s %s", typename(tag->tagged->type), oid_to_hex(&tag->tagged->oid));
-                       printf(" (%s) in %s\n", tag->tag, oid_to_hex(&tag->object.oid));
+                       printf("tagged %s %s", typename(tag->tagged->type),
+                               describe_object(tag->tagged));
+                       printf(" (%s) in %s\n", tag->tag,
+                               describe_object(&tag->object));
                }
        }
 
@@ -356,6 +377,10 @@ static int fsck_sha1(const unsigned char *sha1)
 static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
                           unsigned long size, void *buffer, int *eaten)
 {
+       /*
+        * Note, buffer may be NULL if type is OBJ_BLOB. See
+        * verify_packfile(), data_valid variable for details.
+        */
        struct object *obj;
        obj = parse_object_buffer(sha1, type, size, buffer, eaten);
        if (!obj) {
@@ -368,13 +393,18 @@ 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_sha1(const char *refname, unsigned char *sha1,
+       unsigned long timestamp)
 {
        struct object *obj;
 
        if (!is_null_sha1(sha1)) {
                obj = lookup_object(sha1);
                if (obj) {
+                       if (timestamp && name_objects)
+                               add_decoration(fsck_walk_options.object_names,
+                                       obj,
+                                       xstrfmt("%s@{%ld}", refname, timestamp));
                        obj->used = 1;
                        mark_object_reachable(obj);
                } else {
@@ -394,8 +424,8 @@ static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
                fprintf(stderr, "Checking reflog %s->%s\n",
                        sha1_to_hex(osha1), sha1_to_hex(nsha1));
 
-       fsck_handle_reflog_sha1(refname, osha1);
-       fsck_handle_reflog_sha1(refname, nsha1);
+       fsck_handle_reflog_sha1(refname, osha1, 0);
+       fsck_handle_reflog_sha1(refname, nsha1, timestamp);
        return 0;
 }
 
@@ -424,6 +454,9 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid,
        }
        default_refs++;
        obj->used = 1;
+       if (name_objects)
+               add_decoration(fsck_walk_options.object_names,
+                       obj, xstrdup(refname));
        mark_object_reachable(obj);
 
        return 0;
@@ -493,13 +526,12 @@ static void fsck_object_dir(const char *path)
 
 static int fsck_head_link(void)
 {
-       int flag;
        int null_is_error = 0;
 
        if (verbose)
                fprintf(stderr, "Checking HEAD link\n");
 
-       head_points_at = resolve_ref_unsafe("HEAD", 0, head_oid.hash, &flag);
+       head_points_at = resolve_ref_unsafe("HEAD", 0, head_oid.hash, NULL);
        if (!head_points_at) {
                errors_found |= ERROR_REFS;
                return error("Invalid HEAD");
@@ -540,6 +572,9 @@ static int fsck_cache_tree(struct cache_tree *it)
                        return 1;
                }
                obj->used = 1;
+               if (name_objects)
+                       add_decoration(fsck_walk_options.object_names,
+                               obj, xstrdup(":"));
                mark_object_reachable(obj);
                if (obj->type != OBJ_TREE)
                        err |= objerror(obj, "non-tree in cache-tree");
@@ -568,6 +603,7 @@ static struct option fsck_opts[] = {
        OPT_BOOL(0, "lost-found", &write_lost_and_found,
                                N_("write dangling objects in .git/lost-found")),
        OPT_BOOL(0, "progress", &show_progress, N_("show progress")),
+       OPT_BOOL(0, "name-objects", &name_objects, N_("show verbose names for reachable objects")),
        OPT_END(),
 };
 
@@ -597,6 +633,10 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                include_reflogs = 0;
        }
 
+       if (name_objects)
+               fsck_walk_options.object_names =
+                       xcalloc(1, sizeof(struct decoration));
+
        git_config(fsck_config, NULL);
 
        fsck_head_link();
@@ -604,14 +644,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                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) {
@@ -652,6 +686,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
                                continue;
 
                        obj->used = 1;
+                       if (name_objects)
+                               add_decoration(fsck_walk_options.object_names,
+                                       obj, xstrdup(arg));
                        mark_object_reachable(obj);
                        heads++;
                        continue;
@@ -679,11 +716,15 @@ 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;
                        obj->used = 1;
+                       if (name_objects)
+                               add_decoration(fsck_walk_options.object_names,
+                                       obj,
+                                       xstrfmt(":%s", active_cache[i]->name));
                        mark_object_reachable(obj);
                }
                if (active_cache_tree)
index c583aad6ec2896c8a6ad3b35671e92a3c0478bcd..069950d0b417f5eb97cd756ae32df7a2fb13abce 100644 (file)
@@ -28,7 +28,7 @@ static const char * const builtin_gc_usage[] = {
 
 static int pack_refs = 1;
 static int prune_reflogs = 1;
-static int aggressive_depth = 250;
+static int aggressive_depth = 50;
 static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
 static int gc_auto_pack_limit = 50;
@@ -177,7 +177,7 @@ static int too_many_packs(void)
                 */
                cnt++;
        }
-       return gc_auto_pack_limit <= cnt;
+       return gc_auto_pack_limit < cnt;
 }
 
 static void add_repack_all_option(void)
index aa7435f380e95d87982cd1ae71e91bc53e77af50..8887b6addb5f9085dd9ed46a9e5ad81768c551cb 100644 (file)
@@ -386,7 +386,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
 
        for (nr = 0; nr < active_nr; nr++) {
                const struct cache_entry *ce = active_cache[nr];
-               if (!S_ISREG(ce->ce_mode) || ce_intent_to_add(ce))
+               if (!S_ISREG(ce->ce_mode))
                        continue;
                if (!ce_path_match(ce, pathspec, NULL))
                        continue;
@@ -396,9 +396,10 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
                 * cache version instead
                 */
                if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) {
-                       if (ce_stage(ce))
+                       if (ce_stage(ce) || ce_intent_to_add(ce))
                                continue;
-                       hit |= grep_sha1(opt, ce->sha1, ce->name, 0, ce->name);
+                       hit |= grep_sha1(opt, ce->oid.hash, ce->name, 0,
+                                        ce->name);
                }
                else
                        hit |= grep_file(opt, ce->name);
@@ -438,7 +439,7 @@ 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.sha1, base->buf, tn_len,
+                       hit |= grep_sha1(opt, entry.oid->hash, base->buf, tn_len,
                                         check_attr ? base->buf + tn_len : NULL);
                }
                else if (S_ISDIR(entry.mode)) {
@@ -447,10 +448,10 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
                        void *data;
                        unsigned long size;
 
-                       data = lock_and_read_sha1_file(entry.sha1, &type, &size);
+                       data = lock_and_read_sha1_file(entry.oid->hash, &type, &size);
                        if (!data)
                                die(_("unable to read tree (%s)"),
-                                   sha1_to_hex(entry.sha1));
+                                   oid_to_hex(entry.oid));
 
                        strbuf_addch(base, '/');
                        init_tree_desc(&sub, data, size);
@@ -522,12 +523,14 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,
 }
 
 static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,
-                         int exc_std)
+                         int exc_std, int use_index)
 {
        struct dir_struct dir;
        int i, hit = 0;
 
        memset(&dir, 0, sizeof(dir));
+       if (!use_index)
+               dir.flags |= DIR_NO_GITLINKS;
        if (exc_std)
                setup_standard_excludes(&dir);
 
@@ -902,7 +905,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
                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);
+               hit = grep_directory(&opt, &pathspec, use_exclude, use_index);
        } else if (0 <= opt_exclude) {
                die(_("--[no-]exclude-standard cannot be used for tracked contents."));
        } else if (!list.nr) {
index f7d3567dd0ce2d75778d6cf011961c0f203432b4..9028e1fdccea2ad44a76792adc6e335fb44cfb5c 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[] = {
@@ -107,12 +108,14 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
        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);
+
+       prefix_length = prefix ? strlen(prefix) : 0;
+       if (vpath && prefix)
+               vpath = prefix_filename(prefix, prefix_length, vpath);
 
        git_config(git_default_config, NULL);
 
index 3c55ce456309ee7da95eac0517f11161ab3c1f7c..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"),
@@ -127,7 +129,7 @@ static void exec_woman_emacs(const char *path, const char *page)
                        path = "emacsclient";
                strbuf_addf(&man_page, "(woman \"%s\")", page);
                execlp(path, "emacsclient", "-e", man_page.buf, (char *)NULL);
-               warning(_("failed to exec '%s': %s"), path, strerror(errno));
+               warning_errno(_("failed to exec '%s'"), path);
        }
 }
 
@@ -148,7 +150,7 @@ static void exec_man_konqueror(const char *path, const char *page)
                        path = "kfmclient";
                strbuf_addf(&man_page, "man:%s(1)", page);
                execlp(path, filename, "newTab", man_page.buf, (char *)NULL);
-               warning(_("failed to exec '%s': %s"), path, strerror(errno));
+               warning_errno(_("failed to exec '%s'"), path);
        }
 }
 
@@ -157,7 +159,7 @@ static void exec_man_man(const char *path, const char *page)
        if (!path)
                path = "man";
        execlp(path, "man", page, (char *)NULL);
-       warning(_("failed to exec '%s': %s"), path, strerror(errno));
+       warning_errno(_("failed to exec '%s'"), path);
 }
 
 static void exec_man_cmd(const char *cmd, const char *page)
@@ -165,7 +167,7 @@ static void exec_man_cmd(const char *cmd, const char *page)
        struct strbuf shell_cmd = STRBUF_INIT;
        strbuf_addf(&shell_cmd, "%s %s", cmd, page);
        execl(SHELL_PATH, SHELL_PATH, "-c", shell_cmd.buf, (char *)NULL);
-       warning(_("failed to exec '%s': %s"), cmd, strerror(errno));
+       warning(_("failed to exec '%s'"), cmd);
 }
 
 static void add_man_viewer(const char *name)
@@ -379,17 +381,10 @@ static void get_html_page_path(struct strbuf *page_path, const char *page)
        free(to_free);
 }
 
-/*
- * If open_html is not defined in a platform-specific way (see for
- * example compat/mingw.h), we use the script web--browse to display
- * HTML.
- */
-#ifndef open_html
 static void open_html(const char *path)
 {
        execl_git_cmd("web--browse", "-c", "help.browser", path, (char *)NULL);
 }
-#endif
 
 static void show_html_page(const char *git_cmd)
 {
@@ -433,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,
@@ -476,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 ec6a530159ba916696cf95acbbfcb089ce90bd7f..f4b87c6c9f901e5834ce9e50db089fb487c6eafc 100644 (file)
@@ -77,6 +77,7 @@ static int strict;
 static int do_fsck_object;
 static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
 static int verbose;
+static int show_resolving_progress;
 static int show_stat;
 static int check_self_contained_and_connected;
 
@@ -86,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;
@@ -296,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)
@@ -338,10 +342,10 @@ static void parse_pack_header(void)
        use(sizeof(struct pack_header));
 }
 
-static NORETURN void bad_object(unsigned long offset, const char *format,
+static NORETURN void bad_object(off_t offset, const char *format,
                       ...) __attribute__((format (printf, 2, 3)));
 
-static NORETURN void bad_object(unsigned long offset, const char *format, ...)
+static NORETURN void bad_object(off_t offset, const char *format, ...)
 {
        va_list params;
        char buf[1024];
@@ -349,7 +353,8 @@ static NORETURN void bad_object(unsigned long offset, const char *format, ...)
        va_start(params, format);
        vsnprintf(buf, sizeof(buf), format, params);
        va_end(params);
-       die(_("pack has bad object at offset %lu: %s"), offset, buf);
+       die(_("pack has bad object at offset %"PRIuMAX": %s"),
+           (uintmax_t)offset, buf);
 }
 
 static inline struct thread_local *get_thread_data(void)
@@ -429,7 +434,7 @@ static int is_delta_type(enum object_type type)
        return (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA);
 }
 
-static void *unpack_entry_data(unsigned long offset, unsigned long size,
+static void *unpack_entry_data(off_t offset, unsigned long size,
                               enum object_type type, unsigned char *sha1)
 {
        static char fixed_buf[8192];
@@ -549,13 +554,13 @@ static void *unpack_data(struct object_entry *obj,
                         void *cb_data)
 {
        off_t from = obj[0].idx.offset + obj[0].hdr_size;
-       unsigned long len = obj[1].idx.offset - from;
+       off_t len = obj[1].idx.offset - from;
        unsigned char *data, *inbuf;
        git_zstream stream;
        int status;
 
        data = xmallocz(consume ? 64*1024 : obj->size);
-       inbuf = xmalloc((len < 64*1024) ? len : 64*1024);
+       inbuf = xmalloc((len < 64*1024) ? (int)len : 64*1024);
 
        memset(&stream, 0, sizeof(stream));
        git_inflate_init(&stream);
@@ -563,15 +568,15 @@ static void *unpack_data(struct object_entry *obj,
        stream.avail_out = consume ? 64*1024 : obj->size;
 
        do {
-               ssize_t n = (len < 64*1024) ? len : 64*1024;
+               ssize_t n = (len < 64*1024) ? (ssize_t)len : 64*1024;
                n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
                if (n < 0)
                        die_errno(_("cannot pread pack file"));
                if (!n)
-                       die(Q_("premature end of pack file, %lu byte missing",
-                              "premature end of pack file, %lu bytes missing",
-                              len),
-                           len);
+                       die(Q_("premature end of pack file, %"PRIuMAX" byte missing",
+                              "premature end of pack file, %"PRIuMAX" bytes missing",
+                              (unsigned int)len),
+                           (uintmax_t)len);
                from += n;
                len -= n;
                stream.next_in = inbuf;
@@ -782,13 +787,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();
@@ -1185,12 +1192,10 @@ 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)
+       if (verbose || show_resolving_progress)
                progress = start_progress(_("Resolving deltas"),
                                          nr_ref_deltas + nr_ofs_deltas);
 
@@ -1351,7 +1356,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];
@@ -1528,8 +1533,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)
@@ -1601,6 +1605,18 @@ static void show_pack_info(int stat_only)
        }
 }
 
+static const char *derive_filename(const char *pack_name, const char *suffix,
+                                  struct strbuf *buf)
+{
+       size_t len;
+       if (!strip_suffix(pack_name, ".pack", &len))
+               die(_("packfile name '%s' does not end with '.pack'"),
+                   pack_name);
+       strbuf_add(buf, pack_name, len);
+       strbuf_addstr(buf, suffix);
+       return buf->buf;
+}
+
 int cmd_index_pack(int argc, const char **argv, const char *prefix)
 {
        int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
@@ -1613,6 +1629,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
        struct pack_idx_option opts;
        unsigned char pack_sha1[20];
        unsigned foreign_nr = 1;        /* zero is a "good" value, assume bad */
+       int report_end_of_input = 0;
 
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(index_pack_usage);
@@ -1682,6 +1699,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                                input_len = sizeof(*hdr);
                        } else if (!strcmp(arg, "-v")) {
                                verbose = 1;
+                       } else if (!strcmp(arg, "--show-resolving-progress")) {
+                               show_resolving_progress = 1;
+                       } else if (!strcmp(arg, "--report-end-of-input")) {
+                               report_end_of_input = 1;
                        } else if (!strcmp(arg, "-o")) {
                                if (index_name || (i+1) >= argc)
                                        usage(index_pack_usage);
@@ -1695,6 +1716,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;
@@ -1709,24 +1732,13 @@ 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 (!index_name && pack_name) {
-               size_t len;
-               if (!strip_suffix(pack_name, ".pack", &len))
-                       die(_("packfile name '%s' does not end with '.pack'"),
-                           pack_name);
-               strbuf_add(&index_name_buf, pack_name, len);
-               strbuf_addstr(&index_name_buf, ".idx");
-               index_name = index_name_buf.buf;
-       }
-       if (keep_msg && !keep_name && pack_name) {
-               size_t len;
-               if (!strip_suffix(pack_name, ".pack", &len))
-                       die(_("packfile name '%s' does not end with '.pack'"),
-                           pack_name);
-               strbuf_add(&keep_name_buf, pack_name, len);
-               strbuf_addstr(&keep_name_buf, ".idx");
-               keep_name = keep_name_buf.buf;
-       }
+       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)
+               keep_name = derive_filename(pack_name, ".keep", &keep_name_buf);
+
        if (verify) {
                if (!index_name)
                        die(_("--verify with no packfile name given"));
@@ -1752,6 +1764,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
                obj_stat = xcalloc(st_add(nr_objects, 1), sizeof(struct object_stat));
        ofs_deltas = xcalloc(nr_objects, sizeof(struct ofs_delta_entry));
        parse_pack_objects(pack_sha1);
+       if (report_end_of_input)
+               write_in_full(2, "\0", 1);
        resolve_deltas();
        conclude_pack(fix_thin_pack, curr_pack, pack_sha1);
        free(ofs_deltas);
index 6223b7d46af346b0d96870ee0c647ab9a5440b33..2399b97d902668a08c3c881d544f4d6a88f4e263 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)
@@ -95,6 +94,8 @@ static void copy_templates(const char *template_dir)
        struct strbuf path = STRBUF_INIT;
        struct strbuf template_path = STRBUF_INIT;
        size_t template_len;
+       struct repository_format template_format;
+       struct strbuf err = STRBUF_INIT;
        DIR *dir;
        char *to_free = NULL;
 
@@ -121,21 +122,22 @@ static void copy_templates(const char *template_dir)
 
        /* Make sure that template is from the correct vintage */
        strbuf_addstr(&template_path, "config");
-       repository_format_version = 0;
-       git_config_from_file(check_repository_format_version,
-                            template_path.buf, NULL);
+       read_repository_format(&template_format, template_path.buf);
        strbuf_setlen(&template_path, template_len);
 
-       if (repository_format_version &&
-           repository_format_version != GIT_REPO_VERSION) {
-               warning(_("not copying templates of "
-                       "a wrong format version %d from '%s'"),
-                       repository_format_version,
-                       template_dir);
+       /*
+        * No mention of version at all is OK, but anything else should be
+        * verified.
+        */
+       if (template_format.version >= 0 &&
+           verify_repository_format(&template_format, &err) < 0) {
+               warning(_("not copying templates from '%s': %s"),
+                         template_dir, err.buf);
+               strbuf_release(&err);
                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:
@@ -168,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;
@@ -177,41 +180,51 @@ 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)
-               shared_repository = init_shared_repository;
+               set_shared_repository(init_shared_repository);
 
        /*
         * We would have created the above under user's umask -- under
         * shared-repository settings, we would need to fix them up.
         */
-       if (shared_repository) {
+       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.
@@ -251,7 +264,7 @@ static int create_default_files(const char *template_path)
                /* allow template config file to override the default */
                if (log_all_ref_updates == -1)
                        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);
        }
 
@@ -299,33 +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;
-       }
-       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;
 
@@ -346,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 = xstrdup(real_path(git_dir));
 
-       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);
 
@@ -365,11 +370,11 @@ 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();
 
-       if (shared_repository) {
+       if (get_shared_repository()) {
                char buf[10];
                /* We do not spell "group" and such, so that
                 * the configuration can be read by older version
@@ -377,12 +382,12 @@ int init_db(const char *template_dir, unsigned int flags)
                 * and compatibility values for PERM_GROUP and
                 * PERM_EVERYBODY.
                 */
-               if (shared_repository < 0)
+               if (get_shared_repository() < 0)
                        /* force to the mode value */
-                       xsnprintf(buf, sizeof(buf), "0%o", -shared_repository);
-               else if (shared_repository == PERM_GROUP)
+                       xsnprintf(buf, sizeof(buf), "0%o", -get_shared_repository());
+               else if (get_shared_repository() == PERM_GROUP)
                        xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_GROUP);
-               else if (shared_repository == PERM_EVERYBODY)
+               else if (get_shared_repository() == PERM_EVERYBODY)
                        xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_EVERYBODY);
                else
                        die("BUG: invalid value for shared_repository");
@@ -393,15 +398,19 @@ int init_db(const char *template_dir, unsigned int flags)
        if (!(flags & INIT_DB_QUIET)) {
                int len = strlen(git_dir);
 
-               /* 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. */
-               printf(_("%s%s Git repository in %s%s\n"),
-                      reinit ? _("Reinitialized existing") : _("Initialized empty"),
-                      shared_repository ? _(" shared") : "",
-                      git_dir, len && git_dir[len-1] != '/' ? "/" : "");
+               if (reinit)
+                       printf(get_shared_repository()
+                              ? _("Reinitialized existing shared Git repository in %s%s\n")
+                              : _("Reinitialized existing Git repository in %s%s\n"),
+                              git_dir, len && git_dir[len-1] != '/' ? "/" : "");
+               else
+                       printf(get_shared_repository()
+                              ? _("Initialized empty shared Git repository in %s%s\n")
+                              : _("Initialized empty Git repository in %s%s\n"),
+                              git_dir, len && git_dir[len-1] != '/' ? "/" : "");
        }
 
+       free(original_git_dir);
        return 0;
 }
 
@@ -493,8 +502,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                                 * and we know shared_repository should always be 0;
                                 * but just in case we play safe.
                                 */
-                               saved = shared_repository;
-                               shared_repository = 0;
+                               saved = get_shared_repository();
+                               set_shared_repository(0);
                                switch (safe_create_leading_directories_const(argv[0])) {
                                case SCLD_OK:
                                case SCLD_PERMS:
@@ -506,7 +515,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                                        die_errno(_("cannot mkdir %s"), argv[0]);
                                        break;
                                }
-                               shared_repository = saved;
+                               set_shared_repository(saved);
                                if (mkdir(argv[0], 0777) < 0)
                                        die_errno(_("cannot mkdir %s"), argv[0]);
                                mkdir_tried = 1;
@@ -524,7 +533,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
        }
 
        if (init_shared_repository != -1)
-               shared_repository = init_shared_repository;
+               set_shared_repository(init_shared_repository);
 
        /*
         * GIT_WORK_TREE makes sense only in conjunction with GIT_DIR
@@ -569,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 b99ae4be8875ad8fb41fd8be2a84b6191681a4e4..175f14797b101d22ead9d1008744440da66a7c1c 100644 (file)
@@ -20,7 +20,7 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
 {
        int in_place = 0;
        int trim_empty = 0;
-       struct string_list trailers = STRING_LIST_INIT_DUP;
+       struct string_list trailers = STRING_LIST_INIT_NODUP;
 
        struct option options[] = {
                OPT_BOOL(0, "in-place", &in_place, N_("edit files in place")),
index 0d738d6ddc0d6335e15392dd90e4118e2cb58b88..55d20cc2d88ab03d96f0476b222be3b2f6832ed9 100644 (file)
@@ -33,6 +33,7 @@ static const char *default_date_mode = NULL;
 static int default_abbrev_commit;
 static int default_show_root = 1;
 static int default_follow;
+static int default_show_signature;
 static int decoration_style;
 static int decoration_given;
 static int use_mailmap_config;
@@ -100,6 +101,12 @@ static int log_line_range_callback(const struct option *option, const char *arg,
        return 0;
 }
 
+static void init_log_defaults(void)
+{
+       init_grep_defaults();
+       init_diff_ui_defaults();
+}
+
 static void cmd_log_init_defaults(struct rev_info *rev)
 {
        if (fmt_pretty)
@@ -113,6 +120,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
        rev->abbrev_commit = default_abbrev_commit;
        rev->show_root_diff = default_show_root;
        rev->subject_prefix = fmt_patch_subject_prefix;
+       rev->show_signature = default_show_signature;
        DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
 
        if (default_date_mode)
@@ -230,16 +238,17 @@ static void show_early_header(struct rev_info *rev, const char *stage, int nr)
                if (rev->commit_format != CMIT_FMT_ONELINE)
                        putchar(rev->diffopt.line_termination);
        }
-       printf(_("Final output: %d %s\n"), nr, stage);
+       fprintf(rev->diffopt.file, _("Final output: %d %s\n"), nr, stage);
 }
 
 static struct itimerval early_output_timer;
 
 static void log_show_early(struct rev_info *revs, struct commit_list *list)
 {
-       int i = revs->early_output;
+       int i = revs->early_output, close_file = revs->diffopt.close_file;
        int show_header = 1;
 
+       revs->diffopt.close_file = 0;
        sort_in_topological_order(&list, revs->sort_order);
        while (list && i) {
                struct commit *commit = list->item;
@@ -256,14 +265,19 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
                case commit_ignore:
                        break;
                case commit_error:
+                       if (close_file)
+                               fclose(revs->diffopt.file);
                        return;
                }
                list = list->next;
        }
 
        /* Did we already get enough commits for the early output? */
-       if (!i)
+       if (!i) {
+               if (close_file)
+                       fclose(revs->diffopt.file);
                return;
+       }
 
        /*
         * ..if no, then repeat it twice a second until we
@@ -325,7 +339,7 @@ static int cmd_log_walk(struct rev_info *rev)
 {
        struct commit *commit;
        int saved_nrl = 0;
-       int saved_dcctc = 0;
+       int saved_dcctc = 0, close_file = rev->diffopt.close_file;
 
        if (rev->early_output)
                setup_early_output(rev);
@@ -341,6 +355,7 @@ static int cmd_log_walk(struct rev_info *rev)
         * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
         * retain that state information if replacing rev->diffopt in this loop
         */
+       rev->diffopt.close_file = 0;
        while ((commit = get_revision(rev)) != NULL) {
                if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
                        /*
@@ -361,6 +376,8 @@ static int cmd_log_walk(struct rev_info *rev)
        }
        rev->diffopt.degraded_cc_to_c = saved_dcctc;
        rev->diffopt.needed_rename_limit = saved_nrl;
+       if (close_file)
+               fclose(rev->diffopt.file);
 
        if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
            DIFF_OPT_TST(&rev->diffopt, CHECK_FAILED)) {
@@ -403,6 +420,10 @@ static int git_log_config(const char *var, const char *value, void *cb)
                use_mailmap_config = git_config_bool(var, value);
                return 0;
        }
+       if (!strcmp(var, "log.showsignature")) {
+               default_show_signature = git_config_bool(var, value);
+               return 0;
+       }
 
        if (grep_config(var, value, cb) < 0)
                return -1;
@@ -416,7 +437,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct setup_revision_opt opt;
 
-       init_grep_defaults();
+       init_log_defaults();
        git_config(git_log_config, NULL);
 
        init_revisions(&rev, prefix);
@@ -439,27 +460,27 @@ static void show_tagger(char *buf, int len, struct rev_info *rev)
        pp.fmt = rev->commit_format;
        pp.date_mode = rev->date_mode;
        pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
-       printf("%s", out.buf);
+       fprintf(rev->diffopt.file, "%s", out.buf);
        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;
 
-       fflush(stdout);
+       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, 0, 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);
+           !textconv_object(obj_context.path, obj_context.mode, &oidc, 1, &buf, &size))
+               return stream_blob_to_fd(1, oid, NULL, 0);
 
        if (!buf)
                die(_("git show %s: bad file"), obj_name);
@@ -468,15 +489,15 @@ static int show_blob_object(const unsigned char *sha1, struct rev_info *rev, con
        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') {
@@ -490,7 +511,7 @@ static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
        }
 
        if (offset < size)
-               fwrite(buf + offset, size - offset, 1, stdout);
+               fwrite(buf + offset, size - offset, 1, rev->diffopt.file);
        free(buf);
        return 0;
 }
@@ -499,7 +520,8 @@ static int show_tree_object(const unsigned char *sha1,
                struct strbuf *base,
                const char *pathname, unsigned mode, int stage, void *context)
 {
-       printf("%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
+       FILE *file = context;
+       fprintf(file, "%s%s\n", pathname, S_ISDIR(mode) ? "/" : "");
        return 0;
 }
 
@@ -527,7 +549,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
        struct pathspec match_all;
        int i, count, ret = 0;
 
-       init_grep_defaults();
+       init_log_defaults();
        git_config(git_log_config, NULL);
 
        memset(&match_all, 0, sizeof(match_all));
@@ -552,18 +574,18 @@ 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;
 
                        if (rev.shown_one)
                                putchar('\n');
-                       printf("%stag %s%s\n",
+                       fprintf(rev.diffopt.file, "%stag %s%s\n",
                                        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;
@@ -578,12 +600,12 @@ int cmd_show(int argc, const char **argv, const char *prefix)
                case OBJ_TREE:
                        if (rev.shown_one)
                                putchar('\n');
-                       printf("%stree %s%s\n\n",
+                       fprintf(rev.diffopt.file, "%stree %s%s\n\n",
                                        diff_get_color_opt(&rev.diffopt, DIFF_COMMIT),
                                        name,
                                        diff_get_color_opt(&rev.diffopt, DIFF_RESET));
                        read_tree_recursive((struct tree *)o, "", 0, 0, &match_all,
-                                       show_tree_object, NULL);
+                                       show_tree_object, rev.diffopt.file);
                        rev.shown_one = 1;
                        break;
                case OBJ_COMMIT:
@@ -608,7 +630,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct setup_revision_opt opt;
 
-       init_grep_defaults();
+       init_log_defaults();
        git_config(git_log_config, NULL);
 
        init_revisions(&rev, prefix);
@@ -647,7 +669,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct setup_revision_opt opt;
 
-       init_grep_defaults();
+       init_log_defaults();
        git_config(git_log_config, NULL);
 
        init_revisions(&rev, prefix);
@@ -668,9 +690,9 @@ static int auto_number = 1;
 
 static char *default_attach = NULL;
 
-static struct string_list extra_hdr;
-static struct string_list extra_to;
-static struct string_list extra_cc;
+static struct string_list extra_hdr = STRING_LIST_INIT_NODUP;
+static struct string_list extra_to = STRING_LIST_INIT_NODUP;
+static struct string_list extra_cc = STRING_LIST_INIT_NODUP;
 
 static void add_header(const char *value)
 {
@@ -696,6 +718,8 @@ static void add_header(const char *value)
 #define THREAD_DEEP 2
 static int thread;
 static int do_signoff;
+static int base_auto;
+static char *from;
 static const char *signature = git_version_string;
 static const char *signature_file;
 static int config_cover_letter;
@@ -780,15 +804,29 @@ static int git_format_config(const char *var, const char *value, void *cb)
        }
        if (!strcmp(var, "format.outputdirectory"))
                return git_config_string(&config_output_directory, var, value);
+       if (!strcmp(var, "format.useautobase")) {
+               base_auto = git_config_bool(var, value);
+               return 0;
+       }
+       if (!strcmp(var, "format.from")) {
+               int b = git_config_maybe_bool(var, value);
+               free(from);
+               if (b < 0)
+                       from = xstrdup(value);
+               else if (b)
+                       from = xstrdup(git_committer_info(IDENT_NO_DATE));
+               else
+                       from = NULL;
+               return 0;
+       }
 
        return git_log_config(var, value, cb);
 }
 
-static FILE *realstdout = NULL;
 static const char *output_directory = NULL;
 static int outdir_offset;
 
-static int reopen_stdout(struct commit *commit, const char *subject,
+static int open_next_file(struct commit *commit, const char *subject,
                         struct rev_info *rev, int quiet)
 {
        struct strbuf filename = STRBUF_INIT;
@@ -810,9 +848,9 @@ static int reopen_stdout(struct commit *commit, const char *subject,
                fmt_output_subject(&filename, subject, rev);
 
        if (!quiet)
-               fprintf(realstdout, "%s\n", filename.buf + outdir_offset);
+               printf("%s\n", filename.buf + outdir_offset);
 
-       if (freopen(filename.buf, "w", stdout) == NULL)
+       if ((rev->diffopt.file = fopen(filename.buf, "w")) == NULL)
                return error(_("Cannot open patch file %s"), filename.buf);
 
        strbuf_release(&filename);
@@ -871,15 +909,15 @@ static void gen_message_id(struct rev_info *info, char *base)
        info->message_id = strbuf_detach(&buf, NULL);
 }
 
-static void print_signature(void)
+static void print_signature(FILE *file)
 {
        if (!signature || !*signature)
                return;
 
-       printf("-- \n%s", signature);
+       fprintf(file, "-- \n%s", signature);
        if (signature[strlen(signature)-1] != '\n')
-               putchar('\n');
-       putchar('\n');
+               putc('\n', file);
+       putc('\n', file);
 }
 
 static void add_branch_description(struct strbuf *buf, const char *branch_name)
@@ -942,13 +980,13 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        struct pretty_print_context pp = {0};
        struct commit *head = list[0];
 
-       if (rev->commit_format != CMIT_FMT_EMAIL)
+       if (!cmit_fmt_is_mail(rev->commit_format))
                die(_("Cover letter needs email format"));
 
        committer = git_committer_info(0);
 
        if (!use_stdout &&
-           reopen_stdout(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
+           open_next_file(NULL, rev->numbered_files ? NULL : "cover-letter", rev, quiet))
                return;
 
        log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
@@ -971,7 +1009,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
        pp_remainder(&pp, &msg, &sb, 0);
        add_branch_description(&sb, branch_name);
-       printf("%s\n", sb.buf);
+       fprintf(rev->diffopt.file, "%s\n", sb.buf);
 
        strbuf_release(&sb);
 
@@ -980,6 +1018,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        log.wrap = 72;
        log.in1 = 2;
        log.in2 = 4;
+       log.file = rev->diffopt.file;
        for (i = 0; i < nr; i++)
                shortlog_add_commit(&log, list[i]);
 
@@ -1002,8 +1041,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
        diffcore_std(&opts);
        diff_flush(&opts);
 
-       printf("\n");
-       print_signature();
+       fprintf(rev->diffopt.file, "\n");
 }
 
 static const char *clean_message_id(const char *msg_id)
@@ -1073,6 +1111,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,
@@ -1185,6 +1228,155 @@ static int from_callback(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
+struct base_tree_info {
+       struct object_id base_commit;
+       int nr_patch_id, alloc_patch_id;
+       struct object_id *patch_id;
+};
+
+static struct commit *get_base_commit(const char *base_commit,
+                                     struct commit **list,
+                                     int total)
+{
+       struct commit *base = NULL;
+       struct commit **rev;
+       int i = 0, rev_nr = 0;
+
+       if (base_commit && strcmp(base_commit, "auto")) {
+               base = lookup_commit_reference_by_name(base_commit);
+               if (!base)
+                       die(_("Unknown commit %s"), base_commit);
+       } else if ((base_commit && !strcmp(base_commit, "auto")) || base_auto) {
+               struct branch *curr_branch = branch_get(NULL);
+               const char *upstream = branch_get_upstream(curr_branch, NULL);
+               if (upstream) {
+                       struct commit_list *base_list;
+                       struct commit *commit;
+                       struct object_id oid;
+
+                       if (get_oid(upstream, &oid))
+                               die(_("Failed to resolve '%s' as a valid ref."), upstream);
+                       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)
+                               die(_("Could not find exact merge base."));
+                       base = base_list->item;
+                       free_commit_list(base_list);
+               } else {
+                       die(_("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."));
+               }
+       }
+
+       ALLOC_ARRAY(rev, total);
+       for (i = 0; i < total; i++)
+               rev[i] = list[i];
+
+       rev_nr = total;
+       /*
+        * Get merge base through pair-wise computations
+        * and store it in rev[0].
+        */
+       while (rev_nr > 1) {
+               for (i = 0; i < rev_nr / 2; i++) {
+                       struct commit_list *merge_base;
+                       merge_base = get_merge_bases(rev[2 * i], rev[2 * i + 1]);
+                       if (!merge_base || merge_base->next)
+                               die(_("Failed to find exact merge base"));
+
+                       rev[i] = merge_base->item;
+               }
+
+               if (rev_nr % 2)
+                       rev[i] = rev[2 * i];
+               rev_nr = (rev_nr + 1) / 2;
+       }
+
+       if (!in_merge_bases(base, rev[0]))
+               die(_("base commit should be the ancestor of revision list"));
+
+       for (i = 0; i < total; i++) {
+               if (base == list[i])
+                       die(_("base commit shouldn't be in revision list"));
+       }
+
+       free(rev);
+       return base;
+}
+
+static void prepare_bases(struct base_tree_info *bases,
+                         struct commit *base,
+                         struct commit **list,
+                         int total)
+{
+       struct commit *commit;
+       struct rev_info revs;
+       struct diff_options diffopt;
+       int i;
+
+       if (!base)
+               return;
+
+       diff_setup(&diffopt);
+       DIFF_OPT_SET(&diffopt, RECURSIVE);
+       diff_setup_done(&diffopt);
+
+       oidcpy(&bases->base_commit, &base->object.oid);
+
+       init_revisions(&revs, NULL);
+       revs.max_parents = 1;
+       revs.topo_order = 1;
+       for (i = 0; i < total; i++) {
+               list[i]->object.flags &= ~UNINTERESTING;
+               add_pending_object(&revs, &list[i]->object, "rev_list");
+               list[i]->util = (void *)1;
+       }
+       base->object.flags |= UNINTERESTING;
+       add_pending_object(&revs, &base->object, "base");
+
+       if (prepare_revision_walk(&revs))
+               die(_("revision walk setup failed"));
+       /*
+        * Traverse the commits list, get prerequisite patch ids
+        * and stuff them in bases structure.
+        */
+       while ((commit = get_revision(&revs)) != NULL) {
+               struct object_id oid;
+               struct object_id *patch_id;
+               if (commit->util)
+                       continue;
+               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;
+               oidcpy(patch_id, &oid);
+               bases->nr_patch_id++;
+       }
+}
+
+static void print_bases(struct base_tree_info *bases, FILE *file)
+{
+       int i;
+
+       /* Only do this once, either for the cover or for the first one */
+       if (is_null_oid(&bases->base_commit))
+               return;
+
+       /* Show the base commit */
+       fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit));
+
+       /* Show the prerequisite patches */
+       for (i = bases->nr_patch_id - 1; i >= 0; i--)
+               fprintf(file, "prerequisite-patch-id: %s\n", oid_to_hex(&bases->patch_id[i]));
+
+       free(bases->patch_id);
+       bases->nr_patch_id = 0;
+       bases->alloc_patch_id = 0;
+       oidclr(&bases->base_commit);
+}
+
 int cmd_format_patch(int argc, const char **argv, const char *prefix)
 {
        struct commit *commit;
@@ -1208,7 +1400,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        int quiet = 0;
        int reroll_count = -1;
        char *branch_name = NULL;
-       char *from = NULL;
+       char *base_commit = NULL;
+       struct base_tree_info bases;
+
        const struct option builtin_format_patch_options[] = {
                { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
                            N_("use [PATCH n/m] even with a single patch"),
@@ -1229,6 +1423,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 },
@@ -1271,6 +1468,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                            PARSE_OPT_OPTARG, thread_callback },
                OPT_STRING(0, "signature", &signature, N_("signature"),
                            N_("add a signature")),
+               OPT_STRING(0, "base", &base_commit, N_("base-commit"),
+                          N_("add prerequisite tree info to the patch series")),
                OPT_FILENAME(0, "signature-file", &signature_file,
                                N_("add a signature from a file")),
                OPT__QUIET(&quiet, N_("don't print the patch filenames")),
@@ -1280,10 +1479,11 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        extra_hdr.strdup_strings = 1;
        extra_to.strdup_strings = 1;
        extra_cc.strdup_strings = 1;
-       init_grep_defaults();
+       init_log_defaults();
        git_config(git_format_config, NULL);
        init_revisions(&rev, prefix);
        rev.commit_format = CMIT_FMT_EMAIL;
+       rev.expand_tabs_in_log_default = 0;
        rev.verbose_header = 1;
        rev.diff = 1;
        rev.max_parents = 1;
@@ -1364,7 +1564,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);
@@ -1403,6 +1603,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                setup_pager();
 
        if (output_directory) {
+               if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
+                       rev.diffopt.use_color = GIT_COLOR_NEVER;
                if (use_stdout)
                        die(_("standard output, or directory, which one?"));
                if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
@@ -1433,10 +1635,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
@@ -1460,9 +1662,6 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                get_patch_ids(&rev, &ids);
        }
 
-       if (!use_stdout)
-               realstdout = xfdopen(xdup(1), "w");
-
        if (prepare_revision_walk(&rev))
                die(_("revision walk setup failed"));
        rev.boundary = 1;
@@ -1484,16 +1683,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 */
@@ -1507,6 +1706,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                signature = strbuf_detach(&buf, NULL);
        }
 
+       memset(&bases, 0, sizeof(bases));
+       if (base_commit || base_auto) {
+               struct commit *base = get_base_commit(base_commit, list, nr);
+               reset_revision_walk();
+               prepare_bases(&bases, base, list, nr);
+       }
+
        if (in_reply_to || thread || cover_letter)
                rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
        if (in_reply_to) {
@@ -1520,6 +1726,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                        gen_message_id(&rev, "cover");
                make_cover_letter(&rev, use_stdout,
                                  origin, nr, list, branch_name, quiet);
+               print_bases(&bases, rev.diffopt.file);
+               print_signature(rev.diffopt.file);
                total++;
                start_number--;
        }
@@ -1565,7 +1773,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                }
 
                if (!use_stdout &&
-                   reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
+                   open_next_file(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
                        die(_("Failed to create output files"));
                shown = log_tree_commit(&rev, commit);
                free_commit_buffer(commit);
@@ -1579,15 +1787,16 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                if (!use_stdout)
                        rev.shown_one = 0;
                if (shown) {
+                       print_bases(&bases, rev.diffopt.file);
                        if (rev.mime_boundary)
-                               printf("\n--%s%s--\n\n\n",
+                               fprintf(rev.diffopt.file, "\n--%s%s--\n\n\n",
                                       mime_boundary_leader,
                                       rev.mime_boundary);
                        else
-                               print_signature();
+                               print_signature(rev.diffopt.file);
                }
                if (!use_stdout)
-                       fclose(stdout);
+                       fclose(rev.diffopt.file);
        }
        free(list);
        free(branch_name);
@@ -1601,9 +1810,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);
@@ -1619,15 +1828,15 @@ static const char * const cherry_usage[] = {
 };
 
 static void print_commit(char sign, struct commit *commit, int verbose,
-                        int abbrev)
+                        int abbrev, FILE *file)
 {
        if (!verbose) {
-               printf("%c %s\n", sign,
+               fprintf(file, "%c %s\n", sign,
                       find_unique_abbrev(commit->object.oid.hash, abbrev));
        } else {
                struct strbuf buf = STRBUF_INIT;
                pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
-               printf("%c %s %s\n", sign,
+               fprintf(file, "%c %s %s\n", sign,
                       find_unique_abbrev(commit->object.oid.hash, abbrev),
                       buf.buf);
                strbuf_release(&buf);
@@ -1708,7 +1917,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
                commit = list->item;
                if (has_commit_patch_id(commit, &ids))
                        sign = '-';
-               print_commit(sign, commit, verbose, abbrev);
+               print_commit(sign, commit, verbose, abbrev, revs.diffopt.file);
                list = list->next;
        }
 
index f02e3d23bb71a39dfd9f6eddf40aa84da896b650..1592290815c8b93701fa9d175d76f7a7ed85f7d2 100644 (file)
@@ -14,6 +14,7 @@
 #include "resolve-undo.h"
 #include "string-list.h"
 #include "pathspec.h"
+#include "run-command.h"
 
 static int abbrev;
 static int show_deleted;
@@ -28,8 +29,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 submodules_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 +71,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)
@@ -118,7 +135,8 @@ static void show_killed_files(struct dir_struct *dir)
                                 */
                                pos = cache_name_pos(ent->name, ent->len);
                                if (0 <= pos)
-                                       die("bug in show-killed-files");
+                                       die("BUG: killed-file %.*s not found",
+                                               ent->len, ent->name);
                                pos = -pos - 1;
                                while (pos < active_nr &&
                                       ce_stage(active_cache[pos]))
@@ -151,55 +169,117 @@ 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 struct dir_struct *dir, int show_tag)
+{
+       if (line_terminator == '\0')
+               argv_array_push(&submodules_options, "-z");
+       if (show_tag)
+               argv_array_push(&submodules_options, "-t");
+       if (show_valid_bit)
+               argv_array_push(&submodules_options, "-v");
+       if (show_cached)
+               argv_array_push(&submodules_options, "--cached");
+       if (show_eol)
+               argv_array_push(&submodules_options, "--eol");
+       if (debug_mode)
+               argv_array_push(&submodules_options, "--debug");
+}
+
+/**
+ * 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;
+       int i;
+
+       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, submodules_options.argv);
+
+       /*
+        * Pass in the original pathspec args.  The submodule will be
+        * responsible for prepending the 'submodule_prefix' prior to comparing
+        * against the pathspec for matches.
+        */
+       argv_array_push(&cp.args, "--");
+       for (i = 0; i < pathspec.nr; i++)
+               argv_array_push(&cp.args, pathspec.items[i].original);
+
+       cp.git_cmd = 1;
+       cp.dir = ce->name;
+       status = run_command(&cp);
+       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)
@@ -467,6 +547,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"),
@@ -483,6 +565,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)
@@ -518,13 +601,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(&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 */
index f6df2741112144a38d048ebfd1fe201c8576a040..e3b62f2fc744d340de5e3d9efad12b5de93cd55c 100644 (file)
 static const char mailinfo_usage[] =
        "git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info";
 
+static char *prefix_copy(const char *prefix, const char *filename)
+{
+       if (!prefix || is_absolute_path(filename))
+               return xstrdup(filename);
+       return xstrdup(prefix_filename(prefix, strlen(prefix), filename));
+}
+
 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 +59,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_copy(prefix, argv[1]);
+       patchfile = prefix_copy(prefix, argv[2]);
+
+       status = !!mailinfo(&mi, msgfile, patchfile);
        clear_mailinfo(&mi);
 
+       free(msgfile);
+       free(patchfile);
        return status;
 }
index 104277acc49a08d9472523edc8337c3eeeb345cd..30681681c1389826513464385405dfe6ef8a2855 100644 (file)
@@ -45,6 +45,19 @@ static int is_from_line(const char *line, int len)
 
 static struct strbuf buf = STRBUF_INIT;
 static int keep_cr;
+static int mboxrd;
+
+static int is_gtfrom(const struct strbuf *buf)
+{
+       size_t min = strlen(">From ");
+       size_t ngt;
+
+       if (buf->len < min)
+               return 0;
+
+       ngt = strspn(buf->buf, ">");
+       return ngt && starts_with(buf->buf + ngt, "From ");
+}
 
 /* Called with the first line (potentially partial)
  * already in buf[] -- normally that should begin with
@@ -77,6 +90,9 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
                        strbuf_addch(&buf, '\n');
                }
 
+               if (mboxrd && is_gtfrom(&buf))
+                       strbuf_remove(&buf, 0, 1);
+
                if (fwrite(buf.buf, 1, buf.len, output) != buf.len)
                        die_errno("cannot write output");
 
@@ -109,7 +125,7 @@ static int populate_maildir_list(struct string_list *list, const char *path)
                if ((dir = opendir(name)) == NULL) {
                        if (errno == ENOENT)
                                continue;
-                       error("cannot opendir %s (%s)", name, strerror(errno));
+                       error_errno("cannot opendir %s", name);
                        goto out;
                }
 
@@ -174,12 +190,12 @@ static int split_maildir(const char *maildir, const char *dir,
 
                f = fopen(file, "r");
                if (!f) {
-                       error("cannot open mail %s (%s)", file, strerror(errno));
+                       error_errno("cannot open mail %s", file);
                        goto out;
                }
 
                if (strbuf_getwholeline(&buf, f, '\n')) {
-                       error("cannot read mail %s (%s)", file, strerror(errno));
+                       error_errno("cannot read mail %s", file);
                        goto out;
                }
 
@@ -210,7 +226,7 @@ static int split_mbox(const char *file, const char *dir, int allow_bare,
        int file_done = 0;
 
        if (!f) {
-               error("cannot open mbox %s", file);
+               error_errno("cannot open mbox %s", file);
                goto out;
        }
 
@@ -271,6 +287,8 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
                        keep_cr = 1;
                } else if ( arg[1] == 'o' && arg[2] ) {
                        dir = arg+2;
+               } else if (!strcmp(arg, "--mboxrd")) {
+                       mboxrd = 1;
                } else if ( arg[1] == '-' && !arg[2] ) {
                        argp++; /* -- marks end of options */
                        break;
@@ -318,7 +336,7 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
                }
 
                if (stat(arg, &argstat) == -1) {
-                       error("cannot stat %s (%s)", arg, strerror(errno));
+                       error_errno("cannot stat %s", arg);
                        return 1;
                }
 
index c0d1822eb3ad371b9ab0b830aed2cc2741a978bd..b572a37c2611b2a8c20b1db7edac68623d371a38 100644 (file)
@@ -173,6 +173,9 @@ static int handle_fork_point(int argc, const char **argv)
        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);
+
        for (i = 0; i < revs.nr; i++)
                revs.commit[i]->object.flags &= ~TMP_MARK;
 
index 55447053f2dde004ceffff9967b015b4a01c35d1..13e22a2f0be73ec7e521a02d1f36c414e77a8700 100644 (file)
@@ -62,8 +62,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
                usage_with_options(merge_file_usage, options);
        if (quiet) {
                if (!freopen("/dev/null", "w", stderr))
-                       return error("failed to redirect stderr to /dev/null: "
-                                    "%s", strerror(errno));
+                       return error_errno("failed to redirect stderr to /dev/null");
        }
 
        if (prefix)
@@ -95,12 +94,13 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
                FILE *f = to_stdout ? stdout : fopen(fpath, "wb");
 
                if (!f)
-                       ret = error("Could not open %s for writing", filename);
+                       ret = error_errno("Could not open %s for writing",
+                                         filename);
                else if (result.size &&
                         fwrite(result.ptr, result.size, 1, f) != 1)
-                       ret = error("Could not write to %s", filename);
+                       ret = error_errno("Could not write to %s", filename);
                else if (fclose(f))
-                       ret = error("Could not close %s", filename);
+                       ret = error_errno("Could not close %s", filename);
                free(result.ptr);
        }
 
index 1c3427c36caa40e8740b090c44a048201e81c706..ce356b1da126e31b4ef78b29dcc49246881b6a59 100644 (file)
@@ -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);
+               sha1_to_hex_r(hexbuf[stage], ce->oid.hash);
                xsnprintf(ownbuf[stage], sizeof(ownbuf[stage]), "%o", ce->ce_mode);
                arguments[stage] = hexbuf[stage];
                arguments[stage + 4] = ownbuf[stage];
index 491efd556e87d0b263bb1029e0cabb9b7f6f1472..0dd902195878aedef76559ad67ad6dc9384141b3 100644 (file)
@@ -9,10 +9,10 @@ static const char builtin_merge_recursive_usage[] =
 
 static const char *better_branch_name(const char *branch)
 {
-       static char githead_env[8 + 40 + 1];
+       static char githead_env[8 + GIT_SHA1_HEXSZ + 1];
        char *name;
 
-       if (strlen(branch) != 40)
+       if (strlen(branch) != GIT_SHA1_HEXSZ)
                return branch;
        xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch);
        name = getenv(githead_env);
@@ -21,10 +21,10 @@ static const char *better_branch_name(const char *branch)
 
 int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
 {
-       const unsigned char *bases[21];
+       const struct object_id *bases[21];
        unsigned bases_count = 0;
        int i, failed;
-       unsigned char h1[20], h2[20];
+       struct object_id h1, h2;
        struct merge_options o;
        struct commit *result;
 
@@ -42,38 +42,41 @@ 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) {
-                       unsigned char *sha = xmalloc(20);
-                       if (get_sha1(argv[i], sha))
-                               die("Could not parse object '%s'", argv[i]);
-                       bases[bases_count++] = sha;
+                       struct object_id *oid = xmalloc(sizeof(struct object_id));
+                       if (get_oid(argv[i], oid))
+                               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_sha1(o.branch1, h1))
-               die("Could not resolve ref '%s'", o.branch1);
-       if (get_sha1(o.branch2, h2))
-               die("Could not resolve ref '%s'", o.branch2);
+       if (get_oid(o.branch1, &h1))
+               die(_("could not resolve ref '%s'"), o.branch1);
+       if (get_oid(o.branch2, &h2))
+               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);
+       failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);
        if (failed < 0)
                return 128; /* die() error code */
        return failed;
index ca570041df0f67efa92b056cec01e7d9a4e38ad7..5b7ab9b9672e08d7db843d0ccd951ee4c7bdac15 100644 (file)
@@ -150,15 +150,15 @@ static void show_result(void)
 /* An empty entry never compares same, not even to another empty entry */
 static int same_entry(struct name_entry *a, struct name_entry *b)
 {
-       return  a->sha1 &&
-               b->sha1 &&
-               !hashcmp(a->sha1, b->sha1) &&
+       return  a->oid &&
+               b->oid &&
+               !oidcmp(a->oid, b->oid) &&
                a->mode == b->mode;
 }
 
 static int both_empty(struct name_entry *a, struct name_entry *b)
 {
-       return !(a->sha1 || b->sha1);
+       return !(a->oid || b->oid);
 }
 
 static struct merge_list *create_entry(unsigned stage, unsigned mode, const unsigned char *sha1, const char *path)
@@ -188,8 +188,8 @@ static void resolve(const struct traverse_info *info, struct name_entry *ours, s
                return;
 
        path = traverse_path(info, result);
-       orig = create_entry(2, ours->mode, ours->sha1, path);
-       final = create_entry(0, result->mode, result->sha1, path);
+       orig = create_entry(2, ours->mode, ours->oid->hash, path);
+       final = create_entry(0, result->mode, result->oid->hash, path);
 
        final->link = orig;
 
@@ -213,7 +213,7 @@ static void unresolved_directory(const struct traverse_info *info,
 
        newbase = traverse_path(info, p);
 
-#define ENTRY_SHA1(e) (((e)->mode && S_ISDIR((e)->mode)) ? (e)->sha1 : NULL)
+#define ENTRY_SHA1(e) (((e)->mode && S_ISDIR((e)->mode)) ? (e)->oid->hash : NULL)
        buf0 = fill_tree_descriptor(t+0, ENTRY_SHA1(n + 0));
        buf1 = fill_tree_descriptor(t+1, ENTRY_SHA1(n + 1));
        buf2 = fill_tree_descriptor(t+2, ENTRY_SHA1(n + 2));
@@ -239,7 +239,7 @@ static struct merge_list *link_entry(unsigned stage, const struct traverse_info
                path = entry->path;
        else
                path = traverse_path(info, n);
-       link = create_entry(stage, n->mode, n->sha1, path);
+       link = create_entry(stage, n->mode, n->oid->hash, path);
        link->link = entry;
        return link;
 }
@@ -314,7 +314,7 @@ static int threeway_callback(int n, unsigned long mask, unsigned long dirmask, s
        }
 
        if (same_entry(entry+0, entry+1)) {
-               if (entry[2].sha1 && !S_ISDIR(entry[2].mode)) {
+               if (entry[2].oid && !S_ISDIR(entry[2].mode)) {
                        /* We did not touch, they modified -- take theirs */
                        resolve(info, entry+1, entry+2);
                        return mask;
index 101ffeff4c942636e0ca688357a4b8ec8aa2a431..b65eeaa87d303b027230bf2479f78c15a02ca08a 100644 (file)
@@ -30,6 +30,7 @@
 #include "fmt-merge-msg.h"
 #include "gpg-interface.h"
 #include "sequencer.h"
+#include "string-list.h"
 
 #define DEFAULT_TWOHEAD (1<<0)
 #define DEFAULT_OCTOPUS (1<<1)
@@ -64,6 +65,7 @@ static int option_renormalize;
 static int verbosity;
 static int allow_rerere_auto;
 static int abort_current_merge;
+static int allow_unrelated_histories;
 static int show_progress = -1;
 static int default_to_upstream = 1;
 static const char *sign_commit;
@@ -210,7 +212,7 @@ static struct option builtin_merge_options[] = {
                PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, FF_ONLY },
        OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
        OPT_BOOL(0, "verify-signatures", &verify_signatures,
-               N_("Verify that the named commit has a valid GPG signature")),
+               N_("verify that the named commit has a valid GPG signature")),
        OPT_CALLBACK('s', "strategy", &use_strategies, N_("strategy"),
                N_("merge strategy to use"), option_parse_strategy),
        OPT_CALLBACK('X', "strategy-option", &xopts, N_("option=value"),
@@ -221,6 +223,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, "allow-unrelated-histories", &allow_unrelated_histories,
+                N_("allow merging unrelated histories")),
        OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
        { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
          N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
@@ -333,15 +337,9 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
        struct rev_info rev;
        struct strbuf out = STRBUF_INIT;
        struct commit_list *j;
-       const char *filename;
-       int fd;
        struct pretty_print_context ctx = {0};
 
        printf(_("Squash commit -- not updating HEAD\n"));
-       filename = git_path_squash_msg();
-       fd = open(filename, O_WRONLY | O_CREAT, 0666);
-       if (fd < 0)
-               die_errno(_("Could not write to '%s'"), filename);
 
        init_revisions(&rev, NULL);
        rev.ignore_merges = 1;
@@ -368,10 +366,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
                        oid_to_hex(&commit->object.oid));
                pretty_print_commit(&ctx, commit, &out);
        }
-       if (write_in_full(fd, out.buf, out.len) != out.len)
-               die_errno(_("Writing SQUASH_MSG"));
-       if (close(fd))
-               die_errno(_("Finishing SQUASH_MSG"));
+       write_file_buf(git_path_squash_msg(), out.buf, out.len);
        strbuf_release(&out);
 }
 
@@ -498,7 +493,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
                if (ref_exists(truname.buf)) {
                        strbuf_addf(msg,
                                    "%s\t\tbranch '%s'%s of .\n",
-                                   sha1_to_hex(remote_head->object.oid.hash),
+                                   oid_to_hex(&remote_head->object.oid),
                                    truname.buf + 11,
                                    (early ? " (early part)" : ""));
                        strbuf_release(&truname);
@@ -512,7 +507,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
                desc = merge_remote_util(remote_head);
                if (desc && desc->obj && desc->obj->type == OBJ_TAG) {
                        strbuf_addf(msg, "%s\t\t%s '%s'\n",
-                                   sha1_to_hex(desc->obj->oid.hash),
+                                   oid_to_hex(&desc->obj->oid),
                                    typename(desc->obj->type),
                                    remote);
                        goto cleanup;
@@ -520,7 +515,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
        }
 
        strbuf_addf(msg, "%s\t\tcommit '%s'\n",
-               sha1_to_hex(remote_head->object.oid.hash), remote);
+               oid_to_hex(&remote_head->object.oid), remote);
 cleanup:
        strbuf_release(&buf);
        strbuf_release(&bname);
@@ -679,6 +674,8 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
                hold_locked_index(&lock, 1);
                clean = merge_recursive(&o, head,
                                remoteheads->item, reversed, &result);
+               if (clean < 0)
+                       exit(128);
                if (active_cache_changed &&
                    write_locked_index(&the_index, &lock, COMMIT_LOCK))
                        die (_("unable to write %s"), get_index_file());
@@ -709,42 +706,17 @@ static int count_unmerged_entries(void)
        return ret;
 }
 
-static void split_merge_strategies(const char *string, struct strategy **list,
-                                  int *nr, int *alloc)
-{
-       char *p, *q, *buf;
-
-       if (!string)
-               return;
-
-       buf = xstrdup(string);
-       q = buf;
-       for (;;) {
-               p = strchr(q, ' ');
-               if (!p) {
-                       ALLOC_GROW(*list, *nr + 1, *alloc);
-                       (*list)[(*nr)++].name = xstrdup(q);
-                       free(buf);
-                       return;
-               } else {
-                       *p = '\0';
-                       ALLOC_GROW(*list, *nr + 1, *alloc);
-                       (*list)[(*nr)++].name = xstrdup(q);
-                       q = ++p;
-               }
-       }
-}
-
 static void add_strategies(const char *string, unsigned attr)
 {
-       struct strategy *list = NULL;
-       int list_alloc = 0, list_nr = 0, i;
-
-       memset(&list, 0, sizeof(list));
-       split_merge_strategies(string, &list, &list_nr, &list_alloc);
-       if (list) {
-               for (i = 0; i < list_nr; i++)
-                       append_strategy(get_strategy(list[i].name));
+       int i;
+
+       if (string) {
+               struct string_list list = STRING_LIST_INIT_DUP;
+               struct string_list_item *item;
+               string_list_split(&list, string, ' ', -1);
+               for_each_string_list_item(item, &list)
+                       append_strategy(get_strategy(item->string));
+               string_list_clear(&list, 0);
                return;
        }
        for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
@@ -753,18 +725,6 @@ static void add_strategies(const char *string, unsigned attr)
 
 }
 
-static void write_merge_msg(struct strbuf *msg)
-{
-       const char *filename = git_path_merge_msg();
-       int fd = open(filename, O_WRONLY | O_CREAT, 0666);
-       if (fd < 0)
-               die_errno(_("Could not open '%s' for writing"),
-                         filename);
-       if (write_in_full(fd, msg->buf, msg->len) != msg->len)
-               die_errno(_("Could not write to '%s'"), filename);
-       close(fd);
-}
-
 static void read_merge_msg(struct strbuf *msg)
 {
        const char *filename = git_path_merge_msg();
@@ -798,7 +758,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
        strbuf_addch(&msg, '\n');
        if (0 < option_edit)
                strbuf_commented_addf(&msg, _(merge_editor_comment), comment_line_char);
-       write_merge_msg(&msg);
+       write_file_buf(git_path_merge_msg(), msg.buf, msg.len);
        if (run_commit_hook(0 < option_edit, get_index_file(), "prepare-commit-msg",
                            git_path_merge_msg(), "merge", NULL))
                abort_commit(remoteheads, NULL);
@@ -819,6 +779,14 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
 {
        unsigned char result_tree[20], result_commit[20];
        struct commit_list *parents, **pptr = &parents;
+       static struct lock_file lock;
+
+       hold_locked_index(&lock, 1);
+       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);
        printf(_("Wonderful.\n"));
@@ -953,8 +921,6 @@ static int setup_with_upstream(const char ***argv)
 
 static void write_merge_state(struct commit_list *remoteheads)
 {
-       const char *filename;
-       int fd;
        struct commit_list *j;
        struct strbuf buf = STRBUF_INIT;
 
@@ -968,26 +934,14 @@ static void write_merge_state(struct commit_list *remoteheads)
                }
                strbuf_addf(&buf, "%s\n", oid_to_hex(oid));
        }
-       filename = git_path_merge_head();
-       fd = open(filename, O_WRONLY | O_CREAT, 0666);
-       if (fd < 0)
-               die_errno(_("Could not open '%s' for writing"), filename);
-       if (write_in_full(fd, buf.buf, buf.len) != buf.len)
-               die_errno(_("Could not write to '%s'"), filename);
-       close(fd);
+       write_file_buf(git_path_merge_head(), buf.buf, buf.len);
        strbuf_addch(&merge_msg, '\n');
-       write_merge_msg(&merge_msg);
+       write_file_buf(git_path_merge_msg(), merge_msg.buf, merge_msg.len);
 
-       filename = git_path_merge_mode();
-       fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
-       if (fd < 0)
-               die_errno(_("Could not open '%s' for writing"), filename);
        strbuf_reset(&buf);
        if (fast_forward == FF_NO)
-               strbuf_addf(&buf, "no-ff");
-       if (write_in_full(fd, buf.buf, buf.len) != buf.len)
-               die_errno(_("Could not write to '%s'"), filename);
-       close(fd);
+               strbuf_addstr(&buf, "no-ff");
+       write_file_buf(git_path_merge_mode(), buf.buf, buf.len);
 }
 
 static int default_edit_option(void)
@@ -1003,7 +957,7 @@ static int default_edit_option(void)
        if (e) {
                int v = git_config_maybe_bool(name, e);
                if (v < 0)
-                       die("Bad value '%s' in environment '%s'", e, name);
+                       die(_("Bad value '%s' in environment '%s'"), e, name);
                return v;
        }
 
@@ -1104,7 +1058,7 @@ static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge
                if (!commit) {
                        if (ptr)
                                *ptr = '\0';
-                       die("not something we can merge in %s: %s",
+                       die(_("not something we can merge in %s: %s"),
                            filename, merge_names->buf + pos);
                }
                remotes = &commit_list_insert(commit, remotes)->next;
@@ -1138,7 +1092,7 @@ static struct commit_list *collect_parents(struct commit *head_commit,
                        struct commit *commit = get_merge_parent(argv[i]);
                        if (!commit)
                                help_unknown_ref(argv[i], "merge",
-                                                "not something we can merge");
+                                                _("not something we can merge"));
                        remotes = &commit_list_insert(commit, remotes)->next;
                }
                remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
@@ -1165,7 +1119,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        struct commit *head_commit;
        struct strbuf buf = STRBUF_INIT;
        const char *head_arg;
-       int flag, i, ret = 0, head_subsumed;
+       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;
@@ -1179,7 +1133,7 @@ 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, &flag);
+       branch = branch_to_free = resolve_refdup("HEAD", 0, head_sha1, NULL);
        if (branch && starts_with(branch, "refs/heads/"))
                branch += 11;
        if (!branch || is_null_sha1(head_sha1))
@@ -1187,6 +1141,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        else
                head_commit = lookup_commit_or_die(head_sha1, "HEAD");
 
+       init_diff_ui_defaults();
        git_config(git_merge_config, NULL);
 
        if (branch_mergeoptions)
@@ -1257,12 +1212,12 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                        builtin_merge_options);
 
        if (!head_commit) {
-               struct commit *remote_head;
                /*
                 * If the merged head is a valid one there is no reason
                 * to forbid "git merge" into a branch yet to be born.
                 * We do the same for "git pull".
                 */
+               unsigned char *remote_head_sha1;
                if (squash)
                        die(_("Squash commit into empty head not supported yet"));
                if (fast_forward == FF_NO)
@@ -1270,13 +1225,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                            "an empty head"));
                remoteheads = collect_parents(head_commit, &head_subsumed,
                                              argc, argv, NULL);
-               remote_head = remoteheads->item;
-               if (!remote_head)
+               if (!remoteheads)
                        die(_("%s - not something we can merge"), argv[0]);
                if (remoteheads->next)
                        die(_("Can merge only exactly one commit into empty head"));
-               read_empty(remote_head->object.oid.hash, 0);
-               update_ref("initial pull", "HEAD", remote_head->object.oid.hash,
+               remote_head_sha1 = remoteheads->item->object.oid.hash;
+               read_empty(remote_head_sha1, 0);
+               update_ref("initial pull", "HEAD", remote_head_sha1,
                           NULL, 0, UPDATE_REFS_DIE_ON_ERR);
                goto done;
        }
@@ -1354,7 +1309,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        for (p = remoteheads; p; p = p->next) {
                struct commit *commit = p->item;
                strbuf_addf(&buf, "GITHEAD_%s",
-                           sha1_to_hex(commit->object.oid.hash));
+                           oid_to_hex(&commit->object.oid));
                setenv(buf.buf, merge_remote_util(commit)->name, 1);
                strbuf_reset(&buf);
                if (fast_forward != FF_ONLY &&
@@ -1397,31 +1352,33 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
        update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.oid.hash,
                   NULL, 0, UPDATE_REFS_DIE_ON_ERR);
 
-       if (remoteheads && !common)
-               ; /* No common ancestors found. We need a real merge. */
-       else if (!remoteheads ||
+       if (remoteheads && !common) {
+               /* No common ancestors found. */
+               if (!allow_unrelated_histories)
+                       die(_("refusing to merge unrelated histories"));
+               /* otherwise, we need a real merge. */
+       } else if (!remoteheads ||
                 (!remoteheads->next && !common->next &&
                  common->item == remoteheads->item)) {
                /*
                 * If head can reach all the merge then we are up to date.
                 * but first the most common case of merging one remote.
                 */
-               finish_up_to_date("Already up-to-date.");
+               finish_up_to_date(_("Already up-to-date."));
                goto done;
        } else if (fast_forward != FF_NO && !remoteheads->next &&
                        !common->next &&
-                       !hashcmp(common->item->object.oid.hash, head_commit->object.oid.hash)) {
+                       !oidcmp(&common->item->object.oid, &head_commit->object.oid)) {
                /* Again the most common case of merging one remote. */
                struct strbuf msg = STRBUF_INIT;
                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)
@@ -1484,14 +1441,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                         * HEAD^^" would be missed.
                         */
                        common_one = get_merge_bases(head_commit, j->item);
-                       if (hashcmp(common_one->item->object.oid.hash,
-                               j->item->object.oid.hash)) {
+                       if (oidcmp(&common_one->item->object.oid, &j->item->object.oid)) {
                                up_to_date = 0;
                                break;
                        }
                }
                if (up_to_date) {
-                       finish_up_to_date("Already up-to-date. Yeeah!");
+                       finish_up_to_date(_("Already up-to-date. Yeeah!"));
                        goto done;
                }
        }
@@ -1515,7 +1471,7 @@ 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))
-               hashcpy(stash, null_sha1);
+               hashclr(stash);
 
        for (i = 0; i < use_strategies_nr; i++) {
                int ret;
index 4282b62c595edd987a87eb23ba679079211e0835..de9b40fc63b0a4f76401a111aba806c64ce36ee9 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;
 
index aeae855e2b95399db4ae6032d118848449488267..2f43877bc9a17c5bef2906a383cc8cdd6f4f5b82 100644 (file)
@@ -26,7 +26,7 @@ static const char **internal_copy_pathspec(const char *prefix,
        int i;
        const char **result;
        ALLOC_ARRAY(result, count + 1);
-       memcpy(result, pathspec, count * sizeof(const char *));
+       COPY_ARRAY(result, pathspec, count);
        result[count] = NULL;
        for (i = 0; i < count; i++) {
                int length = strlen(result[i]);
@@ -104,7 +104,7 @@ static int index_range_of_same_dir(const char *src, int length,
 
 int cmd_mv(int argc, const char **argv, const char *prefix)
 {
-       int i, gitmodules_modified = 0;
+       int i, flags, gitmodules_modified = 0;
        int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
        struct option builtin_mv_options[] = {
                OPT__VERBOSE(&verbose, N_("be verbose")),
@@ -134,10 +134,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
        modes = xcalloc(argc, sizeof(enum update_mode));
        /*
         * Keep trailing slash, needed to let
-        * "git mv file no-such-dir/" error out.
+        * "git mv file no-such-dir/" error out, except in the case
+        * "git mv directory no-such-dir/".
         */
-       dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
-                                          KEEP_TRAILING_SLASH);
+       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);
        submodule_gitfile = xcalloc(argc, sizeof(char *));
 
        if (dest_path[0][0] == '\0')
@@ -252,15 +255,18 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                int pos;
                if (show_only || verbose)
                        printf(_("Renaming %s to %s\n"), src, dst);
-               if (!show_only && mode != INDEX) {
-                       if (rename(src, dst) < 0 && !ignore_errors)
-                               die_errno(_("renaming '%s' failed"), src);
-                       if (submodule_gitfile[i]) {
-                               if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
-                                       connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
-                               if (!update_path_in_gitmodules(src, dst))
-                                       gitmodules_modified = 1;
-                       }
+               if (show_only)
+                       continue;
+               if (mode != INDEX && rename(src, dst) < 0) {
+                       if (ignore_errors)
+                               continue;
+                       die_errno(_("renaming '%s' failed"), src);
+               }
+               if (submodule_gitfile[i]) {
+                       if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR)
+                               connect_work_tree_and_git_dir(dst, submodule_gitfile[i]);
+                       if (!update_path_in_gitmodules(src, dst))
+                               gitmodules_modified = 1;
                }
 
                if (mode == WORKING_DIRECTORY)
index 092e03c3cc9b24445ee5ed92cee5b202e04c9ec7..cd89d48b65e8f70819f73ef6e2cfd0634752b284 100644 (file)
@@ -10,6 +10,7 @@
 
 typedef struct rev_name {
        const char *tip_name;
+       unsigned long taggerdate;
        int generation;
        int distance;
 } rev_name;
@@ -20,7 +21,8 @@ static long cutoff = LONG_MAX;
 #define MERGE_TRAVERSAL_WEIGHT 65535
 
 static void name_rev(struct commit *commit,
-               const char *tip_name, int generation, int distance,
+               const char *tip_name, unsigned long taggerdate,
+               int generation, int distance,
                int deref)
 {
        struct rev_name *name = (struct rev_name *)commit->util;
@@ -43,9 +45,12 @@ static void name_rev(struct commit *commit,
                name = xmalloc(sizeof(rev_name));
                commit->util = name;
                goto copy_data;
-       } else if (name->distance > distance) {
+       } else if (name->taggerdate > taggerdate ||
+                       (name->taggerdate == taggerdate &&
+                        name->distance > distance)) {
 copy_data:
                name->tip_name = tip_name;
+               name->taggerdate = taggerdate;
                name->generation = generation;
                name->distance = distance;
        } else
@@ -66,11 +71,11 @@ copy_data:
                                new_name = xstrfmt("%.*s^%d", (int)len, tip_name,
                                                   parent_number);
 
-                       name_rev(parents->item, new_name, 0,
+                       name_rev(parents->item, new_name, taggerdate, 0,
                                distance + MERGE_TRAVERSAL_WEIGHT, 0);
                } else {
-                       name_rev(parents->item, tip_name, generation + 1,
-                               distance + 1, 0);
+                       name_rev(parents->item, tip_name, taggerdate,
+                               generation + 1, distance + 1, 0);
                }
        }
 }
@@ -140,6 +145,7 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
        struct name_ref_data *data = cb_data;
        int can_abbreviate_output = data->tags_only && data->name_only;
        int deref = 0;
+       unsigned long taggerdate = ULONG_MAX;
 
        if (data->tags_only && !starts_with(path, "refs/tags/"))
                return 0;
@@ -164,12 +170,13 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
                        break; /* broken repository */
                o = parse_object(t->tagged->oid.hash);
                deref = 1;
+               taggerdate = t->date;
        }
        if (o && o->type == OBJ_COMMIT) {
                struct commit *commit = (struct commit *)o;
 
                path = name_ref_abbrev(path, can_abbreviate_output);
-               name_rev(commit, xstrdup(path), 0, 0, deref);
+               name_rev(commit, xstrdup(path), taggerdate, 0, 0, deref);
        }
        return 0;
 }
@@ -188,8 +195,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;
        }
 
index ed6f2222f4bf9c54535a7a23971c7749ca8d05d5..5248a9bad8d4d18c8ff0f145e8049606baa8849a 100644 (file)
@@ -91,7 +91,7 @@ static const char * const git_notes_get_ref_usage[] = {
 };
 
 static const char note_template[] =
-       "\nWrite/edit the notes for the following object:\n";
+       N_("Write/edit the notes for the following object:");
 
 struct note_data {
        int given;
@@ -179,7 +179,8 @@ static void prepare_note_data(const unsigned char *object, struct note_data *d,
                        copy_obj_to_fd(fd, old_note);
 
                strbuf_addch(&buf, '\n');
-               strbuf_add_commented_lines(&buf, note_template, strlen(note_template));
+               strbuf_add_commented_lines(&buf, "\n", strlen("\n"));
+               strbuf_add_commented_lines(&buf, _(note_template), strlen(_(note_template)));
                strbuf_addch(&buf, '\n');
                write_or_die(fd, buf.buf, buf.len);
 
@@ -190,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);
        }
@@ -201,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);
        }
@@ -250,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);
@@ -297,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);
@@ -312,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;
                }
@@ -339,7 +340,9 @@ 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;
 }
@@ -366,13 +369,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);
@@ -421,7 +424,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);
@@ -507,12 +510,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);
@@ -531,7 +534,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;
        }
@@ -590,7 +593,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);
@@ -653,13 +656,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,11 +682,11 @@ static int merge_abort(struct notes_merge_options *o)
         */
 
        if (delete_ref("NOTES_MERGE_PARTIAL", NULL, 0))
-               ret += error("Failed to delete ref NOTES_MERGE_PARTIAL");
+               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");
+               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;
 }
 
@@ -703,11 +706,11 @@ static int merge_commit(struct notes_merge_options *o)
         */
 
        if (get_sha1("NOTES_MERGE_PARTIAL", sha1))
-               die("Failed to read ref NOTES_MERGE_PARTIAL");
+               die(_("failed to read ref NOTES_MERGE_PARTIAL"));
        else if (!(partial = lookup_commit_reference(sha1)))
-               die("Could not find commit from NOTES_MERGE_PARTIAL.");
+               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);
@@ -720,10 +723,10 @@ static int merge_commit(struct notes_merge_options *o)
        o->local_ref = local_ref_to_free =
                resolve_refdup("NOTES_MERGE_REF", 0, sha1, 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");
+               die(_("failed to finalize notes merge"));
 
        /* Reuse existing commit message in reflog message */
        memset(&pretty_ctx, 0, sizeof(pretty_ctx));
@@ -744,13 +747,14 @@ static int merge_commit(struct notes_merge_options *o)
 static int git_config_get_notes_strategy(const char *key,
                                         enum notes_merge_strategy *strategy)
 {
-       const char *value;
+       char *value;
 
-       if (git_config_get_string_const(key, &value))
+       if (git_config_get_string(key, &value))
                return 1;
        if (parse_notes_merge_strategy(value, strategy))
-               git_die_config(key, "unknown notes merge strategy %s", value);
+               git_die_config(key, _("unknown notes merge strategy %s"), value);
 
+       free(value);
        return 0;
 }
 
@@ -787,15 +791,15 @@ static int merge(int argc, const char **argv, const char *prefix)
        if (strategy || do_commit + do_abort == 0)
                do_merge = 1;
        if (do_merge + do_commit + do_abort != 1) {
-               error("cannot mix --commit, --abort or -s/--strategy");
+               error(_("cannot mix --commit, --abort or -s/--strategy"));
                usage_with_options(git_notes_merge_usage, options);
        }
 
        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");
+               error(_("too many parameters"));
                usage_with_options(git_notes_merge_usage, options);
        }
 
@@ -816,7 +820,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 {
@@ -846,21 +850,21 @@ static int merge(int argc, const char **argv, const char *prefix)
                update_ref(msg.buf, default_notes_ref(), result_sha1, NULL,
                           0, UPDATE_REFS_DIE_ON_ERR);
        else { /* Merge has unresolved conflicts */
-               char *existing;
+               const struct worktree *wt;
                /* Update .git/NOTES_MERGE_PARTIAL with partial merge result */
                update_ref(msg.buf, "NOTES_MERGE_PARTIAL", result_sha1, NULL,
                           0, UPDATE_REFS_DIE_ON_ERR);
                /* Store ref-to-be-updated into .git/NOTES_MERGE_REF */
-               existing = find_shared_symref("NOTES_MERGE_REF", default_notes_ref());
-               if (existing)
-                       die(_("A notes merge into %s is already in-progress at %s"),
-                           default_notes_ref(), existing);
+               wt = find_shared_symref("NOTES_MERGE_REF", default_notes_ref());
+               if (wt)
+                       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 "
-                      "abort the merge with 'git notes merge --abort'.\n",
+               printf(_("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"),
                       git_path(NOTES_MERGE_WORKTREE));
        }
 
@@ -933,8 +937,8 @@ static int prune(int argc, const char **argv, const char *prefix)
        struct notes_tree *t;
        int show_only = 0, verbose = 0;
        struct option options[] = {
-               OPT__DRY_RUN(&show_only, "do not remove, show only"),
-               OPT__VERBOSE(&verbose, "report pruned notes"),
+               OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
+               OPT__VERBOSE(&verbose, N_("report pruned notes")),
                OPT_END()
        };
 
@@ -963,7 +967,7 @@ static int get_ref(int argc, const char **argv, const char *prefix)
                             git_notes_get_ref_usage, 0);
 
        if (argc) {
-               error("too many parameters");
+               error(_("too many parameters"));
                usage_with_options(git_notes_get_ref_usage, options);
        }
 
@@ -1012,7 +1016,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 a27de5b323f3fc7852a48fdc6de99414e8005c10..0fd52bd6b4b985b24d93ab7fb9887f57305b49fd 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>]"),
@@ -44,7 +45,9 @@ static int non_empty;
 static int reuse_delta = 1, reuse_object = 1;
 static int keep_unreachable, unpack_unreachable, include_tag;
 static unsigned long unpack_unreachable_expiration;
+static int pack_loose_unreachable;
 static int local;
+static int have_non_local_packs;
 static int incremental;
 static int ignore_packed_keep;
 static int allow_ofs_delta;
@@ -65,7 +68,8 @@ 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;
 
@@ -341,15 +345,15 @@ static unsigned long write_no_reuse_object(struct sha1file *f, struct object_ent
 }
 
 /* Return 0 if we will bust the pack-size limit */
-static unsigned long write_reuse_object(struct sha1file *f, struct object_entry *entry,
-                                       unsigned long limit, int usable_delta)
+static off_t write_reuse_object(struct sha1file *f, struct object_entry *entry,
+                               unsigned long limit, int usable_delta)
 {
        struct packed_git *p = entry->in_pack;
        struct pack_window *w_curs = NULL;
        struct revindex_entry *revidx;
        off_t offset;
        enum object_type type = entry->type;
-       unsigned long datalen;
+       off_t datalen;
        unsigned char header[10], dheader[10];
        unsigned hdrlen;
 
@@ -415,11 +419,12 @@ static unsigned long write_reuse_object(struct sha1file *f, struct object_entry
 }
 
 /* Return 0 if we will bust the pack-size limit */
-static unsigned long write_object(struct sha1file *f,
-                                 struct object_entry *entry,
-                                 off_t write_offset)
+static off_t write_object(struct sha1file *f,
+                         struct object_entry *entry,
+                         off_t write_offset)
 {
-       unsigned long limit, len;
+       unsigned long limit;
+       off_t len;
        int usable_delta, to_reuse;
 
        if (!pack_to_stdout)
@@ -491,7 +496,7 @@ static enum write_one_status write_one(struct sha1file *f,
                                       struct object_entry *e,
                                       off_t *offset)
 {
-       unsigned long size;
+       off_t size;
        int recursing;
 
        /*
@@ -715,7 +720,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);
@@ -759,6 +764,10 @@ static off_t write_reused_pack(struct sha1file *f)
        return reuse_packfile_offset - sizeof(struct pack_header);
 }
 
+static const char no_split_warning[] = N_(
+"disabling bitmap writing, packs are split due to pack.packSizeLimit"
+);
+
 static void write_pack_file(void)
 {
        uint32_t i = 0, j;
@@ -813,7 +822,10 @@ static void write_pack_file(void)
                        fixup_pack_header_footer(fd, sha1, pack_tmp_name,
                                                 nr_written, sha1, offset);
                        close(fd);
-                       write_bitmap_index = 0;
+                       if (write_bitmap_index) {
+                               warning(_(no_split_warning));
+                               write_bitmap_index = 0;
+                       }
                }
 
                if (!pack_to_stdout) {
@@ -828,8 +840,7 @@ static void write_pack_file(void)
                         * to preserve this property.
                         */
                        if (stat(pack_tmp_name, &st) < 0) {
-                               warning("failed to stat %s: %s",
-                                       pack_tmp_name, strerror(errno));
+                               warning_errno("failed to stat %s", pack_tmp_name);
                        } else if (!last_mtime) {
                                last_mtime = st.st_mtime;
                        } else {
@@ -837,8 +848,7 @@ static void write_pack_file(void)
                                utb.actime = st.st_atime;
                                utb.modtime = --last_mtime;
                                if (utime(pack_tmp_name, &utb) < 0)
-                                       warning("failed utime() on %s: %s",
-                                               pack_tmp_name, strerror(errno));
+                                       warning_errno("failed utime() on %s", pack_tmp_name);
                        }
 
                        strbuf_addf(&tmpname, "%s-", base_name);
@@ -937,29 +947,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))
@@ -967,14 +1028,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;
-                       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;
                }
        }
 
@@ -1015,8 +1073,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))
@@ -1049,6 +1107,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);
@@ -1186,7 +1247,7 @@ static void add_pbase_object(struct tree_desc *tree,
                if (cmp < 0)
                        return;
                if (name[cmplen] != '/') {
-                       add_object_entry(entry.sha1,
+                       add_object_entry(entry.oid->hash,
                                         object_type(entry.mode),
                                         fullname, 1);
                        return;
@@ -1197,7 +1258,7 @@ static void add_pbase_object(struct tree_desc *tree,
                        const char *down = name+cmplen+1;
                        int downlen = name_cmp_len(down);
 
-                       tree = pbase_tree_get(entry.sha1);
+                       tree = pbase_tree_get(entry.oid->hash);
                        if (!tree)
                                return;
                        init_tree_desc(&sub, tree->tree_data, tree->tree_size);
@@ -1470,6 +1531,83 @@ 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.
+ */
+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;
+
+       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).
+ */
+static void break_delta_chains(struct object_entry *entry)
+{
+       /* If it's not a delta, it can't be part of a cycle. */
+       if (!entry->delta) {
+               entry->dfs_state = DFS_DONE;
+               return;
+       }
+
+       switch (entry->dfs_state) {
+       case DFS_NONE:
+               /*
+                * This is the first time we've seen the object. We mark it as
+                * part of the active potential cycle and recurse.
+                */
+               entry->dfs_state = DFS_ACTIVE;
+               break_delta_chains(entry->delta);
+               entry->dfs_state = DFS_DONE;
+               break;
+
+       case DFS_DONE:
+               /* object already examined, and not part of a cycle */
+               break;
+
+       case DFS_ACTIVE:
+               /*
+                * We found a cycle that needs broken. It would be correct to
+                * break any link in the chain, but it's convenient to
+                * break this one.
+                */
+               drop_reused_delta(entry);
+               entry->dfs_state = DFS_DONE;
+               break;
+       }
+}
+
 static void get_object_details(void)
 {
        uint32_t i;
@@ -1478,7 +1616,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];
@@ -1487,6 +1625,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);
 }
 
@@ -2098,6 +2243,35 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
 #define ll_find_deltas(l, s, w, d, p)  find_deltas(l, &s, w, d, p)
 #endif
 
+static void add_tag_chain(const struct object_id *oid)
+{
+       struct tag *tag;
+
+       /*
+        * We catch duplicates already in add_object_entry(), but we'd
+        * prefer to do this extra check to avoid having to parse the
+        * tag at all if we already know that it's being packed (e.g., if
+        * it was included via bitmaps, we would not have parsed it
+        * previously).
+        */
+       if (packlist_find(&to_pack, oid->hash, NULL))
+               return;
+
+       tag = lookup_tag(oid->hash);
+       while (1) {
+               if (!tag || parse_tag(tag) || !tag->tagged)
+                       die("unable to pack objects reachable from tag %s",
+                           oid_to_hex(oid));
+
+               add_object_entry(tag->object.oid.hash, OBJ_TAG, NULL, 0);
+
+               if (tag->tagged->type != OBJ_TAG)
+                       return;
+
+               tag = (struct tag *)tag->tagged;
+       }
+}
+
 static int add_ref_tag(const char *path, const struct object_id *oid, int flag, void *cb_data)
 {
        struct object_id peeled;
@@ -2105,7 +2279,7 @@ static int add_ref_tag(const char *path, const struct object_id *oid, int flag,
        if (starts_with(path, "refs/tags/") && /* is a tag? */
            !peel_ref(path, peeled.hash)    && /* peelable? */
            packlist_find(&to_pack, peeled.hash, NULL))      /* object packed? */
-               add_object_entry(oid->hash, OBJ_TAG, NULL, 0);
+               add_tag_chain(oid);
        return 0;
 }
 
@@ -2171,7 +2345,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)
@@ -2219,7 +2393,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")) {
@@ -2363,8 +2537,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);
@@ -2373,6 +2546,32 @@ 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,
+                           void *data)
+{
+       enum object_type type = sha1_object_info(sha1, NULL);
+
+       if (type < 0) {
+               warning("loose object at %s could not be examined", path);
+               return 0;
+       }
+
+       add_object_entry(sha1, type, "", 0);
+       return 0;
+}
+
+/*
+ * We actually don't even have to worry about reachability here.
+ * add_object_entry will weed out duplicates, so we just add every
+ * loose object we find.
+ */
+static void add_unreachable_loose_objects(void)
+{
+       for_each_loose_file_in_objdir(get_object_directory(),
+                                     add_loose_object,
+                                     NULL, NULL, NULL);
+}
+
 static int has_sha1_pack_kept_or_nonlocal(const unsigned char *sha1)
 {
        static struct packed_git *last_found = (void *)1;
@@ -2442,13 +2641,13 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
 }
 
 /*
- * 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;
 }
 
 static int get_object_list_from_bitmap(struct rev_info *revs)
@@ -2542,6 +2741,8 @@ static void get_object_list(int ac, const char **av)
 
        if (keep_unreachable)
                add_objects_in_unpacked_packs(&revs);
+       if (pack_loose_unreachable)
+               add_unreachable_loose_objects();
        if (unpack_unreachable)
                loosen_unused_packed_objects(&revs);
 
@@ -2642,6 +2843,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
                         N_("include tag objects that refer to objects to be packed")),
                OPT_BOOL(0, "keep-unreachable", &keep_unreachable,
                         N_("keep unreachable objects")),
+               OPT_BOOL(0, "pack-loose-unreachable", &pack_loose_unreachable,
+                        N_("pack loose unreachable objects")),
                { OPTION_CALLBACK, 0, "unpack-unreachable", NULL, N_("time"),
                  N_("unpack unreachable objects newer than <time>"),
                  PARSE_OPT_OPTARG, option_parse_unpack_unreachable },
@@ -2737,7 +2940,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)
@@ -2747,6 +2966,28 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
                progress = 2;
 
        prepare_packed_git();
+       if (ignore_packed_keep) {
+               struct packed_git *p;
+               for (p = packed_git; p; p = p->next)
+                       if (p->pack_local && p->pack_keep)
+                               break;
+               if (!p) /* no keep-able packs found */
+                       ignore_packed_keep = 0;
+       }
+       if (local) {
+               /*
+                * unlike ignore_packed_keep above, we do not want to
+                * unset "local" based on looking at packs, as it
+                * also covers non-local objects
+                */
+               struct packed_git *p;
+               for (p = packed_git; p; p = p->next) {
+                       if (!p->pack_local) {
+                               have_non_local_packs = 1;
+                               break;
+                       }
+               }
+       }
 
        if (progress)
                progress_state = start_progress(_("Counting objects"), 0);
index 366ce5a5d419649dba34f607ed3f54b6a28bd3ea..a84d0003a3087c842b6eab6a987a93eebaddec79 100644 (file)
@@ -81,16 +81,13 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
 
        while (strbuf_getwholeline(line_buf, stdin, '\n') != EOF) {
                char *line = line_buf->buf;
-               char *p = line;
+               const char *p = line;
                int len;
 
-               if (!memcmp(line, "diff-tree ", 10))
-                       p += 10;
-               else if (!memcmp(line, "commit ", 7))
-                       p += 7;
-               else if (!memcmp(line, "From ", 5))
-                       p += 5;
-               else if (!memcmp(line, "\\ ", 2) && 12 < strlen(line))
+               if (!skip_prefix(line, "diff-tree ", &p) &&
+                   !skip_prefix(line, "commit ", &p) &&
+                   !skip_prefix(line, "From ", &p) &&
+                   starts_with(line, "\\ ") && 12 < strlen(line))
                        continue;
 
                if (!get_oid_hex(p, next_oid)) {
@@ -99,14 +96,14 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
                }
 
                /* Ignore commit comments */
-               if (!patchlen && memcmp(line, "diff ", 5))
+               if (!patchlen && !starts_with(line, "diff "))
                        continue;
 
                /* Parsing diff header?  */
                if (before == -1) {
-                       if (!memcmp(line, "index ", 6))
+                       if (starts_with(line, "index "))
                                continue;
-                       else if (!memcmp(line, "--- ", 4))
+                       else if (starts_with(line, "--- "))
                                before = after = 1;
                        else if (!isalpha(line[0]))
                                break;
@@ -114,14 +111,14 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
 
                /* Looking for a valid hunk header?  */
                if (before == 0 && after == 0) {
-                       if (!memcmp(line, "@@ -", 4)) {
+                       if (starts_with(line, "@@ -")) {
                                /* Parse next hunk, but ignore line numbers.  */
                                scan_hunk_header(line, &before, &after);
                                continue;
                        }
 
                        /* Split at the end of the patch.  */
-                       if (memcmp(line, "diff ", 5))
+                       if (!starts_with(line, "diff "))
                                break;
 
                        /* Else we're parsing another header.  */
index 6214af9b10c213046e13b81fb30cea64abc0e619..3ecb881b0bcacbf1a453bf9a6cb95ae00cdecb1d 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,
@@ -86,9 +87,12 @@ static char *opt_commit;
 static char *opt_edit;
 static char *opt_ff;
 static char *opt_verify_signatures;
+static int opt_autostash = -1;
+static int config_autostash;
 static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
 static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
 static char *opt_gpg_sign;
+static int opt_allow_unrelated_histories;
 
 /* Options passed to git-fetch */
 static char *opt_all;
@@ -149,6 +153,8 @@ static struct option pull_options[] = {
        OPT_PASSTHRU(0, "verify-signatures", &opt_verify_signatures, NULL,
                N_("verify that the named commit has a valid GPG signature"),
                PARSE_OPT_NOARG),
+       OPT_BOOL(0, "autostash", &opt_autostash,
+               N_("automatically stash/stash pop before and after rebase")),
        OPT_PASSTHRU_ARGV('s', "strategy", &opt_strategies, N_("strategy"),
                N_("merge strategy to use"),
                0),
@@ -159,6 +165,9 @@ static struct option pull_options[] = {
        OPT_PASSTHRU('S', "gpg-sign", &opt_gpg_sign, N_("key-id"),
                N_("GPG sign commit"),
                PARSE_OPT_OPTARG),
+       OPT_SET_INT(0, "allow-unrelated-histories",
+                   &opt_allow_unrelated_histories,
+                   N_("allow merging unrelated histories"), 1),
 
        /* Options passed to git-fetch */
        OPT_GROUP(N_("Options related to fetching")),
@@ -306,70 +315,15 @@ static enum rebase_type config_get_rebase(void)
 }
 
 /**
- * Returns 1 if there are unstaged changes, 0 otherwise.
+ * Read config variables.
  */
-static int has_unstaged_changes(const char *prefix)
+static int git_pull_config(const char *var, const char *value, void *cb)
 {
-       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())
+       if (!strcmp(var, "rebase.autostash")) {
+               config_autostash = git_config_bool(var, value);
                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);
+       return git_default_config(var, value, cb);
 }
 
 /**
@@ -612,6 +566,8 @@ static int run_merge(void)
        argv_array_pushv(&args, opt_strategy_opts.argv);
        if (opt_gpg_sign)
                argv_array_push(&args, opt_gpg_sign);
+       if (opt_allow_unrelated_histories > 0)
+               argv_array_push(&args, "--allow-unrelated-histories");
 
        argv_array_push(&args, "FETCH_HEAD");
        ret = run_command_v_opt(args.argv, RUN_GIT_CMD);
@@ -789,6 +745,13 @@ static int run_rebase(const unsigned char *curr_head,
        argv_array_pushv(&args, opt_strategy_opts.argv);
        if (opt_gpg_sign)
                argv_array_push(&args, opt_gpg_sign);
+       if (opt_autostash == 0)
+               argv_array_push(&args, "--no-autostash");
+       else if (opt_autostash == 1)
+               argv_array_push(&args, "--autostash");
+       if (opt_verify_signatures &&
+           !strcmp(opt_verify_signatures, "--verify-signatures"))
+               warning(_("ignoring --verify-signatures for rebase"));
 
        argv_array_push(&args, "--onto");
        argv_array_push(&args, sha1_to_hex(merge_head));
@@ -823,10 +786,10 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (opt_rebase < 0)
                opt_rebase = config_get_rebase();
 
-       git_config(git_default_config, NULL);
+       git_config(git_pull_config, NULL);
 
        if (read_cache_unmerged())
-               die_resolve_conflict("Pull");
+               die_resolve_conflict("pull");
 
        if (file_exists(git_path("MERGE_HEAD")))
                die_conclude_merge();
@@ -834,15 +797,20 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
        if (get_sha1("HEAD", orig_head))
                hashclr(orig_head);
 
+       if (!opt_rebase && opt_autostash != -1)
+               die(_("--[no-]autostash option is only valid with --rebase."));
+
        if (opt_rebase) {
-               int autostash = 0;
+               int autostash = config_autostash;
+               if (opt_autostash != -1)
+                       autostash = opt_autostash;
 
                if (is_null_sha1(orig_head) && !is_cache_unborn())
                        die(_("Updating an unborn branch with changes added to the index."));
 
-               git_config_get_bool("rebase.autostash", &autostash);
                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);
@@ -889,10 +857,24 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
                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."));
+       }
+       if (opt_rebase && merge_heads.nr > 1)
+               die(_("Cannot rebase onto multiple branches."));
+
+       if (opt_rebase) {
+               struct commit_list *list = NULL;
+               struct commit *merge_head, *head;
+
+               head = lookup_commit_reference(orig_head);
+               commit_list_insert(head, &list);
+               merge_head = lookup_commit_reference(merge_heads.sha1[0]);
+               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.sha1, rebase_fork_point);
-       } else
+       } else {
                return run_merge();
+       }
 }
index 4e9e4dbab23e5fb78239eadde724a63240e43505..9307ad56a9fb91455eaf06371382b1431d115598 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)
@@ -353,7 +356,8 @@ static int push_with_options(struct transport *transport, int flags)
        return 1;
 }
 
-static int do_push(const char *repo, int flags)
+static int do_push(const char *repo, int flags,
+                  const struct string_list *push_options)
 {
        int i, errs;
        struct remote *remote = pushremote_get(repo);
@@ -376,6 +380,9 @@ static int do_push(const char *repo, int flags)
        if (remote->mirror)
                flags |= (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE);
 
+       if (push_options->nr)
+               flags |= TRANSPORT_PUSH_OPTIONS;
+
        if ((flags & TRANSPORT_PUSH_ALL) && refspec) {
                if (!strcmp(*refspec, "refs/tags/*"))
                        return error(_("--all and --tags are incompatible"));
@@ -406,13 +413,16 @@ static int do_push(const char *repo, int flags)
                for (i = 0; i < url_nr; i++) {
                        struct transport *transport =
                                transport_get(remote, url[i]);
+                       if (flags & TRANSPORT_PUSH_OPTIONS)
+                               transport->push_options = push_options;
                        if (push_with_options(transport, flags))
                                errs++;
                }
        } else {
                struct transport *transport =
                        transport_get(remote, NULL);
-
+               if (flags & TRANSPORT_PUSH_OPTIONS)
+                       transport->push_options = push_options;
                if (push_with_options(transport, flags))
                        errs++;
        }
@@ -500,6 +510,9 @@ 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 option options[] = {
                OPT__VERBOSITY(&verbosity),
                OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
@@ -533,6 +546,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                  0, "signed", &push_cert, "yes|no|if-asked", N_("GPG sign the push"),
                  PARSE_OPT_OPTARG, option_parse_push_signed },
                OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
+               OPT_STRING_LIST('o', "push-option", &push_options, N_("server-specific"), N_("option to transmit")),
                OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"),
                                TRANSPORT_FAMILY_IPV4),
                OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"),
@@ -563,7 +577,11 @@ int cmd_push(int argc, const char **argv, const char *prefix)
                set_refspecs(argv + 1, argc - 1, repo);
        }
 
-       rc = do_push(repo, flags);
+       for_each_string_list_item(item, &push_options)
+               if (strchr(item->string, '\n'))
+                       die(_("push options must not have new line characters"));
+
+       rc = do_push(repo, flags, &push_options);
        if (rc == -1)
                usage_with_options(push_usage, options);
        else
index 8c693e756852ef2ec3aac3bfc77d71c6258a8306..9bd1fd755ef03824442f6c751a9603b95bfe66ee 100644 (file)
@@ -78,7 +78,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,
index c8e32b297c4be68bb0d33a6a88c15470821ae4ea..e6b3879a5b90034937dfb8eee32f8d2981f6bb53 100644 (file)
 #include "gpg-interface.h"
 #include "sigchain.h"
 #include "fsck.h"
+#include "tmp-objdir.h"
 
-static const char receive_pack_usage[] = "git receive-pack <git-dir>";
+static const char * const receive_pack_usage[] = {
+       N_("git receive-pack <git-dir>"),
+       NULL
+};
 
 enum deny_action {
        DENY_UNCONFIGURED,
@@ -41,15 +45,18 @@ static struct strbuf fsck_msg_types = STRBUF_INIT;
 static int receive_unpack_limit = -1;
 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;
+static int use_push_options;
 static int quiet;
 static int prefer_ofs_delta = 1;
 static int auto_update_server_info;
 static int auto_gc = 1;
-static int fix_thin = 1;
+static int reject_thin;
 static int stateless_rpc;
 static const char *service_dir;
 static const char *head_name;
@@ -73,6 +80,15 @@ static long nonce_stamp_slop;
 static unsigned long nonce_stamp_slop_limit;
 static struct ref_transaction *transaction;
 
+static enum {
+       KEEPALIVE_NEVER = 0,
+       KEEPALIVE_AFTER_NUL,
+       KEEPALIVE_ALWAYS
+} 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) {
@@ -190,13 +206,28 @@ static int receive_pack_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (strcmp(var, "receive.advertisepushoptions") == 0) {
+               advertise_push_options = git_config_bool(var, value);
+               return 0;
+       }
+
+       if (strcmp(var, "receive.keepalive") == 0) {
+               keepalive_in_sec = git_config_int(var, value);
+               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)
 {
        if (sent_capabilities) {
-               packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
+               packet_write_fmt(1, "%s %s\n", sha1_to_hex(sha1), path);
        } else {
                struct strbuf cap = STRBUF_INIT;
 
@@ -208,8 +239,10 @@ static void show_ref(const char *path, const unsigned char *sha1)
                        strbuf_addstr(&cap, " ofs-delta");
                if (push_cert_nonce)
                        strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
+               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",
+               packet_write_fmt(1, "%s %s%c%s\n",
                             sha1_to_hex(sha1), path, 0, cap.buf);
                strbuf_release(&cap);
                sent_capabilities = 1;
@@ -238,9 +271,10 @@ static int show_ref_cb(const char *path_full, const struct object_id *oid,
        return 0;
 }
 
-static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
+static int show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
 {
        show_ref(".have", sha1);
+       return 0;
 }
 
 static void collect_one_alternate_ref(const struct ref *ref, void *data)
@@ -316,10 +350,60 @@ static void rp_error(const char *err, ...)
 static int copy_to_sideband(int in, int out, void *arg)
 {
        char data[128];
+       int keepalive_active = 0;
+
+       if (keepalive_in_sec <= 0)
+               use_keepalive = KEEPALIVE_NEVER;
+       if (use_keepalive == KEEPALIVE_ALWAYS)
+               keepalive_active = 1;
+
        while (1) {
-               ssize_t sz = xread(in, data, sizeof(data));
+               ssize_t sz;
+
+               if (keepalive_active) {
+                       struct pollfd pfd;
+                       int ret;
+
+                       pfd.fd = in;
+                       pfd.events = POLLIN;
+                       ret = poll(&pfd, 1, 1000 * keepalive_in_sec);
+
+                       if (ret < 0) {
+                               if (errno == EINTR)
+                                       continue;
+                               else
+                                       break;
+                       } else if (ret == 0) {
+                               /* no data; send a keepalive packet */
+                               static const char buf[] = "0005\1";
+                               write_or_die(1, buf, sizeof(buf) - 1);
+                               continue;
+                       } /* else there is actual data to read */
+               }
+
+               sz = xread(in, data, sizeof(data));
                if (sz <= 0)
                        break;
+
+               if (use_keepalive == KEEPALIVE_AFTER_NUL && !keepalive_active) {
+                       const char *p = memchr(data, '\0', sz);
+                       if (p) {
+                               /*
+                                * The NUL tells us to start sending keepalives. Make
+                                * sure we send any other data we read along
+                                * with it.
+                                */
+                               keepalive_active = 1;
+                               send_sideband(1, 2, data, p - data, use_sideband);
+                               send_sideband(1, 2, p + 1, sz - (p - data + 1), use_sideband);
+                               continue;
+                       }
+               }
+
+               /*
+                * Either we're not looking for a NUL signal, or we didn't see
+                * it yet; just pass along the data.
+                */
                send_sideband(1, 2, data, sz, use_sideband);
        }
        close(in);
@@ -547,8 +631,16 @@ static void prepare_push_cert_sha1(struct child_process *proc)
        }
 }
 
+struct receive_hook_feed_state {
+       struct command *cmd;
+       int skip_broken;
+       struct strbuf buf;
+       const struct string_list *push_options;
+};
+
 typedef int (*feed_fn)(void *, const char **, size_t *);
-static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
+static int run_and_feed_hook(const char *hook_name, feed_fn feed,
+                            struct receive_hook_feed_state *feed_state)
 {
        struct child_process proc = CHILD_PROCESS_INIT;
        struct async muxer;
@@ -564,6 +656,19 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_sta
        proc.argv = argv;
        proc.in = -1;
        proc.stdout_to_stderr = 1;
+       if (feed_state->push_options) {
+               int i;
+               for (i = 0; i < feed_state->push_options->nr; i++)
+                       argv_array_pushf(&proc.env_array,
+                               "GIT_PUSH_OPTION_%d=%s", i,
+                               feed_state->push_options->items[i].string);
+               argv_array_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT=%d",
+                                feed_state->push_options->nr);
+       } 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));
@@ -603,12 +708,6 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_sta
        return finish_command(&proc);
 }
 
-struct receive_hook_feed_state {
-       struct command *cmd;
-       int skip_broken;
-       struct strbuf buf;
-};
-
 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
 {
        struct receive_hook_feed_state *state = state_;
@@ -631,8 +730,10 @@ static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
        return 0;
 }
 
-static int run_receive_hook(struct command *commands, const char *hook_name,
-                           int skip_broken)
+static int run_receive_hook(struct command *commands,
+                           const char *hook_name,
+                           int skip_broken,
+                           const struct string_list *push_options)
 {
        struct receive_hook_feed_state state;
        int status;
@@ -643,6 +744,7 @@ static int run_receive_hook(struct command *commands, const char *hook_name,
        if (feed_receive_hook(&state, NULL, NULL))
                return 0;
        state.cmd = commands;
+       state.push_options = push_options;
        status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
        strbuf_release(&state.buf);
        return status;
@@ -667,6 +769,7 @@ static int run_update_hook(struct command *cmd)
        proc.stdout_to_stderr = 1;
        proc.err = use_sideband ? -1 : 0;
        proc.argv = argv;
+       proc.env = tmp_objdir_env(tmp_objdir);
 
        code = start_command(&proc);
        if (code)
@@ -686,47 +789,39 @@ 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 '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'.");
 
 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]);
@@ -734,7 +829,7 @@ 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;
-       const char *alt_file;
+       struct check_connected_options opt = CHECK_CONNECTED_INIT;
        uint32_t mask = 1 << (cmd->index % 32);
        int i;
 
@@ -746,9 +841,9 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
                    !delayed_reachability_test(si, i))
                        sha1_array_append(&extra, si->shallow->sha1[i]);
 
-       setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
-       if (check_shallow_connected(command_singleton_iterator,
-                                   0, cmd, alt_file)) {
+       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);
                return -1;
@@ -1068,10 +1163,6 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
        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];
        int flag;
 
        strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
@@ -1081,13 +1172,13 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
        if (!(flag & REF_ISSYMREF))
                return;
 
-       dst_name = strip_namespace(dst_name);
        if (!dst_name) {
                rp_error("refusing update to broken symref '%s'", cmd->ref_name);
                cmd->skip_update = 1;
                cmd->error_string = "broken symref";
                return;
        }
+       dst_name = strip_namespace(dst_name);
 
        if ((item = string_list_lookup(list, dst_name)) == NULL)
                return;
@@ -1102,14 +1193,14 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
 
        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_sha1, DEFAULT_ABBREV),
+                find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV),
+                dst_cmd->ref_name,
+                find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV),
+                find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
 
        cmd->error_string = dst_cmd->error_string =
                "inconsistent aliased update";
@@ -1154,12 +1245,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;
-               if (!check_everything_connected(command_singleton_iterator,
-                                               0, &singleton))
+
+               opt.env = tmp_objdir_env(tmp_objdir);
+               if (!check_connected(command_singleton_iterator, &singleton,
+                                    &opt))
                        continue;
+
                cmd->error_string = "missing necessary objects";
        }
 }
@@ -1313,11 +1409,15 @@ cleanup:
 
 static void execute_commands(struct command *commands,
                             const char *unpacker_error,
-                            struct shallow_info *si)
+                            struct shallow_info *si,
+                            const struct string_list *push_options)
 {
+       struct check_connected_options opt = CHECK_CONNECTED_INIT;
        struct command *cmd;
        unsigned char sha1[20];
        struct iterate_data data;
+       struct async muxer;
+       int err_fd = 0;
 
        if (unpacker_error) {
                for (cmd = commands; cmd; cmd = cmd->next)
@@ -1325,14 +1425,29 @@ static void execute_commands(struct command *commands,
                return;
        }
 
+       if (use_sideband) {
+               memset(&muxer, 0, sizeof(muxer));
+               muxer.proc = copy_to_sideband;
+               muxer.in = -1;
+               if (!start_async(&muxer))
+                       err_fd = muxer.in;
+               /* ...else, continue without relaying sideband */
+       }
+
        data.cmds = commands;
        data.si = si;
-       if (check_everything_connected(iterate_receive_command_list, 0, &data))
+       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);
 
+       if (use_sideband)
+               finish_async(&muxer);
+
        reject_updates_to_hidden(commands);
 
-       if (run_receive_hook(commands, "pre-receive", 0)) {
+       if (run_receive_hook(commands, "pre-receive", 0, push_options)) {
                for (cmd = commands; cmd; cmd = cmd->next) {
                        if (!cmd->error_string)
                                cmd->error_string = "pre-receive hook declined";
@@ -1340,6 +1455,19 @@ 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);
@@ -1372,11 +1500,9 @@ static struct command **queue_command(struct command **tail,
 
        refname = line + 82;
        reflen = linelen - 82;
-       cmd = xcalloc(1, st_add3(sizeof(struct command), reflen, 1));
+       FLEX_ALLOC_MEM(cmd, ref_name, refname, reflen);
        hashcpy(cmd->old_sha1, old_sha1);
        hashcpy(cmd->new_sha1, new_sha1);
-       memcpy(cmd->ref_name, refname, reflen);
-       cmd->ref_name[reflen] = '\0';
        *tail = cmd;
        return &cmd->next;
 }
@@ -1436,6 +1562,9 @@ static struct command *read_head_info(struct sha1_array *shallow)
                        if (advertise_atomic_push
                            && parse_feature_request(feature_list, "atomic"))
                                use_atomic = 1;
+                       if (advertise_push_options
+                           && parse_feature_request(feature_list, "push-options"))
+                               use_push_options = 1;
                }
 
                if (!strcmp(line, "push-cert")) {
@@ -1468,6 +1597,21 @@ static struct command *read_head_info(struct sha1_array *shallow)
        return commands;
 }
 
+static void read_push_options(struct string_list *options)
+{
+       while (1) {
+               char *line;
+               int len;
+
+               line = packet_read_line(0, &len);
+
+               if (!line)
+                       break;
+
+               string_list_append(options, line);
+       }
+}
+
 static const char *parse_pack_header(struct pack_header *hdr)
 {
        switch (read_pack_header(0, hdr)) {
@@ -1519,6 +1663,18 @@ 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)
+               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);
                if (quiet)
@@ -1526,6 +1682,9 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                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;
@@ -1545,11 +1704,18 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                                 (uintmax_t)getpid(),
                                 hostname);
 
+               if (!quiet && err_fd)
+                       argv_array_push(&child.args, "--show-resolving-progress");
+               if (use_sideband)
+                       argv_array_push(&child.args, "--report-end-of-input");
                if (fsck_objects)
                        argv_array_pushf(&child.args, "--strict%s",
                                fsck_msg_types.buf);
-               if (fix_thin)
+               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;
@@ -1574,6 +1740,7 @@ static const char *unpack_with_sideband(struct shallow_info *si)
        if (!use_sideband)
                return unpack(0, si);
 
+       use_keepalive = KEEPALIVE_AFTER_NUL;
        memset(&muxer, 0, sizeof(muxer));
        muxer.proc = copy_to_sideband;
        muxer.in = -1;
@@ -1707,45 +1874,29 @@ static int delete_only(struct command *commands)
 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 {
        int advertise_refs = 0;
-       int i;
        struct command *commands;
        struct sha1_array shallow = SHA1_ARRAY_INIT;
        struct sha1_array ref = SHA1_ARRAY_INIT;
        struct shallow_info si;
 
-       packet_trace_identity("receive-pack");
+       struct option options[] = {
+               OPT__QUIET(&quiet, N_("quiet")),
+               OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
+               OPT_HIDDEN_BOOL(0, "advertise-refs", &advertise_refs, NULL),
+               OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin, NULL),
+               OPT_END()
+       };
 
-       argv++;
-       for (i = 1; i < argc; i++) {
-               const char *arg = *argv++;
+       packet_trace_identity("receive-pack");
 
-               if (*arg == '-') {
-                       if (!strcmp(arg, "--quiet")) {
-                               quiet = 1;
-                               continue;
-                       }
+       argc = parse_options(argc, argv, prefix, options, receive_pack_usage, 0);
 
-                       if (!strcmp(arg, "--advertise-refs")) {
-                               advertise_refs = 1;
-                               continue;
-                       }
-                       if (!strcmp(arg, "--stateless-rpc")) {
-                               stateless_rpc = 1;
-                               continue;
-                       }
-                       if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
-                               fix_thin = 0;
-                               continue;
-                       }
+       if (argc > 1)
+               usage_msg_opt(_("Too many arguments."), receive_pack_usage, options);
+       if (argc == 0)
+               usage_msg_opt(_("You must specify a directory."), receive_pack_usage, options);
 
-                       usage(receive_pack_usage);
-               }
-               if (service_dir)
-                       usage(receive_pack_usage);
-               service_dir = arg;
-       }
-       if (!service_dir)
-               usage(receive_pack_usage);
+       service_dir = argv[0];
 
        setup_path();
 
@@ -1769,6 +1920,10 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 
        if ((commands = read_head_info(&shallow)) != NULL) {
                const char *unpack_status = NULL;
+               struct string_list push_options = STRING_LIST_INIT_DUP;
+
+               if (use_push_options)
+                       read_push_options(&push_options);
 
                prepare_shallow_info(&si, &shallow);
                if (!si.nr_ours && !si.nr_theirs)
@@ -1777,20 +1932,36 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
                        unpack_status = unpack_with_sideband(&si);
                        update_shallow_info(commands, &si, &ref);
                }
-               execute_commands(commands, unpack_status, &si);
+               use_keepalive = KEEPALIVE_ALWAYS;
+               execute_commands(commands, unpack_status, &si,
+                                &push_options);
                if (pack_lockfile)
                        unlink_or_warn(pack_lockfile);
                if (report_status)
                        report(commands, unpack_status);
-               run_receive_hook(commands, "post-receive", 1);
+               run_receive_hook(commands, "post-receive", 1,
+                                &push_options);
                run_update_post_hook(commands);
+               if (push_options.nr)
+                       string_list_clear(&push_options, 0);
                if (auto_gc) {
                        const char *argv_gc_auto[] = {
                                "gc", "--auto", "--quiet", NULL,
                        };
-                       int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
+                       struct child_process proc = CHILD_PROCESS_INIT;
+
+                       proc.no_stdin = 1;
+                       proc.stdout_to_stderr = 1;
+                       proc.err = use_sideband ? -1 : 0;
+                       proc.git_cmd = 1;
+                       proc.argv = argv_gc_auto;
+
                        close_all_packs();
-                       run_command_v_opt(argv_gc_auto, opt);
+                       if (!start_command(&proc)) {
+                               if (use_sideband)
+                                       copy_to_sideband(proc.err, -1, NULL);
+                               finish_command(&proc);
+                       }
                }
                if (auto_update_server_info)
                        update_server_info(0);
index 2d46b6482a0110072828e6d16da2d2fa3e0f8389..7a7136e53e2b8cf1eaa1c79b1183692dd54278a7 100644 (file)
@@ -84,8 +84,8 @@ static int tree_is_complete(const unsigned char *sha1)
        init_tree_desc(&desc, tree->buffer, tree->size);
        complete = 1;
        while (tree_entry(&desc, &entry)) {
-               if (!has_sha1_file(entry.sha1) ||
-                   (S_ISDIR(entry.mode) && !tree_is_complete(entry.sha1))) {
+               if (!has_sha1_file(entry.oid->hash) ||
+                   (S_ISDIR(entry.mode) && !tree_is_complete(entry.oid->hash))) {
                        tree->object.flags |= INCOMPLETE;
                        complete = 0;
                }
index 7457c743e8d8539c4f08df81f86c8b27c0bce392..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);
 }
 
@@ -168,7 +168,7 @@ static int command_loop(const char *child)
                size_t i;
                if (!fgets(buffer, MAXCOMMAND - 1, stdin)) {
                        if (ferror(stdin))
-                               die("Comammand input error");
+                               die("Command input error");
                        exit(0);
                }
                /* Strip end of line characters. */
index fda5c2e53d28ae84f4876ca77ac9fefebee9ada2..e52cf3925b2388008221de6f7cbedeecd6cdd010 100644 (file)
@@ -247,7 +247,7 @@ struct branch_info {
        enum { NO_REBASE, NORMAL_REBASE, INTERACTIVE_REBASE } rebase;
 };
 
-static struct string_list branch_list;
+static struct string_list branch_list = STRING_LIST_INIT_NODUP;
 
 static const char *abbrev_ref(const char *name, const char *prefix)
 {
@@ -539,10 +539,6 @@ static int add_branch_for_removal(const char *refname,
                return 0;
        }
 
-       /* make sure that symrefs are deleted */
-       if (flags & REF_ISSYMREF)
-               return unlink(git_path("%s", refname));
-
        string_list_append(branches->branches, refname);
 
        return 0;
@@ -788,7 +784,7 @@ static int rm(int argc, const char **argv)
        strbuf_release(&buf);
 
        if (!result)
-               result = delete_refs(&branches);
+               result = delete_refs(&branches, REF_NODEREF);
        string_list_clear(&branches, 0);
 
        if (skipped.nr) {
@@ -952,7 +948,7 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data)
        struct show_info *show_info = cb_data;
        struct branch_info *branch_info = item->util;
        struct string_list *merge = &branch_info->merge;
-       const char *also;
+       int width = show_info->width + 4;
        int i;
 
        if (branch_info->rebase && branch_info->merge.nr > 1) {
@@ -963,19 +959,18 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data)
 
        printf("    %-*s ", show_info->width, item->string);
        if (branch_info->rebase) {
-               printf_ln(_(branch_info->rebase == INTERACTIVE_REBASE ?
-                       "rebases interactively onto remote %s" :
-                       "rebases onto remote %s"), merge->items[0].string);
+               printf_ln(branch_info->rebase == INTERACTIVE_REBASE
+                         ? _("rebases interactively onto remote %s")
+                         : _("rebases onto remote %s"), merge->items[0].string);
                return 0;
        } else if (show_info->any_rebase) {
                printf_ln(_(" merges with remote %s"), merge->items[0].string);
-               also = _("    and with remote");
+               width++;
        } else {
                printf_ln(_("merges with remote %s"), merge->items[0].string);
-               also = _("   and with remote");
        }
        for (i = 1; i < merge->nr; i++)
-               printf("    %-*s %s %s\n", show_info->width, "", also,
+               printf(_("%-*s    and with remote %s\n"), width, "",
                       merge->items[i].string);
 
        return 0;
@@ -1154,13 +1149,15 @@ 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 */
                        printf_ln(_("  Push  URL: %s"), url[i]);
                if (!i)
-                       printf_ln(_("  Push  URL: %s"), "(no URL)");
+                       printf_ln(_("  Push  URL: %s"), _("(no URL)"));
                if (no_query)
-                       printf_ln(_("  HEAD branch: %s"), "(not queried)");
+                       printf_ln(_("  HEAD branch: %s"), _("(not queried)"));
                else if (!states.heads.nr)
-                       printf_ln(_("  HEAD branch: %s"), "(unknown)");
+                       printf_ln(_("  HEAD branch: %s"), _("(unknown)"));
                else if (states.heads.nr == 1)
                        printf_ln(_("  HEAD branch: %s"), states.heads.items[0].string);
                else {
@@ -1200,8 +1197,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:",
@@ -1303,7 +1299,7 @@ static int prune_remote(const char *remote, int dry_run)
        string_list_sort(&refs_to_prune);
 
        if (!dry_run)
-               result |= delete_refs(&refs_to_prune);
+               result |= delete_refs(&refs_to_prune, 0);
 
        for_each_string_list_item(item, &states.stale) {
                const char *refname = item->util;
index 858db38f52e878a41cefdd47bbafd1250c7483b0..80dd06b4a2a8b784ab96899cb150b13006d7e402 100644 (file)
@@ -146,6 +146,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        int pack_everything = 0;
        int delete_redundant = 0;
        const char *unpack_unreachable = NULL;
+       int keep_unreachable = 0;
        const char *window = NULL, *window_memory = NULL;
        const char *depth = NULL;
        const char *max_pack_size = NULL;
@@ -175,6 +176,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                                N_("write bitmap index")),
                OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"),
                                N_("with -A, do not loosen objects older than this")),
+               OPT_BOOL('k', "keep-unreachable", &keep_unreachable,
+                               N_("with -a, repack unreachable objects")),
                OPT_STRING(0, "window", &window, N_("n"),
                                N_("size of the window used for delta compression")),
                OPT_STRING(0, "window-memory", &window_memory, N_("bytes"),
@@ -196,6 +199,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        if (delete_redundant && repository_format_precious_objects)
                die(_("cannot delete packs in a precious-objects repo"));
 
+       if (keep_unreachable &&
+           (unpack_unreachable || (pack_everything & LOOSEN_UNREACHABLE)))
+               die(_("--keep-unreachable and -A are incompatible"));
+
        if (pack_kept_objects < 0)
                pack_kept_objects = write_bitmaps;
 
@@ -239,6 +246,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                        } else if (pack_everything & LOOSEN_UNREACHABLE) {
                                argv_array_push(&cmd.args,
                                                "--unpack-unreachable");
+                       } else if (keep_unreachable) {
+                               argv_array_push(&cmd.args, "--keep-unreachable");
+                               argv_array_push(&cmd.args, "--pack-loose-unreachable");
                        } else {
                                argv_array_push(&cmd.env_array, "GIT_REF_PARANOIA=1");
                        }
@@ -378,7 +388,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                                          item->string,
                                          exts[ext].name);
                        if (remove_path(fname))
-                               warning(_("removing '%s' failed"), fname);
+                               warning(_("failed to remove '%s'"), fname);
                        free(fname);
                }
        }
index 748c6ca954679e3fc47c25991dd50e539eaa543d..b58c714cb8935efd08c81c8ebfd8922e1704c8f4 100644 (file)
@@ -440,6 +440,7 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
        };
 
        check_replace_refs = 0;
+       git_config(git_default_config, NULL);
 
        argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
 
index 092c3a5399c731e83058233f8e3e459be493e140..c04ac076dc53b99039768dcdcbf2861e285896c2 100644 (file)
@@ -24,7 +24,7 @@
 
 static const char * const git_reset_usage[] = {
        N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"),
-       N_("git reset [-q] <tree-ish> [--] <paths>..."),
+       N_("git reset [-q] [<tree-ish>] [--] <paths>..."),
        N_("git reset --patch [<tree-ish>] [--] [<paths>...]"),
        NULL
 };
@@ -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);
        }
 
@@ -103,7 +103,7 @@ static void print_new_head_line(struct commit *commit)
        if (body) {
                const char *eol;
                size_t len;
-               body += 2;
+               body = skip_blank_lines(body + 2);
                eol = strchr(body, '\n');
                len = eol ? eol - body : strlen(body);
                printf(" %.*s\n", (int) len, body);
@@ -121,7 +121,7 @@ static void update_index_from_diff(struct diff_queue_struct *q,
 
        for (i = 0; i < q->nr; i++) {
                struct diff_filespec *one = q->queue[i]->one;
-               int is_missing = !(one->mode && !is_null_sha1(one->sha1));
+               int is_missing = !(one->mode && !is_null_oid(&one->oid));
                struct cache_entry *ce;
 
                if (is_missing && !intent_to_add) {
@@ -129,7 +129,7 @@ static void update_index_from_diff(struct diff_queue_struct *q,
                        continue;
                }
 
-               ce = make_cache_entry(one->mode, one->sha1, one->path,
+               ce = make_cache_entry(one->mode, one->oid.hash, one->path,
                                      0, 0);
                if (!ce)
                        die(_("make_cache_entry failed for path '%s'"),
@@ -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,11 +154,11 @@ 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);
-       free_pathspec(&opt.pathspec);
+       clear_pathspec(&opt.pathspec);
 
        return 0;
 }
@@ -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("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;
@@ -357,15 +357,15 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                hold_locked_index(lock, 1);
                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 275da0d647ebe147386c69683cc75f2d06105d23..c43decda70112a9cdb7789dc81394286459aa3af 100644 (file)
@@ -9,6 +9,7 @@
 #include "log-tree.h"
 #include "graph.h"
 #include "bisect.h"
+#include "progress.h"
 
 static const char rev_list_usage[] =
 "git rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
@@ -49,12 +50,17 @@ static const char rev_list_usage[] =
 "    --bisect-all"
 ;
 
+static struct progress *progress;
+static unsigned progress_counter;
+
 static void finish_commit(struct commit *commit, void *data);
 static void show_commit(struct commit *commit, void *data)
 {
        struct rev_list_info *info = data;
        struct rev_info *revs = info->revs;
 
+       display_progress(progress, ++progress_counter);
+
        if (info->flags & REV_LIST_QUIET) {
                finish_commit(commit, data);
                return;
@@ -116,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 {
@@ -190,6 +188,7 @@ static void show_object(struct object *obj, const char *name, void *cb_data)
 {
        struct rev_list_info *info = cb_data;
        finish_object(obj, name, cb_data);
+       display_progress(progress, ++progress_counter);
        if (info->flags & REV_LIST_QUIET)
                return;
        show_object_with_name(stdout, obj, name);
@@ -276,6 +275,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
        int bisect_show_vars = 0;
        int bisect_find_all = 0;
        int use_bitmap_index = 0;
+       const char *show_progress = NULL;
 
        git_config(git_default_config, NULL);
        init_revisions(&revs, prefix);
@@ -325,6 +325,10 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                        test_bitmap_walk(&revs);
                        return 0;
                }
+               if (skip_prefix(arg, "--progress=", &arg)) {
+                       show_progress = arg;
+                       continue;
+               }
                usage(rev_list_usage);
 
        }
@@ -355,15 +359,22 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
        if (bisect_list)
                revs.limited = 1;
 
+       if (show_progress)
+               progress = start_progress_delay(show_progress, 0, 0, 2);
+
        if (use_bitmap_index && !revs.prune) {
                if (revs.count && !revs.left_right && !revs.cherry_mark) {
                        uint32_t commit_count;
+                       int max_count = revs.max_count;
                        if (!prepare_bitmap_walk(&revs)) {
                                count_bitmap_commit_list(&commit_count, NULL, NULL, NULL);
+                               if (max_count >= 0 && max_count < commit_count)
+                                       commit_count = max_count;
                                printf("%d\n", commit_count);
                                return 0;
                        }
-               } else if (revs.tag_objects && revs.tree_objects && revs.blob_objects) {
+               } else if (revs.max_count < 0 &&
+                          revs.tag_objects && revs.tree_objects && revs.blob_objects) {
                        if (!prepare_bitmap_walk(&revs)) {
                                traverse_bitmap_commit_list(&show_object_fast);
                                return 0;
@@ -388,6 +399,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 
        traverse_commit_list(&revs, show_commit, show_object, &info);
 
+       stop_progress(&progress);
+
        if (revs.count) {
                if (revs.left_right && revs.cherry_mark)
                        printf("%d\t%d\t%d\n", revs.count_left, revs.count_right, revs.count_same);
index cf8487b3b95fcca9a8a96a1562646ee8ddd5b354..ff13e59e1dbd200b6e7cf7d1c508b620b19e8cc7 100644 (file)
@@ -298,14 +298,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 +330,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;
@@ -469,7 +502,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
                        (stop_at_non_option ? PARSE_OPT_STOP_AT_NON_OPTION : 0) |
                        PARSE_OPT_SHELL_EVAL);
 
-       strbuf_addf(&parsed, " --");
+       strbuf_addstr(&parsed, " --");
        sq_quote_argv(&parsed, argv, 0);
        puts(parsed.buf);
        return 0;
@@ -505,6 +538,7 @@ N_("git rev-parse --parseopt [<options>] -- [<args>...]\n"
 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;
+       int did_repo_setup = 0;
        int has_dashdash = 0;
        int output_prefix = 0;
        unsigned char sha1[20];
@@ -528,11 +562,40 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                }
        }
 
-       prefix = setup_git_directory();
-       git_config(git_default_config, NULL);
+       /* No options; just report on whether we're in a git repo or not. */
+       if (argc == 1) {
+               setup_git_directory();
+               git_config(git_default_config, NULL);
+               return 0;
+       }
+
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
 
+               if (!strcmp(arg, "--local-env-vars")) {
+                       int i;
+                       for (i = 0; local_repo_env[i]; i++)
+                               printf("%s\n", local_repo_env[i]);
+                       continue;
+               }
+               if (!strcmp(arg, "--resolve-git-dir")) {
+                       const char *gitdir = argv[++i];
+                       if (!gitdir)
+                               die("--resolve-git-dir requires an argument");
+                       gitdir = resolve_gitdir(gitdir);
+                       if (!gitdir)
+                               die("not a gitdir '%s'", argv[i]);
+                       puts(gitdir);
+                       continue;
+               }
+
+               /* The rest of the options require a git repository. */
+               if (!did_repo_setup) {
+                       prefix = setup_git_directory();
+                       git_config(git_default_config, NULL);
+                       did_repo_setup = 1;
+               }
+
                if (!strcmp(arg, "--git-path")) {
                        if (!argv[i + 1])
                                die("--git-path requires an argument");
@@ -613,8 +676,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                filter &= ~(DO_FLAGS|DO_NOREV);
                                verify = 1;
                                abbrev = DEFAULT_ABBREV;
-                               if (arg[7] == '=')
-                                       abbrev = strtoul(arg + 8, NULL, 10);
+                               if (!arg[7])
+                                       continue;
+                               abbrev = strtoul(arg + 8, NULL, 10);
                                if (abbrev < MINIMUM_ABBREV)
                                        abbrev = MINIMUM_ABBREV;
                                else if (40 <= abbrev)
@@ -706,12 +770,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                add_ref_exclusion(&ref_excludes, arg + 10);
                                continue;
                        }
-                       if (!strcmp(arg, "--local-env-vars")) {
-                               int i;
-                               for (i = 0; local_repo_env[i]; i++)
-                                       printf("%s\n", local_repo_env[i]);
-                               continue;
-                       }
                        if (!strcmp(arg, "--show-toplevel")) {
                                const char *work_tree = get_git_work_tree();
                                if (work_tree)
@@ -767,16 +825,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
                                continue;
                        }
-                       if (!strcmp(arg, "--resolve-git-dir")) {
-                               const char *gitdir = argv[++i];
-                               if (!gitdir)
-                                       die("--resolve-git-dir requires an argument");
-                               gitdir = resolve_gitdir(gitdir);
-                               if (!gitdir)
-                                       die("not a gitdir '%s'", argv[i]);
-                               puts(gitdir);
-                               continue;
-                       }
                        if (!strcmp(arg, "--is-inside-git-dir")) {
                                printf("%s\n", is_inside_git_dir() ? "true"
                                                : "false");
index 56a2c366698f838146bcf62d7b2c7a8a115287e1..4ca5b515449a355ae04f0ff496a8ee0b7143e29a 100644 (file)
@@ -71,12 +71,12 @@ 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);
        int cmd = 0;
-       struct option options[] = {
+       struct option base_options[] = {
                OPT_CMDMODE(0, "quit", &cmd, N_("end revert or cherry-pick sequence"), 'q'),
                OPT_CMDMODE(0, "continue", &cmd, N_("resume revert or cherry-pick sequence"), 'c'),
                OPT_CMDMODE(0, "abort", &cmd, N_("cancel revert or cherry-pick sequence"), 'a'),
@@ -91,13 +91,9 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                        N_("option for merge strategy"), option_parse_x),
                { OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key-id"),
                  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
-               OPT_END(),
-               OPT_END(),
-               OPT_END(),
-               OPT_END(),
-               OPT_END(),
-               OPT_END(),
+               OPT_END()
        };
+       struct option *options = base_options;
 
        if (opts->action == REPLAY_PICK) {
                struct option cp_extra[] = {
@@ -108,8 +104,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                        OPT_BOOL(0, "keep-redundant-commits", &opts->keep_redundant_commits, N_("keep redundant, empty commits")),
                        OPT_END(),
                };
-               if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
-                       die(_("program error"));
+               options = parse_options_concat(options, cp_extra);
        }
 
        argc = parse_options(argc, argv, NULL, options, usage_str,
@@ -120,25 +115,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";
                }
 
@@ -161,7 +146,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;
@@ -179,20 +164,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;
@@ -200,14 +195,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 be83c4347a9cd6fdd6a76a9575f8e39a5b2bd6c2..3f3e24eb36af03481f4e7b3f4d22d8e4b5904593 100644 (file)
@@ -107,7 +107,7 @@ static int check_submodules_use_gitfiles(void)
        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,
@@ -123,13 +123,13 @@ static int check_local_mod(unsigned char *head, int index_only)
        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;
@@ -152,7 +152,7 @@ static int check_local_mod(unsigned char *head, int index_only)
 
                if (lstat(ce->name, &st) < 0) {
                        if (errno != ENOENT && errno != ENOTDIR)
-                               warning("'%s': %s", ce->name, strerror(errno));
+                               warning_errno(_("failed to stat '%s'"), ce->name);
                        /* It already vanished from the working tree */
                        continue;
                }
@@ -197,9 +197,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;
 
                /*
@@ -351,10 +351,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))
+               struct object_id oid;
+               if (get_oid("HEAD", &oid))
+                       oidclr(&oid);
+               if (check_local_mod(&oid, index_only))
                        exit(1);
        } else if (!index_only) {
                if (check_submodules_use_gitfiles())
@@ -387,6 +387,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
         */
        if (!index_only) {
                int removed = 0, gitmodules_modified = 0;
+               struct strbuf buf = STRBUF_INIT;
                for (i = 0; i < list.nr; i++) {
                        const char *path = list.entry[i].name;
                        if (list.entry[i].is_submodule) {
@@ -398,7 +399,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                                                continue;
                                        }
                                } else {
-                                       struct strbuf buf = STRBUF_INIT;
+                                       strbuf_reset(&buf);
                                        strbuf_addstr(&buf, path);
                                        if (!remove_dir_recursively(&buf, 0)) {
                                                removed = 1;
@@ -410,7 +411,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                                                /* Submodule was removed by user */
                                                if (!remove_path_from_gitmodules(path))
                                                        gitmodules_modified = 1;
-                                       strbuf_release(&buf);
                                        /* Fallthrough and let remove_path() fail. */
                                }
                        }
@@ -421,6 +421,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                        if (!removed)
                                die_errno("git rm: '%s'", path);
                }
+               strbuf_release(&buf);
                if (gitmodules_modified)
                        stage_updated_gitmodules();
        }
index 5b9dd6a9d8ebe888c2fc912af3590b92737e7a99..1ff5a6753803f8c2ccb5e66dcb926582bd25fd37 100644 (file)
@@ -225,7 +225,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
         * --all and --mirror are incompatible; neither makes sense
         * with any refspecs.
         */
-       if ((refspecs && (send_all || args.send_mirror)) ||
+       if ((nr_refspecs > 0 && (send_all || args.send_mirror)) ||
            (send_all && args.send_mirror))
                usage_with_options(send_pack_usage, options);
 
index bfc082e58467953c1e4c96fd27a884abea4f5127..ba0e1154a9f0b95f60e5bcb6cdb716bf0f6ef366 100644 (file)
@@ -233,11 +233,11 @@ void shortlog_init(struct shortlog *log)
 
 int cmd_shortlog(int argc, const char **argv, const char *prefix)
 {
-       static struct shortlog log;
-       static struct rev_info rev;
+       struct shortlog log = { STRING_LIST_INIT_NODUP };
+       struct rev_info rev;
        int nongit = !startup_info->have_repository;
 
-       static const struct option options[] = {
+       const struct option options[] = {
                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,
@@ -276,6 +276,7 @@ parse_done:
 
        log.user_format = rev.commit_format == CMIT_FMT_USERFORMAT;
        log.abbrev = rev.abbrev;
+       log.file = rev.diffopt.file;
 
        /* assume HEAD if from a tty */
        if (!nongit && !rev.pending.nr && isatty(0))
@@ -289,6 +290,8 @@ parse_done:
                get_from_rev(&rev, &log);
 
        shortlog_output(&log);
+       if (log.file != stdout)
+               fclose(log.file);
        return 0;
 }
 
@@ -305,27 +308,29 @@ 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];
                if (log->summary) {
-                       printf("%6d\t%s\n", (int)UTIL_TO_INT(item), item->string);
+                       fprintf(log->file, "%6d\t%s\n",
+                               (int)UTIL_TO_INT(item), item->string);
                } else {
                        struct string_list *onelines = item->util;
-                       printf("%s (%d):\n", item->string, onelines->nr);
+                       fprintf(log->file, "%s (%d):\n",
+                               item->string, onelines->nr);
                        for (j = onelines->nr - 1; j >= 0; j--) {
                                const char *msg = onelines->items[j].string;
 
                                if (log->wrap_lines) {
                                        strbuf_reset(&sb);
                                        add_wrapped_shortlog_msg(&sb, msg, log);
-                                       fwrite(sb.buf, sb.len, 1, stdout);
+                                       fwrite(sb.buf, sb.len, 1, log->file);
                                }
                                else
-                                       printf("      %s\n", msg);
+                                       fprintf(log->file, "      %s\n", msg);
                        }
-                       putchar('\n');
+                       putc('\n', log->file);
                        onelines->strdup_strings = 1;
                        string_list_clear(onelines, 0);
                        free(onelines);
index 25669357e97e892ffb050d879b74d13a91d4fafc..974f3403abe76288dc98797e3ceac21a070828ec 100644 (file)
@@ -353,8 +353,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 +372,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);
@@ -538,9 +538,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);
@@ -701,8 +700,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 +724,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) {
@@ -826,12 +826,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);
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 5295b727d4609fa33a08c31b2d051ce3f98244fb..4beeda5f9f49d6c2e2f552308b50bacf70ebd421 100644 (file)
@@ -9,6 +9,215 @@
 #include "submodule-config.h"
 #include "string-list.h"
 #include "run-command.h"
+#include "remote.h"
+#include "refs.h"
+#include "connect.h"
+
+static char *get_default_remote(void)
+{
+       char *dest = NULL, *ret;
+       unsigned char sha1[20];
+       struct strbuf sb = STRBUF_INIT;
+       const char *refname = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
+
+       if (!refname)
+               die(_("No such ref: %s"), "HEAD");
+
+       /* detached HEAD */
+       if (!strcmp(refname, "HEAD"))
+               return xstrdup("origin");
+
+       if (!skip_prefix(refname, "refs/heads/", &refname))
+               die(_("Expecting a full ref name, got %s"), refname);
+
+       strbuf_addf(&sb, "branch.%s.remote", refname);
+       if (git_config_get_string(sb.buf, &dest))
+               ret = xstrdup("origin");
+       else
+               ret = dest;
+
+       strbuf_release(&sb);
+       return ret;
+}
+
+static int starts_with_dot_slash(const char *str)
+{
+       return str[0] == '.' && is_dir_sep(str[1]);
+}
+
+static int starts_with_dot_dot_slash(const char *str)
+{
+       return str[0] == '.' && str[1] == '.' && is_dir_sep(str[2]);
+}
+
+/*
+ * Returns 1 if it was the last chop before ':'.
+ */
+static int chop_last_dir(char **remoteurl, int is_relative)
+{
+       char *rfind = find_last_dir_sep(*remoteurl);
+       if (rfind) {
+               *rfind = '\0';
+               return 0;
+       }
+
+       rfind = strrchr(*remoteurl, ':');
+       if (rfind) {
+               *rfind = '\0';
+               return 1;
+       }
+
+       if (is_relative || !strcmp(".", *remoteurl))
+               die(_("cannot strip one component off url '%s'"),
+                       *remoteurl);
+
+       free(*remoteurl);
+       *remoteurl = xstrdup(".");
+       return 0;
+}
+
+/*
+ * The `url` argument is the URL that navigates to the submodule origin
+ * repo. When relative, this URL is relative to the superproject origin
+ * URL repo. The `up_path` argument, if specified, is the relative
+ * path that navigates from the submodule working tree to the superproject
+ * working tree. Returns the origin URL of the submodule.
+ *
+ * Return either an absolute URL or filesystem path (if the superproject
+ * origin URL is an absolute URL or filesystem path, respectively) or a
+ * relative file system path (if the superproject origin URL is a relative
+ * file system path).
+ *
+ * When the output is a relative file system path, the path is either
+ * relative to the submodule working tree, if up_path is specified, or to
+ * the superproject working tree otherwise.
+ *
+ * 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
+ * http://a.com/b  ../../../../../c    .:c           error out
+ * NEEDSWORK: Given how chop_last_dir() works, this function is broken
+ * when a local part has a colon in its path component, too.
+ */
+static char *relative_url(const char *remote_url,
+                               const char *url,
+                               const char *up_path)
+{
+       int is_relative = 0;
+       int colonsep = 0;
+       char *out;
+       char *remoteurl = xstrdup(remote_url);
+       struct strbuf sb = STRBUF_INIT;
+       size_t len = strlen(remoteurl);
+
+       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;
+       else {
+               is_relative = 1;
+               /*
+                * Prepend a './' to ensure all relative
+                * remoteurls start with './' or '../'
+                */
+               if (!starts_with_dot_slash(remoteurl) &&
+                   !starts_with_dot_dot_slash(remoteurl)) {
+                       strbuf_reset(&sb);
+                       strbuf_addf(&sb, "./%s", remoteurl);
+                       free(remoteurl);
+                       remoteurl = strbuf_detach(&sb, NULL);
+               }
+       }
+       /*
+        * When the url starts with '../', remove that and the
+        * last directory in remoteurl.
+        */
+       while (url) {
+               if (starts_with_dot_dot_slash(url)) {
+                       url += 3;
+                       colonsep |= chop_last_dir(&remoteurl, is_relative);
+               } else if (starts_with_dot_slash(url))
+                       url += 2;
+               else
+                       break;
+       }
+       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))
+               out = xstrdup(sb.buf + 2);
+       else
+               out = xstrdup(sb.buf);
+       strbuf_reset(&sb);
+
+       if (!up_path || !is_relative)
+               return out;
+
+       strbuf_addf(&sb, "%s%s", up_path, out);
+       free(out);
+       return strbuf_detach(&sb, NULL);
+}
+
+static int resolve_relative_url(int argc, const char **argv, const char *prefix)
+{
+       char *remoteurl = NULL;
+       char *remote = get_default_remote();
+       const char *up_path = NULL;
+       char *res;
+       const char *url;
+       struct strbuf sb = STRBUF_INIT;
+
+       if (argc != 2 && argc != 3)
+               die("resolve-relative-url only accepts one or two arguments");
+
+       url = argv[1];
+       strbuf_addf(&sb, "remote.%s.url", remote);
+       free(remote);
+
+       if (git_config_get_string(sb.buf, &remoteurl))
+               /* the repository is its own authoritative upstream */
+               remoteurl = xgetcwd();
+
+       if (argc == 3)
+               up_path = argv[2];
+
+       res = relative_url(remoteurl, url, up_path);
+       puts(res);
+       free(res);
+       free(remoteurl);
+       return 0;
+}
+
+static int resolve_relative_url_test(int argc, const char **argv, const char *prefix)
+{
+       char *remoteurl, *res;
+       const char *up_path, *url;
+
+       if (argc != 4)
+               die("resolve-relative-url-test only accepts three arguments: <up_path> <remoteurl> <url>");
+
+       up_path = argv[1];
+       remoteurl = xstrdup(argv[2]);
+       url = argv[3];
+
+       if (!strcmp(up_path, "(null)"))
+               up_path = NULL;
+
+       res = relative_url(remoteurl, url, up_path);
+       puts(res);
+       free(res);
+       free(remoteurl);
+       return 0;
+}
 
 struct module_list {
        const struct cache_entry **entries;
@@ -82,10 +291,8 @@ static int module_list(int argc, const char **argv, const char *prefix)
        argc = parse_options(argc, argv, prefix, module_list_options,
                             git_submodule_helper_usage, 0);
 
-       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0) {
-               printf("#unmatched\n");
+       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
                return 1;
-       }
 
        for (i = 0; i < list.nr; i++) {
                const struct cache_entry *ce = list.entries[i];
@@ -93,13 +300,133 @@ 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);
        }
        return 0;
 }
 
+static void init_submodule(const char *path, const char *prefix, int quiet)
+{
+       const struct submodule *sub;
+       struct strbuf sb = STRBUF_INIT;
+       char *upd = NULL, *url = NULL, *displaypath;
+
+       /* Only loads from .gitmodules, no overlay with .git/config */
+       gitmodules_config();
+
+       if (prefix) {
+               strbuf_addf(&sb, "%s%s", prefix, path);
+               displaypath = strbuf_detach(&sb, NULL);
+       } else
+               displaypath = xstrdup(path);
+
+       sub = submodule_from_path(null_sha1, path);
+
+       if (!sub)
+               die(_("No url found for submodule path '%s' in .gitmodules"),
+                       displaypath);
+
+       /*
+        * Copy url setting when it is not set yet.
+        * To look up the url in .git/config, we must not fall back to
+        * .gitmodules, so look it up directly.
+        */
+       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)
+                       die(_("No url found for submodule path '%s' in .gitmodules"),
+                               displaypath);
+
+               /* Possibly a url relative to parent */
+               if (starts_with_dot_dot_slash(url) ||
+                   starts_with_dot_slash(url)) {
+                       char *remoteurl, *relurl;
+                       char *remote = get_default_remote();
+                       struct strbuf remotesb = STRBUF_INIT;
+                       strbuf_addf(&remotesb, "remote.%s.url", remote);
+                       free(remote);
+
+                       if (git_config_get_string(remotesb.buf, &remoteurl))
+                               /*
+                                * The repository is its own
+                                * authoritative upstream
+                                */
+                               remoteurl = xgetcwd();
+                       relurl = relative_url(remoteurl, url, NULL);
+                       strbuf_release(&remotesb);
+                       free(remoteurl);
+                       free(url);
+                       url = relurl;
+               }
+
+               if (git_config_set_gently(sb.buf, url))
+                       die(_("Failed to register url for submodule path '%s'"),
+                           displaypath);
+               if (!quiet)
+                       fprintf(stderr,
+                               _("Submodule '%s' (%s) registered for path '%s'\n"),
+                               sub->name, url, displaypath);
+       }
+
+       /* Copy "update" setting when it is not set yet */
+       strbuf_reset(&sb);
+       strbuf_addf(&sb, "submodule.%s.update", sub->name);
+       if (git_config_get_string(sb.buf, &upd) &&
+           sub->update_strategy.type != SM_UPDATE_UNSPECIFIED) {
+               if (sub->update_strategy.type == SM_UPDATE_COMMAND) {
+                       fprintf(stderr, _("warning: command update mode suggested for submodule '%s'\n"),
+                               sub->name);
+                       upd = xstrdup("none");
+               } else
+                       upd = xstrdup(submodule_strategy_to_string(&sub->update_strategy));
+
+               if (git_config_set_gently(sb.buf, upd))
+                       die(_("Failed to register update mode for submodule path '%s'"), displaypath);
+       }
+       strbuf_release(&sb);
+       free(displaypath);
+       free(url);
+       free(upd);
+}
+
+static int module_init(int argc, const char **argv, const char *prefix)
+{
+       struct pathspec pathspec;
+       struct module_list list = MODULE_LIST_INIT;
+       int quiet = 0;
+       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()
+       };
+
+       const char *const git_submodule_helper_usage[] = {
+               N_("git submodule--helper init [<path>]"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, prefix, module_init_options,
+                            git_submodule_helper_usage, 0);
+
+       if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
+               return 1;
+
+       for (i = 0; i < list.nr; i++)
+               init_submodule(list.entries[i]->name, prefix, quiet);
+
+       return 0;
+}
+
 static int module_name(int argc, const char **argv, const char *prefix)
 {
        const struct submodule *sub;
@@ -118,20 +445,27 @@ static int module_name(int argc, const char **argv, const char *prefix)
 
        return 0;
 }
+
 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(&cp);
+       struct child_process cp = CHILD_PROCESS_INIT;
 
        argv_array_push(&cp.args, "clone");
        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);
 
@@ -139,21 +473,116 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url
        argv_array_push(&cp.args, path);
 
        cp.git_cmd = 1;
-       cp.env = local_repo_env;
+       prepare_submodule_repo_env(&cp.env_array);
        cp.no_stdin = 1;
 
        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, ".git/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 *path = NULL, *name = NULL, *url = NULL;
-       const char *reference = NULL, *depth = NULL;
+       const char *name = NULL, *url = NULL, *depth = NULL;
        int quiet = 0;
+       int progress = 0;
        FILE *submodule_dot_git;
-       char *sm_gitdir, *cwd, *p;
+       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;
 
        struct option module_clone_options[] = {
                OPT_STRING(0, "prefix", &prefix,
@@ -168,33 +597,50 @@ 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()
        };
 
        const char *const git_submodule_helper_usage[] = {
                N_("git submodule--helper clone [--prefix=<path>] [--quiet] "
-                  "[--reference <repository>] [--name <name>] [--url <url>]"
-                  "[--depth <depth>] [--] [<path>...]"),
+                  "[--reference <repository>] [--name <name>] [--depth <depth>] "
+                  "--url <url> --path <path>"),
                NULL
        };
 
        argc = parse_options(argc, argv, prefix, module_clone_options,
                             git_submodule_helper_usage, 0);
 
+       if (argc || !url || !path || !*path)
+               usage_with_options(git_submodule_helper_usage,
+                                  module_clone_options);
+
        strbuf_addf(&sb, "%s/modules/%s", get_git_dir(), name);
-       sm_gitdir = strbuf_detach(&sb, NULL);
+       sm_gitdir = xstrdup(absolute_path(sb.buf));
+       strbuf_reset(&sb);
+
+       if (!is_absolute_path(path)) {
+               strbuf_addf(&sb, "%s/%s", get_git_work_tree(), path);
+               path = strbuf_detach(&sb, NULL);
+       } else
+               path = xstrdup(path);
 
        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 {
@@ -206,49 +652,430 @@ static int module_clone(int argc, const char **argv, const char *prefix)
        }
 
        /* Write a .git file in the submodule to redirect to the superproject. */
-       if (safe_create_leading_directories_const(path) < 0)
-               die(_("could not create directory '%s'"), path);
-
-       if (path && *path)
-               strbuf_addf(&sb, "%s/.git", path);
-       else
-               strbuf_addstr(&sb, ".git");
-
+       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(submodule_dot_git, "gitdir: %s\n",
-               relative_path(sm_gitdir, path, &rel_path));
+       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);
 
-       cwd = xgetcwd();
        /* Redirect the worktree of the submodule in the superproject's config */
-       if (!is_absolute_path(sm_gitdir)) {
-               strbuf_addf(&sb, "%s/%s", cwd, sm_gitdir);
-               free(sm_gitdir);
-               sm_gitdir = strbuf_detach(&sb, NULL);
-       }
-
-       strbuf_addf(&sb, "%s/%s", cwd, path);
        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(sb.buf, sm_gitdir, &rel_path));
+                              relative_path(path, sm_gitdir, &rel_path));
        strbuf_release(&sb);
        strbuf_release(&rel_path);
        free(sm_gitdir);
-       free(cwd);
+       free(path);
        free(p);
        return 0;
 }
 
+struct submodule_update_clone {
+       /* index into 'list', the list of submodules to look into for cloning */
+       int current;
+       struct module_list list;
+       unsigned warn_if_uninitialized : 1;
+
+       /* update parameter passed via commandline */
+       struct submodule_update_strategy update;
+
+       /* configuration parameters which are passed on to the children */
+       int progress;
+       int quiet;
+       int recommend_shallow;
+       struct string_list references;
+       const char *depth;
+       const char *recursive_prefix;
+       const char *prefix;
+
+       /* Machine-readable status lines to be consumed by git-submodule.sh */
+       struct string_list projectlines;
+
+       /* If we want to stop as fast as possible and return an error */
+       unsigned quickstop : 1;
+
+       /* failed clones to be retried again */
+       const struct cache_entry **failed_clones;
+       int failed_clones_nr, failed_clones_alloc;
+};
+#define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \
+       SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, \
+       NULL, NULL, NULL, \
+       STRING_LIST_INIT_DUP, 0, NULL, 0, 0}
+
+
+static void next_submodule_warn_missing(struct submodule_update_clone *suc,
+               struct strbuf *out, const char *displaypath)
+{
+       /*
+        * Only mention uninitialized submodules when their
+        * paths have been specified.
+        */
+       if (suc->warn_if_uninitialized) {
+               strbuf_addf(out,
+                       _("Submodule path '%s' not initialized"),
+                       displaypath);
+               strbuf_addch(out, '\n');
+               strbuf_addstr(out,
+                       _("Maybe you want to use 'update --init'?"));
+               strbuf_addch(out, '\n');
+       }
+}
+
+/**
+ * Determine whether 'ce' needs to be cloned. If so, prepare the 'child' to
+ * run the clone. Returns 1 if 'ce' needs to be cloned, 0 otherwise.
+ */
+static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
+                                          struct child_process *child,
+                                          struct submodule_update_clone *suc,
+                                          struct strbuf *out)
+{
+       const struct submodule *sub = NULL;
+       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)) {
+               if (suc->recursive_prefix)
+                       strbuf_addf(&sb, "%s/%s", suc->recursive_prefix, ce->name);
+               else
+                       strbuf_addstr(&sb, ce->name);
+               strbuf_addf(out, _("Skipping unmerged submodule %s"), sb.buf);
+               strbuf_addch(out, '\n');
+               goto cleanup;
+       }
+
+       sub = submodule_from_path(null_sha1, ce->name);
+
+       if (suc->recursive_prefix)
+               displaypath = relative_path(suc->recursive_prefix,
+                                           ce->name, &displaypath_sb);
+       else
+               displaypath = ce->name;
+
+       if (!sub) {
+               next_submodule_warn_missing(suc, out, displaypath);
+               goto cleanup;
+       }
+
+       if (suc->update.type == SM_UPDATE_NONE
+           || (suc->update.type == SM_UPDATE_UNSPECIFIED
+               && sub->update_strategy.type == SM_UPDATE_NONE)) {
+               strbuf_addf(out, _("Skipping submodule '%s'"), displaypath);
+               strbuf_addch(out, '\n');
+               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) {
+               next_submodule_warn_missing(suc, out, displaypath);
+               goto cleanup;
+       }
+
+       strbuf_reset(&sb);
+       strbuf_addf(&sb, "%s/.git", ce->name);
+       needs_cloning = !file_exists(sb.buf);
+
+       strbuf_reset(&sb);
+       strbuf_addf(&sb, "%06o %s %d %d\t%s\n", ce->ce_mode,
+                       oid_to_hex(&ce->oid), ce_stage(ce),
+                       needs_cloning, ce->name);
+       string_list_append(&suc->projectlines, sb.buf);
+
+       if (!needs_cloning)
+               goto cleanup;
+
+       child->git_cmd = 1;
+       child->no_stdin = 1;
+       child->stdout_to_stderr = 1;
+       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)
+               argv_array_pushl(&child->args, "--prefix", suc->prefix, NULL);
+       if (suc->recommend_shallow && sub->recommend_shallow == 1)
+               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->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);
+
+       return needs_cloning;
+}
+
+static int update_clone_get_next_task(struct child_process *child,
+                                     struct strbuf *err,
+                                     void *suc_cb,
+                                     void **idx_task_cb)
+{
+       struct submodule_update_clone *suc = suc_cb;
+       const struct cache_entry *ce;
+       int index;
+
+       for (; suc->current < suc->list.nr; suc->current++) {
+               ce = suc->list.entries[suc->current];
+               if (prepare_to_clone_next_submodule(ce, child, suc, err)) {
+                       int *p = xmalloc(sizeof(*p));
+                       *p = suc->current;
+                       *idx_task_cb = p;
+                       suc->current++;
+                       return 1;
+               }
+       }
+
+       /*
+        * The loop above tried cloning each submodule once, now try the
+        * stragglers again, which we can imagine as an extension of the
+        * entry list.
+        */
+       index = suc->current - suc->list.nr;
+       if (index < suc->failed_clones_nr) {
+               int *p;
+               ce = suc->failed_clones[index];
+               if (!prepare_to_clone_next_submodule(ce, child, suc, err)) {
+                       suc->current ++;
+                       strbuf_addstr(err, "BUG: submodule considered for "
+                                          "cloning, doesn't need cloning "
+                                          "any more?\n");
+                       return 0;
+               }
+               p = xmalloc(sizeof(*p));
+               *p = suc->current;
+               *idx_task_cb = p;
+               suc->current ++;
+               return 1;
+       }
+
+       return 0;
+}
+
+static int update_clone_start_failure(struct strbuf *err,
+                                     void *suc_cb,
+                                     void *idx_task_cb)
+{
+       struct submodule_update_clone *suc = suc_cb;
+       suc->quickstop = 1;
+       return 1;
+}
+
+static int update_clone_task_finished(int result,
+                                     struct strbuf *err,
+                                     void *suc_cb,
+                                     void *idx_task_cb)
+{
+       const struct cache_entry *ce;
+       struct submodule_update_clone *suc = suc_cb;
+
+       int *idxP = *(int**)idx_task_cb;
+       int idx = *idxP;
+       free(idxP);
+
+       if (!result)
+               return 0;
+
+       if (idx < suc->list.nr) {
+               ce  = suc->list.entries[idx];
+               strbuf_addf(err, _("Failed to clone '%s'. Retry scheduled"),
+                           ce->name);
+               strbuf_addch(err, '\n');
+               ALLOC_GROW(suc->failed_clones,
+                          suc->failed_clones_nr + 1,
+                          suc->failed_clones_alloc);
+               suc->failed_clones[suc->failed_clones_nr++] = ce;
+               return 0;
+       } else {
+               idx -= suc->list.nr;
+               ce  = suc->failed_clones[idx];
+               strbuf_addf(err, _("Failed to clone '%s' a second time, aborting"),
+                           ce->name);
+               strbuf_addch(err, '\n');
+               suc->quickstop = 1;
+               return 1;
+       }
+
+       return 0;
+}
+
+static int update_clone(int argc, const char **argv, const char *prefix)
+{
+       const char *update = NULL;
+       int max_jobs = -1;
+       struct string_list_item *item;
+       struct pathspec pathspec;
+       struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
+
+       struct option module_update_clone_options[] = {
+               OPT_STRING(0, "prefix", &prefix,
+                          N_("path"),
+                          N_("path into the working tree")),
+               OPT_STRING(0, "recursive-prefix", &suc.recursive_prefix,
+                          N_("path"),
+                          N_("path into the working tree, across nested "
+                             "submodule boundaries")),
+               OPT_STRING(0, "update", &update,
+                          N_("string"),
+                          N_("rebase, merge, checkout or none")),
+               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 "
+                             "specified number of revisions")),
+               OPT_INTEGER('j', "jobs", &max_jobs,
+                           N_("parallel jobs")),
+               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()
+       };
+
+       const char *const git_submodule_helper_usage[] = {
+               N_("git submodule--helper update_clone [--prefix=<path>] [<path>...]"),
+               NULL
+       };
+       suc.prefix = prefix;
+
+       argc = parse_options(argc, argv, prefix, module_update_clone_options,
+                            git_submodule_helper_usage, 0);
+
+       if (update)
+               if (parse_submodule_update_strategy(update, &suc.update) < 0)
+                       die(_("bad value for update parameter"));
+
+       if (module_list_compute(argc, argv, prefix, &pathspec, &suc.list) < 0)
+               return 1;
+
+       if (pathspec.nr)
+               suc.warn_if_uninitialized = 1;
+
+       /* Overlay the parsed .gitmodules file with .git/config */
+       gitmodules_config();
+       git_config(submodule_config, NULL);
+
+       if (max_jobs < 0)
+               max_jobs = parallel_submodules();
+
+       run_processes_parallel(max_jobs,
+                              update_clone_get_next_task,
+                              update_clone_start_failure,
+                              update_clone_task_finished,
+                              &suc);
+
+       /*
+        * We saved the output and put it out all at once now.
+        * That means:
+        * - the listener does not have to interleave their (checkout)
+        *   work with our fetching.  The writes involved in a
+        *   checkout involve more straightforward sequential I/O.
+        * - the listener can avoid doing any work if fetching failed.
+        */
+       if (suc.quickstop)
+               return 1;
+
+       for_each_string_list_item(item, &suc.projectlines)
+               utf8_fprintf(stdout, "%s", item->string);
+
+       return 0;
+}
+
+static int resolve_relative_path(int argc, const char **argv, const char *prefix)
+{
+       struct strbuf sb = STRBUF_INIT;
+       if (argc != 3)
+               die("submodule--helper relative-path takes exactly 2 arguments, got %d", argc);
+
+       printf("%s", relative_path(argv[1], argv[2], &sb));
+       strbuf_release(&sb);
+       return 0;
+}
+
+static const char *remote_submodule_branch(const char *path)
+{
+       const struct submodule *sub;
+       gitmodules_config();
+       git_config(submodule_config, NULL);
+
+       sub = submodule_from_path(null_sha1, path);
+       if (!sub)
+               return NULL;
+
+       if (!sub->branch)
+               return "master";
+
+       if (!strcmp(sub->branch, ".")) {
+               unsigned char sha1[20];
+               const char *refname = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
+
+               if (!refname)
+                       die(_("No such ref: %s"), "HEAD");
+
+               /* detached HEAD */
+               if (!strcmp(refname, "HEAD"))
+                       die(_("Submodule (%s) branch configured to inherit "
+                             "branch from superproject, but the superproject "
+                             "is not on any branch"), sub->name);
+
+               if (!skip_prefix(refname, "refs/heads/", &refname))
+                       die(_("Expecting a full ref name, got %s"), refname);
+               return refname;
+       }
+
+       return sub->branch;
+}
+
+static int resolve_remote_submodule_branch(int argc, const char **argv,
+               const char *prefix)
+{
+       const char *ret;
+       struct strbuf sb = STRBUF_INIT;
+       if (argc != 2)
+               die("submodule--helper remote-branch takes exactly one arguments, got %d", argc);
+
+       ret = remote_submodule_branch(argv[1]);
+       if (!ret)
+               die("submodule %s doesn't exist", argv[1]);
+
+       printf("%s", ret);
+       strbuf_release(&sb);
+       return 0;
+}
+
 struct cmd_struct {
        const char *cmd;
        int (*fn)(int, const char **, const char *);
@@ -258,19 +1085,25 @@ 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}
 };
 
 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
 {
        int i;
        if (argc < 2)
-               die(_("fatal: submodule--helper subcommand must be "
+               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))
                        return commands[i].fn(argc - 1, argv + 1, prefix);
 
-       die(_("fatal: '%s' is not a valid submodule--helper "
+       die(_("'%s' is not a valid submodule--helper "
              "subcommand"), argv[1]);
 }
index 9c29a64e4331e1e45b4467829ba950006b673818..96eed944683a45c33fa5d4a05414ae56406fafca 100644 (file)
@@ -56,6 +56,8 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)
                ret = check_symref(argv[0], 1, 0, 0);
                if (ret)
                        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);
        }
 
index 1705c9466546c7de52b12d3fbafbbe7b6d43cf4e..50e4ae5678c21f348c3ce0e0d0662c9d5f995847 100644 (file)
@@ -29,6 +29,7 @@ static const char * const git_tag_usage[] = {
 };
 
 static unsigned int colopts;
+static int force_sign_annotate;
 
 static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
 {
@@ -104,13 +105,7 @@ static int delete_tag(const char *name, const char *ref,
 static int verify_tag(const char *name, const char *ref,
                                const unsigned char *sha1)
 {
-       const char *argv_verify_tag[] = {"verify-tag",
-                                       "-v", "SHA1_HEX", NULL};
-       argv_verify_tag[2] = sha1_to_hex(sha1);
-
-       if (run_command_v_opt(argv_verify_tag, RUN_GIT_CMD))
-               return error(_("could not verify the tag '%s'"), name);
-       return 0;
+       return gpg_verify_tag(sha1, name, GPG_VERIFY_VERBOSE);
 }
 
 static int do_sign(struct strbuf *buffer)
@@ -166,6 +161,11 @@ static int git_tag_config(const char *var, const char *value, void *cb)
        status = git_gpg_config(var, value, cb);
        if (status)
                return status;
+       if (!strcmp(var, "tag.forcesignannotated")) {
+               force_sign_annotate = git_config_bool(var, value);
+               return 0;
+       }
+
        if (starts_with(var, "column."))
                return git_column_config(var, value, "tag", &colopts);
        return git_default_config(var, value, cb);
@@ -327,7 +327,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        char *cleanup_arg = NULL;
        int create_reflog = 0;
        int annotate = 0, force = 0;
-       int cmdmode = 0;
+       int cmdmode = 0, create_tag_object = 0;
        const char *msgfile = NULL, *keyid = NULL;
        struct msg_arg msg = { 0, STRBUF_INIT };
        struct ref_transaction *transaction;
@@ -385,12 +385,12 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                opt.sign = 1;
                set_signing_key(keyid);
        }
-       if (opt.sign)
-               annotate = 1;
+       create_tag_object = (opt.sign || annotate || msg.given || msgfile);
+
        if (argc == 0 && !cmdmode)
                cmdmode = 'l';
 
-       if ((annotate || msg.given || msgfile || force) && (cmdmode != 0))
+       if ((create_tag_object || force) && (cmdmode != 0))
                usage_with_options(git_tag_usage, options);
 
        finalize_colopts(&colopts, -1);
@@ -431,7 +431,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        if (msg.given || msgfile) {
                if (msg.given && msgfile)
                        die(_("only one -F or -m option is allowed."));
-               annotate = 1;
                if (msg.given)
                        strbuf_addbuf(&buf, &(msg.buf));
                else {
@@ -474,8 +473,11 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        else
                die(_("Invalid cleanup mode %s"), cleanup_arg);
 
-       if (annotate)
+       if (create_tag_object) {
+               if (force_sign_annotate && !annotate)
+                       opt.sign = 1;
                create_tag(object, tag, &buf, &opt, prev, object);
+       }
 
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
index 875e7ed99820998aa5d0e18f73b59763201cdb6c..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)
@@ -355,7 +358,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
                        return; /* we are done */
                else {
                        /* cannot resolve yet --- queue it */
-                       hashcpy(obj_list[nr].sha1, null_sha1);
+                       hashclr(obj_list[nr].sha1);
                        add_delta_to_list(nr, base_sha1, 0, delta_data, delta_size);
                        return;
                }
@@ -406,7 +409,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
                         * The delta base object is itself a delta that
                         * has not been resolved yet.
                         */
-                       hashcpy(obj_list[nr].sha1, null_sha1);
+                       hashclr(obj_list[nr].sha1);
                        add_delta_to_list(nr, null_sha1, base_offset, delta_data, delta_size);
                        return;
                }
@@ -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 1c94ca59bfcd756c94d86ef46592528e8fbfdcb1..f3f07e7f1cb2d952144bf98969b481dc331155bf 100644 (file)
@@ -255,7 +255,7 @@ static int process_lstat_error(const char *path, int err)
 {
        if (err == ENOENT || err == ENOTDIR)
                return remove_one_path(path);
-       return error("lstat(\"%s\"): %s", path, strerror(errno));
+       return error("lstat(\"%s\"): %s", path, strerror(err));
 }
 
 static int add_one_path(const struct cache_entry *old, const char *path, int len, struct stat *st)
@@ -275,7 +275,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 +312,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 +321,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 +347,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 +390,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 +403,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;
@@ -419,30 +419,18 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
        return 0;
 }
 
-static void chmod_path(int flip, const char *path)
+static void chmod_path(char flip, const char *path)
 {
        int pos;
        struct cache_entry *ce;
-       unsigned int mode;
 
        pos = cache_name_pos(path, strlen(path));
        if (pos < 0)
                goto fail;
        ce = active_cache[pos];
-       mode = ce->ce_mode;
-       if (!S_ISREG(mode))
-               goto fail;
-       switch (flip) {
-       case '+':
-               ce->ce_mode |= 0111; break;
-       case '-':
-               ce->ce_mode &= ~0111; break;
-       default:
+       if (chmod_cache_entry(ce, flip) < 0)
                goto fail;
-       }
-       cache_tree_invalidate_path(&the_index, path);
-       ce->ce_flags |= CE_UPDATE_IN_BASE;
-       active_cache_changed |= CE_ENTRY_CHANGED;
+
        report("chmod %cx '%s'", flip, path);
        return;
  fail:
@@ -487,7 +475,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;
@@ -516,7 +504,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') {
@@ -529,7 +517,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;
@@ -557,8 +546,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);
                }
@@ -576,19 +565,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;
@@ -601,7 +590,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;
@@ -651,14 +640,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);
@@ -683,9 +672,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);
        }
@@ -725,7 +714,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.
                 */
@@ -740,10 +729,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 */
                }
@@ -759,7 +748,7 @@ static int do_reupdate(int ac, const char **av,
                if (save_nr != active_nr)
                        goto redo;
        }
-       free_pathspec(&pathspec);
+       clear_pathspec(&pathspec);
        return 0;
 }
 
@@ -807,7 +796,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;
@@ -822,21 +811,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--;
@@ -845,8 +834,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;
@@ -1127,9 +1116,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;
@@ -1139,14 +1128,14 @@ 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;
        default:
-               die("Bug: bad untracked_cache value: %d", untracked_cache);
+               die("BUG: bad untracked_cache value: %d", untracked_cache);
        }
 
        if (active_cache_changed) {
index dbfe14f3fec3f8122e4855727bd7d1c3e4b3073e..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) {
@@ -104,8 +104,7 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
                pfd[1].events = POLLIN;
                if (poll(pfd, 2, -1) < 0) {
                        if (errno != EINTR) {
-                               error("poll failed resuming: %s",
-                                     strerror(errno));
+                               error_errno("poll failed resuming");
                                sleep(1);
                        }
                        continue;
index 00663f6a3003976aaa33f08ae7309fc190ea4748..99f8148cf79bac1d636bfe35a93282f3da2ebfd7 100644 (file)
@@ -18,55 +18,6 @@ static const char * const verify_tag_usage[] = {
                NULL
 };
 
-static int run_gpg_verify(const char *buf, unsigned long size, unsigned flags)
-{
-       struct signature_check sigc;
-       int len;
-       int ret;
-
-       memset(&sigc, 0, sizeof(sigc));
-
-       len = parse_signature(buf, size);
-
-       if (size == len) {
-               if (flags & GPG_VERIFY_VERBOSE)
-                       write_in_full(1, buf, len);
-               return error("no signature found");
-       }
-
-       ret = check_signature(buf, len, buf + len, size - len, &sigc);
-       print_signature_buffer(&sigc, flags);
-
-       signature_check_clear(&sigc);
-       return ret;
-}
-
-static int verify_tag(const char *name, unsigned flags)
-{
-       enum object_type type;
-       unsigned char sha1[20];
-       char *buf;
-       unsigned long size;
-       int ret;
-
-       if (get_sha1(name, sha1))
-               return error("tag '%s' not found.", name);
-
-       type = sha1_object_info(sha1, NULL);
-       if (type != OBJ_TAG)
-               return error("%s: cannot verify a non-tag object of type %s.",
-                               name, typename(type));
-
-       buf = read_sha1_file(sha1, &type, &size);
-       if (!buf)
-               return error("%s: unable to read file.", name);
-
-       ret = run_gpg_verify(buf, size, flags);
-
-       free(buf);
-       return ret;
-}
-
 static int git_verify_tag_config(const char *var, const char *value, void *cb)
 {
        int status = git_gpg_config(var, value, cb);
@@ -95,11 +46,13 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
        if (verbose)
                flags |= GPG_VERIFY_VERBOSE;
 
-       /* sometimes the program was terminated because this signal
-        * was received in the process of writing the gpg input: */
-       signal(SIGPIPE, SIG_IGN);
-       while (i < argc)
-               if (verify_tag(argv[i++], flags))
+       while (i < argc) {
+               unsigned char sha1[20];
+               const char *name = argv[i++];
+               if (get_sha1(name, sha1))
+                       had_error = !!error("tag '%s' not found.", name);
+               else if (gpg_verify_tag(sha1, name, flags))
                        had_error = 1;
+       }
        return had_error;
 }
index 38b56096bd3b914d1128e0bebb5c964a3cdd1b74..9a97e37a3fa53e730f0963f8f00bbca9f6d6efc6 100644 (file)
 
 static const char * const worktree_usage[] = {
        N_("git worktree add [<options>] <path> [<branch>]"),
-       N_("git worktree prune [<options>]"),
        N_("git worktree list [<options>]"),
+       N_("git worktree lock [<options>] <path>"),
+       N_("git worktree prune [<options>]"),
+       N_("git worktree unlock <path>"),
        NULL
 };
 
 struct add_opts {
        int force;
        int detach;
+       int checkout;
        const char *new_branch;
        int force_new_branch;
 };
@@ -94,7 +97,7 @@ static void prune_worktrees(void)
        if (!dir)
                return;
        while ((d = readdir(dir)) != NULL) {
-               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+               if (is_dot_or_dotdot(d->d_name))
                        continue;
                strbuf_reset(&reason);
                if (!prune_worktree(d->d_name, &reason))
@@ -109,7 +112,7 @@ static void prune_worktrees(void)
                if (ret < 0 && errno == ENOTDIR)
                        ret = unlink(path.buf);
                if (ret)
-                       error(_("failed to remove: %s"), strerror(errno));
+                       error_errno(_("failed to remove '%s'"), path.buf);
        }
        closedir(dir);
        if (!show_only)
@@ -191,7 +194,7 @@ static int add_worktree(const char *path, const char *refname,
        struct strbuf sb = STRBUF_INIT;
        const char *name;
        struct stat st;
-       struct child_process cp;
+       struct child_process cp = CHILD_PROCESS_INIT;
        struct argv_array child_env = ARGV_ARRAY_INIT;
        int counter = 0, len, ret;
        struct strbuf symref = STRBUF_INIT;
@@ -204,7 +207,7 @@ static int add_worktree(const char *path, const char *refname,
        if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) &&
                 ref_exists(symref.buf)) { /* it's a branch */
                if (!opts->force)
-                       die_if_checked_out(symref.buf);
+                       die_if_checked_out(symref.buf, 0);
        } else { /* must be a commit */
                commit = lookup_commit_reference_by_name(refname);
                if (!commit)
@@ -261,7 +264,7 @@ static int add_worktree(const char *path, const char *refname,
         */
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
-       write_file(sb.buf, "0000000000000000000000000000000000000000");
+       write_file(sb.buf, "%s", sha1_to_hex(null_sha1));
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
        write_file(sb.buf, "../..");
@@ -270,7 +273,6 @@ static int add_worktree(const char *path, const char *refname,
 
        argv_array_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf);
        argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
-       memset(&cp, 0, sizeof(cp));
        cp.git_cmd = 1;
 
        if (commit)
@@ -284,18 +286,22 @@ static int add_worktree(const char *path, const char *refname,
        if (ret)
                goto done;
 
-       cp.argv = NULL;
-       argv_array_clear(&cp.args);
-       argv_array_pushl(&cp.args, "reset", "--hard", NULL);
-       cp.env = child_env.argv;
-       ret = run_command(&cp);
-       if (!ret) {
-               is_junk = 0;
-               free(junk_work_tree);
-               free(junk_git_dir);
-               junk_work_tree = NULL;
-               junk_git_dir = NULL;
+       if (opts->checkout) {
+               cp.argv = NULL;
+               argv_array_clear(&cp.args);
+               argv_array_pushl(&cp.args, "reset", "--hard", NULL);
+               cp.env = child_env.argv;
+               ret = run_command(&cp);
+               if (ret)
+                       goto done;
        }
+
+       is_junk = 0;
+       free(junk_work_tree);
+       free(junk_git_dir);
+       junk_work_tree = NULL;
+       junk_git_dir = NULL;
+
 done:
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%s/locked", sb_repo.buf);
@@ -320,19 +326,24 @@ static int add(int ac, const char **av, const char *prefix)
                OPT_STRING('B', NULL, &new_branch_force, N_("branch"),
                           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_END()
        };
 
        memset(&opts, 0, sizeof(opts));
+       opts.checkout = 1;
        ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
        if (!!opts.detach + !!opts.new_branch + !!new_branch_force > 1)
                die(_("-b, -B, and --detach are mutually exclusive"));
        if (ac < 1 || ac > 2)
                usage_with_options(worktree_usage, options);
 
-       path = prefix ? prefix_filename(prefix, strlen(prefix), av[0]) : av[0];
+       path = prefix_filename(prefix, strlen(prefix), av[0]);
        branch = ac < 2 ? "HEAD" : av[1];
 
+       if (!strcmp(branch, "-"))
+               branch = "@{-1}";
+
        opts.force_new_branch = !!new_branch_force;
        if (opts.force_new_branch) {
                struct strbuf symref = STRBUF_INIT;
@@ -342,7 +353,7 @@ static int add(int ac, const char **av, const char *prefix)
                if (!opts.force &&
                    !strbuf_check_branch_ref(&symref, opts.new_branch) &&
                    ref_exists(symref.buf))
-                       die_if_checked_out(symref.buf);
+                       die_if_checked_out(symref.buf, 0);
                strbuf_release(&symref);
        }
 
@@ -353,8 +364,7 @@ static int add(int ac, const char **av, const char *prefix)
        }
 
        if (opts.new_branch) {
-               struct child_process cp;
-               memset(&cp, 0, sizeof(cp));
+               struct child_process cp = CHILD_PROCESS_INIT;
                cp.git_cmd = 1;
                argv_array_push(&cp.args, "branch");
                if (opts.force_new_branch)
@@ -378,7 +388,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");
@@ -396,10 +406,12 @@ 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)
+               if (wt->is_detached)
+                       strbuf_addstr(&sb, "(detached HEAD)");
+               else if (wt->head_ref)
                        strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(wt->head_ref, 0));
                else
-                       strbuf_addstr(&sb, "(detached HEAD)");
+                       strbuf_addstr(&sb, "(error)");
        }
        printf("%s\n", sb.buf);
 
@@ -435,7 +447,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)
@@ -452,19 +464,87 @@ static int list(int ac, const char **av, const char *prefix)
        return 0;
 }
 
+static int lock_worktree(int ac, const char **av, const char *prefix)
+{
+       const char *reason = "", *old_reason;
+       struct option options[] = {
+               OPT_STRING(0, "reason", &reason, N_("string"),
+                          N_("reason for locking")),
+               OPT_END()
+       };
+       struct worktree **worktrees, *wt;
+
+       ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+       if (ac != 1)
+               usage_with_options(worktree_usage, options);
+
+       worktrees = get_worktrees(0);
+       wt = find_worktree(worktrees, prefix, av[0]);
+       if (!wt)
+               die(_("'%s' is not a working tree"), av[0]);
+       if (is_main_worktree(wt))
+               die(_("The main working tree cannot be locked or unlocked"));
+
+       old_reason = is_worktree_locked(wt);
+       if (old_reason) {
+               if (*old_reason)
+                       die(_("'%s' is already locked, reason: %s"),
+                           av[0], old_reason);
+               die(_("'%s' is already locked"), av[0]);
+       }
+
+       write_file(git_common_path("worktrees/%s/locked", wt->id),
+                  "%s", reason);
+       free_worktrees(worktrees);
+       return 0;
+}
+
+static int unlock_worktree(int ac, const char **av, const char *prefix)
+{
+       struct option options[] = {
+               OPT_END()
+       };
+       struct worktree **worktrees, *wt;
+       int ret;
+
+       ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+       if (ac != 1)
+               usage_with_options(worktree_usage, options);
+
+       worktrees = get_worktrees(0);
+       wt = find_worktree(worktrees, prefix, av[0]);
+       if (!wt)
+               die(_("'%s' is not a working tree"), av[0]);
+       if (is_main_worktree(wt))
+               die(_("The main working tree cannot be locked or unlocked"));
+       if (!is_worktree_locked(wt))
+               die(_("'%s' is not locked"), av[0]);
+       ret = unlink_or_warn(git_common_path("worktrees/%s/locked", wt->id));
+       free_worktrees(worktrees);
+       return ret;
+}
+
 int cmd_worktree(int ac, const char **av, const char *prefix)
 {
        struct option options[] = {
                OPT_END()
        };
 
+       git_config(git_default_config, NULL);
+
        if (ac < 2)
                usage_with_options(worktree_usage, options);
+       if (!prefix)
+               prefix = "";
        if (!strcmp(av[1], "add"))
                return add(ac - 1, av + 1, prefix);
        if (!strcmp(av[1], "prune"))
                return prune(ac - 1, av + 1, prefix);
        if (!strcmp(av[1], "list"))
                return list(ac - 1, av + 1, prefix);
+       if (!strcmp(av[1], "lock"))
+               return lock_worktree(ac - 1, av + 1, prefix);
+       if (!strcmp(av[1], "unlock"))
+               return unlock_worktree(ac - 1, av + 1, prefix);
        usage_with_options(worktree_usage, options);
 }
index 506ac49691bb7d53b07baf2a1d2581bf6f7ca82a..bbf4efa0a0a38ac8f13ee1c2178eff1d2127c802 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -435,12 +435,14 @@ int create_bundle(struct bundle_header *header, const char *path,
 
        /* write prerequisites */
        if (compute_and_write_prerequisites(bundle_fd, &revs, argc, argv))
-               return -1;
+               goto err;
 
        argc = setup_revisions(argc, argv, &revs, NULL);
 
-       if (argc > 1)
-               return error(_("unrecognized argument: %s"), argv[1]);
+       if (argc > 1) {
+               error(_("unrecognized argument: %s"), argv[1]);
+               goto err;
+       }
 
        object_array_remove_duplicates(&revs.pending);
 
@@ -448,17 +450,26 @@ int create_bundle(struct bundle_header *header, const char *path,
        if (!ref_count)
                die(_("Refusing to create empty bundle."));
        else if (ref_count < 0)
-               return -1;
+               goto err;
 
        /* write pack */
-       if (write_pack_data(bundle_fd, &revs))
-               return -1;
+       if (write_pack_data(bundle_fd, &revs)) {
+               bundle_fd = -1; /* already closed by the above call */
+               goto err;
+       }
 
        if (!bundle_to_stdout) {
                if (commit_lock_file(&lock))
                        die_errno(_("cannot create '%s'"), path);
        }
        return 0;
+err:
+       if (!bundle_to_stdout) {
+               if (0 <= bundle_fd)
+                       close(bundle_fd);
+               rollback_lock_file(&lock);
+       }
+       return -1;
 }
 
 int unbundle(struct bundle_header *header, int bundle_fd, int flags)
index 3ebf9c3aa44eb2ab25f573192b6449f63311ffd7..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)
@@ -319,12 +319,13 @@ static int update_one(struct cache_tree *it,
        i = 0;
        while (i < entries) {
                const struct cache_entry *ce = cache[i];
-               struct cache_tree_sub *sub;
+               struct cache_tree_sub *sub = NULL;
                const char *path, *slash;
                int pathlen, entlen;
                const unsigned char *sha1;
                unsigned mode;
                int expected_missing = 0;
+               int contains_ita = 0;
 
                path = ce->name;
                pathlen = ce_namelen(ce);
@@ -341,13 +342,14 @@ static int update_one(struct cache_tree *it,
                        i += sub->count;
                        sha1 = sub->cache_tree->sha1;
                        mode = S_IFDIR;
-                       if (sub->cache_tree->entry_count < 0) {
+                       contains_ita = sub->cache_tree->entry_count < 0;
+                       if (contains_ita) {
                                to_invalidate = 1;
                                expected_missing = 1;
                        }
                }
                else {
-                       sha1 = ce->sha1;
+                       sha1 = ce->oid.hash;
                        mode = ce->ce_mode;
                        entlen = pathlen - baselen;
                        i++;
@@ -375,11 +377,17 @@ static int update_one(struct cache_tree *it,
                 * they are not part of generated trees. Invalidate up
                 * to root to force cache-tree users to read elsewhere.
                 */
-               if (ce_intent_to_add(ce)) {
+               if (!sub && ce_intent_to_add(ce)) {
                        to_invalidate = 1;
                        continue;
                }
 
+               /*
+                * "sub" can be an empty tree if all subentries are i-t-a.
+                */
+               if (contains_ita && !hashcmp(sha1, EMPTY_TREE_SHA1_BIN))
+                       continue;
+
                strbuf_grow(&buffer, entlen + 100);
                strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
                strbuf_add(&buffer, sha1, 20);
@@ -663,7 +671,7 @@ static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
                        cnt++;
                else {
                        struct cache_tree_sub *sub;
-                       struct tree *subtree = lookup_tree(entry.sha1);
+                       struct tree *subtree = lookup_tree(entry.oid->hash);
                        if (!subtree->object.parsed)
                                parse_tree(subtree);
                        sub = cache_tree_sub(it, entry.path);
@@ -710,7 +718,7 @@ int cache_tree_matches_traversal(struct cache_tree *root,
 
        it = find_cache_tree_from_traversal(root, info);
        it = cache_tree_find(it, ent->path);
-       if (it && it->entry_count > 0 && !hashcmp(ent->sha1, it->sha1))
+       if (it && it->entry_count > 0 && !hashcmp(ent->oid->hash, it->sha1))
                return it->entry_count;
        return 0;
 }
diff --git a/cache.h b/cache.h
index b829410f6da0afc14353b4621d2fdf874181a9f7..a50a61a19787de94daa9d66caa9fcccca58081fe 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -173,7 +173,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 */
 };
 
@@ -369,6 +369,7 @@ extern void free_name_hash(struct index_state *istate);
 #define remove_file_from_cache(path) remove_file_from_index(&the_index, (path))
 #define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags))
 #define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags))
+#define chmod_cache_entry(ce, flip) chmod_index_entry(&the_index, (ce), (flip))
 #define refresh_cache(flags) refresh_index(&the_index, (flags), NULL, NULL, NULL)
 #define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options))
 #define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options))
@@ -408,6 +409,7 @@ 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 DEFAULT_GIT_DIR_ENVIRONMENT ".git"
 #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
 #define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
@@ -432,6 +434,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
@@ -453,6 +456,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);
@@ -468,6 +477,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);
 
 /*
@@ -519,9 +529,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);
@@ -584,6 +595,7 @@ extern int remove_file_from_index(struct index_state *, const char *path);
 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);
@@ -632,6 +644,7 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
 #define REFRESH_IGNORE_SUBMODULES      0x0010  /* ignore submodules */
 #define REFRESH_IN_PORCELAIN   0x0020  /* user friendly output, not "needs update" */
 extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);
+extern struct cache_entry *refresh_cache_entry(struct cache_entry *, unsigned int);
 
 extern void update_index_if_able(struct index_state *, struct lock_file *);
 
@@ -651,10 +664,10 @@ extern int prefer_symlink_refs;
 extern int log_all_ref_updates;
 extern int warn_ambiguous_refs;
 extern int warn_on_object_refname_ambiguity;
-extern int shared_repository;
 extern const char *apply_default_whitespace;
 extern const char *apply_default_ignorewhitespace;
 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;
@@ -664,6 +677,16 @@ 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
  * initialized to true unless --no-replace-object is used or
@@ -698,6 +721,14 @@ extern int ref_paranoia;
 extern char comment_line_char;
 extern int auto_comment_line_char;
 
+/* Windows only */
+enum hide_dotfiles_type {
+       HIDE_DOTFILES_FALSE = 0,
+       HIDE_DOTFILES_TRUE,
+       HIDE_DOTFILES_DOTGITONLY
+};
+extern enum hide_dotfiles_type hide_dotfiles;
+
 enum branch_track {
        BRANCH_TRACK_UNSPECIFIED = -1,
        BRANCH_TRACK_NEVER = 0,
@@ -745,9 +776,39 @@ extern int grafts_replace_parents;
  */
 #define GIT_REPO_VERSION 0
 #define GIT_REPO_VERSION_READ 1
-extern int repository_format_version;
 extern int repository_format_precious_objects;
-extern int check_repository_format(void);
+
+struct repository_format {
+       int version;
+       int precious_objects;
+       int is_bare;
+       char *work_tree;
+       struct string_list unknown_extensions;
+};
+
+/*
+ * Read the repository format characteristics from the config file "path" into
+ * "format" struct. Returns the numeric version. On error, -1 is returned,
+ * format->version is set to -1, and all other fields in the struct are
+ * undefined.
+ */
+int read_repository_format(struct repository_format *format, const char *path);
+
+/*
+ * Verify that the repository described by repository_format is something we
+ * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
+ * any errors encountered.
+ */
+int verify_repository_format(const struct repository_format *format,
+                            struct strbuf *err);
+
+/*
+ * Check the repository format version in the path found in get_git_dir(),
+ * and die if it is a version we don't understand. Generally one would
+ * set_git_dir() before calling this, and use it only for "are we in a valid
+ * repo?".
+ */
+extern void check_repository_format(void);
 
 #define MTIME_CHANGED  0x0001
 #define CTIME_CHANGED  0x0002
@@ -767,15 +828,18 @@ extern int check_repository_format(void);
  */
 extern const char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
 extern const char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
+extern const char *git_common_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
 
 extern char *mksnpath(char *buf, size_t n, const char *fmt, ...)
        __attribute__((format (printf, 3, 4)));
 extern void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
        __attribute__((format (printf, 2, 3)));
+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)));
@@ -839,8 +903,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
@@ -908,25 +972,40 @@ 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);
+}
+
 
-int git_mkstemps(char *path, size_t n, const char *template, int suffix_len);
+int git_mkstemp(char *path, size_t n, const char *template);
 
 /* set default permissions by passing mode arguments to open(2) */
 int git_mkstemps_mode(char *pattern, int suffix_len, int mode);
@@ -961,6 +1040,11 @@ int adjust_shared_perm(const char *path);
  * directory while we were working.  To be robust against this kind of
  * race, callers might want to try invoking the function again when it
  * returns SCLD_VANISHED.
+ *
+ * safe_create_leading_directories() temporarily changes path while it
+ * is working but restores it before returning.
+ * safe_create_leading_directories_const() doesn't modify path, even
+ * temporarily.
  */
 enum scld_error {
        SCLD_OK = 0,
@@ -1041,7 +1125,7 @@ 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(const char *name);
 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);
@@ -1073,6 +1157,7 @@ static inline int has_sha1_file(const unsigned char *sha1)
 
 /* Same as the above, except for struct object_id. */
 extern int has_object_file(const struct object_id *oid);
+extern int has_object_file_with_flags(const struct object_id *oid, int flags);
 
 /*
  * Return true iff an alternate object database has a loose object
@@ -1091,10 +1176,23 @@ static inline unsigned int hexval(unsigned char c)
        return hexval_table[c];
 }
 
+/*
+ * Convert two consecutive hexadecimal digits into a char.  Return a
+ * negative value on error.  Don't run over the end of short strings.
+ */
+static inline int hex2chr(const char *s)
+{
+       int val = hexval(s[0]);
+       return (val < 0) ? val : (val << 4) | hexval(s[1]);
+}
+
 /* Convert to/from hex/sha1 representation */
 #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];
@@ -1115,6 +1213,11 @@ struct object_context {
 #define GET_SHA1_FOLLOW_SYMLINKS 0100
 #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);
@@ -1124,9 +1227,13 @@ 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_oid(const char *str, struct object_id *oid);
+
 typedef int each_abbrev_fn(const unsigned char *sha1, 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.
@@ -1149,11 +1256,12 @@ extern int get_oid_hex(const char *hex, struct object_id *sha1);
  *   printf("%s -> %s", sha1_to_hex(one), sha1_to_hex(two));
  */
 extern char *sha1_to_hex_r(char *out, const unsigned char *sha1);
+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);
+extern int get_oid_mb(const char *str, struct object_id *oid);
 
 extern int validate_headref(const char *ref);
 
@@ -1179,7 +1287,8 @@ struct date_mode {
                DATE_ISO8601_STRICT,
                DATE_RFC2822,
                DATE_STRFTIME,
-               DATE_RAW
+               DATE_RAW,
+               DATE_UNIX
        } type;
        const char *strftime_fmt;
        int local;
@@ -1218,6 +1327,7 @@ extern const char *ident_default_email(void);
 extern const char *git_editor(void);
 extern const char *git_pager(int stdout_is_tty);
 extern int git_ident_config(const char *, const char *, void *);
+extern void reset_ident_date(void);
 
 struct ident_split {
        const char *name_begin;
@@ -1261,6 +1371,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);
@@ -1286,15 +1397,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;
@@ -1326,6 +1468,13 @@ extern struct packed_git {
        char pack_name[FLEX_ARRAY]; /* more */
 } *packed_git;
 
+/*
+ * A most-recently-used ordered version of the packed_git list, which can
+ * be iterated instead of packed_git (and marked via mru_mark).
+ */
+struct mru;
+extern struct mru *packed_git_mru;
+
 struct pack_entry {
        off_t offset;
        unsigned char sha1[20];
@@ -1344,6 +1493,12 @@ 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);
 
@@ -1365,7 +1520,6 @@ extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t
 extern void close_pack_windows(struct packed_git *);
 extern void close_all_packs(void);
 extern void unuse_pack(struct pack_window **);
-extern void free_pack_by_name(const char *);
 extern void clear_delta_base_cache(void);
 extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
 
@@ -1464,7 +1618,7 @@ struct object_info {
        /* Request */
        enum object_type *typep;
        unsigned long *sizep;
-       unsigned long *disk_sizep;
+       off_t *disk_sizep;
        unsigned char *delta_base_sha1;
        struct strbuf *typename;
 
@@ -1491,7 +1645,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);
@@ -1515,10 +1677,18 @@ struct git_config_source {
        const char *blob;
 };
 
+enum config_origin_type {
+       CONFIG_ORIGIN_BLOB,
+       CONFIG_ORIGIN_FILE,
+       CONFIG_ORIGIN_STDIN,
+       CONFIG_ORIGIN_SUBMODULE_BLOB,
+       CONFIG_ORIGIN_CMDLINE
+};
+
 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 char *origin_type,
+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 void git_config_push_parameter(const char *text);
 extern int git_config_from_parameters(config_fn_t fn, void *data);
@@ -1526,7 +1696,6 @@ 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);
-extern int git_config_early(config_fn_t fn, void *, const char *repo_config);
 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 *);
@@ -1550,7 +1719,6 @@ extern void git_config_set_multivar_in_file(const char *, const char *, const ch
 extern int git_config_rename_section(const char *, const char *);
 extern int git_config_rename_section_in_file(const char *, const char *, const char *);
 extern const char *git_etc_gitconfig(void);
-extern int check_repository_format_version(const char *var, const char *value, void *cb);
 extern int git_env_bool(const char *, int);
 extern unsigned long git_env_ulong(const char *, unsigned long);
 extern int git_config_system(void);
@@ -1562,6 +1730,16 @@ extern const char *get_log_output_encoding(void);
 extern const char *get_commit_output_encoding(void);
 
 extern int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
+
+enum config_scope {
+       CONFIG_SCOPE_UNKNOWN = 0,
+       CONFIG_SCOPE_SYSTEM,
+       CONFIG_SCOPE_GLOBAL,
+       CONFIG_SCOPE_REPO,
+       CONFIG_SCOPE_CMDLINE,
+};
+
+extern enum config_scope current_config_scope(void);
 extern const char *current_config_origin_type(void);
 extern const char *current_config_name(void);
 
@@ -1654,6 +1832,8 @@ extern int ignore_untracked_cache_config;
 struct key_value_info {
        const char *filename;
        int linenr;
+       enum config_origin_type origin_type;
+       enum config_scope scope;
 };
 
 extern NORETURN void git_die_config(const char *key, const char *err, ...) __attribute__((format(printf, 2, 3)));
@@ -1679,8 +1859,6 @@ extern int copy_file(const char *dst, const char *src, int mode);
 extern int copy_file_with_time(const char *dst, const char *src, int mode);
 
 extern void write_or_die(int fd, const void *buf, size_t count);
-extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg);
-extern int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg);
 extern void fsync_or_die(int fd, const char *);
 
 extern ssize_t read_in_full(int fd, void *buf, size_t count);
@@ -1692,12 +1870,24 @@ static inline ssize_t write_str_in_full(int fd, const char *str)
        return write_in_full(fd, str, strlen(str));
 }
 
-extern int write_file(const char *path, const char *fmt, ...);
-extern int write_file_gently(const char *path, const char *fmt, ...);
+/**
+ * Open (and truncate) the file at path, write the contents of buf to it,
+ * and close it. Dies if any errors are encountered.
+ */
+extern void write_file_buf(const char *path, const char *buf, size_t len);
+
+/**
+ * Like write_file_buf(), but format the contents into a buffer first.
+ * Additionally, write_file() will append a newline if one is not already
+ * present, making it convenient to write text files:
+ *
+ *   write_file(path, "counter: %d", ctr);
+ */
+__attribute__((format (printf, 2, 3)))
+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);
@@ -1736,8 +1926,8 @@ int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int
 extern int diff_auto_refresh_index;
 
 /* match-trees.c */
-void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int);
-void shift_tree_by(const unsigned char *, const unsigned char *, unsigned char *, const char *);
+void shift_tree(const struct object_id *, const struct object_id *, struct object_id *, int);
+void shift_tree_by(const struct object_id *, const struct object_id *, struct object_id *, const char *);
 
 /*
  * whitespace rules.
@@ -1771,7 +1961,7 @@ int split_cmdline(char *cmdline, const char ***argv);
 /* Takes a negative value returned by split_cmdline */
 const char *split_cmdline_strerror(int cmdline_errno);
 
-/* git.c */
+/* setup.c */
 struct startup_info {
        int have_repository;
        const char *prefix;
index 00d92a16631a80ff8ec4e995dafcd3e55434fad5..24b6542352a60006ac23c09a7cc17fb3aef009fa 100644 (file)
@@ -12,7 +12,7 @@ int main(int ac, char **av)
                struct stat st;
 
                if (lstat(ce->name, &st)) {
-                       error("lstat(%s): %s", ce->name, strerror(errno));
+                       error_errno("lstat(%s)", ce->name);
                        continue;
                }
 
diff --git a/ci/test-documentation.sh b/ci/test-documentation.sh
new file mode 100755 (executable)
index 0000000..579d540
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# Perform sanity checks on documentation and build it.
+#
+
+set -e
+
+make check-builtins
+make check-docs
+make doc
+
+test -s Documentation/git.html
+test -s Documentation/git.xml
+test -s Documentation/git.1
diff --git a/color.c b/color.c
index 8f85153d0d2c1f4bf9340ced9371797eb3c92de9..1b95e6b2a7bb1601fa5862de8989775e197c7b41 100644 (file)
--- a/color.c
+++ b/color.c
@@ -123,19 +123,34 @@ static int parse_color(struct color *out, const char *name, int len)
        return -1;
 }
 
-static int parse_attr(const char *name, int len)
+static int parse_attr(const char *name, size_t len)
 {
-       static const int attr_values[] = { 1, 2, 4, 5, 7,
-                                          22, 22, 24, 25, 27 };
-       static const char * const attr_names[] = {
-               "bold", "dim", "ul", "blink", "reverse",
-               "nobold", "nodim", "noul", "noblink", "noreverse"
+       static const struct {
+               const char *name;
+               size_t len;
+               int val, neg;
+       } attrs[] = {
+#define ATTR(x, val, neg) { (x), sizeof(x)-1, (val), (neg) }
+               ATTR("bold",      1, 22),
+               ATTR("dim",       2, 22),
+               ATTR("italic",    3, 23),
+               ATTR("ul",        4, 24),
+               ATTR("blink",     5, 25),
+               ATTR("reverse",   7, 27),
+               ATTR("strike",    9, 29)
+#undef ATTR
        };
+       int negate = 0;
        int i;
-       for (i = 0; i < ARRAY_SIZE(attr_names); i++) {
-               const char *str = attr_names[i];
-               if (!strncasecmp(name, str, len) && !str[len])
-                       return attr_values[i];
+
+       if (skip_prefix_mem(name, len, "no", &name, &len)) {
+               skip_prefix_mem(name, len, "-", &name, &len);
+               negate = 1;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(attrs); i++) {
+               if (attrs[i].len == len && !memcmp(attrs[i].name, name, len))
+                       return negate ? attrs[i].neg : attrs[i].val;
        }
        return -1;
 }
@@ -200,7 +215,7 @@ int color_parse_mem(const char *value, int value_len, char *dst)
        /* [fg [bg]] [attr]... */
        while (len > 0) {
                const char *word = ptr;
-               struct color c;
+               struct color c = { COLOR_UNSPECIFIED };
                int val, wordlen = 0;
 
                while (len > 0 && !isspace(word[wordlen])) {
diff --git a/color.h b/color.h
index e155d13f784362a5fdd993e1e383e660fa324c30..90627650fccc67c31261977a22544af131812bd1 100644 (file)
--- a/color.h
+++ b/color.h
@@ -3,26 +3,24 @@
 
 struct strbuf;
 
-/*  2 + (2 * num_attrs) + 8 + 1 + 8 + 'm' + NUL */
-/* "\033[1;2;4;5;7;38;5;2xx;48;5;2xxm\0" */
 /*
  * The maximum length of ANSI color sequence we would generate:
  * - leading ESC '['            2
- * - attr + ';'                 3 * 10 (e.g. "1;")
+ * - attr + ';'                 2 * num_attr (e.g. "1;")
+ * - no-attr + ';'              3 * num_attr (e.g. "22;")
  * - fg color + ';'             17 (e.g. "38;2;255;255;255;")
  * - bg color + ';'             17 (e.g. "48;2;255;255;255;")
  * - terminating 'm' NUL        2
  *
- * The above overcounts attr (we only use 5 not 8) and one semicolon
- * but it is close enough.
+ * The above overcounts by one semicolon but it is close enough.
+ *
+ * The space for attributes is also slightly overallocated, as
+ * the negation for some attributes is the same (e.g., nobold and nodim).
+ *
+ * We allocate space for 7 attributes.
  */
-#define COLOR_MAXLEN 70
+#define COLOR_MAXLEN 75
 
-/*
- * IMPORTANT: Due to the way these color codes are emulated on Windows,
- * write them only using printf(), fprintf(), and fputs(). In particular,
- * do not use puts() or write().
- */
 #define GIT_COLOR_NORMAL       ""
 #define GIT_COLOR_RESET                "\033[m"
 #define GIT_COLOR_BOLD         "\033[1m"
index 0e1d4b0893ce0266a6d15f880bb6ad66eb2619fb..59501db99a74ab8f237766730045dda4ecd112b2 100644 (file)
@@ -44,9 +44,9 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
                        memset(p->parent, 0,
                               sizeof(p->parent[0]) * num_parent);
 
-                       hashcpy(p->oid.hash, q->queue[i]->two->sha1);
+                       oidcpy(&p->oid, &q->queue[i]->two->oid);
                        p->mode = q->queue[i]->two->mode;
-                       hashcpy(p->parent[n].oid.hash, q->queue[i]->one->sha1);
+                       oidcpy(&p->parent[n].oid, &q->queue[i]->one->oid);
                        p->parent[n].mode = q->queue[i]->one->mode;
                        p->parent[n].status = q->queue[i]->status;
                        *tail = p;
@@ -77,7 +77,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
                        continue;
                }
 
-               hashcpy(p->parent[n].oid.hash, q->queue[i]->one->sha1);
+               oidcpy(&p->parent[n].oid, &q->queue[i]->one->oid);
                p->parent[n].mode = q->queue[i]->one->mode;
                p->parent[n].status = q->queue[i]->status;
 
@@ -1005,8 +1005,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
                        struct strbuf buf = STRBUF_INIT;
 
                        if (strbuf_readlink(&buf, elem->path, st.st_size) < 0) {
-                               error("readlink(%s): %s", elem->path,
-                                     strerror(errno));
+                               error_errno("readlink(%s)", elem->path);
                                return;
                        }
                        result_size = buf.len;
@@ -1204,9 +1203,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)) {
@@ -1269,16 +1268,16 @@ static struct diff_filepair *combined_pair(struct combine_diff_path *p,
        for (i = 0; i < num_parent; i++) {
                pair->one[i].path = p->path;
                pair->one[i].mode = p->parent[i].mode;
-               hashcpy(pair->one[i].sha1, p->parent[i].oid.hash);
-               pair->one[i].sha1_valid = !is_null_oid(&p->parent[i].oid);
+               oidcpy(&pair->one[i].oid, &p->parent[i].oid);
+               pair->one[i].oid_valid = !is_null_oid(&p->parent[i].oid);
                pair->one[i].has_more_entries = 1;
        }
        pair->one[num_parent - 1].has_more_entries = 0;
 
        pair->two->path = p->path;
        pair->two->mode = p->mode;
-       hashcpy(pair->two->sha1, p->oid.hash);
-       pair->two->sha1_valid = !is_null_oid(&p->oid);
+       oidcpy(&pair->two->oid, &p->oid);
+       pair->two->oid_valid = !is_null_oid(&p->oid);
        return pair;
 }
 
@@ -1526,7 +1525,7 @@ void diff_tree_combined(const unsigned char *sha1,
                free(tmp);
        }
 
-       free_pathspec(&diffopts.pathspec);
+       clear_pathspec(&diffopts.pathspec);
 }
 
 void diff_tree_combined_merge(const struct commit *commit, int dense,
index f84b449413d434b8145426503a98bcd4f9ad995f..42d16dcded870bfa400421a88b6d0d8c9309a404 100644 (file)
@@ -8,7 +8,7 @@
  *
  * After including this header file, using:
  *
- * define_commit_slab(indegee, int);
+ * define_commit_slab(indegree, int);
  *
  * will let you call the following functions:
  *
@@ -126,16 +126,16 @@ static MAYBE_UNUSED elemtype *slabname## _peek(struct slabname *s,        \
        return slabname##_at_peek(s, c, 0);                             \
 }                                                                      \
                                                                        \
-static int stat_ ##slabname## realloc
+struct slabname
 
 /*
- * Note that this seemingly redundant second declaration is required
+ * Note that this redundant forward declaration is required
  * to allow a terminating semicolon, which makes instantiations look
  * like function declarations.  I.e., the expansion of
  *
  *    define_commit_slab(indegree, int);
  *
- * ends in 'static int stat_indegreerealloc;'.  This would otherwise
+ * ends in 'struct indegree;'.  This would otherwise
  * be a syntax error according (at least) to ISO C.  It's hard to
  * catch because GCC silently parses it by default.
  */
index 3f4f371e5eec41fa67345c0b9d373b541e52172a..856fd4aeeff654c45ba0a6149f9db2c22806e0cb 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -414,7 +414,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject)
        while (*p && (*p != '\n' || p[1] != '\n'))
                p++;
        if (*p) {
-               p += 2;
+               p = skip_blank_lines(p + 2);
                for (eol = p; *eol && *eol != '\n'; eol++)
                        ; /* do nothing */
        } else
@@ -931,7 +931,7 @@ static int remove_redundant(struct commit **array, int cnt)
        }
 
        /* Now collect the result */
-       memcpy(work, array, sizeof(*array) * cnt);
+       COPY_ARRAY(work, array, cnt);
        for (i = filled = 0; i < cnt; i++)
                if (!redundant[i])
                        array[filled++] = work[i];
@@ -1092,9 +1092,14 @@ static int do_sign_commit(struct strbuf *buf, const char *keyid)
 {
        struct strbuf sig = STRBUF_INIT;
        int inspos, copypos;
+       const char *eoh;
 
        /* find the end of the header */
-       inspos = strstr(buf->buf, "\n\n") - buf->buf + 1;
+       eoh = strstr(buf->buf, "\n\n");
+       if (!eoh)
+               inspos = buf->len;
+       else
+               inspos = eoh - buf->buf + 1;
 
        if (!keyid || !*keyid)
                keyid = get_signing_key();
@@ -1506,9 +1511,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,
@@ -1561,7 +1566,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;
@@ -1571,6 +1576,15 @@ int commit_tree_extended(const char *msg, size_t msg_len,
        return result;
 }
 
+void set_merge_remote_desc(struct commit *commit,
+                          const char *name, struct object *obj)
+{
+       struct merge_remote_desc *desc;
+       FLEX_ALLOC_STR(desc, name, name);
+       desc->obj = obj;
+       commit->util = desc;
+}
+
 struct commit *get_merge_parent(const char *name)
 {
        struct object *obj;
@@ -1580,13 +1594,8 @@ struct commit *get_merge_parent(const char *name)
                return NULL;
        obj = parse_object(oid.hash);
        commit = (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);
-       if (commit && !commit->util) {
-               struct merge_remote_desc *desc;
-               desc = xmalloc(sizeof(*desc));
-               desc->obj = obj;
-               desc->name = strdup(name);
-               commit->util = desc;
-       }
+       if (commit && !commit->util)
+               set_merge_remote_desc(commit, name, obj);
        return commit;
 }
 
@@ -1617,16 +1626,6 @@ struct commit_list **commit_list_append(struct commit *commit,
        return &new->next;
 }
 
-void print_commit_list(struct commit_list *list,
-                      const char *format_cur,
-                      const char *format_last)
-{
-       for ( ; list; list = list->next) {
-               const char *format = list->next ? format_cur : format_last;
-               printf(format, oid_to_hex(&list->item->object.oid));
-       }
-}
-
 const char *find_commit_header(const char *msg, const char *key, size_t *out_len)
 {
        int key_len = strlen(key);
index 5d58be0017a8eb26cd3f58c1e3b0b610f684beba..afd14f318c0c4d18f3a03781d3229f2fdc0f64c6 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -131,11 +131,17 @@ enum cmit_fmt {
        CMIT_FMT_FULLER,
        CMIT_FMT_ONELINE,
        CMIT_FMT_EMAIL,
+       CMIT_FMT_MBOXRD,
        CMIT_FMT_USERFORMAT,
 
        CMIT_FMT_UNSPECIFIED
 };
 
+static inline int cmit_fmt_is_mail(enum cmit_fmt fmt)
+{
+       return (fmt == CMIT_FMT_EMAIL || fmt == CMIT_FMT_MBOXRD);
+}
+
 struct pretty_print_context {
        /*
         * Callers should tweak these to change the behavior of pp_* functions.
@@ -147,6 +153,7 @@ struct pretty_print_context {
        int preserve_subject;
        struct date_mode date_mode;
        unsigned date_mode_explicit:1;
+       int expand_tabs_in_log;
        int need_8bit_cte;
        char *notes_message;
        struct reflog_walk_info *reflog_info;
@@ -160,6 +167,7 @@ struct pretty_print_context {
         * should not be counted on by callers.
         */
        struct string_list in_body_headers;
+       int graph_width;
 };
 
 struct userformat_want {
@@ -176,6 +184,7 @@ extern const char *format_subject(struct strbuf *sb, const char *msg,
                                  const char *line_separator);
 extern void userformat_find_requirements(const char *fmt, struct userformat_want *w);
 extern int commit_format_is_empty(enum cmit_fmt);
+extern const char *skip_blank_lines(const char *msg);
 extern void format_commit_message(const struct commit *commit,
                                  const char *format, struct strbuf *sb,
                                  const struct pretty_print_context *context);
@@ -258,6 +267,8 @@ 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);
@@ -353,9 +364,11 @@ extern void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *
 
 struct merge_remote_desc {
        struct object *obj; /* the named object, could be a tag */
-       const char *name;
+       char name[FLEX_ARRAY];
 };
 #define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util))
+extern void set_merge_remote_desc(struct commit *commit,
+                                 const char *name, struct object *obj);
 
 /*
  * Given "name" from the command line to merge, find the commit object
@@ -368,10 +381,6 @@ extern int parse_signed_commit(const struct commit *commit,
                               struct strbuf *message, struct strbuf *signature);
 extern int remove_signature(struct strbuf *buf);
 
-extern void print_commit_list(struct commit_list *list,
-                             const char *format_cur,
-                             const char *format_last);
-
 /*
  * Check the signature of the given commit. The result of the check is stored
  * in sig->check_result, 'G' for a good signature, 'U' for a good signature
diff --git a/common-main.c b/common-main.c
new file mode 100644 (file)
index 0000000..c654f95
--- /dev/null
@@ -0,0 +1,41 @@
+#include "cache.h"
+#include "exec_cmd.h"
+
+/*
+ * Many parts of Git have subprograms communicate via pipe, expect the
+ * upstream of a pipe to die with SIGPIPE when the downstream of a
+ * pipe does not need to read all that is written.  Some third-party
+ * programs that ignore or block SIGPIPE for their own reason forget
+ * to restore SIGPIPE handling to the default before spawning Git and
+ * break this carefully orchestrated machinery.
+ *
+ * Restore the way SIGPIPE is handled to default, which is what we
+ * expect.
+ */
+static void restore_sigpipe_to_default(void)
+{
+       sigset_t unblock;
+
+       sigemptyset(&unblock);
+       sigaddset(&unblock, SIGPIPE);
+       sigprocmask(SIG_UNBLOCK, &unblock, NULL);
+       signal(SIGPIPE, SIG_DFL);
+}
+
+int main(int argc, const char **argv)
+{
+       /*
+        * Always open file descriptors 0/1/2 to avoid clobbering files
+        * in die().  It also avoids messing up when the pipes are dup'ed
+        * onto stdin/stdout/stderr in the child processes we spawn.
+        */
+       sanitize_stdfds();
+
+       git_setup_gettext();
+
+       git_extract_argv0_path(argv[0]);
+
+       restore_sigpipe_to_default();
+
+       return cmd_main(argc, argv);
+}
index d3fb2641813404a95709d2b219b9ab1fa1434296..11727f3e1ed7f6d51e334734c19e9eafbf034783 100644 (file)
@@ -3,12 +3,18 @@
 #define HEADER_HMAC_H
 #define HEADER_SHA_H
 #include <CommonCrypto/CommonHMAC.h>
-#define HMAC_CTX CCHmacContext
-#define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len)
-#define HMAC_Update CCHmacUpdate
-#define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash)
-#define HMAC_CTX_cleanup(ignore)
 #define EVP_md5(...) kCCHmacAlgMD5
+/* CCHmac doesn't take md_len and the return type is void */
+#define HMAC git_CC_HMAC
+static inline unsigned char *git_CC_HMAC(CCHmacAlgorithm alg,
+               const void *key, int key_len,
+               const unsigned char *data, size_t data_len,
+               unsigned char *md, unsigned int *md_len)
+{
+       CCHmac(alg, key, key_len, data, data_len, md);
+       return md;
+}
+
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
 #define APPLE_LION_OR_NEWER
 #include <Security/Security.h>
index 54c82ecf201dde2c317efe6862173c1b40f2552d..3fbfda5978b7bb715ab132283a69fa49384896e9 100644 (file)
@@ -286,6 +286,49 @@ int mingw_rmdir(const char *pathname)
        return ret;
 }
 
+static inline int needs_hiding(const char *path)
+{
+       const char *basename;
+
+       if (hide_dotfiles == HIDE_DOTFILES_FALSE)
+               return 0;
+
+       /* We cannot use basename(), as it would remove trailing slashes */
+       mingw_skip_dos_drive_prefix((char **)&path);
+       if (!*path)
+               return 0;
+
+       for (basename = path; *path; path++)
+               if (is_dir_sep(*path)) {
+                       do {
+                               path++;
+                       } while (is_dir_sep(*path));
+                       /* ignore trailing slashes */
+                       if (*path)
+                               basename = path;
+               }
+
+       if (hide_dotfiles == HIDE_DOTFILES_TRUE)
+               return *basename == '.';
+
+       assert(hide_dotfiles == HIDE_DOTFILES_DOTGITONLY);
+       return !strncasecmp(".git", basename, 4) &&
+               (!basename[4] || is_dir_sep(basename[4]));
+}
+
+static int set_hidden_flag(const wchar_t *path, int set)
+{
+       DWORD original = GetFileAttributesW(path), modified;
+       if (set)
+               modified = original | FILE_ATTRIBUTE_HIDDEN;
+       else
+               modified = original & ~FILE_ATTRIBUTE_HIDDEN;
+       if (original == modified || SetFileAttributesW(path, modified))
+               return 0;
+       errno = err_win_to_posix(GetLastError());
+       return -1;
+}
+
 int mingw_mkdir(const char *path, int mode)
 {
        int ret;
@@ -293,6 +336,8 @@ int mingw_mkdir(const char *path, int mode)
        if (xutftowcs_path(wpath, path) < 0)
                return -1;
        ret = _wmkdir(wpath);
+       if (!ret && needs_hiding(path))
+               return set_hidden_flag(wpath, 1);
        return ret;
 }
 
@@ -319,6 +364,21 @@ int mingw_open (const char *filename, int oflags, ...)
                if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))
                        errno = EISDIR;
        }
+       if ((oflags & O_CREAT) && needs_hiding(filename)) {
+               /*
+                * Internally, _wopen() uses the CreateFile() API which errors
+                * out with an ERROR_ACCESS_DENIED if CREATE_ALWAYS was
+                * specified and an already existing file's attributes do not
+                * match *exactly*. As there is no mode or flag we can set that
+                * would correspond to FILE_ATTRIBUTE_HIDDEN, let's just try
+                * again *without* the O_CREAT flag (that corresponds to the
+                * CREATE_ALWAYS flag of CreateFile()).
+                */
+               if (fd < 0 && errno == EACCES)
+                       fd = _wopen(wfilename, oflags & ~O_CREAT, mode);
+               if (fd >= 0 && set_hidden_flag(wfilename, 1))
+                       warning("could not mark '%s' as hidden.", filename);
+       }
        return fd;
 }
 
@@ -350,6 +410,7 @@ int mingw_fgetc(FILE *stream)
 #undef fopen
 FILE *mingw_fopen (const char *filename, const char *otype)
 {
+       int hide = needs_hiding(filename);
        FILE *file;
        wchar_t wfilename[MAX_PATH], wotype[4];
        if (filename && !strcmp(filename, "/dev/null"))
@@ -357,12 +418,19 @@ FILE *mingw_fopen (const char *filename, const char *otype)
        if (xutftowcs_path(wfilename, filename) < 0 ||
                xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
                return NULL;
+       if (hide && !access(filename, F_OK) && set_hidden_flag(wfilename, 0)) {
+               error("could not unhide %s", filename);
+               return NULL;
+       }
        file = _wfopen(wfilename, wotype);
+       if (file && hide && set_hidden_flag(wfilename, 1))
+               warning("could not mark '%s' as hidden.", filename);
        return file;
 }
 
 FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
 {
+       int hide = needs_hiding(filename);
        FILE *file;
        wchar_t wfilename[MAX_PATH], wotype[4];
        if (filename && !strcmp(filename, "/dev/null"))
@@ -370,7 +438,13 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
        if (xutftowcs_path(wfilename, filename) < 0 ||
                xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
                return NULL;
+       if (hide && !access(filename, F_OK) && set_hidden_flag(wfilename, 0)) {
+               error("could not unhide %s", filename);
+               return NULL;
+       }
        file = _wfreopen(wfilename, wotype, stream);
+       if (file && hide && set_hidden_flag(wfilename, 1))
+               warning("could not mark '%s' as hidden.", filename);
        return file;
 }
 
@@ -763,15 +837,12 @@ struct tm *localtime_r(const time_t *timep, struct tm *result)
 
 char *mingw_getcwd(char *pointer, int len)
 {
-       int i;
        wchar_t wpointer[MAX_PATH];
        if (!_wgetcwd(wpointer, ARRAY_SIZE(wpointer)))
                return NULL;
        if (xwcstoutf(pointer, wpointer, len) < 0)
                return NULL;
-       for (i = 0; pointer[i]; i++)
-               if (pointer[i] == '\\')
-                       pointer[i] = '/';
+       convert_slashes(pointer);
        return pointer;
 }
 
@@ -1859,48 +1930,6 @@ int mingw_raise(int sig)
        }
 }
 
-
-static const char *make_backslash_path(const char *path)
-{
-       static char buf[PATH_MAX + 1];
-       char *c;
-
-       if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
-               die("Too long path: %.*s", 60, path);
-
-       for (c = buf; *c; c++) {
-               if (*c == '/')
-                       *c = '\\';
-       }
-       return buf;
-}
-
-void mingw_open_html(const char *unixpath)
-{
-       const char *htmlpath = make_backslash_path(unixpath);
-       typedef HINSTANCE (WINAPI *T)(HWND, const char *,
-                       const char *, const char *, const char *, INT);
-       T ShellExecute;
-       HMODULE shell32;
-       int r;
-
-       shell32 = LoadLibrary("shell32.dll");
-       if (!shell32)
-               die("cannot load shell32.dll");
-       ShellExecute = (T)GetProcAddress(shell32, "ShellExecuteA");
-       if (!ShellExecute)
-               die("cannot run browser");
-
-       printf("Launching default browser to display HTML ...\n");
-       r = HCAST(int, ShellExecute(NULL, "open", htmlpath,
-                               NULL, "\\", SW_SHOWNORMAL));
-       FreeLibrary(shell32);
-       /* see the MSDN documentation referring to the result codes here */
-       if (r <= 32) {
-               die("failed to launch browser for %.*s", MAX_PATH, unixpath);
-       }
-}
-
 int link(const char *oldpath, const char *newpath)
 {
        typedef BOOL (WINAPI *T)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
@@ -2091,7 +2120,7 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
        return -1;
 }
 
-static void setup_windows_environment()
+static void setup_windows_environment(void)
 {
        char *tmp = getenv("TMPDIR");
 
@@ -2112,9 +2141,7 @@ static void setup_windows_environment()
                 * executable (by not mistaking the dir separators
                 * for escape characters).
                 */
-               for (; *tmp; tmp++)
-                       if (*tmp == '\\')
-                               *tmp = '/';
+               convert_slashes(tmp);
        }
 
        /* simulate TERM to enable auto-color (see color.c) */
@@ -2135,7 +2162,7 @@ typedef struct {
 extern int __wgetmainargs(int *argc, wchar_t ***argv, wchar_t ***env, int glob,
                _startupinfo *si);
 
-static NORETURN void die_startup()
+static NORETURN void die_startup(void)
 {
        fputs("fatal: not enough memory for initialization", stderr);
        exit(128);
@@ -2155,7 +2182,7 @@ static char *wcstoutfdup_startup(char *buffer, const wchar_t *wcs, size_t len)
        return memcpy(malloc_startup(len), buffer, len);
 }
 
-void mingw_startup()
+void mingw_startup(void)
 {
        int i, maxlen, argc;
        char *buffer;
index c008694639a654e6a04e541af70e90a5fa4da9e0..33501695550accdb08368aa867b9addb25c90d5f 100644 (file)
@@ -67,12 +67,19 @@ typedef int pid_t;
 #define F_SETFD 2
 #define FD_CLOEXEC 0x1
 
+#if !defined O_CLOEXEC && defined O_NOINHERIT
+#define O_CLOEXEC      O_NOINHERIT
+#endif
+
 #ifndef EAFNOSUPPORT
 #define EAFNOSUPPORT WSAEAFNOSUPPORT
 #endif
 #ifndef ECONNABORTED
 #define ECONNABORTED WSAECONNABORTED
 #endif
+#ifndef ENOTSOCK
+#define ENOTSOCK WSAENOTSOCK
+#endif
 
 struct passwd {
        char *pw_name;
@@ -142,6 +149,7 @@ static inline int fcntl(int fd, int cmd, ...)
 #define sigemptyset(x) (void)0
 static inline int sigaddset(sigset_t *set, int signum)
 { return 0; }
+#define SIG_BLOCK 0
 #define SIG_UNBLOCK 0
 static inline int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
 { return 0; }
@@ -376,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);
 
@@ -406,19 +417,13 @@ static inline void convert_slashes(char *path)
 int mingw_offset_1st_component(const char *path);
 #define offset_1st_component mingw_offset_1st_component
 #define PATH_SEP ';'
-#ifndef __MINGW64_VERSION_MAJOR
+#if !defined(__MINGW64_VERSION_MAJOR) && (!defined(_MSC_VER) || _MSC_VER < 1800)
 #define PRIuMAX "I64u"
 #define PRId64 "I64d"
 #else
 #include <inttypes.h>
 #endif
 
-void mingw_open_html(const char *path);
-#define open_html mingw_open_html
-
-void mingw_mark_as_git_dir(const char *dir);
-#define mark_as_git_dir mingw_mark_as_git_dir
-
 /**
  * Converts UTF-8 encoded string to UTF-16LE.
  *
@@ -534,10 +539,10 @@ extern CRITICAL_SECTION pinfo_cs;
  * A replacement of main() that adds win32 specific initialization.
  */
 
-void mingw_startup();
-#define main(c,v) dummy_decl_mingw_main(); \
+void mingw_startup(void);
+#define main(c,v) dummy_decl_mingw_main(void); \
 static int mingw_main(c,v); \
-int main(int argc, char **argv) \
+int main(int argc, const char **argv) \
 { \
        mingw_startup(); \
        return mingw_main(__argc, (void *)__argv); \
index a0a16eb1bbfb22c13f29c15d2fd68ccc9c7e01ad..1cc31c350223b84cd97939afccf1bcc1caa070b4 100644 (file)
@@ -938,33 +938,16 @@ void **nedpindependent_comalloc(nedpool *p, size_t elems, size_t *sizes, void **
        void **ret;
        threadcache *tc;
        int mymspace;
-    size_t i, *adjustedsizes=(size_t *) alloca(elems*sizeof(size_t));
-    if(!adjustedsizes) return 0;
-    for(i=0; i<elems; i++)
-       adjustedsizes[i]=sizes[i]<sizeof(threadcacheblk) ? sizeof(threadcacheblk) : sizes[i];
+       size_t i, *adjustedsizes=(size_t *) alloca(elems*sizeof(size_t));
+       if(!adjustedsizes) return 0;
+       for(i=0; i<elems; i++)
+               adjustedsizes[i]=sizes[i]<sizeof(threadcacheblk) ? sizeof(threadcacheblk) : sizes[i];
        GetThreadCache(&p, &tc, &mymspace, 0);
        GETMSPACE(m, p, tc, mymspace, 0,
              ret=mspace_independent_comalloc(m, elems, adjustedsizes, chunks));
        return ret;
 }
 
-#ifdef OVERRIDE_STRDUP
-/*
- * This implementation is purely there to override the libc version, to
- * avoid a crash due to allocation and free on different 'heaps'.
- */
-char *strdup(const char *s1)
-{
-       char *s2 = 0;
-       if (s1) {
-               size_t len = strlen(s1) + 1;
-               s2 = malloc(len);
-               memcpy(s2, s1, len);
-       }
-       return s2;
-}
-#endif
-
 #if defined(__cplusplus)
 }
 #endif
index dfbe6d84081c8b8eea50450a4c23c9a80b3b57a7..4293b53b171f5002127d7a354309d343706c0272 100644 (file)
@@ -147,7 +147,7 @@ struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *prec_dir)
                                if (errno || inleft) {
                                        /*
                                         * iconv() failed and errno could be E2BIG, EILSEQ, EINVAL, EBADF
-                                        * MacOS X avoids illegal byte sequemces.
+                                        * MacOS X avoids illegal byte sequences.
                                         * If they occur on a mounted drive (e.g. NFS) it is not worth to
                                         * die() for that, but rather let the user see the original name
                                        */
index fba5986399ed20174d37c39bf6d243bcbfddd3a7..d8bde06f1a3dbdc0af02ef6d63f8e18d39989dc3 100644 (file)
@@ -18,8 +18,6 @@
    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301 USA.  */
 
-#include <stdint.h>
-
 static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
                                          size_t length, reg_syntax_t syntax);
 static void re_compile_fastmap_iter (regex_t *bufp,
index 6aaae003274e268f274df4b76e02609d5f27e457..5cb23e5d5912ac40473643fff0393ac01284df41 100644 (file)
@@ -60,6 +60,7 @@
    GNU regex allows.  Include it before <regex.h>, which correctly
    #undefs RE_DUP_MAX and sets it to the right value.  */
 #include <limits.h>
+#include <stdint.h>
 
 #ifdef GAWK
 #undef alloca
index 42ea1ac110813bbd16e77cfbc36f16e6a5e9ddb2..0b1168853778810d385c84625ad643587537913b 100644 (file)
@@ -9,7 +9,7 @@
  * always have room for a trailing NUL byte.
  */
 #ifndef SNPRINTF_SIZE_CORR
-#if defined(WIN32) && (!defined(__GNUC__) || __GNUC__ < 4)
+#if defined(WIN32) && (!defined(__GNUC__) || __GNUC__ < 4) && (!defined(_MSC_VER) || _MSC_VER < 1900)
 #define SNPRINTF_SIZE_CORR 1
 #else
 #define SNPRINTF_SIZE_CORR 0
diff --git a/compat/strdup.c b/compat/strdup.c
new file mode 100644 (file)
index 0000000..f3fb978
--- /dev/null
@@ -0,0 +1,11 @@
+#include "../git-compat-util.h"
+
+char *gitstrdup(const char *s1)
+{
+       size_t len = strlen(s1) + 1;
+       char *s2 = malloc(len);
+
+       if (s2)
+               memcpy(s2, s1, len);
+       return s2;
+}
index c65c2cd566b51473da12786f28074040c410f343..3a959d124ca794446800653e9c033b883d8d7b8f 100644 (file)
@@ -45,11 +45,15 @@ typedef unsigned long long uintmax_t;
 
 typedef int64_t off64_t;
 
+#if !defined(_MSC_VER) || _MSC_VER < 1600
 #define INTMAX_MIN  _I64_MIN
 #define INTMAX_MAX  _I64_MAX
 #define UINTMAX_MAX _UI64_MAX
 
 #define UINT32_MAX 0xffffffff  /* 4294967295U */
+#else
+#include <stdint.h>
+#endif
 
 #define STDIN_FILENO  0
 #define STDOUT_FILENO 1
index b6ed9e74621fe0bc506beb893e477bff26e88756..1c164088fbb64d2f0143f536f3186f481d876d28 100644 (file)
@@ -104,4 +104,11 @@ static inline void *pthread_getspecific(pthread_key_t key)
        return TlsGetValue(key);
 }
 
+#ifndef __MINGW64_VERSION_MAJOR
+static inline int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
+{
+       return 0;
+}
+#endif
+
 #endif /* PTHREAD_H */
index b905aea31bf53dc0f614d5e95c0dbd382818cbc4..6c7c9b60538d932d6dbc2d32774a6f64f8687c69 100644 (file)
@@ -28,13 +28,13 @@ void syslog(int priority, const char *fmt, ...)
        va_end(ap);
 
        if (str_len < 0) {
-               warning("vsnprintf failed: '%s'", strerror(errno));
+               warning_errno("vsnprintf failed");
                return;
        }
 
        str = malloc(st_add(str_len, 1));
        if (!str) {
-               warning("malloc failed: '%s'", strerror(errno));
+               warning_errno("malloc failed");
                return;
        }
 
@@ -45,7 +45,7 @@ void syslog(int priority, const char *fmt, ...)
        while ((pos = strstr(str, "%1")) != NULL) {
                str = realloc(str, st_add(++str_len, 1));
                if (!str) {
-                       warning("realloc failed: '%s'", strerror(errno));
+                       warning_errno("realloc failed");
                        return;
                }
                memmove(pos + 2, pos + 1, strlen(pos));
index 80a8c9af4f0ddcc883370fe05781337cef0d5ef0..519d51f2b60a2dd0d477863f237e87b1beae1627 100644 (file)
@@ -2,37 +2,42 @@
 
 void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
 {
-       HANDLE hmap;
+       HANDLE osfhandle, hmap;
        void *temp;
-       off_t len;
-       struct stat st;
+       LARGE_INTEGER len;
        uint64_t o = offset;
        uint32_t l = o & 0xFFFFFFFF;
        uint32_t h = (o >> 32) & 0xFFFFFFFF;
 
-       if (!fstat(fd, &st))
-               len = st.st_size;
-       else
+       osfhandle = (HANDLE)_get_osfhandle(fd);
+       if (!GetFileSizeEx(osfhandle, &len))
                die("mmap: could not determine filesize");
 
-       if ((length + offset) > len)
-               length = xsize_t(len - offset);
+       if ((length + offset) > len.QuadPart)
+               length = xsize_t(len.QuadPart - offset);
 
        if (!(flags & MAP_PRIVATE))
                die("Invalid usage of mmap when built with USE_WIN32_MMAP");
 
-       hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL,
-               PAGE_WRITECOPY, 0, 0, NULL);
+       hmap = CreateFileMapping(osfhandle, NULL,
+               prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL);
 
-       if (!hmap)
+       if (!hmap) {
+               errno = EINVAL;
                return MAP_FAILED;
+       }
 
-       temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start);
+       temp = MapViewOfFileEx(hmap, prot == PROT_READ ?
+                       FILE_MAP_READ : FILE_MAP_COPY, h, l, length, start);
 
        if (!CloseHandle(hmap))
                warning("unable to close file mapping handle");
 
-       return temp ? temp : MAP_FAILED;
+       if (temp)
+               return temp;
+
+       errno = GetLastError() == ERROR_COMMITMENT_LIMIT ? EFBIG : EINVAL;
+       return MAP_FAILED;
 }
 
 int git_munmap(void *start, size_t length)
index 5dfa5ed61f49c4032d82c5825c0c43c86e04799f..3c9ed3cfe07c1f3b58f5400af861fb8ae44c3fdb 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,15 @@ 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;
+       } else if (!GetConsoleScreenBufferInfo(hcon, &sbi))
                return 0;
 
+       if (fd >= 0 && fd <= 2)
+               fd_is_interactive[fd] |= FD_CONSOLE;
+
        /* initialize attributes */
        if (!initialized) {
                console = hcon;
@@ -459,75 +472,103 @@ static HANDLE duplicate_handle(HANDLE hnd)
        return hresult;
 }
 
+static HANDLE swap_osfhnd(int fd, HANDLE new_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 the OS can recycle HANDLE (numbers) just like it
+        * recycles fd (numbers), so we must update the cached value
+        * of "console".  You can use GetFileType() to see that
+        * handle and _get_osfhandle(fd) may have the same number
+        * value, but they refer to different actual files now.
+        *
+        * Note that dup2() when given target := {0,1,2} will also
+        * call SetStdHandle(), so we don't need to worry about that.
+        */
+       dup2(new_fd, fd);
+       if (console == handle)
+               console = duplicate;
+       handle = INVALID_HANDLE_VALUE;
+
+       /* Close the temp fd.  This explicitly closes "new_handle"
+        * (because it has been associated with it).
+        */
+       close(new_fd);
+
+       fd_is_interactive[fd] |= FD_SWAPPED;
+
+       return duplicate;
+}
 
-/*
- * 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[];
+#ifdef DETECT_MSYS_TTY
 
-static size_t sizeof_ioinfo = 0;
+#include <winternl.h>
+#include <ntstatus.h>
 
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
+static void detect_msys_tty(int fd)
+{
+       ULONG result;
+       BYTE buffer[1024];
+       POBJECT_NAME_INFORMATION nameinfo = (POBJECT_NAME_INFORMATION) buffer;
+       PWSTR name;
+
+       /* check if fd is a pipe */
+       HANDLE h = (HANDLE) _get_osfhandle(fd);
+       if (GetFileType(h) != FILE_TYPE_PIPE)
+               return;
 
-#define FDEV  0x40
+       /* get pipe name */
+       if (!NT_SUCCESS(NtQueryObject(h, ObjectNameInformation,
+                       buffer, sizeof(buffer) - 2, &result)))
+               return;
+       name = nameinfo->Name.Buffer;
+       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;
 
-static inline ioinfo* _pioinfo(int fd)
-{
-       return (ioinfo*)((char*)__pioinfo[fd >> IOINFO_L2E] +
-                       (fd & (IOINFO_ARRAY_ELTS - 1)) * sizeof_ioinfo);
+       fd_is_interactive[fd] |= FD_MSYS;
 }
 
-static int init_sizeof_ioinfo()
-{
-       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;
-}
+#endif
 
-static HANDLE swap_osfhnd(int fd, HANDLE new_handle)
+/*
+ * 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)
 {
-       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;
+       if (fd >= 0 && fd <= 2)
+               return fd_is_interactive[fd] != 0;
+       return isatty(fd);
 }
 
 void winansi_init(void)
@@ -538,8 +579,19 @@ void winansi_init(void)
        /* check if either stdout or stderr is a console output screen buffer */
        con1 = is_console(1);
        con2 = is_console(2);
-       if (!con1 && !con2)
+
+       /* 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 */
+               detect_msys_tty(0);
+               detect_msys_tty(1);
+               detect_msys_tty(2);
+#endif
                return;
+       }
 
        /* create a named pipe to communicate with the console thread */
        xsnprintf(name, sizeof(name), "\\\\.\\pipe\\winansi%lu", GetCurrentProcessId());
@@ -574,9 +626,10 @@ void winansi_init(void)
  */
 HANDLE winansi_get_osfhandle(int fd)
 {
-       HANDLE hnd = (HANDLE) _get_osfhandle(fd);
-       if ((fd == 1 || fd == 2) && isatty(fd)
-           && GetFileType(hnd) == FILE_TYPE_PIPE)
-               return (fd == 1) ? hconsole1 : 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 9ba40bc1b039b9b65425dc4fa1bd9c7f1fcb0868..83fdecb1bc9f6f31bc625c79c1d3c12ba5b27f77 100644 (file)
--- a/config.c
+++ b/config.c
@@ -24,7 +24,7 @@ struct config_source {
                        size_t pos;
                } buf;
        } u;
-       const char *origin_type;
+       enum config_origin_type origin_type;
        const char *name;
        const char *path;
        int die_on_error;
@@ -38,7 +38,33 @@ struct config_source {
        long (*do_ftell)(struct config_source *c);
 };
 
+/*
+ * These variables record the "current" config source, which
+ * can be accessed by parsing callbacks.
+ *
+ * The "cf" variable will be non-NULL only when we are actually parsing a real
+ * config source (file, blob, cmdline, etc).
+ *
+ * The "current_config_kvi" variable will be non-NULL only when we are feeding
+ * cached config from a configset into a callback.
+ *
+ * They should generally never be non-NULL at the same time. If they are both
+ * NULL, then we aren't parsing anything (and depending on the function looking
+ * at the variables, it's either a bug for it to be called in the first place,
+ * or it's a function which can be reused for non-config purposes, and should
+ * fall back to some sane behavior).
+ */
 static struct config_source *cf;
+static struct key_value_info *current_config_kvi;
+
+/*
+ * Similar to the variables above, this gives access to the "scope" of the
+ * current value (repo, global, etc). For cached values, it can be found via
+ * the current_config_kvi as above. During parsing, the current value can be
+ * found in this variable. It's not part of "cf" because it transcends a single
+ * file (i.e., a file included from .git/config is still in "repo" scope).
+ */
+static enum config_scope current_parsing_scope;
 
 static int zlib_compression_seen;
 
@@ -108,7 +134,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
 
        expanded = expand_user_path(path);
        if (!expanded)
-               return error("Could not expand include path '%s'", path);
+               return error("could not expand include path '%s'", path);
        path = expanded;
 
        /*
@@ -131,7 +157,9 @@ static int handle_path_include(const char *path, struct config_include_data *inc
        if (!access_or_die(path, R_OK, 0)) {
                if (++inc->depth > MAX_INCLUDE_DEPTH)
                        die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
-                           cf && cf->name ? cf->name : "the command line");
+                           !cf ? "<unknown>" :
+                           cf->name ? cf->name :
+                           "the command line");
                ret = git_config_from_file(git_config_include, path, inc);
                inc->depth--;
        }
@@ -162,7 +190,7 @@ void git_config_push_parameter(const char *text)
 {
        struct strbuf env = STRBUF_INIT;
        const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
-       if (old) {
+       if (old && *old) {
                strbuf_addstr(&env, old);
                strbuf_addch(&env, ' ');
        }
@@ -205,32 +233,41 @@ int git_config_parse_parameter(const char *text,
 int git_config_from_parameters(config_fn_t fn, void *data)
 {
        const char *env = getenv(CONFIG_DATA_ENVIRONMENT);
+       int ret = 0;
        char *envw;
        const char **argv = NULL;
        int nr = 0, alloc = 0;
        int i;
+       struct config_source source;
 
        if (!env)
                return 0;
+
+       memset(&source, 0, sizeof(source));
+       source.prev = cf;
+       source.origin_type = CONFIG_ORIGIN_CMDLINE;
+       cf = &source;
+
        /* sq_dequote will write over it */
        envw = xstrdup(env);
 
        if (sq_dequote_to_argv(envw, &argv, &nr, &alloc) < 0) {
-               free(envw);
-               return error("bogus format in " CONFIG_DATA_ENVIRONMENT);
+               ret = error("bogus format in " CONFIG_DATA_ENVIRONMENT);
+               goto out;
        }
 
        for (i = 0; i < nr; i++) {
                if (git_config_parse_parameter(argv[i], fn, data) < 0) {
-                       free(argv);
-                       free(envw);
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
        }
 
+out:
        free(argv);
        free(envw);
-       return nr > 0;
+       cf = source.prev;
+       return ret;
 }
 
 static int get_next_char(void)
@@ -417,6 +454,8 @@ static int git_parse_source(config_fn_t fn, void *data)
        int comment = 0;
        int baselen = 0;
        struct strbuf *var = &cf->var;
+       int error_return = 0;
+       char *error_msg = NULL;
 
        /* U+FEFF Byte Order Mark in UTF8 */
        const char *bomptr = utf8_bom;
@@ -471,10 +510,40 @@ static int git_parse_source(config_fn_t fn, void *data)
                if (get_value(fn, data, var) < 0)
                        break;
        }
+
+       switch (cf->origin_type) {
+       case CONFIG_ORIGIN_BLOB:
+               error_msg = xstrfmt(_("bad config line %d in blob %s"),
+                                     cf->linenr, cf->name);
+               break;
+       case CONFIG_ORIGIN_FILE:
+               error_msg = xstrfmt(_("bad config line %d in file %s"),
+                                     cf->linenr, cf->name);
+               break;
+       case CONFIG_ORIGIN_STDIN:
+               error_msg = xstrfmt(_("bad config line %d in standard input"),
+                                     cf->linenr);
+               break;
+       case CONFIG_ORIGIN_SUBMODULE_BLOB:
+               error_msg = xstrfmt(_("bad config line %d in submodule-blob %s"),
+                                      cf->linenr, cf->name);
+               break;
+       case CONFIG_ORIGIN_CMDLINE:
+               error_msg = xstrfmt(_("bad config line %d in command line %s"),
+                                      cf->linenr, cf->name);
+               break;
+       default:
+               error_msg = xstrfmt(_("bad config line %d in %s"),
+                                     cf->linenr, cf->name);
+       }
+
        if (cf->die_on_error)
-               die(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name);
+               die("%s", error_msg);
        else
-               return error(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name);
+               error_return = error("%s", error_msg);
+
+       free(error_msg);
+       return error_return;
 }
 
 static int parse_unit_factor(const char *end, uintmax_t *val)
@@ -583,16 +652,35 @@ int git_parse_ulong(const char *value, unsigned long *ret)
 NORETURN
 static void die_bad_number(const char *name, const char *value)
 {
-       const char *reason = errno == ERANGE ?
-                            "out of range" :
-                            "invalid unit";
+       const char * error_type = (errno == ERANGE)? _("out of range"):_("invalid unit");
+
        if (!value)
                value = "";
 
-       if (cf && cf->origin_type && cf->name)
-               die(_("bad numeric config value '%s' for '%s' in %s %s: %s"),
-                   value, name, cf->origin_type, cf->name, reason);
-       die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason);
+       if (!(cf && cf->name))
+               die(_("bad numeric config value '%s' for '%s': %s"),
+                   value, name, error_type);
+
+       switch (cf->origin_type) {
+       case CONFIG_ORIGIN_BLOB:
+               die(_("bad numeric config value '%s' for '%s' in blob %s: %s"),
+                   value, name, cf->name, error_type);
+       case CONFIG_ORIGIN_FILE:
+               die(_("bad numeric config value '%s' for '%s' in file %s: %s"),
+                   value, name, cf->name, error_type);
+       case CONFIG_ORIGIN_STDIN:
+               die(_("bad numeric config value '%s' for '%s' in standard input: %s"),
+                   value, name, error_type);
+       case CONFIG_ORIGIN_SUBMODULE_BLOB:
+               die(_("bad numeric config value '%s' for '%s' in submodule-blob %s: %s"),
+                   value, name, cf->name, error_type);
+       case CONFIG_ORIGIN_CMDLINE:
+               die(_("bad numeric config value '%s' for '%s' in command line %s: %s"),
+                   value, name, cf->name, error_type);
+       default:
+               die(_("bad numeric config value '%s' for '%s' in %s: %s"),
+                   value, name, cf->name, error_type);
+       }
 }
 
 int git_config_int(const char *name, const char *value)
@@ -717,6 +805,9 @@ static int git_default_core_config(const char *var, const char *value)
        if (!strcmp(var, "core.attributesfile"))
                return git_config_pathname(&git_attributes_file, var, value);
 
+       if (!strcmp(var, "core.hookspath"))
+               return git_config_pathname(&git_hooks_path, var, value);
+
        if (!strcmp(var, "core.bare")) {
                is_bare_repository_cfg = git_config_bool(var, value);
                return 0;
@@ -750,6 +841,9 @@ static int git_default_core_config(const char *var, const char *value)
                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)
@@ -803,8 +897,6 @@ static int git_default_core_config(const char *var, const char *value)
 
        if (!strcmp(var, "core.autocrlf")) {
                if (value && !strcasecmp(value, "input")) {
-                       if (core_eol == EOL_CRLF)
-                               return error("core.autocrlf=input conflicts with core.eol=crlf");
                        auto_crlf = AUTO_CRLF_INPUT;
                        return 0;
                }
@@ -830,8 +922,6 @@ static int git_default_core_config(const char *var, const char *value)
                        core_eol = EOL_NATIVE;
                else
                        core_eol = EOL_UNSET;
-               if (core_eol == EOL_CRLF && auto_crlf == AUTO_CRLF_INPUT)
-                       return error("core.autocrlf=input conflicts with core.eol=crlf");
                return 0;
        }
 
@@ -840,9 +930,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);
 
@@ -912,6 +999,14 @@ static int git_default_core_config(const char *var, const char *value)
                return 0;
        }
 
+       if (!strcmp(var, "core.hidedotfiles")) {
+               if (value && !strcasecmp(value, "dotgitonly"))
+                       hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
+               else
+                       hide_dotfiles = git_config_bool(var, value);
+               return 0;
+       }
+
        /* Add other config variables here and to Documentation/config.txt. */
        return 0;
 }
@@ -950,7 +1045,7 @@ static int git_default_branch_config(const char *var, const char *value)
                else if (!strcmp(value, "always"))
                        autorebase = AUTOREBASE_ALWAYS;
                else
-                       return error("Malformed value for %s", var);
+                       return error("malformed value for %s", var);
                return 0;
        }
 
@@ -976,7 +1071,7 @@ static int git_default_push_config(const char *var, const char *value)
                else if (!strcmp(value, "current"))
                        push_default = PUSH_DEFAULT_CURRENT;
                else {
-                       error("Malformed value for %s: %s", var, value);
+                       error("malformed value for %s: %s", var, value);
                        return error("Must be one of nothing, matching, simple, "
                                     "upstream or current.");
                }
@@ -1062,7 +1157,8 @@ static int do_config_from(struct config_source *top, config_fn_t fn, void *data)
 }
 
 static int do_config_from_file(config_fn_t fn,
-               const char *origin_type, const char *name, const char *path, FILE *f,
+               const enum config_origin_type origin_type,
+               const char *name, const char *path, FILE *f,
                void *data)
 {
        struct config_source top;
@@ -1081,7 +1177,7 @@ static int do_config_from_file(config_fn_t fn,
 
 static int git_config_from_stdin(config_fn_t fn, void *data)
 {
-       return do_config_from_file(fn, "standard input", "", NULL, stdin, data);
+       return do_config_from_file(fn, CONFIG_ORIGIN_STDIN, "", NULL, stdin, data);
 }
 
 int git_config_from_file(config_fn_t fn, const char *filename, void *data)
@@ -1092,14 +1188,14 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
        f = fopen(filename, "r");
        if (f) {
                flockfile(f);
-               ret = do_config_from_file(fn, "file", filename, filename, f, data);
+               ret = do_config_from_file(fn, CONFIG_ORIGIN_FILE, filename, filename, f, data);
                funlockfile(f);
                fclose(f);
        }
        return ret;
 }
 
-int git_config_from_mem(config_fn_t fn, const char *origin_type,
+int git_config_from_mem(config_fn_t fn, const enum config_origin_type origin_type,
                        const char *name, const char *buf, size_t len, void *data)
 {
        struct config_source top;
@@ -1136,7 +1232,7 @@ static int git_config_from_blob_sha1(config_fn_t fn,
                return error("reference '%s' does not point to a blob", name);
        }
 
-       ret = git_config_from_mem(fn, "blob", name, buf, size, data);
+       ret = git_config_from_mem(fn, CONFIG_ORIGIN_BLOB, name, buf, size, data);
        free(buf);
 
        return ret;
@@ -1188,55 +1284,44 @@ int git_config_system(void)
        return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
 }
 
-int git_config_early(config_fn_t fn, void *data, const char *repo_config)
+static int do_git_config_sequence(config_fn_t fn, void *data)
 {
-       int ret = 0, found = 0;
+       int ret = 0;
        char *xdg_config = xdg_config_home("config");
        char *user_config = expand_user_path("~/.gitconfig");
+       char *repo_config = have_git_dir() ? git_pathdup("config") : NULL;
 
-       if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
+       current_parsing_scope = CONFIG_SCOPE_SYSTEM;
+       if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0))
                ret += git_config_from_file(fn, git_etc_gitconfig(),
                                            data);
-               found += 1;
-       }
 
-       if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) {
+       current_parsing_scope = CONFIG_SCOPE_GLOBAL;
+       if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK))
                ret += git_config_from_file(fn, xdg_config, data);
-               found += 1;
-       }
 
-       if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) {
+       if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK))
                ret += git_config_from_file(fn, user_config, data);
-               found += 1;
-       }
 
-       if (repo_config && !access_or_die(repo_config, R_OK, 0)) {
+       current_parsing_scope = CONFIG_SCOPE_REPO;
+       if (repo_config && !access_or_die(repo_config, R_OK, 0))
                ret += git_config_from_file(fn, repo_config, data);
-               found += 1;
-       }
 
-       switch (git_config_from_parameters(fn, data)) {
-       case -1: /* error */
+       current_parsing_scope = CONFIG_SCOPE_CMDLINE;
+       if (git_config_from_parameters(fn, data) < 0)
                die(_("unable to parse command-line config"));
-               break;
-       case 0: /* found nothing */
-               break;
-       default: /* found at least one item */
-               found++;
-               break;
-       }
 
+       current_parsing_scope = CONFIG_SCOPE_UNKNOWN;
        free(xdg_config);
        free(user_config);
-       return ret == 0 ? found : ret;
+       free(repo_config);
+       return ret;
 }
 
 int git_config_with_options(config_fn_t fn, void *data,
                            struct git_config_source *config_source,
                            int respect_includes)
 {
-       char *repo_config = NULL;
-       int ret;
        struct config_include_data inc = CONFIG_INCLUDE_INIT;
 
        if (respect_includes) {
@@ -1257,11 +1342,7 @@ 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);
 
-       repo_config = git_pathdup("config");
-       ret = git_config_early(fn, data, repo_config);
-       if (repo_config)
-               free(repo_config);
-       return ret;
+       return do_git_config_sequence(fn, data);
 }
 
 static void git_config_raw(config_fn_t fn, void *data)
@@ -1269,7 +1350,7 @@ static void git_config_raw(config_fn_t fn, void *data)
        if (git_config_with_options(fn, data, NULL, 1) < 0)
                /*
                 * git_config_with_options() normally returns only
-                * positive values, as most errors are fatal, and
+                * zero, as most errors are fatal, and
                 * non-fatal potential errors are guarded by "if"
                 * statements that are entered only when no error is
                 * possible.
@@ -1278,7 +1359,7 @@ static void git_config_raw(config_fn_t fn, void *data)
                 * something went really wrong and we should stop
                 * immediately.
                 */
-               die(_("unknown error occured while reading the configuration files"));
+               die(_("unknown error occurred while reading the configuration files"));
 }
 
 static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
@@ -1287,16 +1368,20 @@ static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
        struct string_list *values;
        struct config_set_element *entry;
        struct configset_list *list = &cs->list;
-       struct key_value_info *kv_info;
 
        for (i = 0; i < list->nr; i++) {
                entry = list->items[i].e;
                value_index = list->items[i].value_index;
                values = &entry->value_list;
-               if (fn(entry->key, values->items[value_index].string, data) < 0) {
-                       kv_info = values->items[value_index].util;
-                       git_die_config_linenr(entry->key, kv_info->filename, kv_info->linenr);
-               }
+
+               current_config_kvi = values->items[value_index].util;
+
+               if (fn(entry->key, values->items[value_index].string, data) < 0)
+                       git_die_config_linenr(entry->key,
+                                             current_config_kvi->filename,
+                                             current_config_kvi->linenr);
+
+               current_config_kvi = NULL;
        }
 }
 
@@ -1313,14 +1398,11 @@ static struct config_set_element *configset_find_element(struct config_set *cs,
        struct config_set_element k;
        struct config_set_element *found_entry;
        char *normalized_key;
-       int ret;
        /*
         * `key` may come from the user, so normalize it before using it
         * for querying entries from the hashmap.
         */
-       ret = git_config_parse_key(key, &normalized_key, NULL);
-
-       if (ret)
+       if (git_config_parse_key(key, &normalized_key, NULL))
                return NULL;
 
        hashmap_entry_init(&k, strhash(normalized_key));
@@ -1356,14 +1438,19 @@ static int configset_add_value(struct config_set *cs, const char *key, const cha
        l_item->e = e;
        l_item->value_index = e->value_list.nr - 1;
 
-       if (cf) {
+       if (!cf)
+               die("BUG: configset_add_value has no source");
+       if (cf->name) {
                kv_info->filename = strintern(cf->name);
                kv_info->linenr = cf->linenr;
+               kv_info->origin_type = cf->origin_type;
        } else {
                /* for values read from `git_config_from_parameters()` */
                kv_info->filename = NULL;
                kv_info->linenr = -1;
+               kv_info->origin_type = CONFIG_ORIGIN_CMDLINE;
        }
+       kv_info->scope = current_parsing_scope;
        si->util = kv_info;
 
        return 0;
@@ -2016,7 +2103,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
        lock = xcalloc(1, sizeof(struct lock_file));
        fd = hold_lock_file_for_update(lock, config_filename, 0);
        if (fd < 0) {
-               error("could not lock config file %s: %s", config_filename, strerror(errno));
+               error_errno("could not lock config file %s", config_filename);
                free(store.key);
                ret = CONFIG_NO_LOCK;
                goto out_free;
@@ -2030,8 +2117,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                free(store.key);
 
                if ( ENOENT != errno ) {
-                       error("opening %s: %s", config_filename,
-                             strerror(errno));
+                       error_errno("opening %s", config_filename);
                        ret = CONFIG_INVALID_FILE; /* same as "invalid config file" */
                        goto out_free;
                }
@@ -2115,8 +2201,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                if (contents == MAP_FAILED) {
                        if (errno == ENODEV && S_ISDIR(st.st_mode))
                                errno = EISDIR;
-                       error("unable to mmap '%s': %s",
-                             config_filename, strerror(errno));
+                       error_errno("unable to mmap '%s'", config_filename);
                        ret = CONFIG_INVALID_FILE;
                        contents = NULL;
                        goto out_free;
@@ -2125,8 +2210,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                in_fd = -1;
 
                if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
-                       error("chmod on %s failed: %s",
-                             get_lock_file_path(lock), strerror(errno));
+                       error_errno("chmod on %s failed", get_lock_file_path(lock));
                        ret = CONFIG_NO_WRITE;
                        goto out_free;
                }
@@ -2182,8 +2266,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
        }
 
        if (commit_lock_file(lock) < 0) {
-               error("could not write config file %s: %s", config_filename,
-                     strerror(errno));
+               error_errno("could not write config file %s", config_filename);
                ret = CONFIG_NO_WRITE;
                lock = NULL;
                goto out_free;
@@ -2221,9 +2304,13 @@ void git_config_set_multivar_in_file(const char *config_filename,
                                     const char *key, const char *value,
                                     const char *value_regex, int multi_replace)
 {
-       if (git_config_set_multivar_in_file_gently(config_filename, key, value,
-                                                  value_regex, multi_replace) < 0)
-               die(_("Could not set '%s' to '%s'"), key, value);
+       if (!git_config_set_multivar_in_file_gently(config_filename, key, value,
+                                                   value_regex, multi_replace))
+               return;
+       if (value)
+               die(_("could not set '%s' to '%s'"), key, value);
+       else
+               die(_("could not unset '%s'"), key);
 }
 
 int git_config_set_multivar_gently(const char *key, const char *value,
@@ -2330,8 +2417,8 @@ int git_config_rename_section_in_file(const char *config_filename,
        fstat(fileno(config_file), &st);
 
        if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
-               ret = error("chmod on %s failed: %s",
-                           get_lock_file_path(lock), strerror(errno));
+               ret = error_errno("chmod on %s failed",
+                                 get_lock_file_path(lock));
                goto out;
        }
 
@@ -2385,8 +2472,8 @@ int git_config_rename_section_in_file(const char *config_filename,
        fclose(config_file);
 unlock_and_out:
        if (commit_lock_file(lock) < 0)
-               ret = error("could not write config file %s: %s",
-                           config_filename, strerror(errno));
+               ret = error_errno("could not write config file %s",
+                                 config_filename);
 out:
        free(filename_buf);
        return ret;
@@ -2404,7 +2491,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)
 #undef config_error_nonbool
 int config_error_nonbool(const char *var)
 {
-       return error("Missing value for '%s'", var);
+       return error("missing value for '%s'", var);
 }
 
 int parse_config_key(const char *var,
@@ -2442,10 +2529,46 @@ int parse_config_key(const char *var,
 
 const char *current_config_origin_type(void)
 {
-       return cf && cf->origin_type ? cf->origin_type : "command line";
+       int type;
+       if (current_config_kvi)
+               type = current_config_kvi->origin_type;
+       else if(cf)
+               type = cf->origin_type;
+       else
+               die("BUG: current_config_origin_type called outside config callback");
+
+       switch (type) {
+       case CONFIG_ORIGIN_BLOB:
+               return "blob";
+       case CONFIG_ORIGIN_FILE:
+               return "file";
+       case CONFIG_ORIGIN_STDIN:
+               return "standard input";
+       case CONFIG_ORIGIN_SUBMODULE_BLOB:
+               return "submodule-blob";
+       case CONFIG_ORIGIN_CMDLINE:
+               return "command line";
+       default:
+               die("BUG: unknown config origin type");
+       }
 }
 
 const char *current_config_name(void)
 {
-       return cf && cf->name ? cf->name : "";
+       const char *name;
+       if (current_config_kvi)
+               name = current_config_kvi->filename;
+       else if (cf)
+               name = cf->name;
+       else
+               die("BUG: current_config_name called outside config callback");
+       return name ? name : "";
+}
+
+enum config_scope current_config_scope(void)
+{
+       if (current_config_kvi)
+               return current_config_kvi->scope;
+       else
+               return current_parsing_scope;
 }
index fe8096f8a65241760cfdc3dabd4cf63ee412e9ca..b232908f8c8c2eae84bd6ef8ab2a96ac45bf94a3 100644 (file)
@@ -36,6 +36,8 @@ ifeq ($(uname_S),Linux)
        HAVE_DEV_TTY = YesPlease
        HAVE_CLOCK_GETTIME = YesPlease
        HAVE_CLOCK_MONOTONIC = YesPlease
+       # -lrt is needed for clock_gettime on glibc <= 2.16
+       NEEDS_LIBRT = YesPlease
        HAVE_GETDELIM = YesPlease
        SANE_TEXT_GREP=-a
 endif
@@ -187,6 +189,7 @@ ifeq ($(uname_O),Cygwin)
        X = .exe
        UNRELIABLE_FSTAT = UnfortunatelyYes
        SPARSE_FLAGS = -isystem /usr/include/w32api -Wno-one-bit-signed-bitfield
+       OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
 endif
 ifeq ($(uname_S),FreeBSD)
        NEEDS_LIBICONV = YesPlease
@@ -202,9 +205,11 @@ ifeq ($(uname_S),FreeBSD)
                NO_STRTOUMAX = YesPlease
        endif
        PYTHON_PATH = /usr/local/bin/python
+       PERL_PATH = /usr/local/bin/perl
        HAVE_PATHS_H = YesPlease
        GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
        HAVE_BSD_SYSCTL = YesPlease
+       PAGER_ENV = LESS=FRX LV=-c MORE=FRX
 endif
 ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
@@ -556,7 +561,8 @@ else
                        BASIC_LDFLAGS += -Wl,--large-address-aware
                endif
                CC = gcc
-               COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0
+               COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY
+               EXTLIBS += -lntdll
                INSTALL = /bin/install
                NO_R_TO_GCC_LINKER = YesPlease
                INTERNAL_QSORT = YesPlease
index 0cd9f4680b84bccd0a98193c401b13749b05b833..0b15f04b1089e48f20353cf068d7d37587b8d966 100644 (file)
@@ -528,16 +528,6 @@ AC_CHECK_LIB([curl], [curl_global_init],
 [NO_CURL=],
 [NO_CURL=YesPlease])
 
-if test -z "${NO_CURL}" && test -z "${NO_OPENSSL}"; then
-
-AC_CHECK_LIB([curl], [Curl_ssl_init],
-[NEEDS_SSL_WITH_CURL=YesPlease],
-[NEEDS_SSL_WITH_CURL=])
-
-GIT_CONF_SUBST([NEEDS_SSL_WITH_CURL])
-
-fi
-
 GIT_UNSTASH_FLAGS($CURLDIR)
 
 GIT_CONF_SUBST([NO_CURL])
@@ -550,6 +540,17 @@ AC_CHECK_PROG([CURL_CONFIG], [curl-config],
 
 if test $CURL_CONFIG != no; then
     GIT_CONF_SUBST([CURL_CONFIG])
+    if test -z "${NO_OPENSSL}"; then
+      AC_MSG_CHECKING([if Curl supports SSL])
+      if test $(curl-config --features|grep SSL) = SSL; then
+         NEEDS_SSL_WITH_CURL=YesPlease
+         AC_MSG_RESULT([yes])
+      else
+         NEEDS_SSL_WITH_CURL=
+         AC_MSG_RESULT([no])
+      fi
+      GIT_CONF_SUBST([NEEDS_SSL_WITH_CURL])
+    fi
 fi
 
 fi
@@ -835,9 +836,10 @@ AC_CHECK_TYPE([struct addrinfo],[
 ])
 GIT_CONF_SUBST([NO_IPV6])
 #
-# Define NO_REGEX if you have no or inferior regex support in your C library.
-AC_CACHE_CHECK([whether the platform regex can handle null bytes],
- [ac_cv_c_excellent_regex], [
+# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
+# feature.
+AC_CACHE_CHECK([whether the platform regex supports REG_STARTEND],
+ [ac_cv_c_regex_with_reg_startend], [
 AC_EGREP_CPP(yippeeyeswehaveit,
        AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
 #include <regex.h>
@@ -846,10 +848,10 @@ AC_EGREP_CPP(yippeeyeswehaveit,
 yippeeyeswehaveit
 #endif
 ]),
-       [ac_cv_c_excellent_regex=yes],
-       [ac_cv_c_excellent_regex=no])
+       [ac_cv_c_regex_with_reg_startend=yes],
+       [ac_cv_c_regex_with_reg_startend=no])
 ])
-if test $ac_cv_c_excellent_regex = yes; then
+if test $ac_cv_c_regex_with_reg_startend = yes; then
        NO_REGEX=
 else
        NO_REGEX=YesPlease
@@ -970,10 +972,6 @@ AC_CHECK_LIB([iconv], [locale_charset],
                      [CHARSET_LIB=-lcharset])])
 GIT_CONF_SUBST([CHARSET_LIB])
 #
-# Define NO_HMAC_CTX_CLEANUP=YesPlease if HMAC_CTX_cleanup is missing.
-AC_CHECK_LIB([crypto], [HMAC_CTX_cleanup],
-       [], [GIT_CONF_SUBST([NO_HMAC_CTX_CLEANUP], [YesPlease])])
-#
 # Define HAVE_CLOCK_GETTIME=YesPlease if clock_gettime is available.
 GIT_CHECK_FUNC(clock_gettime,
        [HAVE_CLOCK_GETTIME=YesPlease],
@@ -1112,14 +1110,19 @@ GIT_CONF_SUBST([HAVE_BSD_SYSCTL])
 AC_DEFUN([PTHREADTEST_SRC], [
 AC_LANG_PROGRAM([[
 #include <pthread.h>
+static void *noop(void *ignore) { return ignore; }
 ]], [[
        pthread_mutex_t test_mutex;
        pthread_key_t test_key;
+       pthread_t th;
        int retcode = 0;
+       void *ret = (void *)0;
        retcode |= pthread_key_create(&test_key, (void *)0);
        retcode |= pthread_mutex_init(&test_mutex,(void *)0);
        retcode |= pthread_mutex_lock(&test_mutex);
        retcode |= pthread_mutex_unlock(&test_mutex);
+       retcode |= pthread_create(&th, ret, noop, ret);
+       retcode |= pthread_join(th, &ret);
        return retcode;
 ]])])
 
index c53f3f1c55243feae8affbb268af689b35b9169f..8cb93b0720d9a33d8fc0cddb21c3d1c1a789da96 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)
@@ -115,10 +115,18 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                              struct sha1_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;
@@ -165,13 +173,25 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
                        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);
@@ -658,6 +678,19 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 
 static struct child_process no_fork = CHILD_PROCESS_INIT;
 
+static const char *get_ssh_command(void)
+{
+       const char *ssh;
+
+       if ((ssh = getenv("GIT_SSH_COMMAND")))
+               return ssh;
+
+       if (!git_config_get_string_const("core.sshcommand", &ssh))
+               return ssh;
+
+       return NULL;
+}
+
 /*
  * 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,
@@ -717,7 +750,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);
@@ -758,7 +791,7 @@ struct child_process *git_connect(int fd[2], const char *url,
                                return NULL;
                        }
 
-                       ssh = getenv("GIT_SSH_COMMAND");
+                       ssh = get_ssh_command();
                        if (!ssh) {
                                const char *base;
                                char *ssh_dup;
index 299c56090bc38b1572b0ac03ec48532f40de605f..136c2ac16839b8d4de9b653337dc4794c2a4ea34 100644 (file)
@@ -4,10 +4,6 @@
 #include "connected.h"
 #include "transport.h"
 
-int check_everything_connected(sha1_iterate_fn fn, int quiet, void *cb_data)
-{
-       return check_everything_connected_with_transport(fn, quiet, cb_data, NULL);
-}
 /*
  * If we feed all the commits we want to verify to this command
  *
@@ -19,22 +15,27 @@ int check_everything_connected(sha1_iterate_fn fn, int quiet, void *cb_data)
  *
  * Returns 0 if everything is connected, non-zero otherwise.
  */
-static int check_everything_connected_real(sha1_iterate_fn fn,
-                                          int quiet,
-                                          void *cb_data,
-                                          struct transport *transport,
-                                          const char *shallow_file)
+int check_connected(sha1_iterate_fn fn, void *cb_data,
+                   struct check_connected_options *opt)
 {
        struct child_process rev_list = CHILD_PROCESS_INIT;
-       const char *argv[9];
+       struct check_connected_options defaults = CHECK_CONNECTED_INIT;
        char commit[41];
        unsigned char sha1[20];
-       int err = 0, ac = 0;
+       int err = 0;
        struct packed_git *new_pack = NULL;
+       struct transport *transport;
        size_t base_len;
 
-       if (fn(cb_data, sha1))
+       if (!opt)
+               opt = &defaults;
+       transport = opt->transport;
+
+       if (fn(cb_data, sha1)) {
+               if (opt->err_fd)
+                       close(opt->err_fd);
                return err;
+       }
 
        if (transport && transport->smart_options &&
            transport->smart_options->self_contained_and_connected &&
@@ -47,24 +48,29 @@ static int check_everything_connected_real(sha1_iterate_fn fn,
                strbuf_release(&idx_file);
        }
 
-       if (shallow_file) {
-               argv[ac++] = "--shallow-file";
-               argv[ac++] = shallow_file;
+       if (opt->shallow_file) {
+               argv_array_push(&rev_list.args, "--shallow-file");
+               argv_array_push(&rev_list.args, opt->shallow_file);
        }
-       argv[ac++] = "rev-list";
-       argv[ac++] = "--objects";
-       argv[ac++] = "--stdin";
-       argv[ac++] = "--not";
-       argv[ac++] = "--all";
-       if (quiet)
-               argv[ac++] = "--quiet";
-       argv[ac] = NULL;
+       argv_array_push(&rev_list.args,"rev-list");
+       argv_array_push(&rev_list.args, "--objects");
+       argv_array_push(&rev_list.args, "--stdin");
+       argv_array_push(&rev_list.args, "--not");
+       argv_array_push(&rev_list.args, "--all");
+       argv_array_push(&rev_list.args, "--quiet");
+       if (opt->progress)
+               argv_array_pushf(&rev_list.args, "--progress=%s",
+                                _("Checking connectivity"));
 
-       rev_list.argv = argv;
        rev_list.git_cmd = 1;
+       rev_list.env = opt->env;
        rev_list.in = -1;
        rev_list.no_stdout = 1;
-       rev_list.no_stderr = quiet;
+       if (opt->err_fd)
+               rev_list.err = opt->err_fd;
+       else
+               rev_list.no_stderr = opt->quiet;
+
        if (start_command(&rev_list))
                return error(_("Could not run 'git rev-list'"));
 
@@ -86,34 +92,15 @@ static int check_everything_connected_real(sha1_iterate_fn fn,
                memcpy(commit, sha1_to_hex(sha1), 40);
                if (write_in_full(rev_list.in, commit, 41) < 0) {
                        if (errno != EPIPE && errno != EINVAL)
-                               error(_("failed write to rev-list: %s"),
-                                     strerror(errno));
+                               error_errno(_("failed write to rev-list"));
                        err = -1;
                        break;
                }
        } while (!fn(cb_data, sha1));
 
-       if (close(rev_list.in)) {
-               error(_("failed to close rev-list's stdin: %s"), strerror(errno));
-               err = -1;
-       }
+       if (close(rev_list.in))
+               err = error_errno(_("failed to close rev-list's stdin"));
 
        sigchain_pop(SIGPIPE);
        return finish_command(&rev_list) || err;
 }
-
-int check_everything_connected_with_transport(sha1_iterate_fn fn,
-                                             int quiet,
-                                             void *cb_data,
-                                             struct transport *transport)
-{
-       return check_everything_connected_real(fn, quiet, cb_data,
-                                              transport, NULL);
-}
-
-int check_shallow_connected(sha1_iterate_fn fn, int quiet, void *cb_data,
-                           const char *shallow_file)
-{
-       return check_everything_connected_real(fn, quiet, cb_data,
-                                              NULL, shallow_file);
-}
index 071d408f387b2afdbb642920054a7735c982200b..4ca325f79dc5ee45823834f71f66a6d3b278c3e5 100644 (file)
@@ -10,18 +10,48 @@ struct transport;
  */
 typedef int (*sha1_iterate_fn)(void *, unsigned char [20]);
 
+/*
+ * Named-arguments struct for check_connected. All arguments are
+ * optional, and can be left to defaults as set by CHECK_CONNECTED_INIT.
+ */
+struct check_connected_options {
+       /* Avoid printing any errors to stderr. */
+       int quiet;
+
+       /* --shallow-file to pass to rev-list sub-process */
+       const char *shallow_file;
+
+       /* Transport whose objects we are checking, if available. */
+       struct transport *transport;
+
+       /*
+        * If non-zero, send error messages to this descriptor rather
+        * than stderr. The descriptor is closed before check_connected
+        * returns.
+        */
+       int err_fd;
+
+       /* 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 }
+
 /*
  * Make sure that our object store has all the commits necessary to
  * connect the ancestry chain to some of our existing refs, and all
  * the trees and blobs that these commits use.
  *
  * Return 0 if Ok, non zero otherwise (i.e. some missing objects)
+ *
+ * If "opt" is NULL, behaves as if CHECK_CONNECTED_INIT was passed.
  */
-extern int check_everything_connected(sha1_iterate_fn, int quiet, void *cb_data);
-extern int check_shallow_connected(sha1_iterate_fn, int quiet, void *cb_data,
-                                  const char *shallow_file);
-extern int check_everything_connected_with_transport(sha1_iterate_fn, int quiet,
-                                                    void *cb_data,
-                                                    struct transport *transport);
+int check_connected(sha1_iterate_fn fn, void *cb_data,
+                   struct check_connected_options *opt);
 
 #endif /* CONNECTED_H */
diff --git a/contrib/coccinelle/.gitignore b/contrib/coccinelle/.gitignore
new file mode 100644 (file)
index 0000000..d3f2964
--- /dev/null
@@ -0,0 +1 @@
+*.patch*
diff --git a/contrib/coccinelle/README b/contrib/coccinelle/README
new file mode 100644 (file)
index 0000000..9c2f887
--- /dev/null
@@ -0,0 +1,2 @@
+This directory provides examples of Coccinelle (http://coccinelle.lip6.fr/)
+semantic patches that might be useful to developers.
diff --git a/contrib/coccinelle/array.cocci b/contrib/coccinelle/array.cocci
new file mode 100644 (file)
index 0000000..2d7f25d
--- /dev/null
@@ -0,0 +1,26 @@
+@@
+type T;
+T *dst;
+T *src;
+expression n;
+@@
+- memcpy(dst, src, n * sizeof(*dst));
++ COPY_ARRAY(dst, src, n);
+
+@@
+type T;
+T *dst;
+T *src;
+expression n;
+@@
+- memcpy(dst, src, n * sizeof(*src));
++ COPY_ARRAY(dst, src, n);
+
+@@
+type T;
+T *dst;
+T *src;
+expression n;
+@@
+- memcpy(dst, src, n * sizeof(T));
++ COPY_ARRAY(dst, src, n);
diff --git a/contrib/coccinelle/free.cocci b/contrib/coccinelle/free.cocci
new file mode 100644 (file)
index 0000000..e282131
--- /dev/null
@@ -0,0 +1,5 @@
+@@
+expression E;
+@@
+- if (E)
+  free(E);
diff --git a/contrib/coccinelle/object_id.cocci b/contrib/coccinelle/object_id.cocci
new file mode 100644 (file)
index 0000000..09afdbf
--- /dev/null
@@ -0,0 +1,110 @@
+@@
+expression E1;
+@@
+- is_null_sha1(E1.hash)
++ is_null_oid(&E1)
+
+@@
+expression E1;
+@@
+- is_null_sha1(E1->hash)
++ is_null_oid(E1)
+
+@@
+expression E1;
+@@
+- sha1_to_hex(E1.hash)
++ oid_to_hex(&E1)
+
+@@
+identifier f != oid_to_hex;
+expression E1;
+@@
+  f(...) {...
+- sha1_to_hex(E1->hash)
++ oid_to_hex(E1)
+  ...}
+
+@@
+expression E1, E2;
+@@
+- sha1_to_hex_r(E1, E2.hash)
++ oid_to_hex_r(E1, &E2)
+
+@@
+identifier f != oid_to_hex_r;
+expression E1, E2;
+@@
+   f(...) {...
+- sha1_to_hex_r(E1, E2->hash)
++ oid_to_hex_r(E1, E2)
+  ...}
+
+@@
+expression E1;
+@@
+- hashclr(E1.hash)
++ oidclr(&E1)
+
+@@
+identifier f != oidclr;
+expression E1;
+@@
+  f(...) {...
+- hashclr(E1->hash)
++ oidclr(E1)
+  ...}
+
+@@
+expression E1, E2;
+@@
+- hashcmp(E1.hash, E2.hash)
++ oidcmp(&E1, &E2)
+
+@@
+identifier f != oidcmp;
+expression E1, E2;
+@@
+  f(...) {...
+- hashcmp(E1->hash, E2->hash)
++ oidcmp(E1, E2)
+  ...}
+
+@@
+expression E1, E2;
+@@
+- hashcmp(E1->hash, E2.hash)
++ oidcmp(E1, &E2)
+
+@@
+expression E1, E2;
+@@
+- hashcmp(E1.hash, E2->hash)
++ oidcmp(&E1, E2)
+
+@@
+expression E1, E2;
+@@
+- hashcpy(E1.hash, E2.hash)
++ oidcpy(&E1, &E2)
+
+@@
+identifier f != oidcpy;
+expression E1, E2;
+@@
+  f(...) {...
+- hashcpy(E1->hash, E2->hash)
++ oidcpy(E1, E2)
+  ...}
+
+@@
+expression E1, E2;
+@@
+- hashcpy(E1->hash, E2.hash)
++ oidcpy(E1, &E2)
+
+@@
+expression E1, E2;
+@@
+- hashcpy(E1.hash, E2->hash)
++ oidcpy(&E1, E2)
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);
diff --git a/contrib/coccinelle/strbuf.cocci b/contrib/coccinelle/strbuf.cocci
new file mode 100644 (file)
index 0000000..63995f2
--- /dev/null
@@ -0,0 +1,40 @@
+@ strbuf_addf_with_format_only @
+expression E;
+constant fmt;
+@@
+  strbuf_addf(E,
+(
+  fmt
+|
+  _(fmt)
+)
+  );
+
+@ script:python @
+fmt << strbuf_addf_with_format_only.fmt;
+@@
+cocci.include_match("%" not in fmt)
+
+@ extends strbuf_addf_with_format_only @
+@@
+- strbuf_addf
++ strbuf_addstr
+  (E,
+(
+  fmt
+|
+  _(fmt)
+)
+  );
+
+@@
+expression E1, E2;
+@@
+- strbuf_addf(E1, "%s", E2);
++ strbuf_addstr(E1, E2);
+
+@@
+expression E1, E2, E3;
+@@
+- strbuf_addstr(E1, find_unique_abbrev(E2, E3));
++ strbuf_add_unique_abbrev(E1, E2, E3);
diff --git a/contrib/coccinelle/xstrdup_or_null.cocci b/contrib/coccinelle/xstrdup_or_null.cocci
new file mode 100644 (file)
index 0000000..3fceef1
--- /dev/null
@@ -0,0 +1,7 @@
+@@
+expression E;
+expression V;
+@@
+- if (E)
+-    V = xstrdup(E);
++ V = xstrdup_or_null(E);
index e3918c87e3adf32a9d7a4f0320c92c497376b9b5..21016bf8dfe87572fb53a05488ba05bb3c08ed97 100644 (file)
@@ -338,7 +338,7 @@ __git_tags ()
 __git_refs ()
 {
        local i hash dir="$(__gitdir "${1-}")" track="${2-}"
-       local format refs
+       local format refs pfx
        if [ -d "$dir" ]; then
                case "$cur" in
                refs|refs/*)
@@ -347,14 +347,15 @@ __git_refs ()
                        track=""
                        ;;
                *)
+                       [[ "$cur" == ^* ]] && pfx="^"
                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
-                               if [ -e "$dir/$i" ]; then echo $i; fi
+                               if [ -e "$dir/$i" ]; then echo $pfx$i; fi
                        done
                        format="refname:short"
                        refs="refs/tags refs/heads refs/remotes"
                        ;;
                esac
-               git --git-dir="$dir" for-each-ref --format="%($format)" \
+               git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
                        $refs
                if [ -n "$track" ]; then
                        # employ the heuristic used by git checkout
@@ -803,6 +804,50 @@ __git_find_on_cmdline ()
        done
 }
 
+# Echo the value of an option set on the command line or config
+#
+# $1: short option name
+# $2: long option name including =
+# $3: list of possible values
+# $4: config string (optional)
+#
+# example:
+# result="$(__git_get_option_value "-d" "--do-something=" \
+#     "yes no" "core.doSomething")"
+#
+# result is then either empty (no option set) or "yes" or "no"
+#
+# __git_get_option_value requires 3 arguments
+__git_get_option_value ()
+{
+       local c short_opt long_opt val
+       local result= values config_key word
+
+       short_opt="$1"
+       long_opt="$2"
+       values="$3"
+       config_key="$4"
+
+       ((c = $cword - 1))
+       while [ $c -ge 0 ]; do
+               word="${words[c]}"
+               for val in $values; do
+                       if [ "$short_opt$val" = "$word" ] ||
+                          [ "$long_opt$val"  = "$word" ]; then
+                               result="$val"
+                               break 2
+                       fi
+               done
+               ((c--))
+       done
+
+       if [ -n "$config_key" ] && [ -z "$result" ]; then
+               result="$(git --git-dir="$(__gitdir)" config "$config_key")"
+       fi
+
+       echo "$result"
+}
+
 __git_has_doubledash ()
 {
        local c=1
@@ -964,8 +1009,8 @@ _git_branch ()
        while [ $c -lt $cword ]; do
                i="${words[c]}"
                case "$i" in
-               -d|-m)  only_local_ref="y" ;;
-               -r)     has_r="y" ;;
+               -d|--delete|-m|--move)  only_local_ref="y" ;;
+               -r|--remotes)           has_r="y" ;;
                esac
                ((c++))
        done
@@ -979,7 +1024,7 @@ _git_branch ()
                        --color --no-color --verbose --abbrev= --no-abbrev
                        --track --no-track --contains --merged --no-merged
                        --set-upstream-to= --edit-description --list
-                       --unset-upstream
+                       --unset-upstream --delete --move --remotes
                        "
                ;;
        *)
@@ -1092,12 +1137,15 @@ _git_clone ()
                        --depth
                        --single-branch
                        --branch
+                       --recurse-submodules
                        "
                return
                ;;
        esac
 }
 
+__git_untracked_file_modes="all no normal"
+
 _git_commit ()
 {
        case "$prev" in
@@ -1119,7 +1167,7 @@ _git_commit ()
                return
                ;;
        --untracked-files=*)
-               __gitcomp "all no normal" "" "${cur##--untracked-files=}"
+               __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
                return
                ;;
        --*)
@@ -1158,6 +1206,8 @@ _git_describe ()
 
 __git_diff_algorithms="myers minimal patience histogram"
 
+__git_diff_submodule_formats="log short"
+
 __git_diff_common_options="--stat --numstat --shortstat --summary
                        --patch-with-stat --name-only --name-status --color
                        --no-color --color-words --no-renames --check
@@ -1173,6 +1223,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
                        --dirstat --dirstat= --dirstat-by-file
                        --dirstat-by-file= --cumulative
                        --diff-algorithm=
+                       --submodule --submodule=
 "
 
 _git_diff ()
@@ -1184,6 +1235,10 @@ _git_diff ()
                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
                return
                ;;
+       --submodule=*)
+               __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
+               return
+               ;;
        --*)
                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
                        --base --ours --theirs --no-index
@@ -1339,15 +1394,15 @@ _git_help ()
 {
        case "$cur" in
        --*)
-               __gitcomp "--all --info --man --web"
+               __gitcomp "--all --guides --info --man --web"
                return
                ;;
        esac
        __git_compute_all_commands
        __gitcomp "$__git_all_commands $(__git_aliases)
                attributes cli core-tutorial cvs-migration
-               diffcore gitk glossary hooks ignore modules
-               namespaces repository-layout tutorial tutorial-2
+               diffcore everyday gitk glossary hooks ignore modules
+               namespaces repository-layout revisions tutorial tutorial-2
                workflows
                "
 }
@@ -1447,6 +1502,14 @@ _git_log ()
                __gitcomp "full short no" "" "${cur##--decorate=}"
                return
                ;;
+       --diff-algorithm=*)
+               __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
+               return
+               ;;
+       --submodule=*)
+               __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
+               return
+               ;;
        --*)
                __gitcomp "
                        $__git_log_common_options
@@ -1458,6 +1521,7 @@ _git_log ()
                        --relative-date --date=
                        --pretty= --format= --oneline
                        --show-signature
+                       --cherry-mark
                        --cherry-pick
                        --graph
                        --decorate --decorate=
@@ -1779,6 +1843,56 @@ _git_stage ()
        _git_add
 }
 
+_git_status ()
+{
+       local complete_opt
+       local untracked_state
+
+       case "$cur" in
+       --ignore-submodules=*)
+               __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
+               return
+               ;;
+       --untracked-files=*)
+               __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
+               return
+               ;;
+       --column=*)
+               __gitcomp "
+                       always never auto column row plain dense nodense
+                       " "" "${cur##--column=}"
+               return
+               ;;
+       --*)
+               __gitcomp "
+                       --short --branch --porcelain --long --verbose
+                       --untracked-files= --ignore-submodules= --ignored
+                       --column= --no-column
+                       "
+               return
+               ;;
+       esac
+
+       untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
+               "$__git_untracked_file_modes" "status.showUntrackedFiles")"
+
+       case "$untracked_state" in
+       no)
+               # --ignored option does not matter
+               complete_opt=
+               ;;
+       all|normal|*)
+               complete_opt="--cached --directory --no-empty-directory --others"
+
+               if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
+                       complete_opt="$complete_opt --ignored --exclude=*"
+               fi
+               ;;
+       esac
+
+       __git_complete_index_file "$complete_opt"
+}
+
 __git_config_get_set_variables ()
 {
        local prevword word config_file= c=$cword
@@ -2084,6 +2198,7 @@ _git_config ()
                format.attach
                format.cc
                format.coverLetter
+               format.from
                format.headers
                format.numbered
                format.pretty
@@ -2358,6 +2473,10 @@ _git_show ()
                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
                return
                ;;
+       --submodule=*)
+               __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
+               return
+               ;;
        --*)
                __gitcomp "--pretty= --format= --abbrev-commit --oneline
                        --show-signature
@@ -2594,6 +2713,32 @@ _git_whatchanged ()
        _git_log
 }
 
+_git_worktree ()
+{
+       local subcommands="add list lock prune unlock"
+       local subcommand="$(__git_find_on_cmdline "$subcommands")"
+       if [ -z "$subcommand" ]; then
+               __gitcomp "$subcommands"
+       else
+               case "$subcommand,$cur" in
+               add,--*)
+                       __gitcomp "--detach"
+                       ;;
+               list,--*)
+                       __gitcomp "--porcelain"
+                       ;;
+               lock,--*)
+                       __gitcomp "--reason"
+                       ;;
+               prune,--*)
+                       __gitcomp "--dry-run --expire --verbose"
+                       ;;
+               *)
+                       ;;
+               esac
+       fi
+}
+
 __git_main ()
 {
        local i c=1 command __git_dir
index 64219e631ab9babdc9eb78137478bde2c2cabec8..97eacd7832b28377c5e14918ce6bededc55d7d40 100644 (file)
@@ -355,8 +355,8 @@ __git_ps1 ()
        # incorrect.)
        #
        local ps1_expanded=yes
-       [ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
-       [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
+       [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+       [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no
 
        local repo_info rev_parse_exit_code
        repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
@@ -368,7 +368,7 @@ __git_ps1 ()
                return $exit
        fi
 
-       local short_sha
+       local short_sha=""
        if [ "$rev_parse_exit_code" = "0" ]; then
                short_sha="${repo_info##*$'\n'}"
                repo_info="${repo_info%$'\n'*}"
index c3c7c98aa126470a4794903bc1e6b3be9b6d58cf..22c19df94b8177c6f264f1053f44f5ead259e730 100644 (file)
@@ -4,12 +4,13 @@ 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 gnome-keyring-1 glib-2.0)
-LIBS:=$(shell pkg-config --libs gnome-keyring-1 glib-2.0)
+INCS:=$(shell $(PKG_CONFIG) --cflags gnome-keyring-1 glib-2.0)
+LIBS:=$(shell $(PKG_CONFIG) --libs gnome-keyring-1 glib-2.0)
 
 SRCS:=$(MAIN).c
 OBJS:=$(SRCS:.c=.o)
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/Makefile b/contrib/diff-highlight/Makefile
new file mode 100644 (file)
index 0000000..9018724
--- /dev/null
@@ -0,0 +1,5 @@
+# nothing to build
+all:
+
+test:
+       $(MAKE) -C t
index ffefc31a98a26dfd65d188bbb547cc114231c13d..81bd8040e3cbd34a8b247f23a94eee891fc44296 100755 (executable)
@@ -21,6 +21,10 @@ my $RESET = "\x1b[m";
 my $COLOR = qr/\x1b\[[0-9;]*m/;
 my $BORING = qr/$COLOR|\s/;
 
+# The patch portion of git log -p --graph should only ever have preceding | and
+# not / or \ as merge history only shows up on the commit line.
+my $GRAPH = qr/$COLOR?\|$COLOR?\s+/;
+
 my @removed;
 my @added;
 my $in_hunk;
@@ -32,12 +36,12 @@ $SIG{PIPE} = 'DEFAULT';
 while (<>) {
        if (!$in_hunk) {
                print;
-               $in_hunk = /^$COLOR*\@/;
+               $in_hunk = /^$GRAPH*$COLOR*\@\@ /;
        }
-       elsif (/^$COLOR*-/) {
+       elsif (/^$GRAPH*$COLOR*-/) {
                push @removed, $_;
        }
-       elsif (/^$COLOR*\+/) {
+       elsif (/^$GRAPH*$COLOR*\+/) {
                push @added, $_;
        }
        else {
@@ -46,7 +50,7 @@ while (<>) {
                @added = ();
 
                print;
-               $in_hunk = /^$COLOR*[\@ ]/;
+               $in_hunk = /^$GRAPH*$COLOR*[\@ ]/;
        }
 
        # Most of the time there is enough output to keep things streaming,
@@ -163,6 +167,9 @@ sub highlight_pair {
        }
 }
 
+# we split either by $COLOR or by character. This has the side effect of
+# leaving in graph cruft. It works because the graph cruft does not contain "-"
+# or "+"
 sub split_line {
        local $_ = shift;
        return utf8::decode($_) ?
@@ -211,8 +218,8 @@ sub is_pair_interesting {
        my $suffix_a = join('', @$a[($sa+1)..$#$a]);
        my $suffix_b = join('', @$b[($sb+1)..$#$b]);
 
-       return $prefix_a !~ /^$COLOR*-$BORING*$/ ||
-              $prefix_b !~ /^$COLOR*\+$BORING*$/ ||
+       return $prefix_a !~ /^$GRAPH*$COLOR*-$BORING*$/ ||
+              $prefix_b !~ /^$GRAPH*$COLOR*\+$BORING*$/ ||
               $suffix_a !~ /^$BORING*$/ ||
               $suffix_b !~ /^$BORING*$/;
 }
diff --git a/contrib/diff-highlight/t/.gitignore b/contrib/diff-highlight/t/.gitignore
new file mode 100644 (file)
index 0000000..7dcbb23
--- /dev/null
@@ -0,0 +1,2 @@
+/trash directory*
+/test-results
diff --git a/contrib/diff-highlight/t/Makefile b/contrib/diff-highlight/t/Makefile
new file mode 100644 (file)
index 0000000..5ff5275
--- /dev/null
@@ -0,0 +1,22 @@
+-include ../../../config.mak.autogen
+-include ../../../config.mak
+
+# copied from ../../t/Makefile
+SHELL_PATH ?= $(SHELL)
+SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
+
+all: test
+test: $(T)
+
+.PHONY: help clean all test $(T)
+
+help:
+       @echo 'Run "$(MAKE) test" to launch test scripts'
+       @echo 'Run "$(MAKE) clean" to remove trash folders'
+
+$(T):
+       @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
+
+clean:
+       $(RM) -r 'trash directory'.*
diff --git a/contrib/diff-highlight/t/t9400-diff-highlight.sh b/contrib/diff-highlight/t/t9400-diff-highlight.sh
new file mode 100755 (executable)
index 0000000..3b43dbe
--- /dev/null
@@ -0,0 +1,296 @@
+#!/bin/sh
+
+test_description='Test diff-highlight'
+
+CURR_DIR=$(pwd)
+TEST_OUTPUT_DIRECTORY=$(pwd)
+TEST_DIRECTORY="$CURR_DIR"/../../../t
+DIFF_HIGHLIGHT="$CURR_DIR"/../diff-highlight
+
+CW="$(printf "\033[7m")"       # white
+CR="$(printf "\033[27m")"      # reset
+
+. "$TEST_DIRECTORY"/test-lib.sh
+
+if ! test_have_prereq PERL
+then
+       skip_all='skipping diff-highlight tests; perl not available'
+       test_done
+fi
+
+# dh_test is a test helper function which takes 3 file names as parameters. The
+# first 2 files are used to generate diff and commit output, which is then
+# piped through diff-highlight. The 3rd file should contain the expected output
+# of diff-highlight (minus the diff/commit header, ie. everything after and
+# including the first @@ line).
+dh_test () {
+       a="$1" b="$2" &&
+
+       cat >patch.exp &&
+
+       {
+               cat "$a" >file &&
+               git add file &&
+               git commit -m "Add a file" &&
+
+               cat "$b" >file &&
+               git diff file >diff.raw &&
+               git commit -a -m "Update a file" &&
+               git show >commit.raw
+       } >/dev/null &&
+
+       "$DIFF_HIGHLIGHT" <diff.raw | test_strip_patch_header >diff.act &&
+       "$DIFF_HIGHLIGHT" <commit.raw | test_strip_patch_header >commit.act &&
+       test_cmp patch.exp diff.act &&
+       test_cmp patch.exp commit.act
+}
+
+test_strip_patch_header () {
+       sed -n '/^@@/,$p' $*
+}
+
+# dh_test_setup_history generates a contrived graph such that we have at least
+# 1 nesting (E) and 2 nestings (F).
+#
+#            A branch
+#           /
+#      D---E---F master
+#
+#      git log --all --graph
+#      * commit
+#      |    A
+#      | * commit
+#      | |    F
+#      | * commit
+#      |/
+#      |    E
+#      * commit
+#           D
+#
+dh_test_setup_history () {
+       echo "file1" >file1 &&
+       echo "file2" >file2 &&
+       echo "file3" >file3 &&
+
+       cat file1 >file &&
+       git add file &&
+       git commit -m "D" &&
+
+       git checkout -b branch &&
+       cat file2 >file &&
+       git commit -a -m "A" &&
+
+       git checkout master &&
+       cat file2 >file &&
+       git commit -a -m "E" &&
+
+       cat file3 >file &&
+       git commit -a -m "F"
+}
+
+left_trim () {
+       "$PERL_PATH" -pe 's/^\s+//'
+}
+
+trim_graph () {
+       # graphs start with * or |
+       # followed by a space or / or \
+       "$PERL_PATH" -pe 's@^((\*|\|)( |/|\\))+@@'
+}
+
+test_expect_success 'diff-highlight highlights the beginning of a line' '
+       cat >a <<-\EOF &&
+               aaa
+               bbb
+               ccc
+       EOF
+
+       cat >b <<-\EOF &&
+               aaa
+               0bb
+               ccc
+       EOF
+
+       dh_test a b <<-EOF
+               @@ -1,3 +1,3 @@
+                aaa
+               -${CW}b${CR}bb
+               +${CW}0${CR}bb
+                ccc
+       EOF
+'
+
+test_expect_success 'diff-highlight highlights the end of a line' '
+       cat >a <<-\EOF &&
+               aaa
+               bbb
+               ccc
+       EOF
+
+       cat >b <<-\EOF &&
+               aaa
+               bb0
+               ccc
+       EOF
+
+       dh_test a b <<-EOF
+               @@ -1,3 +1,3 @@
+                aaa
+               -bb${CW}b${CR}
+               +bb${CW}0${CR}
+                ccc
+       EOF
+'
+
+test_expect_success 'diff-highlight highlights the middle of a line' '
+       cat >a <<-\EOF &&
+               aaa
+               bbb
+               ccc
+       EOF
+
+       cat >b <<-\EOF &&
+               aaa
+               b0b
+               ccc
+       EOF
+
+       dh_test a b <<-EOF
+               @@ -1,3 +1,3 @@
+                aaa
+               -b${CW}b${CR}b
+               +b${CW}0${CR}b
+                ccc
+       EOF
+'
+
+test_expect_success 'diff-highlight does not highlight whole line' '
+       cat >a <<-\EOF &&
+               aaa
+               bbb
+               ccc
+       EOF
+
+       cat >b <<-\EOF &&
+               aaa
+               000
+               ccc
+       EOF
+
+       dh_test a b <<-EOF
+               @@ -1,3 +1,3 @@
+                aaa
+               -bbb
+               +000
+                ccc
+       EOF
+'
+
+test_expect_failure 'diff-highlight highlights mismatched hunk size' '
+       cat >a <<-\EOF &&
+               aaa
+               bbb
+       EOF
+
+       cat >b <<-\EOF &&
+               aaa
+               b0b
+               ccc
+       EOF
+
+       dh_test a b <<-EOF
+               @@ -1,3 +1,3 @@
+                aaa
+               -b${CW}b${CR}b
+               +b${CW}0${CR}b
+               +ccc
+       EOF
+'
+
+# These two code points share the same leading byte in UTF-8 representation;
+# a naive byte-wise diff would highlight only the second byte.
+#
+#   - U+00f3 ("o" with acute)
+o_accent=$(printf '\303\263')
+#   - U+00f8 ("o" with stroke)
+o_stroke=$(printf '\303\270')
+
+test_expect_success 'diff-highlight treats multibyte utf-8 as a unit' '
+       echo "unic${o_accent}de" >a &&
+       echo "unic${o_stroke}de" >b &&
+       dh_test a b <<-EOF
+               @@ -1 +1 @@
+               -unic${CW}${o_accent}${CR}de
+               +unic${CW}${o_stroke}${CR}de
+       EOF
+'
+
+# Unlike the UTF-8 above, these are combining code points which are meant
+# to modify the character preceding them:
+#
+#   - U+0301 (combining acute accent)
+combine_accent=$(printf '\314\201')
+#   - U+0302 (combining circumflex)
+combine_circum=$(printf '\314\202')
+
+test_expect_failure 'diff-highlight treats combining code points as a unit' '
+       echo "unico${combine_accent}de" >a &&
+       echo "unico${combine_circum}de" >b &&
+       dh_test a b <<-EOF
+               @@ -1 +1 @@
+               -unic${CW}o${combine_accent}${CR}de
+               +unic${CW}o${combine_circum}${CR}de
+       EOF
+'
+
+test_expect_success 'diff-highlight works with the --graph option' '
+       dh_test_setup_history &&
+
+       # topo-order so that the order of the commits is the same as with --graph
+       # trim graph elements so we can do a diff
+       # trim leading space because our trim_graph is not perfect
+       git log --branches -p --topo-order |
+               "$DIFF_HIGHLIGHT" | left_trim >graph.exp &&
+       git log --branches -p --graph |
+               "$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph.act &&
+       test_cmp graph.exp graph.act
+'
+
+# Most combined diffs won't meet diff-highlight's line-number filter. So we
+# create one here where one side drops a line and the other modifies it. That
+# should result in a diff like:
+#
+#    - modified content
+#    ++resolved content
+#
+# which naively looks like one side added "+resolved".
+test_expect_success 'diff-highlight ignores combined diffs' '
+       echo "content" >file &&
+       git add file &&
+       git commit -m base &&
+
+       >file &&
+       git commit -am master &&
+
+       git checkout -b other HEAD^ &&
+       echo "modified content" >file &&
+       git commit -am other &&
+
+       test_must_fail git merge master &&
+       echo "resolved content" >file &&
+       git commit -am resolved &&
+
+       cat >expect <<-\EOF &&
+       --- a/file
+       +++ b/file
+       @@@ -1,1 -1,0 +1,1 @@@
+       - modified content
+       ++resolved content
+       EOF
+
+       git show -c | "$DIFF_HIGHLIGHT" >actual.raw &&
+       sed -n "/^---/,\$p" <actual.raw >actual &&
+       test_cmp expect actual
+'
+
+test_done
index 95438e1ed42f7289131a1b08654a2b23098c8e26..d60b4315ed60ad10e849408c6986d1ea5b47b32b 100755 (executable)
@@ -96,18 +96,21 @@ foreach my $tar_file (@ARGV)
                $mtime = oct $mtime;
                next if $typeflag == 5; # directory
 
-               print FI "blob\n", "mark :$next_mark\n";
-               if ($typeflag == 2) { # symbolic link
-                       print FI "data ", length($linkname), "\n", $linkname;
-                       $mode = 0120000;
-               } else {
-                       print FI "data $size\n";
-                       while ($size > 0 && read(I, $_, 512) == 512) {
-                               print FI substr($_, 0, $size);
-                               $size -= 512;
+               if ($typeflag != 1) { # handle hard links later
+                       print FI "blob\n", "mark :$next_mark\n";
+                       if ($typeflag == 2) { # symbolic link
+                               print FI "data ", length($linkname), "\n",
+                                       $linkname;
+                               $mode = 0120000;
+                       } else {
+                               print FI "data $size\n";
+                               while ($size > 0 && read(I, $_, 512) == 512) {
+                                       print FI substr($_, 0, $size);
+                                       $size -= 512;
+                               }
                        }
+                       print FI "\n";
                }
-               print FI "\n";
 
                my $path;
                if ($prefix) {
@@ -115,7 +118,13 @@ foreach my $tar_file (@ARGV)
                } else {
                        $path = "$name";
                }
-               $files{$path} = [$next_mark++, $mode];
+
+               if ($typeflag == 1) { # hard link
+                       $linkname = "$prefix/$linkname" if $prefix;
+                       $files{$path} = [ $files{$linkname}->[0], $mode ];
+               } else {
+                       $files{$path} = [$next_mark++, $mode];
+               }
 
                $author_time = $mtime if $mtime > $author_time;
                $path =~ m,^([^/]+)/,;
index 1cebc328cbfa1daffd1e0ce9f4fe1807140340d5..225e3f09547d07563a8da34b21677dce514659fa 100644 (file)
@@ -29,7 +29,7 @@ Obviously this trivial case isn't that interesting; you could just open
 `foo.c` yourself. But when you have many changes scattered across a
 project, you can use the editor's support to "jump" from point to point.
 
-Git-jump can generate three types of interesting lists:
+Git-jump can generate four types of interesting lists:
 
   1. The beginning of any diff hunks.
 
@@ -37,6 +37,8 @@ Git-jump can generate three types of interesting lists:
 
   3. Any grep matches.
 
+  4. Any whitespace errors detected by `git diff --check`.
+
 
 Using git-jump
 --------------
@@ -83,7 +85,7 @@ complete list of files and line numbers for each match.
 Limitations
 -----------
 
-This scripts was written and tested with vim. Given that the quickfix
+This script was written and tested with vim. Given that the quickfix
 format is the same as what gcc produces, I expect emacs users have a
 similar feature for iterating through the list, but I know nothing about
 how to activate it.
index dc90cd6379de4e9bf1eadc69560867601227b55d..427f206a45b326f2ee80af0fae7080d5f794c14a 100755 (executable)
@@ -12,6 +12,8 @@ diff: elements are diff hunks. Arguments are given to diff.
 merge: elements are merge conflicts. Arguments are ignored.
 
 grep: elements are grep hits. Arguments are given to grep.
+
+ws: elements are whitespace errors. Arguments are given to diff --check.
 EOF
 }
 
@@ -25,7 +27,7 @@ mode_diff() {
        perl -ne '
        if (m{^\+\+\+ (.*)}) { $file = $1; next }
        defined($file) or next;
-       if (m/^@@ .*\+(\d+)/) { $line = $1; next }
+       if (m/^@@ .*?\+(\d+)/) { $line = $1; next }
        defined($line) or next;
        if (/^ /) { $line++; next }
        if (/^[-+]\s*(.*)/) {
@@ -55,6 +57,10 @@ mode_grep() {
        '
 }
 
+mode_ws() {
+       git diff --check "$@"
+}
+
 if test $# -lt 1; then
        usage >&2
        exit 1
index bc77e66b8555679ed479929f2e756152cdee19fc..2076cf972b2865dc19cf60dc8df1b69d27041b02 100644 (file)
@@ -1,3 +1,105 @@
+Release 1.4.0
+=============
+
+New features to troubleshoot a git-multimail installation
+---------------------------------------------------------
+
+* One can now perform a basic check of git-multimail's setup by
+  running the hook with the environment variable
+  GIT_MULTIMAIL_CHECK_SETUP set to a non-empty string. See
+  doc/troubleshooting.rst for details.
+
+* A new log files system was added. See the multimailhook.logFile,
+  multimailhook.errorLogFile and multimailhook.debugLogFile variables.
+
+* git_multimail.py can now be made more verbose using
+  multimailhook.verbose.
+
+* A new option --check-ref-filter is now available to help debugging
+  the refFilter* options.
+
+Formatting emails
+-----------------
+
+* Formatting of emails was made slightly more compact, to reduce the
+  odds of having long subject lines truncated or wrapped in short list
+  of commits.
+
+* multimailhook.emailPrefix may now use the '%(repo_shortname)s'
+  placeholder for the repository's short name.
+
+* A new option multimailhook.subjectMaxLength is available to truncate
+  overly long subject lines.
+
+Bug fixes and minor changes
+---------------------------
+
+* Options refFilterDoSendRegex and refFilterDontSendRegex were
+  essentially broken. They should work now.
+
+* The behavior when both refFilter{Do,Dont}SendRegex and
+  refFilter{Exclusion,Inclusion}Regex are set have been slightly
+  changed. Exclusion/Inclusion is now strictly stronger than
+  DoSend/DontSend.
+
+* The management of precedence when a setting can be computed in
+  multiple ways has been considerably refactored and modified.
+  multimailhook.from and multimailhook.reponame now have precedence
+  over the environment-specific settings ($GL_REPO/$GL_USER for
+  gitolite, --stash-user/repo for Stash, --submitter/--project for
+  Gerrit).
+
+* The coverage of the testsuite has been considerably improved. All
+  configuration variables now appear at least once in the testsuite.
+
+This version was tested with Python 2.6 to 3.5. It also mostly works
+with Python 2.4, but there is one known breakage in the testsuite
+related to non-ascii characters. It was tested with Git
+1.7.10.406.gdc801, 1.8.5.6, 2.1.4, and 2.10.0.rc0.1.g07c9292.
+
+Release 1.3.1 (bugfix-only release)
+===================================
+
+* Generate links to commits in combined emails (it was done only for
+  commit emails in 1.3.0).
+
+* Fix broken links on PyPi.
+
+Release 1.3.0
+=============
+
+* New options multimailhook.htmlInIntro and multimailhook.htmlInFooter
+  now allow using HTML in the introduction and footer of emails (e.g.
+  for a more pleasant formatting or to insert a link to the commit on
+  a web interface).
+
+* A new option multimailhook.commitBrowseURL gives a simpler (and less
+  flexible) way to add a link to a web interface for commit emails
+  than multimailhook.htmlInIntro and multimailhook.htmlInFooter.
+
+* A new public function config.add_config_parameters was added to
+  allow custom hooks to set specific Git configuration variables
+  without modifying the configuration files. See an example in
+  post-receive.example.
+
+* Error handling for SMTP has been improved (we used to print Python
+  backtraces for legitimate errors).
+
+* The SMTP mailer can now check TLS certificates when the newly added
+  configuration variable multimailhook.smtpCACerts.
+
+* Python 3 portability has been improved.
+
+* The documentation's formatting has been improved.
+
+* The testsuite has been improved (we now use pyflakes to check for
+  errors in the code).
+
+This version has been tested with Python 2.4 and 2.6 to 3.5, and Git
+v1.7.10-406-gdc801e7, 2.1.4 and 2.8.1.339.g3ad15fd.
+
+No change since 1.3 RC1.
+
 Release 1.2.0
 =============
 
index 09efdb059c4ef6caf7524eab8eebe4e673ca6c50..da65570e9b0d271a12c35dc9d800ba6887323a8f 100644 (file)
@@ -1,14 +1,16 @@
+Contributing
+============
+
 git-multimail is an open-source project, built by volunteers. We would
 welcome your help!
 
-The current maintainers are Michael Haggerty <mhagger@alum.mit.edu>
-and Matthieu Moy <matthieu.moy@grenoble-inp.fr>.
+The current maintainers are Matthieu Moy
+<matthieu.moy@grenoble-inp.fr> and Michael Haggerty
+<mhagger@alum.mit.edu>.
 
 Please note that although a copy of git-multimail is distributed in
 the "contrib" section of the main Git project, development takes place
-in a separate git-multimail repository on GitHub:
-
-    https://github.com/git-multimail/git-multimail
+in a separate `git-multimail repository on GitHub`_.
 
 Whenever enough changes to git-multimail have accumulated, a new
 code-drop of git-multimail will be submitted for inclusion in the Git
@@ -21,10 +23,16 @@ to the maintainers). Please sign off your patches as per the `Git
 project practice
 <https://github.com/git/git/blob/master/Documentation/SubmittingPatches#L234>`__.
 
-General discussion of git-multimail can take place on the main Git
-mailing list,
+Please vote for issues you would like to be addressed in priority
+(click "add your reaction" and then the "+1" thumbs-up button on the
+GitHub issue).
 
-    git@vger.kernel.org
+General discussion of git-multimail can take place on the main `Git
+mailing list`_.
 
 Please CC emails regarding git-multimail to the maintainers so that we
 don't overlook them.
+
+
+.. _`git-multimail repository on GitHub`: https://github.com/git-multimail/git-multimail
+.. _`Git mailing list`: git@vger.kernel.org
index 55120685f04674daed7c0c32b8c9f33b0c8b79e3..5105373aea044f2d8fde0c4fd927c8c492d02585 100644 (file)
@@ -1,11 +1,11 @@
-git-multimail (version 1.2.0)
-=============================
+git-multimail version 1.4.0
+===========================
 
 .. image:: https://travis-ci.org/git-multimail/git-multimail.svg?branch=master
     :target: https://travis-ci.org/git-multimail/git-multimail
 
 git-multimail is a tool for sending notification emails on pushes to a
-Git repository.  It includes a Python module called git_multimail.py,
+Git repository.  It includes a Python module called ``git_multimail.py``,
 which can either be used as a hook script directly or can be imported
 as a Python module into another script.
 
@@ -93,20 +93,20 @@ Requirements
 Invocation
 ----------
 
-git_multimail.py is designed to be used as a ``post-receive`` hook in a
+``git_multimail.py`` is designed to be used as a ``post-receive`` hook in a
 Git repository (see githooks(5)).  Link or copy it to
 $GIT_DIR/hooks/post-receive within the repository for which email
 notifications are desired.  Usually it should be installed on the
 central repository for a project, to which all commits are eventually
 pushed.
 
-For use on pre-v1.5.1 Git servers, git_multimail.py can also work as
+For use on pre-v1.5.1 Git servers, ``git_multimail.py`` can also work as
 an ``update`` hook, taking its arguments on the command line.  To use
 this script in this manner, link or copy it to $GIT_DIR/hooks/update.
 Please note that the script is not completely reliable in this mode
-[2]_.
+[1]_.
 
-Alternatively, git_multimail.py can be imported as a Python module
+Alternatively, ``git_multimail.py`` can be imported as a Python module
 into your own Python post-receive script.  This method is a bit more
 work, but allows the behavior of the hook to be customized using
 arbitrary Python code.  For example, you can use a custom environment
@@ -122,11 +122,18 @@ arbitrary Python code.  For example, you can use a custom environment
 
 Or you can change how emails are sent by writing your own Mailer
 class.  The ``post-receive`` script in this directory demonstrates how
-to use git_multimail.py as a Python module.  (If you make interesting
+to use ``git_multimail.py`` as a Python module.  (If you make interesting
 changes of this type, please consider sharing them with the
 community.)
 
 
+Troubleshooting/FAQ
+-------------------
+
+Please read `<doc/troubleshooting.rst>`__ for frequently asked
+questions and common issues with git-multimail.
+
+
 Configuration
 -------------
 
@@ -134,28 +141,27 @@ By default, git-multimail mostly takes its configuration from the
 following ``git config`` settings:
 
 multimailhook.environment
-
     This describes the general environment of the repository. In most
     cases, you do not need to specify a value for this variable:
     `git-multimail` will autodetect which environment to use.
     Currently supported values:
 
-    * generic
-
+    generic
       the username of the pusher is read from $USER or $USERNAME and
       the repository name is derived from the repository's path.
 
-    * gitolite
+    gitolite
+      Environment to use when ``git-multimail`` is ran as a gitolite_
+      hook.
 
-      the username of the pusher is read from $GL_USER, the repository
+      The username of the pusher is read from $GL_USER, the repository
       name is read from $GL_REPO, and the From: header value is
       optionally read from gitolite.conf (see multimailhook.from).
 
       For more information about gitolite and git-multimail, read
       `<doc/gitolite.rst>`__
 
-    * stash
-
+    stash
       Environment to use when ``git-multimail`` is ran as an Atlassian
       BitBucket Server (formerly known as Atlassian Stash) hook.
 
@@ -169,8 +175,7 @@ multimailhook.environment
       and repo come from these two command line flags, which must be
       specified.
 
-    * gerrit
-
+    gerrit
       Environment to use when ``git-multimail`` is ran as a
       ``ref-updated`` Gerrit hook.
 
@@ -205,14 +210,12 @@ multimailhook.environment
     * If none of the above apply, then ``generic`` is used.
 
 multimailhook.repoName
-
     A short name of this Git repository, to be used in various places
     in the notification email text.  The default is to use $GL_REPO
     for gitolite repositories, or otherwise to derive this value from
     the repository path name.
 
 multimailhook.mailingList
-
     The list of email addresses to which notification emails should be
     sent, as RFC 2822 email addresses separated by commas.  This
     configuration option can be multivalued.  Leave it unset or set it
@@ -221,7 +224,6 @@ multimailhook.mailingList
     specific types of notification email.
 
 multimailhook.refchangeList
-
     The list of email addresses to which summary emails about
     reference changes should be sent, as RFC 2822 email addresses
     separated by commas.  This configuration option can be
@@ -231,7 +233,6 @@ multimailhook.refchangeList
     multimailhook.mailingList is set.
 
 multimailhook.announceList
-
     The list of email addresses to which emails about new annotated
     tags should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
@@ -241,7 +242,6 @@ multimailhook.announceList
     even if one of the other values is set.
 
 multimailhook.commitList
-
     The list of email addresses to which emails about individual new
     commits should be sent, as RFC 2822 email addresses separated by
     commas.  This configuration option can be multivalued.  The
@@ -251,7 +251,6 @@ multimailhook.commitList
     multimailhook.mailingList is set.
 
 multimailhook.announceShortlog
-
     If this option is set to true, then emails about changes to
     annotated tags include a shortlog of changes since the previous
     tag.  This can be useful if the annotated tags represent releases;
@@ -261,7 +260,6 @@ multimailhook.announceShortlog
     rather than useful.  Default is false.
 
 multimailhook.commitEmailFormat
-
     The format of email messages for the individual commits, can be "text" or
     "html". In the latter case, the emails will include diffs using colorized
     HTML instead of plain text used by default. Note that this  currently the
@@ -274,8 +272,43 @@ multimailhook.commitEmailFormat
     the message starting with ``+++`` or ``---`` colored in red or
     green).
 
-multimailhook.refchangeShowGraph
+    By default, all the message is HTML-escaped. See
+    ``multimailhook.htmlInIntro`` to change this behavior.
+
+multimailhook.commitBrowseURL
+    Used to generate a link to an online repository browser in commit
+    emails. This variable must be a string. Format directives like
+    ``%(<variable>)s`` will be expanded the same way as template
+    strings. In particular, ``%(id)s`` will be replaced by the full
+    Git commit identifier (40-chars hexadecimal).
 
+    If the string does not contain any format directive, then
+    ``%(id)s`` will be automatically added to the string. If you don't
+    want ``%(id)s`` to be automatically added, use the empty format
+    directive ``%()s`` anywhere in the string.
+
+    For example, a suitable value for the git-multimail project itself
+    would be
+    ``https://github.com/git-multimail/git-multimail/commit/%(id)s``.
+
+multimailhook.htmlInIntro, multimailhook.htmlInFooter
+    When generating an HTML message, git-multimail escapes any HTML
+    sequence by default. This means that if a template contains HTML
+    like ``<a href="foo">link</a>``, the reader will see the HTML
+    source code and not a proper link.
+
+    Set ``multimailhook.htmlInIntro`` to true to allow writing HTML
+    formatting in introduction templates. Similarly, set
+    ``multimailhook.htmlInFooter`` for HTML in the footer.
+
+    Variables expanded in the template are still escaped. For example,
+    if a repository's path contains a ``<``, it will be rendered as
+    such in the message.
+
+    Read `<doc/customizing-emails.rst>`__ for more details and
+    examples.
+
+multimailhook.refchangeShowGraph
     If this option is set to true, then summary emails about reference
     changes will additionally include:
 
@@ -287,7 +320,6 @@ multimailhook.refchangeShowGraph
     specified in graphOpts.  The default is false.
 
 multimailhook.refchangeShowLog
-
     If this option is set to true, then summary emails about reference
     changes will include a detailed log of the added commits in
     addition to the one line summary.  The log is generated by running
@@ -295,71 +327,80 @@ multimailhook.refchangeShowLog
     Default is false.
 
 multimailhook.mailer
-
     This option changes the way emails are sent.  Accepted values are:
 
-    - sendmail (the default): use the command ``/usr/sbin/sendmail`` or
+    * **sendmail (the default)**: use the command ``/usr/sbin/sendmail`` or
       ``/usr/lib/sendmail`` (or sendmailCommand, if configured).  This
       mode can be further customized via the following options:
 
-      * multimailhook.sendmailCommand
-
-        The command used by mailer ``sendmail`` to send emails.  Shell
-        quoting is allowed in the value of this setting, but remember that
-        Git requires double-quotes to be escaped; e.g.::
+      multimailhook.sendmailCommand
+          The command used by mailer ``sendmail`` to send emails.  Shell
+          quoting is allowed in the value of this setting, but remember that
+          Git requires double-quotes to be escaped; e.g.::
 
-             git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"'
+              git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"'
 
-        Default is '/usr/sbin/sendmail -oi -t' or
-        '/usr/lib/sendmail -oi -t' (depending on which file is
-        present and executable).
+          Default is '/usr/sbin/sendmail -oi -t' or
+          '/usr/lib/sendmail -oi -t' (depending on which file is
+          present and executable).
 
-      * multimailhook.envelopeSender
+      multimailhook.envelopeSender
+          If set then pass this value to sendmail via the -f option to set
+          the envelope sender address.
 
-        If set then pass this value to sendmail via the -f option to set
-        the envelope sender address.
-
-    - smtp: use Python's smtplib.  This is useful when the sendmail
+    * **smtp**: use Python's smtplib.  This is useful when the sendmail
       command is not available on the system.  This mode can be
       further customized via the following options:
 
-      * multimailhook.smtpServer
-
-        The name of the SMTP server to connect to.  The value can
-        also include a colon and a port number; e.g.,
-        ``mail.example.com:25``.  Default is 'localhost' using port 25.
+      multimailhook.smtpServer
+          The name of the SMTP server to connect to.  The value can
+          also include a colon and a port number; e.g.,
+          ``mail.example.com:25``.  Default is 'localhost' using port 25.
 
-      * multimailhook.smtpUser
-      * multimailhook.smtpPass
-
-        Server username and password. Required if smtpEncryption is 'ssl'.
-        Note that the username and password currently need to be
-        set cleartext in the configuration file, which is not
-        recommended. If you need to use this option, be sure your
-        configuration file is read-only.
-
-      * multimailhook.envelopeSender
+      multimailhook.smtpUser, multimailhook.smtpPass
+          Server username and password. Required if smtpEncryption is 'ssl'.
+          Note that the username and password currently need to be
+          set cleartext in the configuration file, which is not
+          recommended. If you need to use this option, be sure your
+          configuration file is read-only.
 
+      multimailhook.envelopeSender
         The sender address to be passed to the SMTP server.  If
         unset, then the value of multimailhook.from is used.
 
-      * multimailhook.smtpServerTimeout
-
+      multimailhook.smtpServerTimeout
         Timeout in seconds.
 
-      * multimailhook.smtpEncryption
-
-        Set the security type. Allowed values: none, ssl, tls.
-        Default=none.
-
-      * multimailhook.smtpServerDebugLevel
-
+      multimailhook.smtpEncryption
+        Set the security type. Allowed values: ``none``, ``ssl``, ``tls`` (starttls).
+        Default is ``none``.
+
+      multimailhook.smtpCACerts
+        Set the path to a list of trusted CA certificate to verify the
+        server certificate, only supported when ``smtpEncryption`` is
+        ``tls``. If unset or empty, the server certificate is not
+        verified. If it targets a file containing a list of trusted CA
+        certificates (PEM format) these CAs will be used to verify the
+        server certificate. For debian, you can set
+        ``/etc/ssl/certs/ca-certificates.crt`` for using the system
+        trusted CAs. For self-signed server, you can add your server
+        certificate to the system store::
+
+            cd /usr/local/share/ca-certificates/
+            openssl s_client -starttls smtp \
+                   -connect mail.example.net:587 -showcerts \
+                   </dev/null 2>/dev/null \
+                 | openssl x509 -outform PEM >mail.example.net.crt
+            update-ca-certificates
+
+        and used the updated ``/etc/ssl/certs/ca-certificates.crt``. Or
+        directly use your ``/path/to/mail.example.net.crt``. Default is
+        unset.
+
+      multimailhook.smtpServerDebugLevel
         Integer number. Set to greater than 0 to activate debugging.
 
-multimailhook.from
-multimailhook.fromCommit
-multimailhook.fromRefchange
-
+multimailhook.from, multimailhook.fromCommit, multimailhook.fromRefchange
     If set, use this value in the From: field of generated emails.
     ``fromCommit`` is used for commit emails, ``fromRefchange`` is
     used for refchange emails, and ``from`` is used as fall-back in
@@ -372,7 +413,7 @@ multimailhook.fromRefchange
     - The value ``pusher``, in which case the pusher's address (if
       available) will be used.
 
-    - The value ``author`` (meaningful only for replyToCommit), in which
+    - The value ``author`` (meaningful only for ``fromCommit``), in which
       case the commit author's address will be used.
 
     If config values are unset, the value of the From: header is
@@ -396,39 +437,47 @@ multimailhook.fromRefchange
     3. Use the value of multimailhook.envelopeSender.
 
 multimailhook.administrator
-
     The name and/or email address of the administrator of the Git
     repository; used in FOOTER_TEMPLATE.  Default is
     multimailhook.envelopesender if it is set; otherwise a generic
     string is used.
 
 multimailhook.emailPrefix
-
     All emails have this string prepended to their subjects, to aid
     email filtering (though filtering based on the X-Git-* email
     headers is probably more robust).  Default is the short name of
     the repository in square brackets; e.g., ``[myrepo]``.  Set this
-    value to the empty string to suppress the email prefix.
+    value to the empty string to suppress the email prefix. You may
+    use the placeholder ``%(repo_shortname)s`` for the short name of
+    the repository.
 
 multimailhook.emailMaxLines
-
     The maximum number of lines that should be included in the body of
     a generated email.  If not specified, there is no limit.  Lines
     beyond the limit are suppressed and counted, and a final line is
     added indicating the number of suppressed lines.
 
 multimailhook.emailMaxLineLength
-
     The maximum length of a line in the email body.  Lines longer than
-    this limit are truncated to this length with a trailing `` [...]``
+    this limit are truncated to this length with a trailing ``[...]``
     added to indicate the missing text.  The default is 500, because
     (a) diffs with longer lines are probably from binary files, for
     which a diff is useless, and (b) even if a text file has such long
     lines, the diffs are probably unreadable anyway.  To disable line
     truncation, set this option to 0.
 
-multimailhook.maxCommitEmails
+multimailhook.subjectMaxLength
+    The maximum length of the subject line (i.e. the ``oneline`` field
+    in templates, not including the prefix). Lines longer than this
+    limit are truncated to this length with a trailing ``[...]`` added
+    to indicate the missing text. This option The default is to use
+    ``multimailhook.emailMaxLineLength``. This option avoids sending
+    emails with overly long subject lines, but should not be needed if
+    the commit messages follow the Git convention (one short subject
+    line, then a blank line, then the message body). To disable line
+    truncation, set this option to 0.
 
+multimailhook.maxCommitEmails
     The maximum number of commit emails to send for a given change.
     When the number of patches is larger that this value, only the
     summary refchange email is sent.  This can avoid accidental
@@ -436,23 +485,23 @@ multimailhook.maxCommitEmails
     emails limit, set this option to 0.  The default is 500.
 
 multimailhook.emailStrictUTF8
-
     If this boolean option is set to `true`, then the main part of the
     email body is forced to be valid UTF-8.  Any characters that are
     not valid UTF-8 are converted to the Unicode replacement
     character, U+FFFD.  The default is `true`.
 
-multimailhook.diffOpts
+    This option is ineffective with Python 3, where non-UTF-8
+    characters are unconditionally replaced.
 
+multimailhook.diffOpts
     Options passed to ``git diff-tree`` when generating the summary
     information for ReferenceChange emails.  Default is ``--stat
     --summary --find-copies-harder``.  Add -p to those options to
     include a unified diff of changes in addition to the usual summary
-    output.  Shell quoting is allowed; see multimailhook.logOpts for
+    output.  Shell quoting is allowed; see ``multimailhook.logOpts`` for
     details.
 
 multimailhook.graphOpts
-
     Options passed to ``git log --graph`` when generating graphs for the
     reference change summary emails (used only if refchangeShowGraph
     is true).  The default is '--oneline --decorate'.
@@ -460,7 +509,6 @@ multimailhook.graphOpts
     Shell quoting is allowed; see logOpts for details.
 
 multimailhook.logOpts
-
     Options passed to ``git log`` to generate additional info for
     reference change emails (used only if refchangeShowLog is set).
     For example, adding -p will show each commit's complete diff.  The
@@ -479,7 +527,6 @@ multimailhook.logOpts
               logopts = --pretty=format:\"%h %aN <%aE>%n%s%n%n%b%n\"
 
 multimailhook.commitLogOpts
-
     Options passed to ``git log`` to generate additional info for
     revision change emails.  For example, adding --ignore-all-spaces
     will suppress whitespace changes.  The default options are ``-C
@@ -487,26 +534,21 @@ multimailhook.commitLogOpts
     multimailhook.logOpts for details.
 
 multimailhook.dateSubstitute
-
     String to use as a substitute for ``Date:`` in the output of ``git
-    log`` while formatting commit messages. This is usefull to avoid
+    log`` while formatting commit messages. This is useful to avoid
     emitting a line that can be interpreted by mailers as the start of
     a cited message (Zimbra webmail in particular). Defaults to
-    ``CommitDate: ``. Set to an empty string or ``none`` to deactivate
+    ``CommitDate:``. Set to an empty string or ``none`` to deactivate
     the behavior.
 
 multimailhook.emailDomain
-
     Domain name appended to the username of the person doing the push
     to convert it into an email address
     (via ``"%s@%s" % (username, emaildomain)``). More complicated
     schemes can be implemented by overriding Environment and
     overriding its get_pusher_email() method.
 
-multimailhook.replyTo
-multimailhook.replyToCommit
-multimailhook.replyToRefchange
-
+multimailhook.replyTo, multimailhook.replyToCommit, multimailhook.replyToRefchange
     Addresses to use in the Reply-To: field for commit emails
     (replyToCommit) and refchange emails (replyToRefchange).
     multimailhook.replyTo is used as default when replyToCommit or
@@ -519,36 +561,30 @@ multimailhook.replyToRefchange
     commit emails.
 
 multimailhook.quiet
-
     Do not output the list of email recipients from the hook
 
 multimailhook.stdout
-
     For debugging, send emails to stdout rather than to the
     mailer.  Equivalent to the --stdout command line option
 
 multimailhook.scanCommitForCc
-
     If this option is set to true, than recipients from lines in commit body
     that starts with ``CC:`` will be added to CC list.
     Default: false
 
 multimailhook.combineWhenSingleCommit
-
     If this option is set to true and a single new commit is pushed to
     a branch, combine the summary and commit email messages into a
     single email.
     Default: true
 
-multimailhook.refFilterInclusionRegex
-multimailhook.refFilterExclusionRegex
-multimailhook.refFilterDoSendRegex
-multimailhook.refFilterDontSendRegex
-
+multimailhook.refFilterInclusionRegex, multimailhook.refFilterExclusionRegex, multimailhook.refFilterDoSendRegex, multimailhook.refFilterDontSendRegex
     **Warning:** these options are experimental. They should work, but
     the user-interface is not stable yet (in particular, the option
     names may change). If you want to participate in stabilizing the
     feature, please contact the maintainers and/or send pull-requests.
+    If you are happy with the current shape of the feature, please
+    report it too.
 
     Regular expressions that can be used to limit refs for which email
     updates will be sent.  It is an error to specify both an inclusion
@@ -598,6 +634,32 @@ multimailhook.refFilterDontSendRegex
       [multimailhook]
               refFilterExclusionRegex = ^refs/tags/|^refs/heads/master$
 
+    ``refFilterInclusionRegex`` and ``refFilterExclusionRegex`` are
+    strictly stronger than ``refFilterDoSendRegex`` and
+    ``refFilterDontSendRegex``. In other words, adding a ref to a
+    DoSend/DontSend regex has no effect if it is already excluded by a
+    Exclusion/Inclusion regex.
+
+multimailhook.logFile, multimailhook.errorLogFile, multimailhook.debugLogFile
+
+    When set, these variable designate path to files where
+    git-multimail will log some messages. Normal messages and error
+    messages are sent to ``logFile``, and error messages are also sent
+    to ``errorLogFile``. Debug messages and all other messages are
+    sent to ``debugLogFile``. The recommended way is to set only one
+    of these variables, but it is also possible to set several of them
+    (part of the information is then duplicated in several log files,
+    for example errors are duplicated to all log files).
+
+    Relative path are relative to the Git repository where the push is
+    done.
+
+multimailhook.verbose
+
+    Verbosity level of git-multimail on its standard output. By
+    default, show only error and info messages. If set to true, show
+    also debug messages.
+
 Email filtering aids
 --------------------
 
@@ -613,8 +675,8 @@ Customizing email contents
 
 git-multimail mostly generates emails by expanding templates.  The
 templates can be customized.  To avoid the need to edit
-git_multimail.py directly, the preferred way to change the templates
-is to write a separate Python script that imports git_multimail.py as
+``git_multimail.py`` directly, the preferred way to change the templates
+is to write a separate Python script that imports ``git_multimail.py`` as
 a module, then replaces the templates in place.  See the provided
 post-receive script for an example of how this is done.
 
@@ -626,14 +688,16 @@ git-multimail is mostly customized via an "environment" that describes
 the local environment in which Git is running.  Two types of
 environment are built in:
 
-* GenericEnvironment: a stand-alone Git repository.
+GenericEnvironment
+    a stand-alone Git repository.
 
-* GitoliteEnvironment: a Git repository that is managed by gitolite
-  [3]_.  For such repositories, the identity of the pusher is read from
-  environment variable $GL_USER, the name of the repository is read
-  from $GL_REPO (if it is not overridden by multimailhook.reponame),
-  and the From: header value is optionally read from gitolite.conf
-  (see multimailhook.from).
+GitoliteEnvironment
+    a Git repository that is managed by gitolite_.  For such
+    repositories, the identity of the pusher is read from
+    environment variable $GL_USER, the name of the repository is read
+    from $GL_REPO (if it is not overridden by multimailhook.reponame),
+    and the From: header value is optionally read from gitolite.conf
+    (see multimailhook.from).
 
 By default, git-multimail assumes GitoliteEnvironment if $GL_USER and
 $GL_REPO are set, and otherwise assumes GenericEnvironment.
@@ -645,7 +709,7 @@ option to the script.
 If you need to customize the script in ways that are not supported by
 the existing environments, you can define your own environment class
 class using arbitrary Python code.  To do so, you need to import
-git_multimail.py as a Python module, as demonstrated by the example
+``git_multimail.py`` as a Python module, as demonstrated by the example
 post-receive script.  Then implement your environment class; it should
 usually inherit from one of the existing Environment classes and
 possibly one or more of the EnvironmentMixin classes.  Then set the
@@ -673,9 +737,7 @@ contribute to git-multimail.
 Footnotes
 ---------
 
-.. [1] http://www.python.org/dev/peps/pep-0394/
-
-.. [2] Because of the way information is passed to update hooks, the
+.. [1] Because of the way information is passed to update hooks, the
        script's method of determining whether a commit has already
        been seen does not work when it is used as an ``update`` script.
        In particular, no notification email will be generated for a
@@ -683,4 +745,4 @@ Footnotes
        push. A workaround is to use --force-send to force sending the
        emails.
 
-.. [3] https://github.com/sitaramc/gitolite
+.. _gitolite: https://github.com/sitaramc/gitolite
index 300a2a4d2d479b3ab002a5e6480c3e9a83e36fb7..161b0230a05f1c011dbf28fcf1962c8fb3ee37c7 100644 (file)
@@ -6,10 +6,10 @@ website:
     https://github.com/git-multimail/git-multimail
 
 The version in this directory was obtained from the upstream project
-on October 11 2015 and consists of the "git-multimail" subdirectory from
+on August 17 2016 and consists of the "git-multimail" subdirectory from
 revision
 
-    c0791b9ef5821a746fc3475c25765e640452eaae refs/tags/1.2.0
+    07b1cb6bfd7be156c62e1afa17cae13b850a869f refs/tags/1.4.0
 
 Please see the README file in this directory for information about how
 to report bugs or contribute to git-multimail.
diff --git a/contrib/hooks/multimail/doc/customizing-emails.rst b/contrib/hooks/multimail/doc/customizing-emails.rst
new file mode 100644 (file)
index 0000000..3f5b67f
--- /dev/null
@@ -0,0 +1,56 @@
+Customizing the content and formatting of emails
+================================================
+
+Overloading template strings
+----------------------------
+
+The content of emails is generated based on template strings defined
+in ``git_multimail.py``. You can customize these template strings
+without changing the script itself, by defining a Python wrapper
+around it. The python wrapper should ``import git_multimail`` and then
+override the ``git_multimail.*`` strings like this::
+
+  import sys  # needed for sys.argv
+
+  # Import and customize git_multimail:
+  import git_multimail
+  git_multimail.REVISION_INTRO_TEMPLATE = """..."""
+  git_multimail.COMBINED_INTRO_TEMPLATE = git_multimail.REVISION_INTRO_TEMPLATE
+
+  # start git_multimail itself:
+  git_multimail.main(sys.argv[1:])
+
+The template strings can use any value already used in the existing
+templates (read the source code).
+
+Using HTML in template strings
+------------------------------
+
+If ``multimailhook.commitEmailFormat`` is set to HTML, then
+git-multimail will generate HTML emails for commit notifications. The
+log and diff will be formatted automatically by git-multimail. By
+default, any HTML special character in the templates will be escaped.
+
+To use HTML formatting in the introduction of the email, set
+``multimailhook.htmlInIntro`` to ``true``. Then, the template can
+contain any HTML tags, that will be sent as-is in the email. For
+example, to add some formatting and a link to the online commit, use
+a format like::
+
+  git_multimail.REVISION_INTRO_TEMPLATE = """\
+  <span style="color:#808080">This is an automated email from the git hooks/post-receive script.</span><br /><br />
+
+  <strong>%(pusher)s</strong> pushed a commit to %(refname_type)s %(short_refname)s
+  in repository %(repo_shortname)s.<br />
+
+  <a href="https://github.com/git-multimail/git-multimail/commit/%(newrev)s">View on GitHub</a>.
+  """
+
+Note that the values expanded from ``%(variable)s`` in the format
+strings will still be escaped.
+
+For a less flexible but easier to set up way to add a link to commit
+emails, see ``multimailhook.commitBrowseURL``.
+
+Similarly, one can set ``multimailhook.htmlInFooter`` and override any
+of the ``*_FOOTER*`` template strings.
diff --git a/contrib/hooks/multimail/doc/troubleshooting.rst b/contrib/hooks/multimail/doc/troubleshooting.rst
new file mode 100644 (file)
index 0000000..651b509
--- /dev/null
@@ -0,0 +1,78 @@
+Troubleshooting issues with git-multimail: a FAQ
+================================================
+
+How to check that git-multimail is properly set up?
+---------------------------------------------------
+
+Since version 1.4.0, git-multimail allows a simple self-checking of
+its configuration: run it with the environment variable
+``GIT_MULTIMAIL_CHECK_SETUP`` set to a non-empty string. You should
+get something like this::
+
+  $ GIT_MULTIMAIL_CHECK_SETUP=true /home/moy/dev/git-multimail/git-multimail/git_multimail.py
+  Environment values:
+      administrator : 'the administrator of this repository'
+      charset : 'utf-8'
+      emailprefix : '[git-multimail] '
+      fqdn : 'anie'
+      projectdesc : 'UNNAMED PROJECT'
+      pusher : 'moy'
+      repo_path : '/home/moy/dev/git-multimail'
+      repo_shortname : 'git-multimail'
+
+  Now, checking that git-multimail's standard input is properly set ...
+  Please type some text and then press Return
+  foo
+  You have just entered:
+  foo
+  git-multimail seems properly set up.
+
+If you forgot to set an important variable, you may get instead::
+
+  $ GIT_MULTIMAIL_CHECK_SETUP=true /home/moy/dev/git-multimail/git-multimail/git_multimail.py
+  No email recipients configured!
+
+Do not set ``$GIT_MULTIMAIL_CHECK_SETUP`` other than for testing your
+configuration: it would disable the hook completely.
+
+Git is not using the right address in the From/To/Reply-To field
+----------------------------------------------------------------
+
+First, make sure that git-multimail actually uses what you think it is
+using. A lot happens to your email (especially when posting to a
+mailing-list) between the time `git_multimail.py` sends it and the
+time it reaches your inbox.
+
+A simple test (to do on a test repository, do not use in production as
+it would disable email sending): change your post-receive hook to call
+`git_multimail.py` with the `--stdout` option, and try to push to the
+repository. You should see something like::
+
+  Counting objects: 3, done.
+  Writing objects: 100% (3/3), 263 bytes | 0 bytes/s, done.
+  Total 3 (delta 0), reused 0 (delta 0)
+  remote: Sending notification emails to: foo.bar@example.com
+  remote: ===========================================================================
+  remote: Date: Mon, 25 Apr 2016 18:39:59 +0200
+  remote: To: foo.bar@example.com
+  remote: Subject: [git] branch master updated: foo
+  remote: MIME-Version: 1.0
+  remote: Content-Type: text/plain; charset=utf-8
+  remote: Content-Transfer-Encoding: 8bit
+  remote: Message-ID: <20160425163959.2311.20498@anie>
+  remote: From: Auth Or <Foo.Bar@example.com>
+  remote: Reply-To: Auth Or <Foo.Bar@example.com>
+  remote: X-Git-Host: example
+  ...
+  remote: --
+  remote: To stop receiving notification emails like this one, please contact
+  remote: the administrator of this repository.
+  remote: ===========================================================================
+  To /path/to/repo
+     6278f04..e173f20  master -> master
+
+Note: this does not include the sender (Return-Path: header), as it is
+not part of the message content but passed to the mailer. Some mailer
+show the ``Sender:`` field instead of the ``From:`` field (for
+example, Zimbra Webmail shows ``From: <sender-field> on behalf of
+<from-field>``).
index 0180dba43126df209bde82e3e5aea3616f402c96..c7f86403cf0750289b08be6d7d66180c78242f0c 100755 (executable)
@@ -1,8 +1,8 @@
 #! /usr/bin/env python
 
-__version__ = '1.2.0'
+__version__ = '1.4.0'
 
-# Copyright (c) 2015 Matthieu Moy and others
+# Copyright (c) 2015-2016 Matthieu Moy and others
 # Copyright (c) 2012-2014 Michael Haggerty and others
 # Derived from contrib/hooks/post-receive-email, which is
 # Copyright (c) 2007 Andy Parkins
@@ -56,7 +56,13 @@ import socket
 import subprocess
 import shlex
 import optparse
+import logging
 import smtplib
+try:
+    import ssl
+except ImportError:
+    # Python < 2.6 do not have ssl, but that's OK if we don't use it.
+    pass
 import time
 import cgi
 
@@ -75,11 +81,14 @@ def is_ascii(s):
 
 
 if PYTHON3:
+    def is_string(s):
+        return isinstance(s, str)
+
     def str_to_bytes(s):
         return s.encode(ENCODING)
 
-    def bytes_to_str(s):
-        return s.decode(ENCODING)
+    def bytes_to_str(s, errors='strict'):
+        return s.decode(ENCODING, errors)
 
     unicode = str
 
@@ -90,16 +99,34 @@ if PYTHON3:
             f.buffer.write(msg.encode(sys.getdefaultencoding()))
         except UnicodeEncodeError:
             f.buffer.write(msg.encode(ENCODING))
+
+    def read_line(f):
+        # Try reading with the default encoding. If it fails,
+        # try UTF-8.
+        out = f.buffer.readline()
+        try:
+            return out.decode(sys.getdefaultencoding())
+        except UnicodeEncodeError:
+            return out.decode(ENCODING)
 else:
+    def is_string(s):
+        try:
+            return isinstance(s, basestring)
+        except NameError:  # Silence Pyflakes warning
+            raise
+
     def str_to_bytes(s):
         return s
 
-    def bytes_to_str(s):
+    def bytes_to_str(s, errors='strict'):
         return s
 
     def write_str(f, msg):
         f.write(msg)
 
+    def read_line(f):
+        return f.readline()
+
     def next(it):
         return it.next()
 
@@ -199,8 +226,8 @@ reference pointing at a previous point in the repository history.
             \\
              O -- O -- O   (%(oldrev_short)s)
 
-Any revisions marked "omits" are not gone; other references still
-refer to them.  Any revisions marked "discards" are gone forever.
+Any revisions marked "omit" are not gone; other references still
+refer to them.  Any revisions marked "discard" are gone forever.
 """
 
 
@@ -219,8 +246,8 @@ You should already have received notification emails for all of the O
 revisions, and so the following emails describe only the N revisions
 from the common base, B.
 
-Any revisions marked "omits" are not gone; other references still
-refer to them.  Any revisions marked "discards" are gone forever.
+Any revisions marked "omit" are not gone; other references still
+refer to them.  Any revisions marked "discard" are gone forever.
 """
 
 
@@ -244,22 +271,22 @@ from the repository.
 NEW_REVISIONS_TEMPLATE = """\
 The %(tot)s revisions listed above as "new" are entirely new to this
 repository and will be described in separate emails.  The revisions
-listed as "adds" were already present in the repository and have only
+listed as "add" were already present in the repository and have only
 been added to this reference.
 
 """
 
 
 TAG_CREATED_TEMPLATE = """\
-        at  %(newrev_short)-9s (%(newrev_type)s)
+      at %(newrev_short)-8s (%(newrev_type)s)
 """
 
 
 TAG_UPDATED_TEMPLATE = """\
 *** WARNING: tag %(short_refname)s was modified! ***
 
-      from  %(oldrev_short)-9s (%(oldrev_type)s)
-        to  %(newrev_short)-9s (%(newrev_type)s)
+    from %(oldrev_short)-8s (%(oldrev_type)s)
+      to %(newrev_short)-8s (%(newrev_type)s)
 """
 
 
@@ -272,7 +299,7 @@ TAG_DELETED_TEMPLATE = """\
 # The template used in summary tables.  It looks best if this uses the
 # same alignment as TAG_CREATED_TEMPLATE and TAG_UPDATED_TEMPLATE.
 BRIEF_SUMMARY_TEMPLATE = """\
-%(action)10s  %(rev_short)-9s %(text)s
+%(action)8s %(rev_short)-8s %(text)s
 """
 
 
@@ -313,6 +340,16 @@ in repository %(repo_shortname)s.
 
 """
 
+LINK_TEXT_TEMPLATE = """\
+View the commit online:
+%(browse_url)s
+
+"""
+
+LINK_HTML_TEMPLATE = """\
+<p><a href="%(browse_url)s">View the commit online</a>.</p>
+"""
+
 
 REVISION_FOOTER_TEMPLATE = FOOTER_TEMPLATE
 
@@ -410,11 +447,16 @@ def read_output(cmd, input=None, keepends=False, **kw):
         input = str_to_bytes(input)
     else:
         stdin = None
+    errors = 'strict'
+    if 'errors' in kw:
+        errors = kw['errors']
+        del kw['errors']
     p = subprocess.Popen(
-        cmd, stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kw
+        tuple(str_to_bytes(w) for w in cmd),
+        stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kw
         )
     (out, err) = p.communicate(input)
-    out = bytes_to_str(out)
+    out = bytes_to_str(out, errors=errors)
     retcode = p.wait()
     if retcode:
         raise CommandError(cmd, retcode)
@@ -532,6 +574,28 @@ class Config(object):
         assert words[-1] == ''
         return words[:-1]
 
+    @staticmethod
+    def add_config_parameters(c):
+        """Add configuration parameters to Git.
+
+        c is either an str or a list of str, each element being of the
+        form 'var=val' or 'var', with the same syntax and meaning as
+        the argument of 'git -c var=val'.
+        """
+        if isinstance(c, str):
+            c = (c,)
+        parameters = os.environ.get('GIT_CONFIG_PARAMETERS', '')
+        if parameters:
+            parameters += ' '
+        # git expects GIT_CONFIG_PARAMETERS to be of the form
+        #    "'name1=value1' 'name2=value2' 'name3=value3'"
+        # including everything inside the double quotes (but not the double
+        # quotes themselves).  Spacing is critical.  Also, if a value contains
+        # a literal single quote that quote must be represented using the
+        # four character sequence: '\''
+        parameters += ' '.join("'" + x.replace("'", "'\\''") + "'" for x in c)
+        os.environ['GIT_CONFIG_PARAMETERS'] = parameters
+
     def get(self, name, default=None):
         try:
             values = self._split(read_git_output(
@@ -745,6 +809,12 @@ class Change(object):
         values['multimail_version'] = get_version()
         return values
 
+    # Aliases usable in template strings. Tuple of pairs (destination,
+    # source).
+    VALUES_ALIAS = (
+        ("id", "newrev"),
+        )
+
     def get_values(self, **extra_values):
         """Return a dictionary {keyword: expansion} for this Change.
 
@@ -760,6 +830,9 @@ class Change(object):
         values = self._values.copy()
         if extra_values:
             values.update(extra_values)
+
+        for alias, val in self.VALUES_ALIAS:
+            values[alias] = values[val]
         return values
 
     def expand(self, template, **extra_values):
@@ -772,10 +845,14 @@ class Change(object):
 
         return template % self.get_values(**extra_values)
 
-    def expand_lines(self, template, **extra_values):
+    def expand_lines(self, template, html_escape_val=False, **extra_values):
         """Break template into lines and expand each line."""
 
         values = self.get_values(**extra_values)
+        if html_escape_val:
+            for k in values:
+                if is_string(values[k]):
+                    values[k] = cgi.escape(values[k], True)
         for line in template.splitlines(True):
             yield line % values
 
@@ -787,9 +864,10 @@ class Change(object):
 
         values = self.get_values(**extra_values)
         if self._contains_html_diff:
-            values['contenttype'] = 'html'
+            self._content_type = 'html'
         else:
-            values['contenttype'] = 'plain'
+            self._content_type = 'plain'
+        values['contenttype'] = self._content_type
 
         for line in template.splitlines():
             (name, value) = line.split(': ', 1)
@@ -819,7 +897,11 @@ class Change(object):
 
         raise NotImplementedError()
 
-    def generate_email_intro(self):
+    def generate_browse_link(self, base_url):
+        """Generate a link to an online repository browser."""
+        return iter(())
+
+    def generate_email_intro(self, html_escape_val=False):
         """Generate the email intro for this Change, a line at a time.
 
         The output will be used as the standard boilerplate at the top
@@ -835,7 +917,7 @@ class Change(object):
 
         raise NotImplementedError()
 
-    def generate_email_footer(self):
+    def generate_email_footer(self, html_escape_val):
         """Generate the footer of the email, a line at a time.
 
         The footer is always included, irrespective of
@@ -876,9 +958,18 @@ class Change(object):
         for line in self.generate_email_header(**extra_header_values):
             yield line
         yield '\n'
-        for line in self._wrap_for_html(self.generate_email_intro()):
+        html_escape_val = (self.environment.html_in_intro and
+                           self._contains_html_diff)
+        intro = self.generate_email_intro(html_escape_val)
+        if not self.environment.html_in_intro:
+            intro = self._wrap_for_html(intro)
+        for line in intro:
             yield line
 
+        if self.environment.commitBrowseURL:
+            for line in self.generate_browse_link(self.environment.commitBrowseURL):
+                yield line
+
         body = self.generate_email_body(push)
         if body_filter is not None:
             body = body_filter(body)
@@ -939,11 +1030,17 @@ class Change(object):
             yield line
         if self._contains_html_diff:
             yield '</pre>'
-
-        for line in self._wrap_for_html(self.generate_email_footer()):
+        html_escape_val = (self.environment.html_in_footer and
+                           self._contains_html_diff)
+        footer = self.generate_email_footer(html_escape_val)
+        if not self.environment.html_in_footer:
+            footer = self._wrap_for_html(footer)
+        for line in footer:
             yield line
 
-    def get_alt_fromaddr(self):
+    def get_specific_fromaddr(self):
+        """For kinds of Changes which specify it, return the kind-specific
+        From address to use."""
         return None
 
 
@@ -968,7 +1065,7 @@ class Revision(Change):
             self.cc_recipients = ', '.join(to.strip() for to in self._cc_recipients())
             if self.cc_recipients:
                 self.environment.log_msg(
-                    'Add %s to CC for %s\n' % (self.cc_recipients, self.rev.sha1))
+                    'Add %s to CC for %s' % (self.cc_recipients, self.rev.sha1))
 
     def _cc_recipients(self):
         cc_recipients = []
@@ -988,10 +1085,15 @@ class Revision(Change):
             ['log', '--format=%s', '--no-walk', self.rev.sha1]
             )
 
+        max_subject_length = self.environment.get_max_subject_length()
+        if max_subject_length > 0 and len(oneline) > max_subject_length:
+            oneline = oneline[:max_subject_length - 6] + ' [...]'
+
         values['rev'] = self.rev.sha1
         values['rev_short'] = self.rev.short
         values['change_type'] = self.change_type
         values['refname'] = self.refname
+        values['newrev'] = self.rev.sha1
         values['short_refname'] = self.reference_change.short_refname
         values['refname_type'] = self.reference_change.refname_type
         values['reply_to_msgid'] = self.reference_change.msgid
@@ -1015,8 +1117,26 @@ class Revision(Change):
                 ):
             yield line
 
-    def generate_email_intro(self):
-        for line in self.expand_lines(REVISION_INTRO_TEMPLATE):
+    def generate_browse_link(self, base_url):
+        if '%(' not in base_url:
+            base_url += '%(id)s'
+        url = "".join(self.expand_lines(base_url))
+        if self._content_type == 'html':
+            for line in self.expand_lines(LINK_HTML_TEMPLATE,
+                                          html_escape_val=True,
+                                          browse_url=url):
+                yield line
+        elif self._content_type == 'plain':
+            for line in self.expand_lines(LINK_TEXT_TEMPLATE,
+                                          html_escape_val=False,
+                                          browse_url=url):
+                yield line
+        else:
+            raise NotImplementedError("Content-type %s unsupported. Please report it as a bug.")
+
+    def generate_email_intro(self, html_escape_val=False):
+        for line in self.expand_lines(REVISION_INTRO_TEMPLATE,
+                                      html_escape_val=html_escape_val):
             yield line
 
     def generate_email_body(self, push):
@@ -1025,20 +1145,21 @@ class Revision(Change):
         for line in read_git_lines(
                 ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
                 keepends=True,
-                ):
+                errors='replace'):
             if line.startswith('Date:   ') and self.environment.date_substitute:
                 yield self.environment.date_substitute + line[len('Date:   '):]
             else:
                 yield line
 
-    def generate_email_footer(self):
-        return self.expand_lines(REVISION_FOOTER_TEMPLATE)
+    def generate_email_footer(self, html_escape_val):
+        return self.expand_lines(REVISION_FOOTER_TEMPLATE,
+                                 html_escape_val=html_escape_val)
 
     def generate_email(self, push, body_filter=None, extra_header_values={}):
         self._contains_diff()
         return Change.generate_email(self, push, body_filter, extra_header_values)
 
-    def get_alt_fromaddr(self):
+    def get_specific_fromaddr(self):
         return self.environment.from_commit
 
 
@@ -1096,7 +1217,7 @@ class ReferenceChange(Change):
                 # Tracking branch:
                 environment.log_warning(
                     '*** Push-update of tracking branch %r\n'
-                    '***  - incomplete email generated.\n'
+                    '***  - incomplete email generated.'
                     % (refname,)
                     )
                 klass = OtherReferenceChange
@@ -1104,7 +1225,7 @@ class ReferenceChange(Change):
                 # Some other reference namespace:
                 environment.log_warning(
                     '*** Push-update of strange reference %r\n'
-                    '***  - incomplete email generated.\n'
+                    '***  - incomplete email generated.'
                     % (refname,)
                     )
                 klass = OtherReferenceChange
@@ -1112,7 +1233,7 @@ class ReferenceChange(Change):
             # Anything else (is there anything else?)
             environment.log_warning(
                 '*** Unknown type of update to %r (%s)\n'
-                '***  - incomplete email generated.\n'
+                '***  - incomplete email generated.'
                 % (refname, rev.type,)
                 )
             klass = OtherReferenceChange
@@ -1217,8 +1338,9 @@ class ReferenceChange(Change):
                 ):
             yield line
 
-    def generate_email_intro(self):
-        for line in self.expand_lines(self.intro_template):
+    def generate_email_intro(self, html_escape_val=False):
+        for line in self.expand_lines(self.intro_template,
+                                      html_escape_val=html_escape_val):
             yield line
 
     def generate_email_body(self, push):
@@ -1238,8 +1360,9 @@ class ReferenceChange(Change):
         for line in self.generate_revision_change_summary(push):
             yield line
 
-    def generate_email_footer(self):
-        return self.expand_lines(self.footer_template)
+    def generate_email_footer(self, html_escape_val):
+        return self.expand_lines(self.footer_template,
+                                 html_escape_val=html_escape_val)
 
     def generate_revision_change_graph(self, push):
         if self.showgraph:
@@ -1347,9 +1470,9 @@ class ReferenceChange(Change):
             if discards and adds:
                 for (sha1, subject) in discards:
                     if sha1 in discarded_commits:
-                        action = 'discards'
+                        action = 'discard'
                     else:
-                        action = 'omits'
+                        action = 'omit'
                     yield self.expand(
                         BRIEF_SUMMARY_TEMPLATE, action=action,
                         rev_short=sha1, text=subject,
@@ -1358,7 +1481,7 @@ class ReferenceChange(Change):
                     if sha1 in new_commits:
                         action = 'new'
                     else:
-                        action = 'adds'
+                        action = 'add'
                     yield self.expand(
                         BRIEF_SUMMARY_TEMPLATE, action=action,
                         rev_short=sha1, text=subject,
@@ -1370,9 +1493,9 @@ class ReferenceChange(Change):
             elif discards:
                 for (sha1, subject) in discards:
                     if sha1 in discarded_commits:
-                        action = 'discards'
+                        action = 'discard'
                     else:
-                        action = 'omits'
+                        action = 'omit'
                     yield self.expand(
                         BRIEF_SUMMARY_TEMPLATE, action=action,
                         rev_short=sha1, text=subject,
@@ -1391,7 +1514,7 @@ class ReferenceChange(Change):
                     if sha1 in new_commits:
                         action = 'new'
                     else:
-                        action = 'adds'
+                        action = 'add'
                     yield self.expand(
                         BRIEF_SUMMARY_TEMPLATE, action=action,
                         rev_short=sha1, text=subject,
@@ -1444,7 +1567,7 @@ class ReferenceChange(Change):
                 for r in discarded_revisions:
                     (sha1, subject) = r.rev.get_summary()
                     yield r.expand(
-                        BRIEF_SUMMARY_TEMPLATE, action='discards', text=subject,
+                        BRIEF_SUMMARY_TEMPLATE, action='discard', text=subject,
                         )
                 for line in self.generate_revision_change_graph(push):
                     yield line
@@ -1482,7 +1605,7 @@ class ReferenceChange(Change):
             )
         yield '\n'
 
-    def get_alt_fromaddr(self):
+    def get_specific_fromaddr(self):
         return self.environment.from_refchange
 
 
@@ -1605,6 +1728,14 @@ class BranchChange(ReferenceChange):
         self.header_template = COMBINED_HEADER_TEMPLATE
         self.intro_template = COMBINED_INTRO_TEMPLATE
         self.footer_template = COMBINED_FOOTER_TEMPLATE
+
+        def revision_gen_link(base_url):
+            # revision is used only to generate the body, and
+            # _content_type is set while generating headers. Get it
+            # from the BranchChange object.
+            revision._content_type = self._content_type
+            return revision.generate_browse_link(base_url)
+        self.generate_browse_link = revision_gen_link
         for line in self.generate_email(push, body_filter, values):
             yield line
 
@@ -1684,13 +1815,13 @@ class AnnotatedTagChange(ReferenceChange):
             except CommandError:
                 prevtag = None
             if prevtag:
-                yield '  replaces  %s\n' % (prevtag,)
+                yield ' replaces %s\n' % (prevtag,)
         else:
             prevtag = None
-            yield '    length  %s bytes\n' % (read_git_output(['cat-file', '-s', tagobject]),)
+            yield '  length %s bytes\n' % (read_git_output(['cat-file', '-s', tagobject]),)
 
-        yield ' tagged by  %s\n' % (tagger,)
-        yield '        on  %s\n' % (tagged,)
+        yield '      by %s\n' % (tagger,)
+        yield '      on %s\n' % (tagged,)
         yield '\n'
 
         # Show the content of the tag message; this might contain a
@@ -1807,6 +1938,9 @@ class OtherReferenceChange(ReferenceChange):
 class Mailer(object):
     """An object that can send emails."""
 
+    def __init__(self, environment):
+        self.environment = environment
+
     def send(self, lines, to_addrs):
         """Send an email consisting of lines.
 
@@ -1841,14 +1975,14 @@ class SendMailer(Mailer):
                 'Try setting multimailhook.sendmailCommand.'
                 )
 
-    def __init__(self, command=None, envelopesender=None):
+    def __init__(self, environment, command=None, envelopesender=None):
         """Construct a SendMailer instance.
 
         command should be the command and arguments used to invoke
         sendmail, as a list of strings.  If an envelopesender is
         provided, it will also be passed to the command, via '-f
         envelopesender'."""
-
+        super(SendMailer, self).__init__(environment)
         if command:
             self.command = command[:]
         else:
@@ -1861,7 +1995,7 @@ class SendMailer(Mailer):
         try:
             p = subprocess.Popen(self.command, stdin=subprocess.PIPE)
         except OSError:
-            sys.stderr.write(
+            self.environment.get_logger().error(
                 '*** Cannot execute command: %s\n' % ' '.join(self.command) +
                 '*** %s\n' % sys.exc_info()[1] +
                 '*** Try setting multimailhook.mailer to "smtp"\n' +
@@ -1872,15 +2006,16 @@ class SendMailer(Mailer):
             lines = (str_to_bytes(line) for line in lines)
             p.stdin.writelines(lines)
         except Exception:
-            sys.stderr.write(
+            self.environment.get_logger().error(
                 '*** Error while generating commit email\n'
                 '***  - mail sending aborted.\n'
                 )
-            try:
+            if hasattr(p, 'terminate'):
                 # subprocess.terminate() is not available in Python 2.4
                 p.terminate()
-            except AttributeError:
-                pass
+            else:
+                import signal
+                os.kill(p.pid, signal.SIGTERM)
             raise
         else:
             p.stdin.close()
@@ -1892,13 +2027,16 @@ class SendMailer(Mailer):
 class SMTPMailer(Mailer):
     """Send emails using Python's smtplib."""
 
-    def __init__(self, envelopesender, smtpserver,
+    def __init__(self, environment,
+                 envelopesender, smtpserver,
                  smtpservertimeout=10.0, smtpserverdebuglevel=0,
                  smtpencryption='none',
                  smtpuser='', smtppass='',
+                 smtpcacerts=''
                  ):
+        super(SMTPMailer, self).__init__(environment)
         if not envelopesender:
-            sys.stderr.write(
+            self.environment.get_logger().error(
                 'fatal: git_multimail: cannot use SMTPMailer without a sender address.\n'
                 'please set either multimailhook.envelopeSender or user.email\n'
                 )
@@ -1915,6 +2053,7 @@ class SMTPMailer(Mailer):
         self.security = smtpencryption
         self.username = smtpuser
         self.password = smtppass
+        self.smtpcacerts = smtpcacerts
         try:
             def call(klass, server, timeout):
                 try:
@@ -1925,13 +2064,56 @@ class SMTPMailer(Mailer):
             if self.security == 'none':
                 self.smtp = call(smtplib.SMTP, self.smtpserver, timeout=self.smtpservertimeout)
             elif self.security == 'ssl':
+                if self.smtpcacerts:
+                    raise smtplib.SMTPException(
+                        "Checking certificate is not supported for ssl, prefer starttls"
+                        )
                 self.smtp = call(smtplib.SMTP_SSL, self.smtpserver, timeout=self.smtpservertimeout)
             elif self.security == 'tls':
+                if 'ssl' not in sys.modules:
+                    self.environment.get_logger().error(
+                        '*** Your Python version does not have the ssl library installed\n'
+                        '*** smtpEncryption=tls is not available.\n'
+                        '*** Either upgrade Python to 2.6 or later\n'
+                        '    or use git_multimail.py version 1.2.\n')
                 if ':' not in self.smtpserver:
                     self.smtpserver += ':587'  # default port for TLS
                 self.smtp = call(smtplib.SMTP, self.smtpserver, timeout=self.smtpservertimeout)
+                # start: ehlo + starttls
+                # equivalent to
+                #     self.smtp.ehlo()
+                #     self.smtp.starttls()
+                # with acces to the ssl layer
                 self.smtp.ehlo()
-                self.smtp.starttls()
+                if not self.smtp.has_extn("starttls"):
+                    raise smtplib.SMTPException("STARTTLS extension not supported by server")
+                resp, reply = self.smtp.docmd("STARTTLS")
+                if resp != 220:
+                    raise smtplib.SMTPException("Wrong answer to the STARTTLS command")
+                if self.smtpcacerts:
+                    self.smtp.sock = ssl.wrap_socket(
+                        self.smtp.sock,
+                        ca_certs=self.smtpcacerts,
+                        cert_reqs=ssl.CERT_REQUIRED
+                        )
+                else:
+                    self.smtp.sock = ssl.wrap_socket(
+                        self.smtp.sock,
+                        cert_reqs=ssl.CERT_NONE
+                        )
+                    self.environment.get_logger().error(
+                        '*** Warning, the server certificat is not verified (smtp) ***\n'
+                        '***          set the option smtpCACerts                   ***\n'
+                        )
+                if not hasattr(self.smtp.sock, "read"):
+                    # using httplib.FakeSocket with Python 2.5.x or earlier
+                    self.smtp.sock.read = self.smtp.sock.recv
+                self.smtp.file = smtplib.SSLFakeFile(self.smtp.sock)
+                self.smtp.helo_resp = None
+                self.smtp.ehlo_resp = None
+                self.smtp.esmtp_features = {}
+                self.smtp.does_esmtp = 0
+                # end:   ehlo + starttls
                 self.smtp.ehlo()
             else:
                 sys.stdout.write('*** Error: Control reached an invalid option. ***')
@@ -1942,15 +2124,16 @@ class SMTPMailer(Mailer):
                     % self.smtpserverdebuglevel)
                 self.smtp.set_debuglevel(self.smtpserverdebuglevel)
         except Exception:
-            sys.stderr.write(
+            self.environment.get_logger().error(
                 '*** Error establishing SMTP connection to %s ***\n'
-                % self.smtpserver)
-            sys.stderr.write('*** %s\n' % sys.exc_info()[1])
+                '*** %s\n'
+                % (self.smtpserver, sys.exc_info()[1]))
             sys.exit(1)
 
     def __del__(self):
         if hasattr(self, 'smtp'):
             self.smtp.quit()
+            del self.smtp
 
     def send(self, lines, to_addrs):
         try:
@@ -1958,13 +2141,26 @@ class SMTPMailer(Mailer):
                 self.smtp.login(self.username, self.password)
             msg = ''.join(lines)
             # turn comma-separated list into Python list if needed.
-            if isinstance(to_addrs, basestring):
+            if is_string(to_addrs):
                 to_addrs = [email for (name, email) in getaddresses([to_addrs])]
             self.smtp.sendmail(self.envelopesender, to_addrs, msg)
-        except Exception:
-            sys.stderr.write('*** Error sending email ***\n')
-            sys.stderr.write('*** %s\n' % sys.exc_info()[1])
-            self.smtp.quit()
+        except smtplib.SMTPResponseException:
+            err = sys.exc_info()[1]
+            self.environment.get_logger().error(
+                '*** Error sending email ***\n'
+                '*** Error %d: %s\n'
+                % (err.smtp_code, bytes_to_str(err.smtp_error)))
+            try:
+                smtp = self.smtp
+                # delete the field before quit() so that in case of
+                # error, self.smtp is deleted anyway.
+                del self.smtp
+                smtp.quit()
+            except:
+                self.environment.get_logger().error(
+                    '*** Error closing the SMTP connection ***\n'
+                    '*** Exiting anyway ... ***\n'
+                    '*** %s\n' % sys.exc_info()[1])
             sys.exit(1)
 
 
@@ -2086,6 +2282,11 @@ class Environment(object):
             to send and when computing what commits are considered new
             to the repository.  Default is "^refs/notes/".
 
+        get_max_subject_length()
+
+            Return an int giving the maximal length for the subject
+            (git log --oneline).
+
     They should also define the following attributes:
 
         announce_show_shortlog (bool)
@@ -2097,6 +2298,14 @@ class Environment(object):
             If "html", generate commit emails in HTML instead of plain text
             used by default.
 
+        html_in_intro (bool)
+        html_in_footer (bool)
+
+            When generating HTML emails, the introduction (respectively,
+            the footer) will be HTML-escaped iff html_in_intro (respectively,
+            the footer) is true. When false, only the values used to expand
+            the template are escaped.
+
         refchange_showgraph (bool)
 
             True iff refchanges emails should include a detailed graph.
@@ -2152,6 +2361,15 @@ class Environment(object):
             multimailhook.fromRefchange and multimailhook.fromCommit
             by ConfigEnvironmentMixin.
 
+        log_file, error_log_file, debug_log_file (string)
+
+            Name of a file to which logs should be sent.
+
+        verbose (int)
+
+            How verbose the system should be.
+            - 0 (default): show info, errors, ...
+            - 1 : show basic debug info
     """
 
     REPO_NAME_RE = re.compile(r'^(?P<name>.+?)(?:\.git)$')
@@ -2160,6 +2378,9 @@ class Environment(object):
         self.osenv = osenv or os.environ
         self.announce_show_shortlog = False
         self.commit_email_format = "text"
+        self.html_in_intro = False
+        self.html_in_footer = False
+        self.commitBrowseURL = None
         self.maxcommitemails = 500
         self.diffopts = ['--stat', '--summary', '--find-copies-harder']
         self.graphopts = ['--oneline', '--decorate']
@@ -2171,6 +2392,7 @@ class Environment(object):
         self.quiet = False
         self.stdout = False
         self.combine_when_single_commit = True
+        self.logger = None
 
         self.COMPUTED_KEYS = [
             'administrator',
@@ -2185,6 +2407,12 @@ class Environment(object):
 
         self._values = None
 
+    def get_logger(self):
+        """Get (possibly creates) the logger associated to this environment."""
+        if self.logger is None:
+            self.logger = Logger(self)
+        return self.logger
+
     def get_repo_shortname(self):
         """Use the last part of the repo path, with ".git" stripped off if present."""
 
@@ -2236,7 +2464,7 @@ class Environment(object):
         The return value is always a new dictionary."""
 
         if self._values is None:
-            values = {}
+            values = {'': ''}  # %()s expands to the empty string.
 
             for key in self.COMPUTED_KEYS:
                 value = getattr(self, 'get_%s' % (key,))()
@@ -2292,6 +2520,11 @@ class Environment(object):
         # which we simply do not have right now.
         return "^refs/notes/"
 
+    def get_max_subject_length(self):
+        """Return the maximal subject line (git log --oneline) length.
+        Longer subject lines will be truncated."""
+        raise NotImplementedError()
+
     def filter_body(self, lines):
         """Filter the lines intended for an email body.
 
@@ -2307,19 +2540,22 @@ class Environment(object):
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        write_str(sys.stderr, msg)
+        self.get_logger().info(msg)
 
     def log_warning(self, msg):
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        write_str(sys.stderr, msg)
+        self.get_logger().warning(msg)
 
     def log_error(self, msg):
         """Write the string msg on a log file or on stderr.
 
         Sends the text to stderr by default, override to change the behavior."""
-        write_str(sys.stderr, msg)
+        self.get_logger().error(msg)
+
+    def check(self):
+        pass
 
 
 class ConfigEnvironmentMixin(Environment):
@@ -2375,6 +2611,16 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
             else:
                 self.commit_email_format = commit_email_format
 
+        html_in_intro = config.get_bool('htmlInIntro')
+        if html_in_intro is not None:
+            self.html_in_intro = html_in_intro
+
+        html_in_footer = config.get_bool('htmlInFooter')
+        if html_in_footer is not None:
+            self.html_in_footer = html_in_footer
+
+        self.commitBrowseURL = config.get('commitBrowseURL')
+
         maxcommitemails = config.get('maxcommitemails')
         if maxcommitemails is not None:
             try:
@@ -2415,7 +2661,6 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
                                  ['author'])
         self.__reply_to_commit = config.get('replyToCommit', default=reply_to)
 
-        from_addr = self.config.get('from')
         self.from_refchange = config.get('fromRefchange')
         self.forbid_field_values('fromRefchange',
                                  self.from_refchange,
@@ -2429,6 +2674,14 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
         if combine is not None:
             self.combine_when_single_commit = combine
 
+        self.log_file = config.get('logFile', default=None)
+        self.error_log_file = config.get('errorLogFile', default=None)
+        self.debug_log_file = config.get('debugLogFile', default=None)
+        if config.get_bool('Verbose', default=False):
+            self.verbose = 1
+        else:
+            self.verbose = 0
+
     def get_administrator(self):
         return (
             self.config.get('administrator') or
@@ -2447,11 +2700,21 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
         if emailprefix is not None:
             emailprefix = emailprefix.strip()
             if emailprefix:
-                return emailprefix + ' '
-            else:
-                return ''
+                emailprefix += ' '
         else:
-            return '[%s] ' % (self.get_repo_shortname(),)
+            emailprefix = '[%(repo_shortname)s] '
+        short_name = self.get_repo_shortname()
+        try:
+            return emailprefix % {'repo_shortname': short_name}
+        except:
+            self.get_logger().error(
+                '*** Invalid multimailhook.emailPrefix: %s\n' % emailprefix +
+                '*** %s\n' % sys.exc_info()[1] +
+                "*** Only the '%(repo_shortname)s' placeholder is allowed\n"
+                )
+            raise ConfigurationException(
+                '"%s" is not an allowed setting for emailPrefix' % emailprefix
+                )
 
     def get_sender(self):
         return self.config.get('envelopesender')
@@ -2472,9 +2735,9 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
     def get_fromaddr(self, change=None):
         fromaddr = self.config.get('from')
         if change:
-            alt_fromaddr = change.get_alt_fromaddr()
-            if alt_fromaddr:
-                fromaddr = alt_fromaddr
+            specific_fromaddr = change.get_specific_fromaddr()
+            if specific_fromaddr:
+                fromaddr = specific_fromaddr
         if fromaddr:
             fromaddr = self.process_addr(fromaddr, change)
         if fromaddr:
@@ -2500,7 +2763,7 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
 class FilterLinesEnvironmentMixin(Environment):
     """Handle encoding and maximum line length of body lines.
 
-        emailmaxlinelength (int or None)
+        email_max_line_length (int or None)
 
             The maximum length of any single line in the email body.
             Longer lines are truncated at that length with ' [...]'
@@ -2515,10 +2778,13 @@ class FilterLinesEnvironmentMixin(Environment):
 
     """
 
-    def __init__(self, strict_utf8=True, emailmaxlinelength=500, **kw):
+    def __init__(self, strict_utf8=True,
+                 email_max_line_length=500, max_subject_length=500,
+                 **kw):
         super(FilterLinesEnvironmentMixin, self).__init__(**kw)
         self.__strict_utf8 = strict_utf8
-        self.__emailmaxlinelength = emailmaxlinelength
+        self.__email_max_line_length = email_max_line_length
+        self.__max_subject_length = max_subject_length
 
     def filter_body(self, lines):
         lines = super(FilterLinesEnvironmentMixin, self).filter_body(lines)
@@ -2527,15 +2793,18 @@ class FilterLinesEnvironmentMixin(Environment):
                 lines = (line.decode(ENCODING, 'replace') for line in lines)
             # Limit the line length in Unicode-space to avoid
             # splitting characters:
-            if self.__emailmaxlinelength:
-                lines = limit_linelength(lines, self.__emailmaxlinelength)
+            if self.__email_max_line_length > 0:
+                lines = limit_linelength(lines, self.__email_max_line_length)
             if not PYTHON3:
                 lines = (line.encode(ENCODING, 'replace') for line in lines)
-        elif self.__emailmaxlinelength:
-            lines = limit_linelength(lines, self.__emailmaxlinelength)
+        elif self.__email_max_line_length:
+            lines = limit_linelength(lines, self.__email_max_line_length)
 
         return lines
 
+    def get_max_subject_length(self):
+        return self.__max_subject_length
+
 
 class ConfigFilterLinesEnvironmentMixin(
         ConfigEnvironmentMixin,
@@ -2548,9 +2817,13 @@ class ConfigFilterLinesEnvironmentMixin(
         if strict_utf8 is not None:
             kw['strict_utf8'] = strict_utf8
 
-        emailmaxlinelength = config.get('emailmaxlinelength')
-        if emailmaxlinelength is not None:
-            kw['emailmaxlinelength'] = int(emailmaxlinelength)
+        email_max_line_length = config.get('emailmaxlinelength')
+        if email_max_line_length is not None:
+            kw['email_max_line_length'] = int(email_max_line_length)
+
+        max_subject_length = config.get('subjectMaxLength', default=email_max_line_length)
+        if max_subject_length is not None:
+            kw['max_subject_length'] = int(max_subject_length)
 
         super(ConfigFilterLinesEnvironmentMixin, self).__init__(
             config=config, **kw
@@ -2566,7 +2839,7 @@ class MaxlinesEnvironmentMixin(Environment):
 
     def filter_body(self, lines):
         lines = super(MaxlinesEnvironmentMixin, self).filter_body(lines)
-        if self.__emailmaxlines:
+        if self.__emailmaxlines > 0:
             lines = limit_lines(lines, self.__emailmaxlines)
         return lines
 
@@ -2659,25 +2932,64 @@ class StaticRecipientsEnvironmentMixin(Environment):
         # actual *contents* of the change being reported, we only
         # choose based on the *type* of the change.  Therefore we can
         # compute them once and for all:
-        if not (refchange_recipients or
-                announce_recipients or
-                revision_recipients or
-                scancommitforcc):
-            raise ConfigurationException('No email recipients configured!')
         self.__refchange_recipients = refchange_recipients
         self.__announce_recipients = announce_recipients
         self.__revision_recipients = revision_recipients
 
+    def check(self):
+        if not (self.get_refchange_recipients(None) or
+                self.get_announce_recipients(None) or
+                self.get_revision_recipients(None) or
+                self.get_scancommitforcc()):
+            raise ConfigurationException('No email recipients configured!')
+        super(StaticRecipientsEnvironmentMixin, self).check()
+
     def get_refchange_recipients(self, refchange):
+        if self.__refchange_recipients is None:
+            return super(StaticRecipientsEnvironmentMixin,
+                         self).get_refchange_recipients(refchange)
         return self.__refchange_recipients
 
     def get_announce_recipients(self, annotated_tag_change):
+        if self.__announce_recipients is None:
+            return super(StaticRecipientsEnvironmentMixin,
+                         self).get_refchange_recipients(annotated_tag_change)
         return self.__announce_recipients
 
     def get_revision_recipients(self, revision):
+        if self.__revision_recipients is None:
+            return super(StaticRecipientsEnvironmentMixin,
+                         self).get_refchange_recipients(revision)
         return self.__revision_recipients
 
 
+class CLIRecipientsEnvironmentMixin(Environment):
+    """Mixin storing recipients information comming from the
+    command-line."""
+
+    def __init__(self, cli_recipients=None, **kw):
+        super(CLIRecipientsEnvironmentMixin, self).__init__(**kw)
+        self.__cli_recipients = cli_recipients
+
+    def get_refchange_recipients(self, refchange):
+        if self.__cli_recipients is None:
+            return super(CLIRecipientsEnvironmentMixin,
+                         self).get_refchange_recipients(refchange)
+        return self.__cli_recipients
+
+    def get_announce_recipients(self, annotated_tag_change):
+        if self.__cli_recipients is None:
+            return super(CLIRecipientsEnvironmentMixin,
+                         self).get_announce_recipients(annotated_tag_change)
+        return self.__cli_recipients
+
+    def get_revision_recipients(self, revision):
+        if self.__cli_recipients is None:
+            return super(CLIRecipientsEnvironmentMixin,
+                         self).get_revision_recipients(revision)
+        return self.__cli_recipients
+
+
 class ConfigRecipientsEnvironmentMixin(
         ConfigEnvironmentMixin,
         StaticRecipientsEnvironmentMixin
@@ -2751,24 +3063,20 @@ class StaticRefFilterEnvironmentMixin(Environment):
         if ref_filter_do_send_regex and ref_filter_dont_send_regex:
             raise ConfigurationException(
                 "Cannot specify both a ref doSend and dontSend regex.")
-        if ref_filter_do_send_regex or ref_filter_dont_send_regex:
-            self.__is_do_send_filter = bool(ref_filter_do_send_regex)
-            if ref_filter_incl_regex:
-                ref_filter_send_regex = ref_filter_incl_regex
-            elif ref_filter_excl_regex:
-                ref_filter_send_regex = ref_filter_excl_regex
-            else:
-                ref_filter_send_regex = '.*'
-                self.__is_do_send_filter = True
-            try:
-                self.__send_compiled_regex = re.compile(ref_filter_send_regex)
-            except Exception:
-                raise ConfigurationException(
-                    'Invalid Ref Filter Regex "%s": %s' %
-                    (ref_filter_send_regex, sys.exc_info()[1]))
+        self.__is_do_send_filter = bool(ref_filter_do_send_regex)
+        if ref_filter_do_send_regex:
+            ref_filter_send_regex = ref_filter_do_send_regex
+        elif ref_filter_dont_send_regex:
+            ref_filter_send_regex = ref_filter_dont_send_regex
         else:
-            self.__send_compiled_regex = self.__compiled_regex
-            self.__is_do_send_filter = self.__is_inclusion_filter
+            ref_filter_send_regex = '.*'
+            self.__is_do_send_filter = True
+        try:
+            self.__send_compiled_regex = re.compile(ref_filter_send_regex)
+        except Exception:
+            raise ConfigurationException(
+                'Invalid Ref Filter Regex "%s": %s' %
+                (ref_filter_send_regex, sys.exc_info()[1]))
 
     def get_ref_filter_regex(self, send_filter=False):
         if send_filter:
@@ -2839,34 +3147,21 @@ class GenericEnvironmentMixin(Environment):
         return self.osenv.get('USER', self.osenv.get('USERNAME', 'unknown user'))
 
 
-class GenericEnvironment(
-        ProjectdescEnvironmentMixin,
-        ConfigMaxlinesEnvironmentMixin,
-        ComputeFQDNEnvironmentMixin,
-        ConfigFilterLinesEnvironmentMixin,
-        ConfigRecipientsEnvironmentMixin,
-        ConfigRefFilterEnvironmentMixin,
-        PusherDomainEnvironmentMixin,
-        ConfigOptionsEnvironmentMixin,
-        GenericEnvironmentMixin,
-        Environment,
-        ):
-    pass
+class GitoliteEnvironmentHighPrecMixin(Environment):
+    def get_pusher(self):
+        return self.osenv.get('GL_USER', 'unknown user')
 
 
-class GitoliteEnvironmentMixin(Environment):
+class GitoliteEnvironmentLowPrecMixin(Environment):
     def get_repo_shortname(self):
         # The gitolite environment variable $GL_REPO is a pretty good
         # repo_shortname (though it's probably not as good as a value
         # the user might have explicitly put in his config).
         return (
             self.osenv.get('GL_REPO', None) or
-            super(GitoliteEnvironmentMixin, self).get_repo_shortname()
+            super(GitoliteEnvironmentLowPrecMixin, self).get_repo_shortname()
             )
 
-    def get_pusher(self):
-        return self.osenv.get('GL_USER', 'unknown user')
-
     def get_fromaddr(self, change=None):
         GL_USER = self.osenv.get('GL_USER')
         if GL_USER is not None:
@@ -2904,7 +3199,7 @@ class GitoliteEnvironmentMixin(Environment):
                             return m.group(1)
                 finally:
                     f.close()
-        return super(GitoliteEnvironmentMixin, self).get_fromaddr(change)
+        return super(GitoliteEnvironmentLowPrecMixin, self).get_fromaddr(change)
 
 
 class IncrementalDateTime(object):
@@ -2925,67 +3220,43 @@ class IncrementalDateTime(object):
         return formatted
 
 
-class GitoliteEnvironment(
-        ProjectdescEnvironmentMixin,
-        ConfigMaxlinesEnvironmentMixin,
-        ComputeFQDNEnvironmentMixin,
-        ConfigFilterLinesEnvironmentMixin,
-        ConfigRecipientsEnvironmentMixin,
-        ConfigRefFilterEnvironmentMixin,
-        PusherDomainEnvironmentMixin,
-        ConfigOptionsEnvironmentMixin,
-        GitoliteEnvironmentMixin,
-        Environment,
-        ):
-    pass
-
-
-class StashEnvironmentMixin(Environment):
+class StashEnvironmentHighPrecMixin(Environment):
     def __init__(self, user=None, repo=None, **kw):
-        super(StashEnvironmentMixin, self).__init__(**kw)
+        super(StashEnvironmentHighPrecMixin,
+              self).__init__(user=user, repo=repo, **kw)
         self.__user = user
         self.__repo = repo
 
-    def get_repo_shortname(self):
-        return self.__repo
-
     def get_pusher(self):
         return re.match('(.*?)\s*<', self.__user).group(1)
 
     def get_pusher_email(self):
         return self.__user
 
-    def get_fromaddr(self, change=None):
-        return self.__user
 
+class StashEnvironmentLowPrecMixin(Environment):
+    def __init__(self, user=None, repo=None, **kw):
+        super(StashEnvironmentLowPrecMixin, self).__init__(**kw)
+        self.__repo = repo
+        self.__user = user
 
-class StashEnvironment(
-        StashEnvironmentMixin,
-        ProjectdescEnvironmentMixin,
-        ConfigMaxlinesEnvironmentMixin,
-        ComputeFQDNEnvironmentMixin,
-        ConfigFilterLinesEnvironmentMixin,
-        ConfigRecipientsEnvironmentMixin,
-        ConfigRefFilterEnvironmentMixin,
-        PusherDomainEnvironmentMixin,
-        ConfigOptionsEnvironmentMixin,
-        Environment,
-        ):
-    pass
+    def get_repo_shortname(self):
+        return self.__repo
+
+    def get_fromaddr(self, change=None):
+        return self.__user
 
 
-class GerritEnvironmentMixin(Environment):
+class GerritEnvironmentHighPrecMixin(Environment):
     def __init__(self, project=None, submitter=None, update_method=None, **kw):
-        super(GerritEnvironmentMixin, self).__init__(**kw)
+        super(GerritEnvironmentHighPrecMixin,
+              self).__init__(submitter=submitter, project=project, **kw)
         self.__project = project
         self.__submitter = submitter
         self.__update_method = update_method
         "Make an 'update_method' value available for templates."
         self.COMPUTED_KEYS += ['update_method']
 
-    def get_repo_shortname(self):
-        return self.__project
-
     def get_pusher(self):
         if self.__submitter:
             if self.__submitter.find('<') != -1:
@@ -3008,16 +3279,10 @@ class GerritEnvironmentMixin(Environment):
         if self.__submitter:
             return self.__submitter
         else:
-            return super(GerritEnvironmentMixin, self).get_pusher_email()
-
-    def get_fromaddr(self, change=None):
-        if self.__submitter and self.__submitter.find('<') != -1:
-            return self.__submitter
-        else:
-            return super(GerritEnvironmentMixin, self).get_fromaddr(change)
+            return super(GerritEnvironmentHighPrecMixin, self).get_pusher_email()
 
     def get_default_ref_ignore_regex(self):
-        default = super(GerritEnvironmentMixin, self).get_default_ref_ignore_regex()
+        default = super(GerritEnvironmentHighPrecMixin, self).get_default_ref_ignore_regex()
         return default + '|^refs/changes/|^refs/cache-automerge/|^refs/meta/'
 
     def get_revision_recipients(self, revision):
@@ -3030,25 +3295,26 @@ class GerritEnvironmentMixin(Environment):
         if committer == 'Gerrit Code Review':
             return []
         else:
-            return super(GerritEnvironmentMixin, self).get_revision_recipients(revision)
+            return super(GerritEnvironmentHighPrecMixin, self).get_revision_recipients(revision)
 
     def get_update_method(self):
         return self.__update_method
 
 
-class GerritEnvironment(
-        GerritEnvironmentMixin,
-        ProjectdescEnvironmentMixin,
-        ConfigMaxlinesEnvironmentMixin,
-        ComputeFQDNEnvironmentMixin,
-        ConfigFilterLinesEnvironmentMixin,
-        ConfigRecipientsEnvironmentMixin,
-        ConfigRefFilterEnvironmentMixin,
-        PusherDomainEnvironmentMixin,
-        ConfigOptionsEnvironmentMixin,
-        Environment,
-        ):
-    pass
+class GerritEnvironmentLowPrecMixin(Environment):
+    def __init__(self, project=None, submitter=None, **kw):
+        super(GerritEnvironmentLowPrecMixin, self).__init__(**kw)
+        self.__project = project
+        self.__submitter = submitter
+
+    def get_repo_shortname(self):
+        return self.__project
+
+    def get_fromaddr(self, change=None):
+        if self.__submitter and self.__submitter.find('<') != -1:
+            return self.__submitter
+        else:
+            return super(GerritEnvironmentLowPrecMixin, self).get_fromaddr(change)
 
 
 class Push(object):
@@ -3314,13 +3580,13 @@ class Push(object):
             if not change.recipients:
                 change.environment.log_warning(
                     '*** no recipients configured so no email will be sent\n'
-                    '*** for %r update %s->%s\n'
+                    '*** for %r update %s->%s'
                     % (change.refname, change.old.sha1, change.new.sha1,)
                     )
             else:
                 if not change.environment.quiet:
                     change.environment.log_msg(
-                        'Sending notification emails to: %s\n' % (change.recipients,))
+                        'Sending notification emails to: %s' % (change.recipients,))
                 extra_values = {'send_date': next(send_date)}
 
                 rev = change.send_single_combined_email(sha1s)
@@ -3343,14 +3609,14 @@ class Push(object):
                 change.environment.log_warning(
                     '*** Too many new commits (%d), not sending commit emails.\n' % len(sha1s) +
                     '*** Try setting multimailhook.maxCommitEmails to a greater value\n' +
-                    '*** Currently, multimailhook.maxCommitEmails=%d\n' % max_emails
+                    '*** Currently, multimailhook.maxCommitEmails=%d' % max_emails
                     )
                 return
 
             for (num, sha1) in enumerate(sha1s):
                 rev = Revision(change, GitObject(sha1), num=num + 1, tot=len(sha1s))
                 if not rev.recipients and rev.cc_recipients:
-                    change.environment.log_msg('*** Replacing Cc: with To:\n')
+                    change.environment.log_msg('*** Replacing Cc: with To:')
                     rev.recipients = rev.cc_recipients
                     rev.cc_recipients = None
                 if rev.recipients:
@@ -3364,7 +3630,7 @@ class Push(object):
         if unhandled_sha1s:
             change.environment.log_error(
                 'ERROR: No emails were sent for the following new commits:\n'
-                '    %s\n'
+                '    %s'
                 % ('\n    '.join(sorted(unhandled_sha1s)),)
                 )
 
@@ -3378,24 +3644,41 @@ def include_ref(refname, ref_filter_regex, is_inclusion_filter):
 
 
 def run_as_post_receive_hook(environment, mailer):
-    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(True)
+    environment.check()
+    send_filter_regex, send_is_inclusion_filter = environment.get_ref_filter_regex(True)
+    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(False)
     changes = []
-    for line in sys.stdin:
+    while True:
+        line = read_line(sys.stdin)
+        if line == '':
+            break
         (oldrev, newrev, refname) = line.strip().split(' ', 2)
+        environment.get_logger().debug(
+            "run_as_post_receive_hook: oldrev=%s, newrev=%s, refname=%s" %
+            (oldrev, newrev, refname))
+
         if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
             continue
+        if not include_ref(refname, send_filter_regex, send_is_inclusion_filter):
+            continue
         changes.append(
             ReferenceChange.create(environment, oldrev, newrev, refname)
             )
     if changes:
         push = Push(environment, changes)
         push.send_emails(mailer, body_filter=environment.filter_body)
+    if hasattr(mailer, '__del__'):
+        mailer.__del__()
 
 
 def run_as_update_hook(environment, mailer, refname, oldrev, newrev, force_send=False):
-    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(True)
+    environment.check()
+    send_filter_regex, send_is_inclusion_filter = environment.get_ref_filter_regex(True)
+    ref_filter_regex, is_inclusion_filter = environment.get_ref_filter_regex(False)
     if not include_ref(refname, ref_filter_regex, is_inclusion_filter):
         return
+    if not include_ref(refname, send_filter_regex, send_is_inclusion_filter):
+        return
     changes = [
         ReferenceChange.create(
             environment,
@@ -3406,6 +3689,77 @@ def run_as_update_hook(environment, mailer, refname, oldrev, newrev, force_send=
         ]
     push = Push(environment, changes, force_send)
     push.send_emails(mailer, body_filter=environment.filter_body)
+    if hasattr(mailer, '__del__'):
+        mailer.__del__()
+
+
+def check_ref_filter(environment):
+    send_filter_regex, send_is_inclusion = environment.get_ref_filter_regex(True)
+    ref_filter_regex, ref_is_inclusion = environment.get_ref_filter_regex(False)
+
+    def inc_exc_lusion(b):
+        if b:
+            return 'inclusion'
+        else:
+            return 'exclusion'
+
+    if send_filter_regex:
+        sys.stdout.write("DoSend/DontSend filter regex (" +
+                         (inc_exc_lusion(send_is_inclusion)) +
+                         '): ' + send_filter_regex.pattern +
+                         '\n')
+    if send_filter_regex:
+        sys.stdout.write("Include/Exclude filter regex (" +
+                         (inc_exc_lusion(ref_is_inclusion)) +
+                         '): ' + ref_filter_regex.pattern +
+                         '\n')
+    sys.stdout.write(os.linesep)
+
+    sys.stdout.write(
+        "Refs marked as EXCLUDE are excluded by either refFilterInclusionRegex\n"
+        "or refFilterExclusionRegex. No emails will be sent for commits included\n"
+        "in these refs.\n"
+        "Refs marked as DONT-SEND are excluded by either refFilterDoSendRegex or\n"
+        "refFilterDontSendRegex, but not by either refFilterInclusionRegex or\n"
+        "refFilterExclusionRegex. Emails will be sent for commits included in these\n"
+        "refs only when the commit reaches a ref which isn't excluded.\n"
+        "Refs marked as DO-SEND are not excluded by any filter. Emails will\n"
+        "be sent normally for commits included in these refs.\n")
+
+    sys.stdout.write(os.linesep)
+
+    for refname in read_git_lines(['for-each-ref', '--format', '%(refname)']):
+        sys.stdout.write(refname)
+        if not include_ref(refname, ref_filter_regex, ref_is_inclusion):
+            sys.stdout.write(' EXCLUDE')
+        elif not include_ref(refname, send_filter_regex, send_is_inclusion):
+            sys.stdout.write(' DONT-SEND')
+        else:
+            sys.stdout.write(' DO-SEND')
+
+        sys.stdout.write(os.linesep)
+
+
+def show_env(environment, out):
+    out.write('Environment values:\n')
+    for (k, v) in sorted(environment.get_values().items()):
+        if k:  # Don't show the {'' : ''} pair.
+            out.write('    %s : %r\n' % (k, v))
+    out.write('\n')
+    # Flush to avoid interleaving with further log output
+    out.flush()
+
+
+def check_setup(environment):
+    environment.check()
+    show_env(environment, sys.stdout)
+    sys.stdout.write("Now, checking that git-multimail's standard input "
+                     "is properly set ..." + os.linesep)
+    sys.stdout.write("Please type some text and then press Return" + os.linesep)
+    stdin = sys.stdin.readline()
+    sys.stdout.write("You have just entered:" + os.linesep)
+    sys.stdout.write(stdin)
+    sys.stdout.write("git-multimail seems properly set up." + os.linesep)
 
 
 def choose_mailer(config, environment):
@@ -3418,55 +3772,56 @@ def choose_mailer(config, environment):
         smtpencryption = config.get('smtpencryption', default='none')
         smtpuser = config.get('smtpuser', default='')
         smtppass = config.get('smtppass', default='')
+        smtpcacerts = config.get('smtpcacerts', default='')
         mailer = SMTPMailer(
+            environment,
             envelopesender=(environment.get_sender() or environment.get_fromaddr()),
             smtpserver=smtpserver, smtpservertimeout=smtpservertimeout,
             smtpserverdebuglevel=smtpserverdebuglevel,
             smtpencryption=smtpencryption,
             smtpuser=smtpuser,
             smtppass=smtppass,
+            smtpcacerts=smtpcacerts
             )
     elif mailer == 'sendmail':
         command = config.get('sendmailcommand')
         if command:
             command = shlex.split(command)
-        mailer = SendMailer(command=command, envelopesender=environment.get_sender())
+        mailer = SendMailer(environment,
+                            command=command, envelopesender=environment.get_sender())
     else:
         environment.log_error(
             'fatal: multimailhook.mailer is set to an incorrect value: "%s"\n' % mailer +
-            'please use one of "smtp" or "sendmail".\n'
+            'please use one of "smtp" or "sendmail".'
             )
         sys.exit(1)
     return mailer
 
 
 KNOWN_ENVIRONMENTS = {
-    'generic': GenericEnvironmentMixin,
-    'gitolite': GitoliteEnvironmentMixin,
-    'stash': StashEnvironmentMixin,
-    'gerrit': GerritEnvironmentMixin,
+    'generic': {'highprec': GenericEnvironmentMixin},
+    'gitolite': {'highprec': GitoliteEnvironmentHighPrecMixin,
+                 'lowprec': GitoliteEnvironmentLowPrecMixin},
+    'stash': {'highprec': StashEnvironmentHighPrecMixin,
+              'lowprec': StashEnvironmentLowPrecMixin},
+    'gerrit': {'highprec': GerritEnvironmentHighPrecMixin,
+               'lowprec': GerritEnvironmentLowPrecMixin},
     }
 
 
 def choose_environment(config, osenv=None, env=None, recipients=None,
                        hook_info=None):
+    env_name = choose_environment_name(config, env, osenv)
+    environment_klass = build_environment_klass(env_name)
+    env = build_environment(environment_klass, env_name, config,
+                            osenv, recipients, hook_info)
+    return env
+
+
+def choose_environment_name(config, env, osenv):
     if not osenv:
         osenv = os.environ
 
-    environment_mixins = [
-        ConfigRefFilterEnvironmentMixin,
-        ProjectdescEnvironmentMixin,
-        ConfigMaxlinesEnvironmentMixin,
-        ComputeFQDNEnvironmentMixin,
-        ConfigFilterLinesEnvironmentMixin,
-        PusherDomainEnvironmentMixin,
-        ConfigOptionsEnvironmentMixin,
-        ]
-    environment_kw = {
-        'osenv': osenv,
-        'config': config,
-        }
-
     if not env:
         env = config.get('environment')
 
@@ -3475,8 +3830,58 @@ def choose_environment(config, osenv=None, env=None, recipients=None,
             env = 'gitolite'
         else:
             env = 'generic'
+    return env
+
+
+COMMON_ENVIRONMENT_MIXINS = [
+    ConfigRecipientsEnvironmentMixin,
+    CLIRecipientsEnvironmentMixin,
+    ConfigRefFilterEnvironmentMixin,
+    ProjectdescEnvironmentMixin,
+    ConfigMaxlinesEnvironmentMixin,
+    ComputeFQDNEnvironmentMixin,
+    ConfigFilterLinesEnvironmentMixin,
+    PusherDomainEnvironmentMixin,
+    ConfigOptionsEnvironmentMixin,
+    ]
+
+
+def build_environment_klass(env_name):
+    if 'class' in KNOWN_ENVIRONMENTS[env_name]:
+        return KNOWN_ENVIRONMENTS[env_name]['class']
+
+    environment_mixins = []
+    known_env = KNOWN_ENVIRONMENTS[env_name]
+    if 'highprec' in known_env:
+        high_prec_mixin = known_env['highprec']
+        environment_mixins.append(high_prec_mixin)
+    environment_mixins = environment_mixins + COMMON_ENVIRONMENT_MIXINS
+    if 'lowprec' in known_env:
+        low_prec_mixin = known_env['lowprec']
+        environment_mixins.append(low_prec_mixin)
+    environment_mixins.append(Environment)
+    klass_name = env_name.capitalize() + 'Environement'
+    environment_klass = type(
+        klass_name,
+        tuple(environment_mixins),
+        {},
+        )
+    KNOWN_ENVIRONMENTS[env_name]['class'] = environment_klass
+    return environment_klass
+
 
-    environment_mixins.insert(0, KNOWN_ENVIRONMENTS[env])
+GerritEnvironment = build_environment_klass('gerrit')
+StashEnvironment = build_environment_klass('stash')
+GitoliteEnvironment = build_environment_klass('gitolite')
+GenericEnvironment = build_environment_klass('generic')
+
+
+def build_environment(environment_klass, env, config,
+                      osenv, recipients, hook_info):
+    environment_kw = {
+        'osenv': osenv,
+        'config': config,
+        }
 
     if env == 'stash':
         environment_kw['user'] = hook_info['stash_user']
@@ -3486,20 +3891,8 @@ def choose_environment(config, osenv=None, env=None, recipients=None,
         environment_kw['submitter'] = hook_info['submitter']
         environment_kw['update_method'] = hook_info['update_method']
 
-    if recipients:
-        environment_mixins.insert(0, StaticRecipientsEnvironmentMixin)
-        environment_kw['refchange_recipients'] = recipients
-        environment_kw['announce_recipients'] = recipients
-        environment_kw['revision_recipients'] = recipients
-        environment_kw['scancommitforcc'] = config.get('scancommitforcc')
-    else:
-        environment_mixins.insert(0, ConfigRecipientsEnvironmentMixin)
+    environment_kw['cli_recipients'] = recipients
 
-    environment_klass = type(
-        'EffectiveEnvironment',
-        tuple(environment_mixins) + (Environment,),
-        {},
-        )
     return environment_klass(**environment_kw)
 
 
@@ -3520,7 +3913,8 @@ def get_version():
     return __version__
 
 
-def compute_gerrit_options(options, args, required_gerrit_options):
+def compute_gerrit_options(options, args, required_gerrit_options,
+                           raw_refname):
     if None in required_gerrit_options:
         raise SystemExit("Error: Specify all of --oldrev, --newrev, --refname, "
                          "and --project; or none of them.")
@@ -3537,24 +3931,11 @@ def compute_gerrit_options(options, args, required_gerrit_options):
     # Gerrit oddly omits 'refs/heads/' in the refname when calling
     # ref-updated hook; put it back.
     git_dir = get_git_dir()
-    if (not os.path.exists(os.path.join(git_dir, options.refname)) and
+    if (not os.path.exists(os.path.join(git_dir, raw_refname)) and
         os.path.exists(os.path.join(git_dir, 'refs', 'heads',
-                                    options.refname))):
+                                    raw_refname))):
         options.refname = 'refs/heads/' + options.refname
 
-    # Convert each string option unicode for Python3.
-    if PYTHON3:
-        opts = ['environment', 'recipients', 'oldrev', 'newrev', 'refname',
-                'project', 'submitter', 'stash-user', 'stash-repo']
-        for opt in opts:
-            if not hasattr(options, opt):
-                continue
-            obj = getattr(options, opt)
-            if obj:
-                enc = obj.encode('utf-8', 'surrogateescape')
-                dec = enc.decode('utf-8', 'replace')
-                setattr(options, opt, dec)
-
     # New revisions can appear in a gerrit repository either due to someone
     # pushing directly (in which case options.submitter will be set), or they
     # can press "Submit this patchset" in the web UI for some CR (in which
@@ -3594,6 +3975,20 @@ def compute_gerrit_options(options, args, required_gerrit_options):
 
 
 def check_hook_specific_args(options, args):
+    raw_refname = options.refname
+    # Convert each string option unicode for Python3.
+    if PYTHON3:
+        opts = ['environment', 'recipients', 'oldrev', 'newrev', 'refname',
+                'project', 'submitter', 'stash_user', 'stash_repo']
+        for opt in opts:
+            if not hasattr(options, opt):
+                continue
+            obj = getattr(options, opt)
+            if obj:
+                enc = obj.encode('utf-8', 'surrogateescape')
+                dec = enc.decode('utf-8', 'replace')
+                setattr(options, opt, dec)
+
     # First check for stash arguments
     if (options.stash_user is None) != (options.stash_repo is None):
         raise SystemExit("Error: Specify both of --stash-user and "
@@ -3607,12 +4002,78 @@ def check_hook_specific_args(options, args):
     required_gerrit_options = (options.oldrev, options.newrev, options.refname,
                                options.project)
     if required_gerrit_options != (None,) * 4:
-        return compute_gerrit_options(options, args, required_gerrit_options)
+        return compute_gerrit_options(options, args, required_gerrit_options,
+                                      raw_refname)
 
     # No special options in use, just return what we started with
     return options, args, {}
 
 
+class Logger(object):
+    def parse_verbose(self, verbose):
+        if verbose > 0:
+            return logging.DEBUG
+        else:
+            return logging.INFO
+
+    def create_log_file(self, environment, name, path, verbosity):
+        log_file = logging.getLogger(name)
+        file_handler = logging.FileHandler(path)
+        log_fmt = logging.Formatter("%(asctime)s [%(levelname)-5.5s]  %(message)s")
+        file_handler.setFormatter(log_fmt)
+        log_file.addHandler(file_handler)
+        log_file.setLevel(verbosity)
+        return log_file
+
+    def __init__(self, environment):
+        self.environment = environment
+        self.loggers = []
+        stderr_log = logging.getLogger('git_multimail.stderr')
+
+        class EncodedStderr(object):
+            def write(self, x):
+                write_str(sys.stderr, x)
+
+            def flush(self):
+                sys.stderr.flush()
+
+        stderr_handler = logging.StreamHandler(EncodedStderr())
+        stderr_log.addHandler(stderr_handler)
+        stderr_log.setLevel(self.parse_verbose(environment.verbose))
+        self.loggers.append(stderr_log)
+
+        if environment.debug_log_file is not None:
+            debug_log_file = self.create_log_file(
+                environment, 'git_multimail.debug', environment.debug_log_file, logging.DEBUG)
+            self.loggers.append(debug_log_file)
+
+        if environment.log_file is not None:
+            log_file = self.create_log_file(
+                environment, 'git_multimail.file', environment.log_file, logging.INFO)
+            self.loggers.append(log_file)
+
+        if environment.error_log_file is not None:
+            error_log_file = self.create_log_file(
+                environment, 'git_multimail.error', environment.error_log_file, logging.ERROR)
+            self.loggers.append(error_log_file)
+
+    def info(self, msg):
+        for l in self.loggers:
+            l.info(msg)
+
+    def debug(self, msg):
+        for l in self.loggers:
+            l.debug(msg)
+
+    def warning(self, msg):
+        for l in self.loggers:
+            l.warning(msg)
+
+    def error(self, msg):
+        for l in self.loggers:
+            l.error(msg)
+
+
 def main(args):
     parser = optparse.OptionParser(
         description=__doc__,
@@ -3639,7 +4100,7 @@ def main(args):
         '--show-env', action='store_true', default=False,
         help=(
             'Write to stderr the values determined for the environment '
-            '(intended for debugging purposes).'
+            '(intended for debugging purposes), then proceed normally.'
             ),
         )
     parser.add_option(
@@ -3664,6 +4125,22 @@ def main(args):
             "Display git-multimail's version"
             ),
         )
+
+    parser.add_option(
+        '--python-version', action='store_true', default=False,
+        help=(
+            "Display the version of Python used by git-multimail"
+            ),
+        )
+
+    parser.add_option(
+        '--check-ref-filter', action='store_true', default=False,
+        help=(
+            'List refs and show information on how git-multimail '
+            'will process them.'
+            )
+        )
+
     # The following options permit this script to be run as a gerrit
     # ref-updated hook.  See e.g.
     # code.google.com/p/gerrit/source/browse/Documentation/config-hooks.txt
@@ -3690,21 +4167,16 @@ def main(args):
         sys.stdout.write('git-multimail version ' + get_version() + '\n')
         return
 
+    if options.python_version:
+        sys.stdout.write('Python version ' + sys.version + '\n')
+        return
+
     if options.c:
-        parameters = os.environ.get('GIT_CONFIG_PARAMETERS', '')
-        if parameters:
-            parameters += ' '
-        # git expects GIT_CONFIG_PARAMETERS to be of the form
-        #    "'name1=value1' 'name2=value2' 'name3=value3'"
-        # including everything inside the double quotes (but not the double
-        # quotes themselves).  Spacing is critical.  Also, if a value contains
-        # a literal single quote that quote must be represented using the
-        # four character sequence: '\''
-        parameters += ' '.join("'" + x.replace("'", "'\\''") + "'" for x in options.c)
-        os.environ['GIT_CONFIG_PARAMETERS'] = parameters
+        Config.add_config_parameters(options.c)
 
     config = Config('multimailhook')
 
+    environment = None
     try:
         environment = choose_environment(
             config, osenv=os.environ,
@@ -3714,38 +4186,52 @@ def main(args):
             )
 
         if options.show_env:
-            sys.stderr.write('Environment values:\n')
-            for (k, v) in sorted(environment.get_values().items()):
-                sys.stderr.write('    %s : %r\n' % (k, v))
-            sys.stderr.write('\n')
+            show_env(environment, sys.stderr)
 
         if options.stdout or environment.stdout:
             mailer = OutputMailer(sys.stdout)
         else:
             mailer = choose_mailer(config, environment)
 
+        must_check_setup = os.environ.get('GIT_MULTIMAIL_CHECK_SETUP')
+        if must_check_setup == '':
+            must_check_setup = False
+        if options.check_ref_filter:
+            check_ref_filter(environment)
+        elif must_check_setup:
+            check_setup(environment)
         # Dual mode: if arguments were specified on the command line, run
         # like an update hook; otherwise, run as a post-receive hook.
-        if args:
+        elif args:
             if len(args) != 3:
                 parser.error('Need zero or three non-option arguments')
             (refname, oldrev, newrev) = args
+            environment.get_logger().debug(
+                "run_as_update_hook: refname=%s, oldrev=%s, newrev=%s, force_send=%s" %
+                (refname, oldrev, newrev, options.force_send))
             run_as_update_hook(environment, mailer, refname, oldrev, newrev, options.force_send)
         else:
             run_as_post_receive_hook(environment, mailer)
     except ConfigurationException:
         sys.exit(sys.exc_info()[1])
+    except SystemExit:
+        raise
     except Exception:
         t, e, tb = sys.exc_info()
         import traceback
-        sys.stdout.write('\n')
-        sys.stdout.write('Exception \'' + t.__name__ +
-                         '\' raised. Please report this as a bug to\n')
-        sys.stdout.write('https://github.com/git-multimail/git-multimail/issues\n')
-        sys.stdout.write('with the information below:\n\n')
-        sys.stdout.write('git-multimail version ' + get_version() + '\n')
-        sys.stdout.write('Python version ' + sys.version + '\n')
-        traceback.print_exc(file=sys.stdout)
+        sys.stderr.write('\n')  # Avoid mixing message with previous output
+        msg = (
+            'Exception \'' + t.__name__ +
+            '\' raised. Please report this as a bug to\n'
+            'https://github.com/git-multimail/git-multimail/issues\n'
+            'with the information below:\n\n'
+            'git-multimail version ' + get_version() + '\n'
+            'Python version ' + sys.version + '\n' +
+            traceback.format_exc())
+        try:
+            environment.get_logger().error(msg)
+        except:
+            sys.stderr.write(msg)
         sys.exit(1)
 
 if __name__ == '__main__':
index 9975df7107ac29be2b2ac861b90dfc0730ec7b97..1ea113d274e27adfede78bd5b5530608a47fa378 100755 (executable)
@@ -55,6 +55,12 @@ import git_multimail
 # git-multimail:
 config = git_multimail.Config('multimailhook')
 
+# Set some Git configuration variables. Equivalent to passing var=val
+# to "git -c var=val" each time git is called, or to adding the
+# configuration in .git/config (must come before instanciating the
+# environment) :
+#git_multimail.Config.add_config_parameters('multimailhook.commitEmailFormat=html')
+#git_multimail.Config.add_config_parameters(('user.name=foo', 'user.email=foo@example.com'))
 
 # Select the type of environment:
 try:
diff --git a/contrib/long-running-filter/example.pl b/contrib/long-running-filter/example.pl
new file mode 100755 (executable)
index 0000000..3945705
--- /dev/null
@@ -0,0 +1,128 @@
+#!/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=([^=]+)$/;
+
+       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 5a9955d757fe163a6ac46ad331a6bb629398b1f6..158958d36357bd217f8b257cbdbdc65b049d6c07 100644 (file)
@@ -19,7 +19,7 @@
 [InputOutput::RequireCheckedSyscalls]
 functions = open say close
 
-# This rules demands to add a dependancy for the Readonly module. This is not
+# This rule demands to add a dependency for the Readonly module. This is not
 # wished.
 [-ValuesAndExpressions::ProhibitConstantPragma]
 
index 8dd74a9a406e9cfd685ea1af3947e4bea4c82f90..41e74fba1e1b1a0b310160e98c0fa26a74e859ca 100755 (executable)
@@ -963,7 +963,7 @@ sub mw_upload_file {
                print {*STDERR} "Check the configuration of file uploads in your mediawiki.\n";
                return $newrevid;
        }
-       # Deleting and uploading a file requires a priviledged user
+       # Deleting and uploading a file requires a privileged user
        if ($file_deleted) {
                $mediawiki = connect_maybe($mediawiki, $remotename, $url);
                my $query = {
index 92baa3beeeaf924e06ceb6d8afb9e14e60f322e6..52b84ba3d4396e13c3aae3af4fe78aac5ddd55ca 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-BUILD_LABEL=$(shell date +"%s")
+BUILD_LABEL=$(shell cut -d" " -f3 ../../GIT-VERSION-FILE)
 TAR_OUT=$(shell go env GOOS)_$(shell go env GOARCH).tar.gz
 
 all: git-remote-persistent-https git-remote-persistent-https--proxy \
@@ -25,8 +25,10 @@ git-remote-persistent-http: git-remote-persistent-https
        ln -f -s git-remote-persistent-https git-remote-persistent-http
 
 git-remote-persistent-https:
+       case $$(go version) in \
+       "go version go"1.[0-5].*) EQ=" " ;; *) EQ="=" ;; esac && \
        go build -o git-remote-persistent-https \
-               -ldflags "-X main._BUILD_EMBED_LABEL $(BUILD_LABEL)"
+               -ldflags "-X main._BUILD_EMBED_LABEL$${EQ}$(BUILD_LABEL)"
 
 clean:
        rm -f git-remote-persistent-http* *.tar.gz
index 7a39b30ad09483ef9796d98ca78e52f652046582..dec085a235f4477c9079dc643c76db166f487761 100755 (executable)
@@ -4,8 +4,9 @@
 #
 # Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>
 #
-if [ $# -eq 0 ]; then
-    set -- -h
+if test $# -eq 0
+then
+       set -- -h
 fi
 OPTS_SPEC="\
 git subtree add   --prefix=<prefix> <commit>
@@ -48,89 +49,144 @@ squash=
 message=
 prefix=
 
-debug()
-{
-       if [ -n "$debug" ]; then
+debug () {
+       if test -n "$debug"
+       then
                printf "%s\n" "$*" >&2
        fi
 }
 
-say()
-{
-       if [ -z "$quiet" ]; then
+say () {
+       if test -z "$quiet"
+       then
                printf "%s\n" "$*" >&2
        fi
 }
 
-progress()
-{
-       if [ -z "$quiet" ]; then
+progress () {
+       if test -z "$quiet"
+       then
                printf "%s\r" "$*" >&2
        fi
 }
 
-assert()
-{
-       if "$@"; then
-               :
-       else
+assert () {
+       if ! "$@"
+       then
                die "assertion failed: " "$@"
        fi
 }
 
 
-#echo "Options: $*"
-
-while [ $# -gt 0 ]; do
+while test $# -gt 0
+do
        opt="$1"
        shift
+
        case "$opt" in
-               -q) quiet=1 ;;
-               -d) debug=1 ;;
-               --annotate) annotate="$1"; shift ;;
-               --no-annotate) annotate= ;;
-               -b) branch="$1"; shift ;;
-               -P) prefix="${1%/}"; shift ;;
-               -m) message="$1"; shift ;;
-               --no-prefix) prefix= ;;
-               --onto) onto="$1"; shift ;;
-               --no-onto) onto= ;;
-               --rejoin) rejoin=1 ;;
-               --no-rejoin) rejoin= ;;
-               --ignore-joins) ignore_joins=1 ;;
-               --no-ignore-joins) ignore_joins= ;;
-               --squash) squash=1 ;;
-               --no-squash) squash= ;;
-               --) break ;;
-               *) die "Unexpected option: $opt" ;;
+       -q)
+               quiet=1
+               ;;
+       -d)
+               debug=1
+               ;;
+       --annotate)
+               annotate="$1"
+               shift
+               ;;
+       --no-annotate)
+               annotate=
+               ;;
+       -b)
+               branch="$1"
+               shift
+               ;;
+       -P)
+               prefix="${1%/}"
+               shift
+               ;;
+       -m)
+               message="$1"
+               shift
+               ;;
+       --no-prefix)
+               prefix=
+               ;;
+       --onto)
+               onto="$1"
+               shift
+               ;;
+       --no-onto)
+               onto=
+               ;;
+       --rejoin)
+               rejoin=1
+               ;;
+       --no-rejoin)
+               rejoin=
+               ;;
+       --ignore-joins)
+               ignore_joins=1
+               ;;
+       --no-ignore-joins)
+               ignore_joins=
+               ;;
+       --squash)
+               squash=1
+               ;;
+       --no-squash)
+               squash=
+               ;;
+       --)
+               break
+               ;;
+       *)
+               die "Unexpected option: $opt"
+               ;;
        esac
 done
 
 command="$1"
 shift
+
 case "$command" in
-       add|merge|pull) default= ;;
-       split|push) default="--default HEAD" ;;
-       *) die "Unknown command '$command'" ;;
+add|merge|pull)
+       default=
+       ;;
+split|push)
+       default="--default HEAD"
+       ;;
+*)
+       die "Unknown command '$command'"
+       ;;
 esac
 
-if [ -z "$prefix" ]; then
+if test -z "$prefix"
+then
        die "You must provide the --prefix option."
 fi
 
 case "$command" in
-       add) [ -e "$prefix" ] && 
-               die "prefix '$prefix' already exists." ;;
-       *)   [ -e "$prefix" ] || 
-               die "'$prefix' does not exist; use 'git subtree add'" ;;
+add)
+       test -e "$prefix" &&
+               die "prefix '$prefix' already exists."
+       ;;
+*)
+       test -e "$prefix" ||
+               die "'$prefix' does not exist; use 'git subtree add'"
+       ;;
 esac
 
 dir="$(dirname "$prefix/.")"
 
-if [ "$command" != "pull" -a "$command" != "add" -a "$command" != "push" ]; then
+if test "$command" != "pull" &&
+               test "$command" != "add" &&
+               test "$command" != "push"
+then
        revs=$(git rev-parse $default --revs-only "$@") || exit $?
-       dirs="$(git rev-parse --no-revs --no-flags "$@")" || exit $?
-       if [ -n "$dirs" ]; then
+       dirs=$(git rev-parse --no-revs --no-flags "$@") || exit $?
+       if test -n "$dirs"
+       then
                die "Error: Use --prefix instead of bare filenames."
        fi
 fi
@@ -142,78 +198,82 @@ debug "dir: {$dir}"
 debug "opts: {$*}"
 debug
 
-cache_setup()
-{
+cache_setup () {
        cachedir="$GIT_DIR/subtree-cache/$$"
-       rm -rf "$cachedir" || die "Can't delete old cachedir: $cachedir"
-       mkdir -p "$cachedir" || die "Can't create new cachedir: $cachedir"
-       mkdir -p "$cachedir/notree" || die "Can't create new cachedir: $cachedir/notree"
+       rm -rf "$cachedir" ||
+               die "Can't delete old cachedir: $cachedir"
+       mkdir -p "$cachedir" ||
+               die "Can't create new cachedir: $cachedir"
+       mkdir -p "$cachedir/notree" ||
+               die "Can't create new cachedir: $cachedir/notree"
        debug "Using cachedir: $cachedir" >&2
 }
 
-cache_get()
-{
-       for oldrev in $*; do
-               if [ -r "$cachedir/$oldrev" ]; then
+cache_get () {
+       for oldrev in "$@"
+       do
+               if test -r "$cachedir/$oldrev"
+               then
                        read newrev <"$cachedir/$oldrev"
                        echo $newrev
                fi
        done
 }
 
-cache_miss()
-{
-       for oldrev in $*; do
-               if [ ! -r "$cachedir/$oldrev" ]; then
+cache_miss () {
+       for oldrev in "$@"
+       do
+               if ! test -r "$cachedir/$oldrev"
+               then
                        echo $oldrev
                fi
        done
 }
 
-check_parents()
-{
-       missed=$(cache_miss $*)
-       for miss in $missed; do
-               if [ ! -r "$cachedir/notree/$miss" ]; then
+check_parents () {
+       missed=$(cache_miss "$@")
+       for miss in $missed
+       do
+               if ! test -r "$cachedir/notree/$miss"
+               then
                        debug "  incorrect order: $miss"
                fi
        done
 }
 
-set_notree()
-{
+set_notree () {
        echo "1" > "$cachedir/notree/$1"
 }
 
-cache_set()
-{
+cache_set () {
        oldrev="$1"
        newrev="$2"
-       if [ "$oldrev" != "latest_old" \
-            -a "$oldrev" != "latest_new" \
-            -a -e "$cachedir/$oldrev" ]; then
+       if test "$oldrev" != "latest_old" &&
+               test "$oldrev" != "latest_new" &&
+               test -e "$cachedir/$oldrev"
+       then
                die "cache for $oldrev already exists!"
        fi
        echo "$newrev" >"$cachedir/$oldrev"
 }
 
-rev_exists()
-{
-       if git rev-parse "$1" >/dev/null 2>&1; then
+rev_exists () {
+       if git rev-parse "$1" >/dev/null 2>&1
+       then
                return 0
        else
                return 1
        fi
 }
 
-rev_is_descendant_of_branch()
-{
+rev_is_descendant_of_branch () {
        newrev="$1"
        branch="$2"
-       branch_hash=$(git rev-parse $branch)
-       match=$(git rev-list -1 $branch_hash ^$newrev)
+       branch_hash=$(git rev-parse "$branch")
+       match=$(git rev-list -1 "$branch_hash" "^$newrev")
 
-       if [ -z "$match" ]; then
+       if test -z "$match"
+       then
                return 0
        else
                return 1
@@ -223,15 +283,14 @@ rev_is_descendant_of_branch()
 # if a commit doesn't have a parent, this might not work.  But we only want
 # to remove the parent from the rev-list, and since it doesn't exist, it won't
 # be there anyway, so do nothing in that case.
-try_remove_previous()
-{
-       if rev_exists "$1^"; then
+try_remove_previous () {
+       if rev_exists "$1^"
+       then
                echo "^$1^"
        fi
 }
 
-find_latest_squash()
-{
+find_latest_squash () {
        debug "Looking for latest squash ($dir)..."
        dir="$1"
        sq=
@@ -239,37 +298,43 @@ find_latest_squash()
        sub=
        git log --grep="^git-subtree-dir: $dir/*\$" \
                --pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
-       while read a b junk; do
+       while read a b junk
+       do
                debug "$a $b $junk"
                debug "{{$sq/$main/$sub}}"
                case "$a" in
-                       START) sq="$b" ;;
-                       git-subtree-mainline:) main="$b" ;;
-                       git-subtree-split:)
-                               sub="$(git rev-parse "$b^0")" ||
-                                   die "could not rev-parse split hash $b from commit $sq"
-                               ;;
-                       END)
-                               if [ -n "$sub" ]; then
-                                       if [ -n "$main" ]; then
-                                               # a rejoin commit?
-                                               # Pretend its sub was a squash.
-                                               sq="$sub"
-                                       fi
-                                       debug "Squash found: $sq $sub"
-                                       echo "$sq" "$sub"
-                                       break
+               START)
+                       sq="$b"
+                       ;;
+               git-subtree-mainline:)
+                       main="$b"
+                       ;;
+               git-subtree-split:)
+                       sub="$(git rev-parse "$b^0")" ||
+                       die "could not rev-parse split hash $b from commit $sq"
+                       ;;
+               END)
+                       if test -n "$sub"
+                       then
+                               if test -n "$main"
+                               then
+                                       # a rejoin commit?
+                                       # Pretend its sub was a squash.
+                                       sq="$sub"
                                fi
-                               sq=
-                               main=
-                               sub=
-                               ;;
+                               debug "Squash found: $sq $sub"
+                               echo "$sq" "$sub"
+                               break
+                       fi
+                       sq=
+                       main=
+                       sub=
+                       ;;
                esac
        done
 }
 
-find_existing_splits()
-{
+find_existing_splits () {
        debug "Looking for prior splits..."
        dir="$1"
        revs="$2"
@@ -277,37 +342,43 @@ find_existing_splits()
        sub=
        git log --grep="^git-subtree-dir: $dir/*\$" \
                --pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
-       while read a b junk; do
+       while read a b junk
+       do
                case "$a" in
-                       START) sq="$b" ;;
-                       git-subtree-mainline:) main="$b" ;;
-                       git-subtree-split:)
-                               sub="$(git rev-parse "$b^0")" ||
-                                   die "could not rev-parse split hash $b from commit $sq"
-                               ;;
-                       END)
-                               debug "  Main is: '$main'"
-                               if [ -z "$main" -a -n "$sub" ]; then
-                                       # squash commits refer to a subtree
-                                       debug "  Squash: $sq from $sub"
-                                       cache_set "$sq" "$sub"
-                               fi
-                               if [ -n "$main" -a -n "$sub" ]; then
-                                       debug "  Prior: $main -> $sub"
-                                       cache_set $main $sub
-                                       cache_set $sub $sub
-                                       try_remove_previous "$main"
-                                       try_remove_previous "$sub"
-                               fi
-                               main=
-                               sub=
-                               ;;
+               START)
+                       sq="$b"
+                       ;;
+               git-subtree-mainline:)
+                       main="$b"
+                       ;;
+               git-subtree-split:)
+                       sub="$(git rev-parse "$b^0")" ||
+                       die "could not rev-parse split hash $b from commit $sq"
+                       ;;
+               END)
+                       debug "  Main is: '$main'"
+                       if test -z "$main" -a -n "$sub"
+                       then
+                               # squash commits refer to a subtree
+                               debug "  Squash: $sq from $sub"
+                               cache_set "$sq" "$sub"
+                       fi
+                       if test -n "$main" -a -n "$sub"
+                       then
+                               debug "  Prior: $main -> $sub"
+                               cache_set $main $sub
+                               cache_set $sub $sub
+                               try_remove_previous "$main"
+                               try_remove_previous "$sub"
+                       fi
+                       main=
+                       sub=
+                       ;;
                esac
        done
 }
 
-copy_commit()
-{
+copy_commit () {
        # We're going to set some environment vars here, so
        # do it in a subshell to get rid of them safely later
        debug copy_commit "{$1}" "{$2}" "{$3}"
@@ -325,66 +396,69 @@ copy_commit()
                        GIT_COMMITTER_NAME \
                        GIT_COMMITTER_EMAIL \
                        GIT_COMMITTER_DATE
-               (printf "%s" "$annotate"; cat ) |
+               (
+                       printf "%s" "$annotate"
+                       cat
+               ) |
                git commit-tree "$2" $3  # reads the rest of stdin
        ) || die "Can't copy commit $1"
 }
 
-add_msg()
-{
+add_msg () {
        dir="$1"
        latest_old="$2"
        latest_new="$3"
-       if [ -n "$message" ]; then
+       if test -n "$message"
+       then
                commit_message="$message"
        else
                commit_message="Add '$dir/' from commit '$latest_new'"
        fi
        cat <<-EOF
                $commit_message
-               
+
                git-subtree-dir: $dir
                git-subtree-mainline: $latest_old
                git-subtree-split: $latest_new
        EOF
 }
 
-add_squashed_msg()
-{
-       if [ -n "$message" ]; then
+add_squashed_msg () {
+       if test -n "$message"
+       then
                echo "$message"
        else
                echo "Merge commit '$1' as '$2'"
        fi
 }
 
-rejoin_msg()
-{
+rejoin_msg () {
        dir="$1"
        latest_old="$2"
        latest_new="$3"
-       if [ -n "$message" ]; then
+       if test -n "$message"
+       then
                commit_message="$message"
        else
                commit_message="Split '$dir/' into commit '$latest_new'"
        fi
        cat <<-EOF
                $commit_message
-               
+
                git-subtree-dir: $dir
                git-subtree-mainline: $latest_old
                git-subtree-split: $latest_new
        EOF
 }
 
-squash_msg()
-{
+squash_msg () {
        dir="$1"
        oldsub="$2"
        newsub="$3"
        newsub_short=$(git rev-parse --short "$newsub")
-       
-       if [ -n "$oldsub" ]; then
+
+       if test -n "$oldsub"
+       then
                oldsub_short=$(git rev-parse --short "$oldsub")
                echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short"
                echo
@@ -393,41 +467,41 @@ squash_msg()
        else
                echo "Squashed '$dir/' content from commit $newsub_short"
        fi
-       
+
        echo
        echo "git-subtree-dir: $dir"
        echo "git-subtree-split: $newsub"
 }
 
-toptree_for_commit()
-{
+toptree_for_commit () {
        commit="$1"
        git log -1 --pretty=format:'%T' "$commit" -- || exit $?
 }
 
-subtree_for_commit()
-{
+subtree_for_commit () {
        commit="$1"
        dir="$2"
        git ls-tree "$commit" -- "$dir" |
-       while read mode type tree name; do
-               assert [ "$name" = "$dir" ]
-               assert [ "$type" = "tree" -o "$type" = "commit" ]
-               [ "$type" = "commit" ] && continue  # ignore submodules
+       while read mode type tree name
+       do
+               assert test "$name" = "$dir"
+               assert test "$type" = "tree" -o "$type" = "commit"
+               test "$type" = "commit" && continue  # ignore submodules
                echo $tree
                break
        done
 }
 
-tree_changed()
-{
+tree_changed () {
        tree=$1
        shift
-       if [ $# -ne 1 ]; then
+       if test $# -ne 1
+       then
                return 0   # weird parents, consider it changed
        else
                ptree=$(toptree_for_commit $1)
-               if [ "$ptree" != "$tree" ]; then
+               if test "$ptree" != "$tree"
+               then
                        return 0   # changed
                else
                        return 1   # not changed
@@ -435,118 +509,127 @@ tree_changed()
        fi
 }
 
-new_squash_commit()
-{
+new_squash_commit () {
        old="$1"
        oldsub="$2"
        newsub="$3"
        tree=$(toptree_for_commit $newsub) || exit $?
-       if [ -n "$old" ]; then
-               squash_msg "$dir" "$oldsub" "$newsub" | 
-                       git commit-tree "$tree" -p "$old" || exit $?
+       if test -n "$old"
+       then
+               squash_msg "$dir" "$oldsub" "$newsub" |
+               git commit-tree "$tree" -p "$old" || exit $?
        else
                squash_msg "$dir" "" "$newsub" |
-                       git commit-tree "$tree" || exit $?
+               git commit-tree "$tree" || exit $?
        fi
 }
 
-copy_or_skip()
-{
+copy_or_skip () {
        rev="$1"
        tree="$2"
        newparents="$3"
-       assert [ -n "$tree" ]
+       assert test -n "$tree"
 
        identical=
        nonidentical=
        p=
        gotparents=
-       for parent in $newparents; do
+       for parent in $newparents
+       do
                ptree=$(toptree_for_commit $parent) || exit $?
-               [ -z "$ptree" ] && continue
-               if [ "$ptree" = "$tree" ]; then
+               test -z "$ptree" && continue
+               if test "$ptree" = "$tree"
+               then
                        # an identical parent could be used in place of this rev.
                        identical="$parent"
                else
                        nonidentical="$parent"
                fi
-               
+
                # sometimes both old parents map to the same newparent;
                # eliminate duplicates
                is_new=1
-               for gp in $gotparents; do
-                       if [ "$gp" = "$parent" ]; then
+               for gp in $gotparents
+               do
+                       if test "$gp" = "$parent"
+                       then
                                is_new=
                                break
                        fi
                done
-               if [ -n "$is_new" ]; then
+               if test -n "$is_new"
+               then
                        gotparents="$gotparents $parent"
                        p="$p -p $parent"
                fi
        done
 
        copycommit=
-       if [ -n "$identical" ] && [ -n "$nonidentical" ]; then
+       if test -n "$identical" && test -n "$nonidentical"
+       then
                extras=$(git rev-list --count $identical..$nonidentical)
-               if [ "$extras" -ne 0 ]; then
+               if test "$extras" -ne 0
+               then
                        # we need to preserve history along the other branch
                        copycommit=1
                fi
        fi
-       if [ -n "$identical" ] && [ -z "$copycommit" ]; then
+       if test -n "$identical" && test -z "$copycommit"
+       then
                echo $identical
        else
-               copy_commit $rev $tree "$p" || exit $?
+               copy_commit "$rev" "$tree" "$p" || exit $?
        fi
 }
 
-ensure_clean()
-{
-       if ! git diff-index HEAD --exit-code --quiet 2>&1; then
+ensure_clean () {
+       if ! git diff-index HEAD --exit-code --quiet 2>&1
+       then
                die "Working tree has modifications.  Cannot add."
        fi
-       if ! git diff-index --cached HEAD --exit-code --quiet 2>&1; then
+       if ! git diff-index --cached HEAD --exit-code --quiet 2>&1
+       then
                die "Index has modifications.  Cannot add."
        fi
 }
 
-ensure_valid_ref_format()
-{
+ensure_valid_ref_format () {
        git check-ref-format "refs/heads/$1" ||
-           die "'$1' does not look like a ref"
+               die "'$1' does not look like a ref"
 }
 
-cmd_add()
-{
-       if [ -e "$dir" ]; then
+cmd_add () {
+       if test -e "$dir"
+       then
                die "'$dir' already exists.  Cannot add."
        fi
 
        ensure_clean
-       
-       if [ $# -eq 1 ]; then
-           git rev-parse -q --verify "$1^{commit}" >/dev/null ||
-           die "'$1' does not refer to a commit"
-
-           "cmd_add_commit" "$@"
-       elif [ $# -eq 2 ]; then
-           # Technically we could accept a refspec here but we're
-           # just going to turn around and add FETCH_HEAD under the
-           # specified directory.  Allowing a refspec might be
-           # misleading because we won't do anything with any other
-           # branches fetched via the refspec.
-           ensure_valid_ref_format "$2"
-
-           "cmd_add_repository" "$@"
+
+       if test $# -eq 1
+       then
+               git rev-parse -q --verify "$1^{commit}" >/dev/null ||
+                       die "'$1' does not refer to a commit"
+
+               cmd_add_commit "$@"
+
+       elif test $# -eq 2
+       then
+               # Technically we could accept a refspec here but we're
+               # just going to turn around and add FETCH_HEAD under the
+               # specified directory.  Allowing a refspec might be
+               # misleading because we won't do anything with any other
+               # branches fetched via the refspec.
+               ensure_valid_ref_format "$2"
+
+               cmd_add_repository "$@"
        else
-           say "error: parameters were '$@'"
-           die "Provide either a commit or a repository and commit."
+               say "error: parameters were '$@'"
+               die "Provide either a commit or a repository and commit."
        fi
 }
 
-cmd_add_repository()
-{
+cmd_add_repository () {
        echo "git fetch" "$@"
        repository=$1
        refspec=$2
@@ -556,60 +639,63 @@ cmd_add_repository()
        cmd_add_commit "$@"
 }
 
-cmd_add_commit()
-{
+cmd_add_commit () {
        revs=$(git rev-parse $default --revs-only "$@") || exit $?
        set -- $revs
        rev="$1"
-       
+
        debug "Adding $dir as '$rev'..."
        git read-tree --prefix="$dir" $rev || exit $?
        git checkout -- "$dir" || exit $?
        tree=$(git write-tree) || exit $?
-       
+
        headrev=$(git rev-parse HEAD) || exit $?
-       if [ -n "$headrev" -a "$headrev" != "$rev" ]; then
+       if test -n "$headrev" && test "$headrev" != "$rev"
+       then
                headp="-p $headrev"
        else
                headp=
        fi
-       
-       if [ -n "$squash" ]; then
+
+       if test -n "$squash"
+       then
                rev=$(new_squash_commit "" "" "$rev") || exit $?
                commit=$(add_squashed_msg "$rev" "$dir" |
-                        git commit-tree $tree $headp -p "$rev") || exit $?
+                       git commit-tree "$tree" $headp -p "$rev") || exit $?
        else
                revp=$(peel_committish "$rev") &&
-               commit=$(add_msg "$dir" "$headrev" "$rev" |
-                        git commit-tree $tree $headp -p "$revp") || exit $?
+               commit=$(add_msg "$dir" $headrev "$rev" |
+                       git commit-tree "$tree" $headp -p "$revp") || exit $?
        fi
        git reset "$commit" || exit $?
-       
+
        say "Added dir '$dir'"
 }
 
-cmd_split()
-{
+cmd_split () {
        debug "Splitting $dir..."
        cache_setup || exit $?
-       
-       if [ -n "$onto" ]; then
+
+       if test -n "$onto"
+       then
                debug "Reading history for --onto=$onto..."
                git rev-list $onto |
-               while read rev; do
+               while read rev
+               do
                        # the 'onto' history is already just the subdir, so
                        # any parent we find there can be used verbatim
                        debug "  cache: $rev"
-                       cache_set $rev $rev
+                       cache_set "$rev" "$rev"
                done
        fi
-       
-       if [ -n "$ignore_joins" ]; then
+
+       if test -n "$ignore_joins"
+       then
                unrevs=
        else
                unrevs="$(find_existing_splits "$dir" "$revs")"
        fi
-       
+
        # We can't restrict rev-list to only $dir here, because some of our
        # parents have the $dir contents the root, and those won't match.
        # (and rev-list --follow doesn't seem to solve this)
@@ -618,12 +704,14 @@ cmd_split()
        revcount=0
        createcount=0
        eval "$grl" |
-       while read rev parents; do
+       while read rev parents
+       do
                revcount=$(($revcount + 1))
                progress "$revcount/$revmax ($createcount)"
                debug "Processing commit: $rev"
-               exists=$(cache_get $rev)
-               if [ -n "$exists" ]; then
+               exists=$(cache_get "$rev")
+               if test -n "$exists"
+               then
                        debug "  prior: $exists"
                        continue
                fi
@@ -631,76 +719,89 @@ cmd_split()
                debug "  parents: $parents"
                newparents=$(cache_get $parents)
                debug "  newparents: $newparents"
-               
-               tree=$(subtree_for_commit $rev "$dir")
+
+               tree=$(subtree_for_commit "$rev" "$dir")
                debug "  tree is: $tree"
 
                check_parents $parents
-               
+
                # ugly.  is there no better way to tell if this is a subtree
                # vs. a mainline commit?  Does it matter?
-               if [ -z $tree ]; then
-                       set_notree $rev
-                       if [ -n "$newparents" ]; then
-                               cache_set $rev $rev
+               if test -z "$tree"
+               then
+                       set_notree "$rev"
+                       if test -n "$newparents"
+                       then
+                               cache_set "$rev" "$rev"
                        fi
                        continue
                fi
 
                newrev=$(copy_or_skip "$rev" "$tree" "$newparents") || exit $?
                debug "  newrev is: $newrev"
-               cache_set $rev $newrev
-               cache_set latest_new $newrev
-               cache_set latest_old $rev
+               cache_set "$rev" "$newrev"
+               cache_set latest_new "$newrev"
+               cache_set latest_old "$rev"
        done || exit $?
+
        latest_new=$(cache_get latest_new)
-       if [ -z "$latest_new" ]; then
+       if test -z "$latest_new"
+       then
                die "No new revisions were found"
        fi
-       
-       if [ -n "$rejoin" ]; then
+
+       if test -n "$rejoin"
+       then
                debug "Merging split branch into HEAD..."
                latest_old=$(cache_get latest_old)
                git merge -s ours \
-                       -m "$(rejoin_msg "$dir" $latest_old $latest_new)" \
-                       $latest_new >&2 || exit $?
-       fi
-       if [ -n "$branch" ]; then
-               if rev_exists "refs/heads/$branch"; then
-                       if ! rev_is_descendant_of_branch $latest_new $branch; then
+                       --allow-unrelated-histories \
+                       -m "$(rejoin_msg "$dir" "$latest_old" "$latest_new")" \
+                       "$latest_new" >&2 || exit $?
+       fi
+       if test -n "$branch"
+       then
+               if rev_exists "refs/heads/$branch"
+               then
+                       if ! rev_is_descendant_of_branch "$latest_new" "$branch"
+                       then
                                die "Branch '$branch' is not an ancestor of commit '$latest_new'."
                        fi
                        action='Updated'
                else
                        action='Created'
                fi
-               git update-ref -m 'subtree split' "refs/heads/$branch" $latest_new || exit $?
+               git update-ref -m 'subtree split' \
+                       "refs/heads/$branch" "$latest_new" || exit $?
                say "$action branch '$branch'"
        fi
-       echo $latest_new
+       echo "$latest_new"
        exit 0
 }
 
-cmd_merge()
-{
+cmd_merge () {
        revs=$(git rev-parse $default --revs-only "$@") || exit $?
        ensure_clean
-       
+
        set -- $revs
-       if [ $# -ne 1 ]; then
+       if test $# -ne 1
+       then
                die "You must provide exactly one revision.  Got: '$revs'"
        fi
        rev="$1"
-       
-       if [ -n "$squash" ]; then
+
+       if test -n "$squash"
+       then
                first_split="$(find_latest_squash "$dir")"
-               if [ -z "$first_split" ]; then
+               if test -z "$first_split"
+               then
                        die "Can't squash-merge: '$dir' was never added."
                fi
                set $first_split
                old=$1
                sub=$2
-               if [ "$sub" = "$rev" ]; then
+               if test "$sub" = "$rev"
+               then
                        say "Subtree is already at commit $rev."
                        exit 0
                fi
@@ -710,25 +811,29 @@ cmd_merge()
        fi
 
        version=$(git version)
-       if [ "$version" \< "git version 1.7" ]; then
-               if [ -n "$message" ]; then
-                       git merge -s subtree --message="$message" $rev
+       if test "$version" \< "git version 1.7"
+       then
+               if test -n "$message"
+               then
+                       git merge -s subtree --message="$message" "$rev"
                else
-                       git merge -s subtree $rev
+                       git merge -s subtree "$rev"
                fi
        else
-               if [ -n "$message" ]; then
-                       git merge -Xsubtree="$prefix" --message="$message" $rev
+               if test -n "$message"
+               then
+                       git merge -Xsubtree="$prefix" \
+                               --message="$message" "$rev"
                else
                        git merge -Xsubtree="$prefix" $rev
                fi
        fi
 }
 
-cmd_pull()
-{
-       if [ $# -ne 2 ]; then
-           die "You must provide <repository> <ref>"
+cmd_pull () {
+       if test $# -ne 2
+       then
+               die "You must provide <repository> <ref>"
        fi
        ensure_clean
        ensure_valid_ref_format "$2"
@@ -738,20 +843,21 @@ cmd_pull()
        cmd_merge "$@"
 }
 
-cmd_push()
-{
-       if [ $# -ne 2 ]; then
-           die "You must provide <repository> <ref>"
+cmd_push () {
+       if test $# -ne 2
+       then
+               die "You must provide <repository> <ref>"
        fi
        ensure_valid_ref_format "$2"
-       if [ -e "$dir" ]; then
-           repository=$1
-           refspec=$2
-           echo "git push using: " $repository $refspec
-           localrev=$(git subtree split --prefix="$prefix") || die
-           git push "$repository" $localrev:refs/heads/$refspec
+       if test -e "$dir"
+       then
+               repository=$1
+               refspec=$2
+               echo "git push using: " "$repository" "$refspec"
+               localrev=$(git subtree split --prefix="$prefix") || die
+               git push "$repository" "$localrev":"refs/heads/$refspec"
        else
-           die "'$dir' must already exist. Try 'git subtree add'."
+               die "'$dir' must already exist. Try 'git subtree add'."
        fi
 }
 
index 3bf96a9bb6b29757736d8f4250fae25664e298f0..3c87ebaf57baede9810c3b9b489eed9751189706 100755 (executable)
@@ -16,16 +16,16 @@ export TEST_DIRECTORY
 
 subtree_test_create_repo()
 {
-       test_create_repo "$1"
+       test_create_repo "$1" &&
        (
-               cd $1
+               cd "$1" &&
                git config log.date relative
        )
 }
 
 create()
 {
-       echo "$1" >"$1"
+       echo "$1" >"$1" &&
        git add "$1"
 }
 
@@ -71,12 +71,12 @@ join_commits()
 }
 
 test_create_commit() (
-       repo=$1
-       commit=$2
-       cd "$repo"
-       mkdir -p $(dirname "$commit") \
+       repo=$1 &&
+       commit=$2 &&
+       cd "$repo" &&
+       mkdir -p "$(dirname "$commit")" \
        || error "Could not create directory for commit"
-       echo "$commit" >"$commit"
+       echo "$commit" >"$commit" &&
        git add "$commit" || error "Could not add commit"
        git commit -m "$commit" || error "Could not commit"
 )
@@ -346,6 +346,22 @@ test_expect_success 'split sub dir/ with --rejoin' '
        )
  '
 
+next_test
+test_expect_success 'split sub dir/ with --rejoin from scratch' '
+       subtree_test_create_repo "$subtree_test_count" &&
+       test_create_commit "$subtree_test_count" main1 &&
+       (
+               cd "$subtree_test_count" &&
+               mkdir "sub dir" &&
+               echo file >"sub dir"/file &&
+               git add "sub dir/file" &&
+               git commit -m"sub dir file" &&
+               split_hash=$(git subtree split --prefix="sub dir" --rejoin) &&
+               git subtree split --prefix="sub dir" --rejoin &&
+               check_equal "$(last_commit_message)" "Split '\''sub dir/'\'' into commit '\''$split_hash'\''"
+       )
+ '
+
 next_test
 test_expect_success 'split sub dir/ with --rejoin and --message' '
        subtree_test_create_repo "$subtree_test_count" &&
@@ -932,7 +948,7 @@ test_expect_success 'split a new subtree without --onto option' '
 
                # also test that we still can split out an entirely new subtree
                # if the parent of the first commit in the tree is not empty,
-               # then the new subtree has accidently been attached to something
+               # then the new subtree has accidentally been attached to something
                git subtree split --prefix="sub dir2" --branch subproj2-br &&
                check_equal "$(git log --pretty=format:%P -1 subproj2-br)" ""
        )
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
index f524b8d7f4daf70a610a1e00af2ae6f1c23f8f62..4e17e45ed265b3f4861d1b7a1e86edaa4df3b1ac 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.
@@ -176,7 +177,9 @@ static enum eol output_eol(enum crlf_action crlf_action)
                return EOL_LF;
        case CRLF_UNDEFINED:
        case CRLF_AUTO_CRLF:
+               return EOL_CRLF;
        case CRLF_AUTO_INPUT:
+               return EOL_LF;
        case CRLF_TEXT:
        case CRLF_AUTO:
                /* fall through */
@@ -187,33 +190,29 @@ static enum eol output_eol(enum crlf_action crlf_action)
 }
 
 static void check_safe_crlf(const char *path, enum crlf_action crlf_action,
-                            struct text_stat *stats, enum safe_crlf checksafe)
+                           struct text_stat *old_stats, struct text_stat *new_stats,
+                           enum safe_crlf checksafe)
 {
-       if (!checksafe)
-               return;
-
-       if (output_eol(crlf_action) == EOL_LF) {
+       if (old_stats->crlf && !new_stats->crlf ) {
                /*
-                * CRLFs would not be restored by checkout:
-                * check if we'd remove CRLFs
+                * CRLFs would not be restored by checkout
                 */
-               if (stats->crlf) {
-                       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);
-                       else /* i.e. SAFE_CRLF_FAIL */
-                               die("CRLF would be replaced by LF in %s.", path);
-               }
-       } else if (output_eol(crlf_action) == EOL_CRLF) {
+               if (checksafe == SAFE_CRLF_WARN)
+                       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);
+       } else if (old_stats->lonelf && !new_stats->lonelf ) {
                /*
-                * CRLFs would be added by checkout:
-                * check if we have "naked" LFs
+                * CRLFs would be added by checkout
                 */
-               if (stats->lonelf) {
-                       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);
-                       else /* i.e. SAFE_CRLF_FAIL */
-                               die("LF would be replaced by CRLF in %s", path);
-               }
+               if (checksafe == SAFE_CRLF_WARN)
+                       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);
        }
 }
 
@@ -231,12 +230,35 @@ static int has_cr_in_index(const char *path)
        return has_cr;
 }
 
+static int will_convert_lf_to_crlf(size_t len, struct text_stat *stats,
+                                  enum crlf_action crlf_action)
+{
+       if (output_eol(crlf_action) != EOL_CRLF)
+               return 0;
+       /* No "naked" LF? Nothing to convert, regardless. */
+       if (!stats->lonelf)
+               return 0;
+
+       if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
+               /* If we have any CR or CRLF line endings, we do not touch it */
+               /* This is the new safer autocrlf-handling */
+               if (stats->lonecr || stats->crlf)
+                       return 0;
+
+               if (convert_is_binary(len, stats))
+                       return 0;
+       }
+       return 1;
+
+}
+
 static int crlf_to_git(const char *path, const char *src, size_t len,
                       struct strbuf *buf,
                       enum crlf_action crlf_action, enum safe_crlf checksafe)
 {
        struct text_stat stats;
        char *dst;
+       int convert_crlf_into_lf;
 
        if (crlf_action == CRLF_BINARY ||
            (src && !len))
@@ -250,25 +272,38 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
                return 1;
 
        gather_stats(src, len, &stats);
+       /* Optimization: No CRLF? Nothing to convert, regardless. */
+       convert_crlf_into_lf = !!stats.crlf;
 
        if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
                if (convert_is_binary(len, &stats))
                        return 0;
-
-               if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
-                       /*
-                        * If the file in the index has any CR in it, do not convert.
-                        * This is the new safer autocrlf handling.
-                        */
-                       if (has_cr_in_index(path))
-                               return 0;
+               /*
+                * 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) && has_cr_in_index(path))
+                       convert_crlf_into_lf = 0;
+       }
+       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" */
+               if (convert_crlf_into_lf) {
+                       new_stats.lonelf += new_stats.crlf;
+                       new_stats.crlf = 0;
+               }
+               /* simulate "git checkout" */
+               if (will_convert_lf_to_crlf(len, &new_stats, crlf_action)) {
+                       new_stats.crlf += new_stats.lonelf;
+                       new_stats.lonelf = 0;
                }
+               check_safe_crlf(path, crlf_action, &stats, &new_stats, checksafe);
        }
-
-       check_safe_crlf(path, crlf_action, &stats, checksafe);
-
-       /* Optimization: No CRLF? Nothing to convert, regardless. */
-       if (!stats.crlf)
+       if (!convert_crlf_into_lf)
                return 0;
 
        /*
@@ -314,23 +349,9 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len,
                return 0;
 
        gather_stats(src, len, &stats);
-
-       /* No "naked" LF? Nothing to convert, regardless. */
-       if (!stats.lonelf)
+       if (!will_convert_lf_to_crlf(len, &stats, crlf_action))
                return 0;
 
-       if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
-               if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
-                       /* If we have any CR or CRLF line endings, we do not touch it */
-                       /* This is the new safer autocrlf-handling */
-                       if (stats.lonecr || stats.crlf )
-                               return 0;
-               }
-
-               if (convert_is_binary(len, &stats))
-                       return 0;
-       }
-
        /* are we "faking" in place editing ? */
        if (src == buf->buf)
                to_free = strbuf_detach(buf, NULL);
@@ -397,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);
 
@@ -415,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)
 {
        /*
@@ -436,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;
@@ -462,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 {
@@ -486,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;
@@ -526,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;
@@ -786,7 +1111,11 @@ static void convert_attrs(struct conv_attrs *ca, const char *path)
                ca->drv = git_path_check_convert(ccheck + 2);
                if (ca->crlf_action != CRLF_BINARY) {
                        enum eol eol_attr = git_path_check_eol(ccheck + 3);
-                       if (eol_attr == EOL_LF)
+                       if (ca->crlf_action == CRLF_AUTO && eol_attr == EOL_LF)
+                               ca->crlf_action = CRLF_AUTO_INPUT;
+                       else if (ca->crlf_action == CRLF_AUTO && eol_attr == EOL_CRLF)
+                               ca->crlf_action = CRLF_AUTO_CRLF;
+                       else if (eol_attr == EOL_LF)
                                ca->crlf_action = CRLF_TEXT_INPUT;
                        else if (eol_attr == EOL_CRLF)
                                ca->crlf_action = CRLF_TEXT_CRLF;
@@ -823,7 +1152,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)
@@ -845,9 +1174,9 @@ const char *get_convert_attr_ascii(const char *path)
        case CRLF_AUTO:
                return "text=auto";
        case CRLF_AUTO_CRLF:
-               return "text=auto eol=crlf"; /* This is not supported yet */
+               return "text=auto eol=crlf";
        case CRLF_AUTO_INPUT:
-               return "text=auto eol=lf"; /* This is not supported yet */
+               return "text=auto eol=lf";
        }
        return "";
 }
@@ -856,18 +1185,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) {
@@ -889,9 +1212,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);
@@ -903,15 +1226,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) {
@@ -920,9 +1237,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;
@@ -930,8 +1248,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;
@@ -949,7 +1267,7 @@ int renormalize_buffer(const char *path, const char *src, size_t len, struct str
                src = dst->buf;
                len = dst->len;
        }
-       return ret | convert_to_git(path, src, len, dst, SAFE_CRLF_FALSE);
+       return ret | convert_to_git(path, src, len, dst, SAFE_CRLF_RENORMALIZE);
 }
 
 /*****************************************************************
@@ -1380,27 +1698,22 @@ static struct stream_filter *ident_filter(const unsigned char *sha1)
 struct stream_filter *get_stream_filter(const char *path, const unsigned char *sha1)
 {
        struct conv_attrs ca;
-       enum crlf_action crlf_action;
        struct stream_filter *filter = NULL;
 
        convert_attrs(&ca, path);
+       if (ca.drv && (ca.drv->process || ca.drv->smudge || ca.drv->clean))
+               return NULL;
 
-       if (ca.drv && (ca.drv->smudge || ca.drv->clean))
-               return filter;
+       if (ca.crlf_action == CRLF_AUTO || ca.crlf_action == CRLF_AUTO_CRLF)
+               return NULL;
 
        if (ca.ident)
                filter = ident_filter(sha1);
 
-       crlf_action = ca.crlf_action;
-
-       if ((crlf_action == CRLF_BINARY) ||
-                       crlf_action == CRLF_AUTO_INPUT ||
-                       (crlf_action == CRLF_TEXT_INPUT))
-               filter = cascade_filter(filter, &null_filter_singleton);
-
-       else if (output_eol(crlf_action) == EOL_CRLF &&
-                !(crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_CRLF))
+       if (output_eol(ca.crlf_action) == EOL_CRLF)
                filter = cascade_filter(filter, lf_to_crlf_filter());
+       else
+               filter = cascade_filter(filter, &null_filter_singleton);
 
        return filter;
 }
index ccf436bfbf2a89ceb7003ea6dbebf6ae2b6f4a8c..82871a11d5fb45133096b26ad46c6c0f65797926 100644 (file)
--- a/convert.h
+++ b/convert.h
@@ -7,7 +7,8 @@
 enum safe_crlf {
        SAFE_CRLF_FALSE = 0,
        SAFE_CRLF_FAIL = 1,
-       SAFE_CRLF_WARN = 2
+       SAFE_CRLF_WARN = 2,
+       SAFE_CRLF_RENORMALIZE = 3
 };
 
 extern enum safe_crlf safe_crlf;
diff --git a/copy.c b/copy.c
index 574fa1f09dadc2e9cc9a39702bafb352f71a56c4..4de6a110f0912d81def3f2dd4ffd6ddc9bc30d2f 100644 (file)
--- a/copy.c
+++ b/copy.c
@@ -42,15 +42,15 @@ int copy_file(const char *dst, const char *src, int mode)
        status = copy_fd(fdi, fdo);
        switch (status) {
        case COPY_READ_ERROR:
-               error("copy-fd: read returned %s", strerror(errno));
+               error_errno("copy-fd: read returned");
                break;
        case COPY_WRITE_ERROR:
-               error("copy-fd: write returned %s", strerror(errno));
+               error_errno("copy-fd: write returned");
                break;
        }
        close(fdi);
        if (close(fdo) != 0)
-               return error("%s: close error: %s", dst, strerror(errno));
+               return error_errno("%s: close error", dst);
 
        if (!status && adjust_shared_perm(dst))
                return -1;
index caef21e4fc91898f209709f723de1df5afc66a66..46c5937526a53c3563ea47bfba8195bcf9352c35 100644 (file)
@@ -126,8 +126,17 @@ static void serve_one_client(FILE *in, FILE *out)
                        fprintf(out, "password=%s\n", e->item.password);
                }
        }
-       else if (!strcmp(action.buf, "exit"))
+       else if (!strcmp(action.buf, "exit")) {
+               /*
+                * It's important that we clean up our socket first, and then
+                * signal the client only once we have finished the cleanup.
+                * Calling exit() directly does this, because we clean up in
+                * our atexit() handler, and then signal the client when our
+                * process actually ends, which closes the socket and gives
+                * them EOF.
+                */
                exit(0);
+       }
        else if (!strcmp(action.buf, "erase"))
                remove_credential(&c);
        else if (!strcmp(action.buf, "store")) {
@@ -170,12 +179,12 @@ static int serve_cache_loop(int fd)
 
                client = accept(fd, NULL, NULL);
                if (client < 0) {
-                       warning("accept failed: %s", strerror(errno));
+                       warning_errno("accept failed");
                        return 1;
                }
                client2 = dup(client);
                if (client2 < 0) {
-                       warning("dup failed: %s", strerror(errno));
+                       warning_errno("dup failed");
                        close(client);
                        return 1;
                }
@@ -210,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;
@@ -223,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,
@@ -248,7 +257,7 @@ static void init_socket_directory(const char *path)
        free(path_copy);
 }
 
-int main(int argc, const char **argv)
+int cmd_main(int argc, const char **argv)
 {
        const char *socket_path;
        int ignore_sighup = 0;
index f4afdc6988c32cd95769dee488f8495b8a6ce5b6..cc8a6ee19214b12758fc3d4b39ff4a07f4442d91 100644 (file)
@@ -32,6 +32,7 @@ static int send_request(const char *socket, const struct strbuf *out)
                write_or_die(1, in, r);
                got_data = 1;
        }
+       close(fd);
        return got_data;
 }
 
@@ -82,7 +83,7 @@ static void do_cache(const char *socket, const char *action, int timeout,
        strbuf_release(&buf);
 }
 
-int main(int argc, const char **argv)
+int cmd_main(int argc, const char **argv)
 {
        char *socket_path = NULL;
        int timeout = 900;
index 57141679abdaa804282a0cc2d808e7c6687d924a..55ca1b1334319924dcbbf69ec39b2335e6a452aa 100644 (file)
@@ -142,7 +142,7 @@ static void lookup_credential(const struct string_list *fns, struct credential *
                        return; /* Found credential */
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        const char * const usage[] = {
                "git credential-store [<options>] <action>",
index 7d6501d190a529933d501e7f7006a70c4897282b..aa996669fc40021e0c8cb01fa8021da7064e2781 100644 (file)
@@ -63,9 +63,12 @@ static int credential_config_callback(const char *var, const char *value,
                key = dot + 1;
        }
 
-       if (!strcmp(key, "helper"))
-               string_list_append(&c->helpers, value);
-       else if (!strcmp(key, "username")) {
+       if (!strcmp(key, "helper")) {
+               if (*value)
+                       string_list_append(&c->helpers, value);
+               else
+                       string_list_clear(&c->helpers, 0);
+       } else if (!strcmp(key, "username")) {
                if (!c->username)
                        c->username = xstrdup(value);
        }
index 8d45c336f5f816768962c39e8af6b10e0bb0e21e..473e6b6b63c42e59d5a89985b2573ab5c2815157 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -1,6 +1,5 @@
 #include "cache.h"
 #include "pkt-line.h"
-#include "exec_cmd.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "string-list.h"
@@ -32,7 +31,7 @@ static const char daemon_usage[] =
 "           [<directory>...]";
 
 /* List of acceptable pathname prefixes */
-static char **ok_paths;
+static const char **ok_paths;
 static int strict_paths;
 
 /* If this is set, git-daemon-export-ok is not required */
@@ -161,6 +160,7 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
 {
        static char rpath[PATH_MAX];
        static char interp_path[PATH_MAX];
+       size_t rlen;
        const char *path;
        const char *dir;
 
@@ -188,8 +188,12 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
                        namlen = slash - dir;
                        restlen -= namlen;
                        loginfo("userpath <%s>, request <%s>, namlen %d, restlen %d, slash <%s>", user_path, dir, namlen, restlen, slash);
-                       snprintf(rpath, PATH_MAX, "%.*s/%s%.*s",
-                                namlen, dir, user_path, restlen, slash);
+                       rlen = snprintf(rpath, sizeof(rpath), "%.*s/%s%.*s",
+                                       namlen, dir, user_path, restlen, slash);
+                       if (rlen >= sizeof(rpath)) {
+                               logerror("user-path too large: %s", rpath);
+                               return NULL;
+                       }
                        dir = rpath;
                }
        }
@@ -208,7 +212,15 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
 
                strbuf_expand(&expanded_path, interpolated_path,
                              expand_path, &context);
-               strlcpy(interp_path, expanded_path.buf, PATH_MAX);
+
+               rlen = strlcpy(interp_path, expanded_path.buf,
+                              sizeof(interp_path));
+               if (rlen >= sizeof(interp_path)) {
+                       logerror("interpolated path too large: %s",
+                                interp_path);
+                       return NULL;
+               }
+
                strbuf_release(&expanded_path);
                loginfo("Interpolated dir '%s'", interp_path);
 
@@ -220,7 +232,11 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
                        logerror("'%s': Non-absolute path denied (base-path active)", dir);
                        return NULL;
                }
-               snprintf(rpath, PATH_MAX, "%s%s", base_path, dir);
+               rlen = snprintf(rpath, sizeof(rpath), "%s%s", base_path, dir);
+               if (rlen >= sizeof(rpath)) {
+                       logerror("base-path too large: %s", rpath);
+                       return NULL;
+               }
                dir = rpath;
        }
 
@@ -240,7 +256,7 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
        }
 
        if ( ok_paths && *ok_paths ) {
-               char **pp;
+               const char **pp;
                int pathlen = strlen(path);
 
                /* The validation is done on the paths after enter_repo
@@ -282,7 +298,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;
 }
 
@@ -669,6 +685,17 @@ static void hostinfo_clear(struct hostinfo *hi)
        strbuf_release(&hi->tcp_port);
 }
 
+static void set_keep_alive(int sockfd)
+{
+       int ka = 1;
+
+       if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &ka, sizeof(ka)) < 0) {
+               if (errno != ENOTSOCK)
+                       logerror("unable to set SO_KEEPALIVE on socket: %s",
+                               strerror(errno));
+       }
+}
+
 static int execute(void)
 {
        char *line = packet_buffer;
@@ -681,6 +708,7 @@ static int execute(void)
        if (addr)
                loginfo("Connection from %s:%s", addr, port);
 
+       set_keep_alive(0);
        alarm(init_timeout ? init_timeout : timeout);
        pktlen = packet_read(0, NULL, NULL, packet_buffer, sizeof(packet_buffer), 0);
        alarm(0);
@@ -951,6 +979,8 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
                        continue;
                }
 
+               set_keep_alive(sockfd);
+
                if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
                        logerror("Could not bind to %s: %s",
                                 ip2str(ai->ai_family, ai->ai_addr, ai->ai_addrlen),
@@ -1010,6 +1040,8 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
                return 0;
        }
 
+       set_keep_alive(sockfd);
+
        if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
                logerror("Could not bind to %s: %s",
                         ip2str(AF_INET, (struct sockaddr *)&sin, sizeof(sin)),
@@ -1178,7 +1210,7 @@ static int serve(struct string_list *listen_addr, int listen_port,
        return service_loop(&socklist);
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        int listen_port = 0;
        struct string_list listen_addr = STRING_LIST_INIT_NODUP;
@@ -1188,12 +1220,8 @@ int main(int argc, char **argv)
        struct credentials *cred = NULL;
        int i;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
-
        for (i = 1; i < argc; i++) {
-               char *arg = argv[i];
+               const char *arg = argv[i];
                const char *v;
 
                if (skip_prefix(arg, "--listen=", &v)) {
@@ -1367,8 +1395,7 @@ int main(int argc, char **argv)
        if (detach) {
                if (daemonize())
                        die("--detach not supported on this platform");
-       } else
-               sanitize_stdfds();
+       }
 
        if (pid_file)
                write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid());
diff --git a/date.c b/date.c
index 7c9f76998ac7a00fb5f8781dd8e460f899edbfac..a996331f5b33703c9f70844c6b49453ec39d16a7 100644 (file)
--- a/date.c
+++ b/date.c
@@ -74,6 +74,8 @@ static int local_tzoffset(unsigned long time)
        localtime_r(&t, &tm);
        t_local = tm_to_time_t(&tm);
 
+       if (t_local == -1)
+               return 0; /* error; just use +0000 */
        if (t_local < t) {
                eastwest = -1;
                offset = t - t_local;
@@ -175,6 +177,12 @@ const char *show_date(unsigned long time, int tz, const struct date_mode *mode)
        struct tm *tm;
        static struct strbuf timebuf = STRBUF_INIT;
 
+       if (mode->type == DATE_UNIX) {
+               strbuf_reset(&timebuf);
+               strbuf_addf(&timebuf, "%lu", time);
+               return timebuf.buf;
+       }
+
        if (mode->local)
                tz = local_tzoffset(time);
 
@@ -790,6 +798,8 @@ static enum date_mode_type parse_date_type(const char *format, const char **end)
                return DATE_NORMAL;
        if (skip_prefix(format, "raw", end))
                return DATE_RAW;
+       if (skip_prefix(format, "unix", end))
+               return DATE_UNIX;
        if (skip_prefix(format, "format", end))
                return DATE_STRFTIME;
 
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 03daadb25af835a695c7d0baf466b0e1f82b58c4..f420786039d387d3a943d510c802ecd90c3ddf28 100644 (file)
@@ -65,8 +65,7 @@ static int populate_from_stdin(struct diff_filespec *s)
        size_t size = 0;
 
        if (strbuf_read(&buf, 0, 0) < 0)
-               return error("error while reading from stdin %s",
-                                    strerror(errno));
+               return error_errno("error while reading from stdin");
 
        s->should_munmap = 0;
        s->data = strbuf_detach(&buf, &size);
@@ -282,6 +281,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 059123c5dcef4129763895b0f2ad5a54728b0c07..84dba60c405b588ed794a2539ce3cddaa1fbaf8b 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
@@ -26,6 +27,8 @@
 #endif
 
 static int diff_detect_rename_default;
+static int diff_indent_heuristic; /* experimental */
+static int diff_compaction_heuristic; /* experimental */
 static int diff_rename_limit_default = 400;
 static int diff_suppress_blank_empty;
 static int diff_use_color_default = -1;
@@ -40,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,
@@ -53,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"))
@@ -130,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;
@@ -162,12 +173,69 @@ 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
  * never be affected by the setting of diff.renames
  * the user happens to have in the configuration file.
  */
+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);
+               if (diff_indent_heuristic)
+                       diff_compaction_heuristic = 0;
+       }
+       if (!strcmp(var, "diff.compactionheuristic")) {
+               diff_compaction_heuristic = git_config_bool(var, value);
+               if (diff_compaction_heuristic)
+                       diff_indent_heuristic = 0;
+       }
+       return 0;
+}
+
 int git_diff_ui_config(const char *var, const char *value, void *cb)
 {
        if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
@@ -224,6 +292,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;
 
@@ -344,7 +423,6 @@ struct emit_callback {
        const char **label_path;
        struct diff_words_data *diff_words;
        struct diff_options *opt;
-       int *found_changesp;
        struct strbuf *header;
 };
 
@@ -712,7 +790,6 @@ static void emit_rewrite_diff(const char *name_a,
 
        memset(&ecbdata, 0, sizeof(ecbdata));
        ecbdata.color_diff = want_color(o->use_color);
-       ecbdata.found_changesp = &o->found_changes;
        ecbdata.ws_rule = whitespace_rule(name_b);
        ecbdata.opt = o;
        if (ecbdata.ws_rule & WS_BLANK_AT_EOF) {
@@ -941,7 +1018,8 @@ static int find_word_boundaries(mmfile_t *buffer, regex_t *word_regex,
 {
        if (word_regex && *begin < buffer->size) {
                regmatch_t match[1];
-               if (!regexec(word_regex, buffer->ptr + *begin, 1, match, 0)) {
+               if (!regexec_buf(word_regex, buffer->ptr + *begin,
+                                buffer->size - *begin, 1, match, 0)) {
                        char *p = memchr(buffer->ptr + *begin + match[0].rm_so,
                                        '\n', match[0].rm_eo - match[0].rm_so);
                        *end = p ? p - buffer->ptr : match[0].rm_eo + *begin;
@@ -1206,12 +1284,13 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
        struct diff_options *o = ecbdata->opt;
        const char *line_prefix = diff_line_prefix(o);
 
+       o->found_changes = 1;
+
        if (ecbdata->header) {
-               fprintf(ecbdata->opt->file, "%s", ecbdata->header->buf);
+               fprintf(o->file, "%s", ecbdata->header->buf);
                strbuf_reset(ecbdata->header);
                ecbdata->header = NULL;
        }
-       *(ecbdata->found_changesp) = 1;
 
        if (ecbdata->label_path[0]) {
                const char *name_a_tab, *name_b_tab;
@@ -1219,9 +1298,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
                name_a_tab = strchr(ecbdata->label_path[0], ' ') ? "\t" : "";
                name_b_tab = strchr(ecbdata->label_path[1], ' ') ? "\t" : "";
 
-               fprintf(ecbdata->opt->file, "%s%s--- %s%s%s\n",
+               fprintf(o->file, "%s%s--- %s%s%s\n",
                        line_prefix, meta, ecbdata->label_path[0], reset, name_a_tab);
-               fprintf(ecbdata->opt->file, "%s%s+++ %s%s%s\n",
+               fprintf(o->file, "%s%s+++ %s%s%s\n",
                        line_prefix, meta, ecbdata->label_path[1], reset, name_b_tab);
                ecbdata->label_path[0] = ecbdata->label_path[1] = NULL;
        }
@@ -1239,15 +1318,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
                find_lno(line, ecbdata);
                emit_hunk_header(ecbdata, line, len);
                if (line[len-1] != '\n')
-                       putc('\n', ecbdata->opt->file);
-               return;
-       }
-
-       if (len < 1) {
-               emit_line(ecbdata->opt, reset, reset, line, len);
-               if (ecbdata->diff_words
-                   && ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN)
-                       fputs("~\n", ecbdata->opt->file);
+                       putc('\n', o->file);
                return;
        }
 
@@ -1272,8 +1343,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
                }
                diff_words_flush(ecbdata);
                if (ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN) {
-                       emit_line(ecbdata->opt, context, reset, line, len);
-                       fputs("~\n", ecbdata->opt->file);
+                       emit_line(o, context, reset, line, len);
+                       fputs("~\n", o->file);
                } else {
                        /*
                         * Skip the prefix character, if any.  With
@@ -1284,7 +1355,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
                              line++;
                              len--;
                        }
-                       emit_line(ecbdata->opt, context, reset, line, len);
+                       emit_line(o, context, reset, line, len);
                }
                return;
        }
@@ -1306,8 +1377,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
        default:
                /* incomplete line at the end */
                ecbdata->lno_in_preimage++;
-               emit_line(ecbdata->opt,
-                         diff_get_color(ecbdata->color_diff, DIFF_CONTEXT),
+               emit_line(o, diff_get_color(ecbdata->color_diff, DIFF_CONTEXT),
                          reset, line, len);
                break;
        }
@@ -1615,7 +1685,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 ?
@@ -1923,8 +1993,8 @@ static void show_dirstat(struct diff_options *options)
 
                name = p->two->path ? p->two->path : p->one->path;
 
-               if (p->one->sha1_valid && p->two->sha1_valid)
-                       content_changed = hashcmp(p->one->sha1, p->two->sha1);
+               if (p->one->oid_valid && p->two->oid_valid)
+                       content_changed = oidcmp(&p->one->oid, &p->two->oid);
                else
                        content_changed = 1;
 
@@ -1953,7 +2023,7 @@ static void show_dirstat(struct diff_options *options)
                if (DIFF_FILE_VALID(p->one) && DIFF_FILE_VALID(p->two)) {
                        diff_populate_filespec(p->one, 0);
                        diff_populate_filespec(p->two, 0);
-                       diffcore_count_changes(p->one, p->two, NULL, NULL, 0,
+                       diffcore_count_changes(p->one, p->two, NULL, NULL,
                                               &copied, &added);
                        diff_free_filespec_data(p->one);
                        diff_free_filespec_data(p->two);
@@ -1996,7 +2066,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);
 }
 
@@ -2040,7 +2110,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);
 }
 
@@ -2289,16 +2359,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->sha1, two->sha1, two->dirty_submodule,
+                               &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)) {
@@ -2306,15 +2397,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;
@@ -2374,7 +2456,7 @@ static void builtin_diff(const char *name_a,
                if (!one->data && !two->data &&
                    S_ISREG(one->mode) && S_ISREG(two->mode) &&
                    !DIFF_OPT_TST(o, BINARY)) {
-                       if (!hashcmp(one->sha1, two->sha1)) {
+                       if (!oidcmp(&one->oid, &two->oid)) {
                                if (must_show_header)
                                        fprintf(o->file, "%s", header.buf);
                                goto free_ab_and_return;
@@ -2427,7 +2509,6 @@ static void builtin_diff(const char *name_a,
                memset(&ecbdata, 0, sizeof(ecbdata));
                ecbdata.label_path = lbl;
                ecbdata.color_diff = want_color(o->use_color);
-               ecbdata.found_changesp = &o->found_changes;
                ecbdata.ws_rule = whitespace_rule(name_b);
                if (ecbdata.ws_rule & WS_BLANK_AT_EOF)
                        check_blank_at_eof(&mf1, &mf2, &ecbdata);
@@ -2495,7 +2576,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
                return;
        }
 
-       same_contents = !hashcmp(one->sha1, two->sha1);
+       same_contents = !oidcmp(&one->oid, &two->oid);
 
        if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) {
                data->is_binary = 1;
@@ -2628,8 +2709,8 @@ void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1,
 {
        if (mode) {
                spec->mode = canon_mode(mode);
-               hashcpy(spec->sha1, sha1);
-               spec->sha1_valid = sha1_valid;
+               hashcpy(spec->oid.hash, sha1);
+               spec->oid_valid = sha1_valid;
        }
 }
 
@@ -2672,6 +2753,13 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
        if (!FAST_WORKING_DIRECTORY && !want_file && has_sha1_pack(sha1))
                return 0;
 
+       /*
+        * Similarly, if we'd have to convert the file contents anyway, that
+        * makes the optimization not worthwhile.
+        */
+       if (!want_file && would_convert_to_git(name))
+               return 0;
+
        len = strlen(name);
        pos = cache_name_pos(name, len);
        if (pos < 0)
@@ -2682,7 +2770,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;
 
        /*
@@ -2711,7 +2799,8 @@ static int diff_populate_gitlink(struct diff_filespec *s, int size_only)
        if (s->dirty_submodule)
                dirty = "-dirty";
 
-       strbuf_addf(&buf, "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty);
+       strbuf_addf(&buf, "Subproject commit %s%s\n",
+                   oid_to_hex(&s->oid), dirty);
        s->size = buf.len;
        if (size_only) {
                s->data = NULL;
@@ -2754,8 +2843,8 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
        if (S_ISGITLINK(s->mode))
                return diff_populate_gitlink(s, size_only);
 
-       if (!s->sha1_valid ||
-           reuse_worktree_file(s->path, s->sha1, 0)) {
+       if (!s->oid_valid ||
+           reuse_worktree_file(s->path, s->oid.hash, 0)) {
                struct strbuf buf = STRBUF_INIT;
                struct stat st;
                int fd;
@@ -2812,9 +2901,10 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
        else {
                enum object_type type;
                if (size_only || (flags & CHECK_BINARY)) {
-                       type = sha1_object_info(s->sha1, &s->size);
+                       type = sha1_object_info(s->oid.hash, &s->size);
                        if (type < 0)
-                               die("unable to read %s", sha1_to_hex(s->sha1));
+                               die("unable to read %s",
+                                   oid_to_hex(&s->oid));
                        if (size_only)
                                return 0;
                        if (s->size > big_file_threshold && s->is_binary == -1) {
@@ -2822,9 +2912,9 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
                                return 0;
                        }
                }
-               s->data = read_sha1_file(s->sha1, &type, &s->size);
+               s->data = read_sha1_file(s->oid.hash, &type, &s->size);
                if (!s->data)
-                       die("unable to read %s", sha1_to_hex(s->sha1));
+                       die("unable to read %s", oid_to_hex(&s->oid));
                s->should_free = 1;
        }
        return 0;
@@ -2853,7 +2943,7 @@ void diff_free_filespec_data(struct diff_filespec *s)
 static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
                           void *blob,
                           unsigned long size,
-                          const unsigned char *sha1,
+                          const struct object_id *oid,
                           int mode)
 {
        int fd;
@@ -2878,7 +2968,7 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
                die_errno("unable to write temp-file");
        close_tempfile(&temp->tempfile);
        temp->name = get_tempfile_path(&temp->tempfile);
-       sha1_to_hex_r(temp->hex, sha1);
+       oid_to_hex_r(temp->hex, oid);
        xsnprintf(temp->mode, sizeof(temp->mode), "%06o", mode);
        strbuf_release(&buf);
        strbuf_release(&template);
@@ -2902,8 +2992,8 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
        }
 
        if (!S_ISGITLINK(one->mode) &&
-           (!one->sha1_valid ||
-            reuse_worktree_file(name, one->sha1, 1))) {
+           (!one->oid_valid ||
+            reuse_worktree_file(name, one->oid.hash, 1))) {
                struct stat st;
                if (lstat(name, &st) < 0) {
                        if (errno == ENOENT)
@@ -2915,19 +3005,19 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
                        if (strbuf_readlink(&sb, name, st.st_size) < 0)
                                die_errno("readlink(%s)", name);
                        prep_temp_blob(name, temp, sb.buf, sb.len,
-                                      (one->sha1_valid ?
-                                       one->sha1 : null_sha1),
-                                      (one->sha1_valid ?
+                                      (one->oid_valid ?
+                                       &one->oid : &null_oid),
+                                      (one->oid_valid ?
                                        one->mode : S_IFLNK));
                        strbuf_release(&sb);
                }
                else {
                        /* we can borrow from the file in the work tree */
                        temp->name = name;
-                       if (!one->sha1_valid)
+                       if (!one->oid_valid)
                                sha1_to_hex_r(temp->hex, null_sha1);
                        else
-                               sha1_to_hex_r(temp->hex, one->sha1);
+                               sha1_to_hex_r(temp->hex, one->oid.hash);
                        /* Even though we may sometimes borrow the
                         * contents from the work tree, we always want
                         * one->mode.  mode is trustworthy even when
@@ -2942,7 +3032,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
                if (diff_populate_filespec(one, 0))
                        die("cannot read data blob for %s", one->path);
                prep_temp_blob(name, temp, one->data, one->size,
-                              one->sha1, one->mode);
+                              &one->oid, one->mode);
        }
        return temp;
 }
@@ -3006,6 +3096,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,
@@ -3055,7 +3161,7 @@ static void fill_metainfo(struct strbuf *msg,
        default:
                *must_show_header = 0;
        }
-       if (one && two && hashcmp(one->sha1, two->sha1)) {
+       if (one && two && oidcmp(&one->oid, &two->oid)) {
                int abbrev = DIFF_OPT_TST(o, FULL_INDEX) ? 40 : DEFAULT_ABBREV;
 
                if (DIFF_OPT_TST(o, BINARY)) {
@@ -3064,9 +3170,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->sha1, abbrev));
-               strbuf_addstr(msg, find_unique_abbrev(two->sha1, 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);
@@ -3121,20 +3227,20 @@ static void run_diff_cmd(const char *pgm,
 static void diff_fill_sha1_info(struct diff_filespec *one)
 {
        if (DIFF_FILE_VALID(one)) {
-               if (!one->sha1_valid) {
+               if (!one->oid_valid) {
                        struct stat st;
                        if (one->is_stdin) {
-                               hashcpy(one->sha1, null_sha1);
+                               oidclr(&one->oid);
                                return;
                        }
                        if (lstat(one->path, &st) < 0)
                                die_errno("stat '%s'", one->path);
-                       if (index_path(one->sha1, one->path, &st, 0))
+                       if (index_path(one->oid.hash, one->path, &st, 0))
                                die("cannot hash %s", one->path);
                }
        }
        else
-               hashclr(one->sha1);
+               oidclr(&one->oid);
 }
 
 static void strip_prefix(int prefix_length, const char **namep, const char **otherp)
@@ -3259,12 +3365,13 @@ 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->ws_error_highlight = ws_error_highlight_default;
        DIFF_OPT_SET(options, RENAME_EMPTY);
 
        /* pathchange left =NULL by default */
@@ -3273,6 +3380,10 @@ 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_indent_heuristic)
+               DIFF_XDL_SET(options, INDENT_HEURISTIC);
+       else if (diff_compaction_heuristic)
+               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
 
        options->orderfile = diff_order_file_cfg;
 
@@ -3300,7 +3411,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"
@@ -3374,7 +3485,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 */
 
        /*
@@ -3496,7 +3607,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;
@@ -3505,7 +3616,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;
@@ -3514,7 +3625,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;
@@ -3523,7 +3634,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;
@@ -3651,40 +3762,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;
@@ -3793,6 +3878,16 @@ 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, "--indent-heuristic")) {
+               DIFF_XDL_SET(options, INDENT_HEURISTIC);
+               DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
+       } else if (!strcmp(arg, "--no-indent-heuristic"))
+               DIFF_XDL_CLR(options, INDENT_HEURISTIC);
+       else if (!strcmp(arg, "--compaction-heuristic")) {
+               DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
+               DIFF_XDL_CLR(options, INDENT_HEURISTIC);
+       } else if (!strcmp(arg, "--no-compaction-heuristic"))
+               DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
        else if (!strcmp(arg, "--patience"))
                options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
        else if (!strcmp(arg, "--histogram"))
@@ -3889,11 +3984,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"))
@@ -3927,6 +4026,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)) {
@@ -3940,6 +4041,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;
@@ -3961,6 +4068,8 @@ int diff_opt_parse(struct diff_options *options,
                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;
                return argcount;
        } else
                return 0;
@@ -4071,27 +4180,46 @@ 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);
-       if (abblen < 37) {
-               static char hex[41];
+
+       /*
+        * In well-behaved cases, where the abbbreviated result is the
+        * same as the requested length, append three dots after the
+        * abbreviation (hence the whole logic is limited to the case
+        * where abblen < 37); when the actual abbreviated result is a
+        * bit longer than the requested length, we reduce the number
+        * of dots so that they match the well-behaved ones.  However,
+        * if the actual abbreviation is longer than the requested
+        * length by more than three, we give up on aligning, and add
+        * three dots anyway, to indicate that the output is not the
+        * full object name.  Yes, this may be suboptimal, but this
+        * appears only in "diff --raw --abbrev" output and it is not
+        * worth the effort to change it now.  Note that this would
+        * likely to work fine when the automatic sizing of default
+        * abbreviation length is used--we would be fed -1 in "len" in
+        * that case, and will end up always appending three-dots, but
+        * the automatic sizing is supposed to give abblen that ensures
+        * uniqueness across all objects (statistically speaking).
+        */
+       if (abblen < GIT_SHA1_HEXSZ - 3) {
+               static char hex[GIT_SHA1_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)
@@ -4102,8 +4230,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->sha1, opt->abbrev));
-               fprintf(opt->file, "%s ", diff_unique_abbrev(p->two->sha1, opt->abbrev));
+                       diff_aligned_abbrev(&p->one->oid, opt->abbrev));
+               fprintf(opt->file, "%s ",
+                       diff_aligned_abbrev(&p->two->oid, opt->abbrev));
        }
        if (p->score) {
                fprintf(opt->file, "%c%03d%c", p->status, similarity_index(p),
@@ -4152,11 +4281,11 @@ int diff_unmodified_pair(struct diff_filepair *p)
        /* both are valid and point at the same path.  that is, we are
         * dealing with a change.
         */
-       if (one->sha1_valid && two->sha1_valid &&
-           !hashcmp(one->sha1, two->sha1) &&
+       if (one->oid_valid && two->oid_valid &&
+           !oidcmp(&one->oid, &two->oid) &&
            !one->dirty_submodule && !two->dirty_submodule)
                return 1; /* no change */
-       if (!one->sha1_valid && !two->sha1_valid)
+       if (!one->oid_valid && !two->oid_valid)
                return 1; /* both look at the same file on the filesystem. */
        return 0;
 }
@@ -4217,7 +4346,7 @@ void diff_debug_filespec(struct diff_filespec *s, int x, const char *one)
                s->path,
                DIFF_FILE_VALID(s) ? "valid" : "invalid",
                s->mode,
-               s->sha1_valid ? sha1_to_hex(s->sha1) : "");
+               s->oid_valid ? oid_to_hex(&s->oid) : "");
        fprintf(stderr, "queue[%d] %s size %lu\n",
                x, one ? one : "",
                s->size);
@@ -4287,11 +4416,11 @@ static void diff_resolve_rename_copy(void)
                        else
                                p->status = DIFF_STATUS_RENAMED;
                }
-               else if (hashcmp(p->one->sha1, p->two->sha1) ||
+               else if (oidcmp(&p->one->oid, &p->two->oid) ||
                         p->one->mode != p->two->mode ||
                         p->one->dirty_submodule ||
                         p->two->dirty_submodule ||
-                        is_null_sha1(p->one->sha1))
+                        is_null_oid(&p->one->oid))
                        p->status = DIFF_STATUS_MODIFIED;
                else {
                        /* This is a "no-change" entry and should not
@@ -4433,7 +4562,7 @@ static void patch_id_consume(void *priv, char *line, unsigned long len)
 }
 
 /* returns 0 upon success, and writes result into sha1 */
-static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
+static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1, int diff_header_only)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
        int i;
@@ -4468,9 +4597,6 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
 
                diff_fill_sha1_info(p->one);
                diff_fill_sha1_info(p->two);
-               if (fill_mmfile(&mf1, p->one) < 0 ||
-                               fill_mmfile(&mf2, p->two) < 0)
-                       return error("unable to read files to diff");
 
                len1 = remove_space(p->one->path, strlen(p->one->path));
                len2 = remove_space(p->two->path, strlen(p->two->path));
@@ -4505,10 +4631,19 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
                                        len2, p->two->path);
                git_SHA1_Update(&ctx, buffer, len1);
 
+               if (diff_header_only)
+                       continue;
+
+               if (fill_mmfile(&mf1, p->one) < 0 ||
+                   fill_mmfile(&mf2, p->two) < 0)
+                       return error("unable to read files to diff");
+
                if (diff_filespec_is_binary(p->one) ||
                    diff_filespec_is_binary(p->two)) {
-                       git_SHA1_Update(&ctx, sha1_to_hex(p->one->sha1), 40);
-                       git_SHA1_Update(&ctx, sha1_to_hex(p->two->sha1), 40);
+                       git_SHA1_Update(&ctx, oid_to_hex(&p->one->oid),
+                                       40);
+                       git_SHA1_Update(&ctx, oid_to_hex(&p->two->oid),
+                                       40);
                        continue;
                }
 
@@ -4525,11 +4660,11 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
        return 0;
 }
 
-int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1)
+int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1, int diff_header_only)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
        int i;
-       int result = diff_get_patch_id(options, sha1);
+       int result = diff_get_patch_id(options, sha1, diff_header_only);
 
        for (i = 0; i < q->nr; i++)
                diff_free_filepair(q->queue[i]);
@@ -4566,25 +4701,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)
@@ -4800,7 +4935,7 @@ static int diff_filespec_check_stat_unmatch(struct diff_filepair *p)
         */
        if (!DIFF_FILE_VALID(p->one) || /* (1) */
            !DIFF_FILE_VALID(p->two) ||
-           (p->one->sha1_valid && p->two->sha1_valid) ||
+           (p->one->oid_valid && p->two->oid_valid) ||
            (p->one->mode != p->two->mode) ||
            diff_populate_filespec(p->one, CHECK_SIZE_ONLY) ||
            diff_populate_filespec(p->two, CHECK_SIZE_ONLY) ||
@@ -4851,7 +4986,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)
@@ -5096,8 +5231,9 @@ size_t fill_textconv(struct userdiff_driver *driver,
        if (!driver->textconv)
                die("BUG: fill_textconv called with non-textconv driver");
 
-       if (driver->textconv_cache && df->sha1_valid) {
-               *outbuf = notes_cache_get(driver->textconv_cache, df->sha1,
+       if (driver->textconv_cache && df->oid_valid) {
+               *outbuf = notes_cache_get(driver->textconv_cache,
+                                         df->oid.hash,
                                          &size);
                if (*outbuf)
                        return size;
@@ -5107,9 +5243,9 @@ size_t fill_textconv(struct userdiff_driver *driver,
        if (!*outbuf)
                die("unable to read files to diff");
 
-       if (driver->textconv_cache && df->sha1_valid) {
+       if (driver->textconv_cache && df->oid_valid) {
                /* ignore errors, as we might be in a readonly repository */
-               notes_cache_put(driver->textconv_cache, df->sha1, *outbuf,
+               notes_cache_put(driver->textconv_cache, df->oid.hash, *outbuf,
                                size);
                /*
                 * we could save up changes and flush them all at the end,
diff --git a/diff.h b/diff.h
index e7d68edaf9d4744ce3c48356e1835c5506d5322d..e9ccb38c26c7f1b5b0d5932bb98c2875276cf828 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -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;
@@ -266,6 +274,8 @@ 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 *);
 extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
@@ -331,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
@@ -341,13 +355,13 @@ extern int run_diff_files(struct rev_info *revs, unsigned int option);
 extern int run_diff_index(struct rev_info *revs, int cached);
 
 extern int do_diff_cache(const unsigned char *, struct diff_options *);
-extern int diff_flush_patch_id(struct diff_options *, unsigned char *);
+extern int diff_flush_patch_id(struct diff_options *, unsigned char *, int);
 
 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 5473493e10551633659d0727626ffc2273ef4f73..c64359f489c87910b9d41756918dacda49276004 100644 (file)
@@ -57,8 +57,8 @@ static int should_break(struct diff_filespec *src,
                return 1; /* even their types are different */
        }
 
-       if (src->sha1_valid && dst->sha1_valid &&
-           !hashcmp(src->sha1, dst->sha1))
+       if (src->oid_valid && dst->oid_valid &&
+           !oidcmp(&src->oid, &dst->oid))
                return 0; /* they are the same */
 
        if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
@@ -73,7 +73,6 @@ static int should_break(struct diff_filespec *src,
 
        if (diffcore_count_changes(src, dst,
                                   &src->cnt_data, &dst->cnt_data,
-                                  0,
                                   &src_copied, &literal_added))
                return 0;
 
index 4159748a70ccc0ddee7cf2fcf82976629dfa6867..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;
 }
 
@@ -169,7 +166,6 @@ int diffcore_count_changes(struct diff_filespec *src,
                           struct diff_filespec *dst,
                           void **src_count_p,
                           void **dst_count_p,
-                          unsigned long delta_limit,
                           unsigned long *src_copied,
                           unsigned long *literal_added)
 {
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 7715c13ec4780a755ec2a6552c0aec9994691087..9795ca1c159a5177b1b7031a87c8f8bd5e5be3d5 100644 (file)
@@ -7,6 +7,8 @@
 #include "diffcore.h"
 #include "xdiff-interface.h"
 #include "kwset.h"
+#include "commit.h"
+#include "quote.h"
 
 typedef int (*pickaxe_fn)(mmfile_t *one, mmfile_t *two,
                          struct diff_options *o,
@@ -21,7 +23,6 @@ static void diffgrep_consume(void *priv, char *line, unsigned long len)
 {
        struct diffgrep_cb *data = priv;
        regmatch_t regmatch;
-       int hold;
 
        if (line[0] != '+' && line[0] != '-')
                return;
@@ -31,11 +32,8 @@ static void diffgrep_consume(void *priv, char *line, unsigned long len)
                 * caller early.
                 */
                return;
-       /* Yuck -- line ought to be "const char *"! */
-       hold = line[len];
-       line[len] = '\0';
-       data->hit = !regexec(data->regexp, line + 1, 1, &regmatch, 0);
-       line[len] = hold;
+       data->hit = !regexec_buf(data->regexp, line + 1, len - 1, 1,
+                                &regmatch, 0);
 }
 
 static int diff_grep(mmfile_t *one, mmfile_t *two,
@@ -48,9 +46,11 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
        xdemitconf_t xecfg;
 
        if (!one)
-               return !regexec(regexp, two->ptr, 1, &regmatch, 0);
+               return !regexec_buf(regexp, two->ptr, two->size,
+                                   1, &regmatch, 0);
        if (!two)
-               return !regexec(regexp, one->ptr, 1, &regmatch, 0);
+               return !regexec_buf(regexp, one->ptr, one->size,
+                                   1, &regmatch, 0);
 
        /*
         * We have both sides; need to run textual diff and see if
@@ -81,8 +81,8 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
                regmatch_t regmatch;
                int flags = 0;
 
-               assert(data[sz] == '\0');
-               while (*data && !regexec(regexp, data, 1, &regmatch, flags)) {
+               while (*data &&
+                      !regexec_buf(regexp, data, sz, 1, &regmatch, flags)) {
                        flags |= REG_NOTBOL;
                        data += regmatch.rm_eo;
                        if (*data && regmatch.rm_so == regmatch.rm_eo)
@@ -198,6 +198,18 @@ static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
        *q = outq;
 }
 
+static void regcomp_or_die(regex_t *regex, const char *needle, int cflags)
+{
+       int err = regcomp(regex, needle, cflags);
+       if (err) {
+               /* The POSIX.2 people are surely sick */
+               char errbuf[1024];
+               regerror(err, regex, errbuf, 1024);
+               regfree(regex);
+               die("invalid regex: %s", errbuf);
+       }
+}
+
 void diffcore_pickaxe(struct diff_options *o)
 {
        const char *needle = o->pickaxe;
@@ -206,18 +218,19 @@ void diffcore_pickaxe(struct diff_options *o)
        kwset_t kws = NULL;
 
        if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
-               int err;
                int cflags = REG_EXTENDED | REG_NEWLINE;
                if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
                        cflags |= REG_ICASE;
-               err = regcomp(&regex, needle, cflags);
-               if (err) {
-                       /* The POSIX.2 people are surely sick */
-                       char errbuf[1024];
-                       regerror(err, &regex, errbuf, 1024);
-                       regfree(&regex);
-                       die("invalid regex: %s", errbuf);
-               }
+               regcomp_or_die(&regex, needle, cflags);
+               regexp = &regex;
+       } else if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE) &&
+                  has_non_ascii(needle)) {
+               struct strbuf sb = STRBUF_INIT;
+               int cflags = REG_NEWLINE | REG_ICASE;
+
+               basic_regex_quote_buf(&sb, needle);
+               regcomp_or_die(&regex, sb.buf, cflags);
+               strbuf_release(&sb);
                regexp = &regex;
        } else {
                kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)
index 3b3c1ed535e7c8b17947d69dbe0bd5c8f115cf2d..f7444c86bde3909c8fca23f71c4852514eb26b88 100644 (file)
@@ -60,7 +60,8 @@ static int add_rename_dst(struct diff_filespec *two)
                memmove(rename_dst + first + 1, rename_dst + first,
                        (rename_dst_nr - first - 1) * sizeof(*rename_dst));
        rename_dst[first].two = alloc_filespec(two->path);
-       fill_filespec(rename_dst[first].two, two->sha1, two->sha1_valid, two->mode);
+       fill_filespec(rename_dst[first].two, two->oid.hash, two->oid_valid,
+                     two->mode);
        rename_dst[first].pair = NULL;
        return 0;
 }
@@ -144,7 +145,6 @@ static int estimate_similarity(struct diff_filespec *src,
         * call into this function in that case.
         */
        unsigned long max_size, delta_size, base_size, src_copied, literal_added;
-       unsigned long delta_limit;
        int score;
 
        /* We deal only with regular files.  Symlink renames are handled
@@ -190,11 +190,8 @@ static int estimate_similarity(struct diff_filespec *src,
        if (!dst->cnt_data && diff_populate_filespec(dst, 0))
                return 0;
 
-       delta_limit = (unsigned long)
-               (base_size * (MAX_SCORE-minimum_score) / MAX_SCORE);
        if (diffcore_count_changes(src, dst,
                                   &src->cnt_data, &dst->cnt_data,
-                                  delta_limit,
                                   &src_copied, &literal_added))
                return 0;
 
@@ -260,12 +257,13 @@ struct file_similarity {
 
 static unsigned int hash_filespec(struct diff_filespec *filespec)
 {
-       if (!filespec->sha1_valid) {
+       if (!filespec->oid_valid) {
                if (diff_populate_filespec(filespec, 0))
                        return 0;
-               hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1);
+               hash_sha1_file(filespec->data, filespec->size, "blob",
+                              filespec->oid.hash);
        }
-       return sha1hash(filespec->sha1);
+       return sha1hash(filespec->oid.hash);
 }
 
 static int find_identical_files(struct hashmap *srcs,
@@ -287,7 +285,7 @@ static int find_identical_files(struct hashmap *srcs,
                struct diff_filespec *source = p->filespec;
 
                /* False hash collision? */
-               if (hashcmp(source->sha1, target->sha1))
+               if (oidcmp(&source->oid, &target->oid))
                        continue;
                /* Non-regular files? If so, the modes must match! */
                if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) {
@@ -340,9 +338,11 @@ static int find_exact_renames(struct diff_options *options)
        int i, renames = 0;
        struct hashmap file_table;
 
-       /* Add all sources to the hash table */
+       /* Add all sources to the hash table in reverse order, because
+        * later on they will be retrieved in LIFO order.
+        */
        hashmap_init(&file_table, NULL, rename_src_nr);
-       for (i = 0; i < rename_src_nr; i++)
+       for (i = rename_src_nr-1; i >= 0; i--)
                insert_file_table(&file_table, i, rename_src[i].p->one);
 
        /* Walk the destinations and find best source match */
@@ -464,7 +464,7 @@ void diffcore_rename(struct diff_options *options)
                                 strcmp(options->single_follow, p->two->path))
                                continue; /* not interested */
                        else if (!DIFF_OPT_TST(options, RENAME_EMPTY) &&
-                                is_empty_blob_sha1(p->two->sha1))
+                                is_empty_blob_sha1(p->two->oid.hash))
                                continue;
                        else if (add_rename_dst(p->two) < 0) {
                                warning("skipping rename detection, detected"
@@ -474,7 +474,7 @@ void diffcore_rename(struct diff_options *options)
                        }
                }
                else if (!DIFF_OPT_TST(options, RENAME_EMPTY) &&
-                        is_empty_blob_sha1(p->one->sha1))
+                        is_empty_blob_sha1(p->one->oid.hash))
                        continue;
                else if (!DIFF_PAIR_UNMERGED(p) && !DIFF_FILE_VALID(p->two)) {
                        /*
@@ -537,7 +537,7 @@ void diffcore_rename(struct diff_options *options)
                                rename_dst_nr * rename_src_nr, 50, 1);
        }
 
-       mx = xcalloc(st_mult(num_create, NUM_CANDIDATE_PER_DST), sizeof(*mx));
+       mx = xcalloc(st_mult(NUM_CANDIDATE_PER_DST, num_create), sizeof(*mx));
        for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
                struct diff_filespec *two = rename_dst[i].two;
                struct diff_score *m;
@@ -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)
index 33ea2de348803b29a08a6713ae4cab1345f874d9..623024135478088028cd42b8c6a744ebb04bf0a7 100644 (file)
@@ -25,7 +25,7 @@
 struct userdiff_driver;
 
 struct diff_filespec {
-       unsigned char sha1[20];
+       struct object_id oid;
        char *path;
        void *data;
        void *cnt_data;
@@ -33,7 +33,7 @@ struct diff_filespec {
        int count;               /* Reference count */
        int rename_used;         /* Count of rename users */
        unsigned short mode;     /* file mode */
-       unsigned sha1_valid : 1; /* if true, use sha1 and trust mode;
+       unsigned oid_valid : 1;  /* if true, use oid and trust mode;
                                  * if false, use the name and read from
                                  * the filesystem.
                                  */
@@ -142,7 +142,6 @@ extern int diffcore_count_changes(struct diff_filespec *src,
                                  struct diff_filespec *dst,
                                  void **src_count_p,
                                  void **dst_count_p,
-                                 unsigned long delta_limit,
                                  unsigned long *src_copied,
                                  unsigned long *literal_added);
 
diff --git a/dir-iterator.c b/dir-iterator.c
new file mode 100644 (file)
index 0000000..34182a9
--- /dev/null
@@ -0,0 +1,202 @@
+#include "cache.h"
+#include "dir.h"
+#include "iterator.h"
+#include "dir-iterator.h"
+
+struct dir_iterator_level {
+       int initialized;
+
+       DIR *dir;
+
+       /*
+        * The length of the directory part of path at this level
+        * (including a trailing '/'):
+        */
+       size_t prefix_len;
+
+       /*
+        * The last action that has been taken with the current entry
+        * (needed for directories, which have to be included in the
+        * iteration and also iterated into):
+        */
+       enum {
+               DIR_STATE_ITER,
+               DIR_STATE_RECURSE
+       } dir_state;
+};
+
+/*
+ * The full data structure used to manage the internal directory
+ * iteration state. It includes members that are not part of the
+ * public interface.
+ */
+struct dir_iterator_int {
+       struct dir_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 directory
+        * that will be included in this iteration.
+        */
+       struct dir_iterator_level *levels;
+};
+
+int dir_iterator_advance(struct dir_iterator *dir_iterator)
+{
+       struct dir_iterator_int *iter =
+               (struct dir_iterator_int *)dir_iterator;
+
+       while (1) {
+               struct dir_iterator_level *level =
+                       &iter->levels[iter->levels_nr - 1];
+               struct dirent *de;
+
+               if (!level->initialized) {
+                       /*
+                        * Note: dir_iterator_begin() ensures that
+                        * path is not the empty string.
+                        */
+                       if (!is_dir_sep(iter->base.path.buf[iter->base.path.len - 1]))
+                               strbuf_addch(&iter->base.path, '/');
+                       level->prefix_len = iter->base.path.len;
+
+                       level->dir = opendir(iter->base.path.buf);
+                       if (!level->dir && errno != ENOENT) {
+                               warning("error opening directory %s: %s",
+                                       iter->base.path.buf, strerror(errno));
+                               /* Popping the level is handled below */
+                       }
+
+                       level->initialized = 1;
+               } else if (S_ISDIR(iter->base.st.st_mode)) {
+                       if (level->dir_state == DIR_STATE_ITER) {
+                               /*
+                                * The directory was just iterated
+                                * over; now prepare to iterate into
+                                * it.
+                                */
+                               level->dir_state = DIR_STATE_RECURSE;
+                               ALLOC_GROW(iter->levels, iter->levels_nr + 1,
+                                          iter->levels_alloc);
+                               level = &iter->levels[iter->levels_nr++];
+                               level->initialized = 0;
+                               continue;
+                       } else {
+                               /*
+                                * The directory has already been
+                                * iterated over and iterated into;
+                                * we're done with it.
+                                */
+                       }
+               }
+
+               if (!level->dir) {
+                       /*
+                        * This level is exhausted (or wasn't opened
+                        * successfully); pop up a level.
+                        */
+                       if (--iter->levels_nr == 0)
+                               return dir_iterator_abort(dir_iterator);
+
+                       continue;
+               }
+
+               /*
+                * Loop until we find an entry that we can give back
+                * to the caller:
+                */
+               while (1) {
+                       strbuf_setlen(&iter->base.path, level->prefix_len);
+                       errno = 0;
+                       de = readdir(level->dir);
+
+                       if (!de) {
+                               /* This level is exhausted; pop up a level. */
+                               if (errno) {
+                                       warning("error reading directory %s: %s",
+                                               iter->base.path.buf, strerror(errno));
+                               } else if (closedir(level->dir))
+                                       warning("error closing directory %s: %s",
+                                               iter->base.path.buf, strerror(errno));
+
+                               level->dir = NULL;
+                               if (--iter->levels_nr == 0)
+                                       return dir_iterator_abort(dir_iterator);
+                               break;
+                       }
+
+                       if (is_dot_or_dotdot(de->d_name))
+                               continue;
+
+                       strbuf_addstr(&iter->base.path, de->d_name);
+                       if (lstat(iter->base.path.buf, &iter->base.st) < 0) {
+                               if (errno != ENOENT)
+                                       warning("error reading path '%s': %s",
+                                               iter->base.path.buf,
+                                               strerror(errno));
+                               continue;
+                       }
+
+                       /*
+                        * We have to set these each time because
+                        * the path strbuf might have been realloc()ed.
+                        */
+                       iter->base.relative_path =
+                               iter->base.path.buf + iter->levels[0].prefix_len;
+                       iter->base.basename =
+                               iter->base.path.buf + level->prefix_len;
+                       level->dir_state = DIR_STATE_ITER;
+
+                       return ITER_OK;
+               }
+       }
+}
+
+int dir_iterator_abort(struct dir_iterator *dir_iterator)
+{
+       struct dir_iterator_int *iter = (struct dir_iterator_int *)dir_iterator;
+
+       for (; iter->levels_nr; iter->levels_nr--) {
+               struct dir_iterator_level *level =
+                       &iter->levels[iter->levels_nr - 1];
+
+               if (level->dir && closedir(level->dir)) {
+                       strbuf_setlen(&iter->base.path, level->prefix_len);
+                       warning("error closing directory %s: %s",
+                               iter->base.path.buf, strerror(errno));
+               }
+       }
+
+       free(iter->levels);
+       strbuf_release(&iter->base.path);
+       free(iter);
+       return ITER_DONE;
+}
+
+struct dir_iterator *dir_iterator_begin(const char *path)
+{
+       struct dir_iterator_int *iter = xcalloc(1, sizeof(*iter));
+       struct dir_iterator *dir_iterator = &iter->base;
+
+       if (!path || !*path)
+               die("BUG: empty path passed to dir_iterator_begin()");
+
+       strbuf_init(&iter->base.path, PATH_MAX);
+       strbuf_addstr(&iter->base.path, path);
+
+       ALLOC_GROW(iter->levels, 10, iter->levels_alloc);
+
+       iter->levels_nr = 1;
+       iter->levels[0].initialized = 0;
+
+       return dir_iterator;
+}
diff --git a/dir-iterator.h b/dir-iterator.h
new file mode 100644 (file)
index 0000000..27739e6
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef DIR_ITERATOR_H
+#define DIR_ITERATOR_H
+
+/*
+ * Iterate over a directory tree.
+ *
+ * Iterate over a directory tree, recursively, including paths of all
+ * types and hidden paths. Skip "." and ".." entries and don't follow
+ * symlinks except for the original path.
+ *
+ * Every time dir_iterator_advance() is called, update the members of
+ * the dir_iterator structure to reflect the next path in the
+ * iteration. The order that paths are iterated over within a
+ * directory is undefined, but directory paths are always iterated
+ * over before the subdirectory contents.
+ *
+ * A typical iteration looks like this:
+ *
+ *     int ok;
+ *     struct iterator *iter = dir_iterator_begin(path);
+ *
+ *     while ((ok = dir_iterator_advance(iter)) == ITER_OK) {
+ *             if (want_to_stop_iteration()) {
+ *                     ok = dir_iterator_abort(iter);
+ *                     break;
+ *             }
+ *
+ *             // Access information about the current path:
+ *             if (S_ISDIR(iter->st.st_mode))
+ *                     printf("%s is a directory\n", iter->relative_path);
+ *     }
+ *
+ *     if (ok != ITER_DONE)
+ *             handle_error();
+ *
+ * Callers are allowed to modify iter->path while they are working,
+ * but they must restore it to its original contents before calling
+ * dir_iterator_advance() again.
+ */
+
+struct dir_iterator {
+       /* The current path: */
+       struct strbuf path;
+
+       /*
+        * The current path relative to the starting path. This part
+        * of the path always uses "/" characters to separate path
+        * components:
+        */
+       const char *relative_path;
+
+       /* The current basename: */
+       const char *basename;
+
+       /* The result of calling lstat() on path: */
+       struct stat st;
+};
+
+/*
+ * Start a directory iteration over path. Return a dir_iterator that
+ * holds the internal state of the iteration.
+ *
+ * The iteration includes all paths under path, not including path
+ * itself and not including "." or ".." entries.
+ *
+ * path is the starting directory. An internal copy will be made.
+ */
+struct dir_iterator *dir_iterator_begin(const char *path);
+
+/*
+ * Advance the iterator to the first or next item and return ITER_OK.
+ * If the iteration is exhausted, free the dir_iterator and any
+ * resources associated with it and return ITER_DONE. On error, free
+ * dir_iterator and associated resources and return ITER_ERROR. It is
+ * a bug to use iterator or call this function again after it has
+ * returned ITER_DONE or ITER_ERROR.
+ */
+int dir_iterator_advance(struct dir_iterator *iterator);
+
+/*
+ * End the iteration before it has been exhausted. Free the
+ * dir_iterator and any associated resources and return ITER_DONE. On
+ * error, free the dir_iterator and return ITER_ERROR.
+ */
+int dir_iterator_abort(struct dir_iterator *iterator);
+
+#endif
diff --git a/dir.c b/dir.c
index a4a9d9fae154849fe38b153af9b16e00ef401f60..bfa8c8a9a51297c3a969c8706467504cb11ce51b 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -53,24 +53,16 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
        int check_only, const struct path_simplify *simplify);
 static int get_dtype(struct dirent *de, const char *path, int len);
 
-/* helper string functions with support for the ignore_case flag */
-int strcmp_icase(const char *a, const char *b)
+int fspathcmp(const char *a, const char *b)
 {
        return ignore_case ? strcasecmp(a, b) : strcmp(a, b);
 }
 
-int strncmp_icase(const char *a, const char *b, size_t count)
+int fspathncmp(const char *a, const char *b, size_t count)
 {
        return ignore_case ? strncasecmp(a, b, count) : strncmp(a, b, count);
 }
 
-int fnmatch_icase(const char *pattern, const char *string, int flags)
-{
-       return wildmatch(pattern, string,
-                        flags | (ignore_case ? WM_CASEFOLD : 0),
-                        NULL);
-}
-
 int git_fnmatch(const struct pathspec_item *item,
                const char *pattern, const char *string,
                int prefix)
@@ -215,8 +207,9 @@ 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)
 
 /*
  * Does 'match' match the given name?
@@ -291,6 +284,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;
 }
 
@@ -394,6 +413,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)
@@ -457,7 +491,7 @@ int no_wildcard(const char *string)
 
 void parse_exclude_pattern(const char **pattern,
                           int *patternlen,
-                          int *flags,
+                          unsigned *flags,
                           int *nowildcardlen)
 {
        const char *p = *pattern;
@@ -498,7 +532,7 @@ void add_exclude(const char *string, const char *base,
 {
        struct exclude *x;
        int patternlen;
-       int flags;
+       unsigned flags;
        int nowildcardlen;
 
        parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
@@ -533,7 +567,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;
@@ -541,7 +575,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;
 }
@@ -721,7 +755,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);
@@ -798,16 +833,16 @@ void add_excludes_from_file(struct dir_struct *dir, const char *fname)
 
 int match_basename(const char *basename, int basenamelen,
                   const char *pattern, int prefix, int patternlen,
-                  int flags)
+                  unsigned flags)
 {
        if (prefix == patternlen) {
                if (patternlen == basenamelen &&
-                   !strncmp_icase(pattern, basename, basenamelen))
+                   !fspathncmp(pattern, basename, basenamelen))
                        return 1;
        } else if (flags & EXC_FLAG_ENDSWITH) {
                /* "*literal" matching against "fooliteral" */
                if (patternlen - 1 <= basenamelen &&
-                   !strncmp_icase(pattern + 1,
+                   !fspathncmp(pattern + 1,
                                   basename + basenamelen - (patternlen - 1),
                                   patternlen - 1))
                        return 1;
@@ -823,7 +858,7 @@ int match_basename(const char *basename, int basenamelen,
 int match_pathname(const char *pathname, int pathlen,
                   const char *base, int baselen,
                   const char *pattern, int prefix, int patternlen,
-                  int flags)
+                  unsigned flags)
 {
        const char *name;
        int namelen;
@@ -844,7 +879,7 @@ int match_pathname(const char *pathname, int pathlen,
         */
        if (pathlen < baselen + 1 ||
            (baselen && pathname[baselen] != '/') ||
-           strncmp_icase(pathname, base, baselen))
+           fspathncmp(pathname, base, baselen))
                return 0;
 
        namelen = baselen ? pathlen - baselen - 1 : pathlen;
@@ -858,7 +893,7 @@ int match_pathname(const char *pathname, int pathlen,
                if (prefix > namelen)
                        return 0;
 
-               if (strncmp_icase(pattern, name, prefix))
+               if (fspathncmp(pattern, name, prefix))
                        return 0;
                pattern += prefix;
                patternlen -= prefix;
@@ -2012,8 +2047,8 @@ int read_directory(struct dir_struct *dir, const char *path, int len, const stru
        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);
+       QSORT(dir->entries, dir->nr, cmp_name);
+       QSORT(dir->ignored, dir->ignored_nr, cmp_name);
        if (dir->untracked) {
                static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS);
                trace_printf_key(&trace_untracked_stats,
@@ -2202,8 +2237,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 */
@@ -2214,10 +2247,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)
@@ -2372,7 +2407,7 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra
 
        varint_len = encode_varint(untracked->ident.len, varbuf);
        strbuf_add(out, varbuf, varint_len);
-       strbuf_add(out, untracked->ident.buf, untracked->ident.len);
+       strbuf_addbuf(out, &untracked->ident);
 
        strbuf_add(out, ouc, ouc_size(len));
        free(ouc);
diff --git a/dir.h b/dir.h
index cd46f30017ce239720926afdad4301b2ac402ccf..97c83bb383a6b1fb5ce58d5e81dead570b73ac43 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -27,7 +27,7 @@ struct exclude {
        int nowildcardlen;
        const char *base;
        int baselen;
-       int flags;
+       unsigned flags;         /* EXC_FLAG_* */
 
        /*
         * Counting starts from 1 for line numbers in ignore files,
@@ -226,10 +226,10 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname,
  * attr.c:path_matches()
  */
 extern int match_basename(const char *, int,
-                         const char *, int, int, int);
+                         const char *, int, int, unsigned);
 extern int match_pathname(const char *, int,
                          const char *, int,
-                         const char *, int, int, int);
+                         const char *, int, int, unsigned);
 
 extern struct exclude *last_exclude_matching(struct dir_struct *dir,
                                             const char *name, int *dtype);
@@ -241,7 +241,7 @@ extern struct exclude_list *add_exclude_list(struct dir_struct *dir,
 extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen,
                                          struct exclude_list *el, int check_index);
 extern void add_excludes_from_file(struct dir_struct *, const char *fname);
-extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen);
+extern void parse_exclude_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen);
 extern void add_exclude(const char *string, const char *base,
                        int baselen, struct exclude_list *el, int srcpos);
 extern void clear_exclude_list(struct exclude_list *el);
@@ -262,17 +262,39 @@ extern int is_empty_dir(const char *dir);
 
 extern void setup_standard_excludes(struct dir_struct *dir);
 
+
+/* Constants for remove_dir_recursively: */
+
+/*
+ * If a non-directory is found within path, stop and return an error.
+ * (In this case some empty directories might already have been
+ * removed.)
+ */
 #define REMOVE_DIR_EMPTY_ONLY 01
+
+/*
+ * If any Git work trees are found within path, skip them without
+ * considering it an error.
+ */
 #define REMOVE_DIR_KEEP_NESTED_GIT 02
+
+/* Remove the contents of path, but leave path itself. */
 #define REMOVE_DIR_KEEP_TOPLEVEL 04
+
+/*
+ * Remove path and its contents, recursively. flags is a combination
+ * of the above REMOVE_DIR_* constants. Return 0 on success.
+ *
+ * This function uses path as temporary scratch space, but restores it
+ * before returning.
+ */
 extern int remove_dir_recursively(struct strbuf *path, int flag);
 
 /* tries to remove the path with empty directories along it, ignores ENOENT */
 extern int remove_path(const char *path);
 
-extern int strcmp_icase(const char *a, const char *b);
-extern int strncmp_icase(const char *a, const char *b, size_t count);
-extern int fnmatch_icase(const char *pattern, const char *string, int flags);
+extern int fspathcmp(const char *a, const char *b);
+extern int fspathncmp(const char *a, const char *b, size_t count);
 
 /*
  * The prefix part of pattern must not contains wildcards.
@@ -282,6 +304,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)
index 01c644cddbe8e57e31cc711aa0ca3838cf23c64d..7519edecdc297a0c0fdbbb2f3c68cb55abf2e8b2 100644 (file)
--- a/editor.c
+++ b/editor.c
@@ -63,7 +63,6 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
        if (!buffer)
                return 0;
        if (strbuf_read_file(buffer, path, 0) < 0)
-               return error("could not read file '%s': %s",
-                               path, strerror(errno));
+               return error_errno("could not read file '%s'", path);
        return 0;
 }
diff --git a/entry.c b/entry.c
index a4109574fa72e0f3f32ad7b9e1ed0e402c8aecff..c6eea240b69eae1a8b19eb61f6bbf0c888c5e1cb 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -82,7 +82,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 +127,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);
 
@@ -148,7 +148,8 @@ static int write_entry(struct cache_entry *ce,
        struct stat st;
 
        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,14 +163,14 @@ 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);
                        free(new);
                        if (ret)
-                               return error("unable to create symlink %s (%s)",
-                                            path, strerror(errno));
+                               return error_errno("unable to create symlink %s",
+                                                  path);
                        break;
                }
 
@@ -186,8 +187,7 @@ static int write_entry(struct cache_entry *ce,
                fd = open_output_fd(path, ce, to_tempfile);
                if (fd < 0) {
                        free(new);
-                       return error("unable to create file %s (%s)",
-                               path, strerror(errno));
+                       return error_errno("unable to create file %s", path);
                }
 
                wrote = write_in_full(fd, new, size);
@@ -284,8 +284,7 @@ int checkout_entry(struct cache_entry *ce,
                                return error("%s is a directory", path.buf);
                        remove_subtree(&path);
                } else if (unlink(path.buf))
-                       return error("unable to unlink old '%s' (%s)",
-                                    path.buf, strerror(errno));
+                       return error_errno("unable to unlink old '%s'", path.buf);
        } else if (state->not_new)
                return 0;
 
index 6dec9d0403f11579a7ab316db87a1dbbc58e71b2..0935ec696e530e1b610c71eda0a0a7072d1d656f 100644 (file)
@@ -16,7 +16,7 @@ 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;
@@ -25,14 +25,13 @@ int log_all_ref_updates = -1; /* unspecified */
 int warn_ambiguous_refs = 1;
 int warn_on_object_refname_ambiguity = 1;
 int ref_paranoia = -1;
-int repository_format_version;
 int repository_format_precious_objects;
 const char *git_commit_encoding;
 const char *git_log_output_encoding;
-int shared_repository = PERM_UMASK;
 const char *apply_default_whitespace;
 const char *apply_default_ignorewhitespace;
 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;
@@ -41,7 +40,6 @@ 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;
@@ -64,8 +62,8 @@ int grafts_replace_parents = 1;
 int core_apply_sparse_checkout;
 int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
-struct startup_info *startup_info;
 unsigned long pack_size_limit_cfg;
+enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
 
 #ifndef PROTECT_HFS_DEFAULT
 #define PROTECT_HFS_DEFAULT 0
@@ -101,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;
@@ -121,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
@@ -197,6 +198,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)
@@ -223,6 +231,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;
 
 /*
@@ -325,3 +343,29 @@ const char *get_commit_output_encoding(void)
 {
        return git_commit_encoding ? git_commit_encoding : "UTF-8";
 }
+
+static int the_shared_repository = PERM_UMASK;
+static int need_shared_repository_from_config = 1;
+
+void set_shared_repository(int value)
+{
+       the_shared_repository = value;
+       need_shared_repository_from_config = 0;
+}
+
+int get_shared_repository(void)
+{
+       if (need_shared_repository_from_config) {
+               const char *var = "core.sharedrepository";
+               const char *value;
+               if (!git_config_get_value(var, &value))
+                       the_shared_repository = git_config_perm(var, value);
+               need_shared_repository_from_config = 0;
+       }
+       return the_shared_repository;
+}
+
+void reset_shared_repository(void)
+{
+       need_shared_repository_from_config = 1;
+}
index 9d5703a157fe8e9d8396e0771798e54dc5eea6eb..19ac2146d0c49be8f5ef3739664dc3105544b4c2 100644 (file)
@@ -38,21 +38,17 @@ char *system_path(const char *path)
        return strbuf_detach(&d, NULL);
 }
 
-const char *git_extract_argv0_path(const char *argv0)
+void git_extract_argv0_path(const char *argv0)
 {
        const char *slash;
 
        if (!argv0 || !*argv0)
-               return NULL;
+               return;
 
        slash = find_last_dir_sep(argv0);
 
-       if (slash) {
+       if (slash)
                argv0_path = xstrndup(argv0, slash - argv0);
-               return slash + 1;
-       }
-
-       return argv0;
 }
 
 void git_set_argv_exec_path(const char *exec_path)
index 1f6b43378ba3866c07578b2222154e3a760440d1..ff0b48048a6ba82827b4d441654c34c21cfb7b9a 100644 (file)
@@ -4,7 +4,7 @@
 struct argv_array;
 
 extern void git_set_argv_exec_path(const char *exec_path);
-extern const char *git_extract_argv0_path(const char *path);
+extern void git_extract_argv0_path(const char *path);
 extern const char *git_exec_path(void);
 extern void setup_path(void);
 extern const char **prepare_git_cmd(struct argv_array *out, const char **argv);
index 9fc7093406b1e2085a3b2180a8506bcd6d486e06..cb545d7df514b73a5ad9358b614ea9b4751e3c1e 100644 (file)
@@ -164,8 +164,8 @@ Format of STDIN stream:
 #include "refs.h"
 #include "csum-file.h"
 #include "quote.h"
-#include "exec_cmd.h"
 #include "dir.h"
+#include "run-command.h"
 
 #define PACK_ID_BITS 16
 #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
@@ -282,6 +282,7 @@ struct recent_command {
 /* Configured limits on output */
 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;
@@ -300,7 +301,7 @@ static int failure;
 static FILE *pack_edges;
 static unsigned int show_stats = 1;
 static int global_argc;
-static char **global_argv;
+static const char **global_argv;
 
 /* Memory pools */
 static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mem_pool);
@@ -329,6 +330,7 @@ static const char *export_marks_file;
 static const char *import_marks_file;
 static int import_marks_file_from_stream;
 static int import_marks_file_ignore_missing;
+static int import_marks_file_done;
 static int relative_marks_paths;
 
 /* Our last blob */
@@ -414,7 +416,7 @@ static void write_crash_report(const char *err)
        struct recent_command *rc;
 
        if (!rpt) {
-               error("can't write crash report %s: %s", loc, strerror(errno));
+               error_errno("can't write crash report %s", loc);
                free(loc);
                return;
        }
@@ -595,6 +597,33 @@ static struct object_entry *insert_object(unsigned char *sha1)
        return e;
 }
 
+static void invalidate_pack_id(unsigned int id)
+{
+       unsigned int h;
+       unsigned long lu;
+       struct tag *t;
+
+       for (h = 0; h < ARRAY_SIZE(object_table); h++) {
+               struct object_entry *e;
+
+               for (e = object_table[h]; e; e = e->next)
+                       if (e->pack_id == id)
+                               e->pack_id = MAX_PACK_ID;
+       }
+
+       for (lu = 0; lu < branch_table_sz; lu++) {
+               struct branch *b;
+
+               for (b = branch_table[lu]; b; b = b->table_next_branch)
+                       if (b->pack_id == id)
+                               b->pack_id = MAX_PACK_ID;
+       }
+
+       for (t = first_tag; t; t = t->next_tag)
+               if (t->pack_id == id)
+                       t->pack_id = MAX_PACK_ID;
+}
+
 static unsigned int hc_str(const char *s, size_t len)
 {
        unsigned int r = 0;
@@ -950,6 +979,23 @@ static void unkeep_all_packs(void)
        }
 }
 
+static int loosen_small_pack(const struct packed_git *p)
+{
+       struct child_process unpack = CHILD_PROCESS_INIT;
+
+       if (lseek(p->pack_fd, 0, SEEK_SET) < 0)
+               die_errno("Failed seeking to start of '%s'", p->pack_name);
+
+       unpack.in = p->pack_fd;
+       unpack.git_cmd = 1;
+       unpack.stdout_to_stderr = 1;
+       argv_array_push(&unpack.args, "unpack-objects");
+       if (!show_stats)
+               argv_array_push(&unpack.args, "-q");
+
+       return run_command(&unpack);
+}
+
 static void end_packfile(void)
 {
        static int running;
@@ -972,6 +1018,14 @@ static void end_packfile(void)
                fixup_pack_header_footer(pack_data->pack_fd, pack_data->sha1,
                                    pack_data->pack_name, object_count,
                                    cur_pack_sha1, pack_size);
+
+               if (object_count <= unpack_limit) {
+                       if (!loosen_small_pack(pack_data)) {
+                               invalidate_pack_id(pack_id);
+                               goto discard_pack;
+                       }
+               }
+
                close(pack_data->pack_fd);
                idx_name = keep_pack(create_index());
 
@@ -1002,6 +1056,7 @@ static void end_packfile(void)
                pack_id++;
        }
        else {
+discard_pack:
                close(pack_data->pack_fd);
                unlink_or_warn(pack_data->pack_name);
        }
@@ -1405,9 +1460,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)
@@ -1512,7 +1567,7 @@ static int tree_content_set(
        t = root->tree;
        for (i = 0; i < t->entry_count; i++) {
                e = t->entries[i];
-               if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
+               if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
                        if (!*slash1) {
                                if (!S_ISDIR(mode)
                                                && e->versions[1].mode == mode
@@ -1602,7 +1657,7 @@ static int tree_content_remove(
        t = root->tree;
        for (i = 0; i < t->entry_count; i++) {
                e = t->entries[i];
-               if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
+               if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
                        if (*slash1 && !S_ISDIR(e->versions[1].mode))
                                /*
                                 * If p names a file in some subdirectory, and a
@@ -1669,7 +1724,7 @@ static int tree_content_get(
        t = root->tree;
        for (i = 0; i < t->entry_count; i++) {
                e = t->entries[i];
-               if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
+               if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
                        if (!*slash1)
                                goto found_entry;
                        if (!S_ISDIR(e->versions[1].mode))
@@ -1802,12 +1857,12 @@ static void dump_marks(void)
        static struct lock_file mark_lock;
        FILE *f;
 
-       if (!export_marks_file)
+       if (!export_marks_file || (import_marks_file && !import_marks_file_done))
                return;
 
        if (hold_lock_file_for_update(&mark_lock, export_marks_file, 0) < 0) {
-               failure |= error("Unable to write marks file %s: %s",
-                       export_marks_file, strerror(errno));
+               failure |= error_errno("Unable to write marks file %s",
+                                      export_marks_file);
                return;
        }
 
@@ -1822,8 +1877,8 @@ static void dump_marks(void)
 
        dump_marks_helper(f, 0, marks);
        if (commit_lock_file(&mark_lock)) {
-               failure |= error("Unable to write file %s: %s",
-                       export_marks_file, strerror(errno));
+               failure |= error_errno("Unable to write file %s",
+                                      export_marks_file);
                return;
        }
 }
@@ -1835,7 +1890,7 @@ static void read_marks(void)
        if (f)
                ;
        else if (import_marks_file_ignore_missing && errno == ENOENT)
-               return; /* Marks file does not exist */
+               goto done; /* Marks file does not exist */
        else
                die_errno("cannot read '%s'", import_marks_file);
        while (fgets(line, sizeof(line), f)) {
@@ -1865,6 +1920,8 @@ static void read_marks(void)
                insert_mark(mark, e);
        }
        fclose(f);
+done:
+       import_marks_file_done = 1;
 }
 
 
@@ -3317,6 +3374,7 @@ static void parse_option(const char *option)
 static void git_pack_config(void)
 {
        int indexversion_value;
+       int limit;
        unsigned long packsizelimit_value;
 
        if (!git_config_get_ulong("pack.depth", &max_depth)) {
@@ -3341,6 +3399,11 @@ static void git_pack_config(void)
        if (!git_config_get_ulong("pack.packsizelimit", &packsizelimit_value))
                max_packsize = packsizelimit_value;
 
+       if (!git_config_get_int("fastimport.unpacklimit", &limit))
+               unpack_limit = limit;
+       else if (!git_config_get_int("transfer.unpacklimit", &limit))
+               unpack_limit = limit;
+
        git_config(git_default_config, NULL);
 }
 
@@ -3381,14 +3444,10 @@ static void parse_argv(void)
                read_marks();
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        unsigned int i;
 
-       git_extract_argv0_path(argv[0]);
-
-       git_setup_gettext();
-
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(fast_import_usage);
 
index f96f6dfb35afb419ac38fcec9b4013fbf0e6d36d..601f0779a1903a2b860412e3404e4ea8e4bce573 100644 (file)
 #include "version.h"
 #include "prio-queue.h"
 #include "sha1-array.h"
-#include "sigchain.h"
 
 static int transfer_unpack_limit = -1;
 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;
@@ -51,6 +52,21 @@ 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);
+}
+
 static void rev_list_push(struct commit *commit, int mark)
 {
        if (!(commit->object.flags & mark)) {
@@ -183,7 +199,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.
@@ -194,7 +210,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"));
                }
        }
 }
@@ -206,7 +222,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)) {
@@ -224,7 +240,7 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1)
                        return ACK;
                }
        }
-       die("git fetch_pack: expected ACK/NAK, got '%s'", line);
+       die(_("git fetch-pack: expected ACK/NAK, got '%s'"), line);
 }
 
 static void send_request(struct fetch_pack_args *args,
@@ -244,16 +260,21 @@ static void insert_one_alternate_ref(const struct ref *ref, void *unused)
 
 #define INITIAL_FLUSH 16
 #define PIPESAFE_FLUSH 32
-#define LARGE_FLUSH 1024
+#define LARGE_FLUSH 16384
 
 static int next_flush(struct fetch_pack_args *args, int count)
 {
-       int flush_limit = args->stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
-
-       if (count < flush_limit)
-               count <<= 1;
-       else
-               count += flush_limit;
+       if (args->stateless_rpc) {
+               if (count < LARGE_FLUSH)
+                       count <<= 1;
+               else
+                       count = count * 11 / 10;
+       } else {
+               if (count < PIPESAFE_FLUSH)
+                       count <<= 1;
+               else
+                       count += PIPESAFE_FLUSH;
+       }
        return count;
 }
 
@@ -271,7 +292,7 @@ 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;
@@ -308,10 +329,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);
@@ -331,10 +355,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];
@@ -343,23 +378,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);
@@ -376,8 +411,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;
@@ -398,9 +432,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;
@@ -413,7 +447,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)) {
@@ -424,10 +458,17 @@ static int find_common(struct fetch_pack_args *args,
                                                const char *hex = sha1_to_hex(result_sha1);
                                                packet_buf_write(&req_buf, "have %s\n", hex);
                                                state_len = req_buf.len;
-                                       }
+                                               /*
+                                                * Reset in_vain because an ack
+                                                * for this commit has not been
+                                                * seen.
+                                                */
+                                               in_vain = 0;
+                                       } else if (!args->stateless_rpc
+                                                  || ack != ACK_common)
+                                               in_vain = 0;
                                        mark_common(commit, 0, 1);
                                        retval = 0;
-                                       in_vain = 0;
                                        got_continue = 1;
                                        if (ack == ACK_ready) {
                                                clear_prio_queue(&rev_list);
@@ -439,8 +480,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 */
                        }
                }
@@ -450,8 +490,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++;
@@ -463,9 +502,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;
@@ -510,9 +548,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);
        }
 }
@@ -548,7 +585,7 @@ static void filter_refs(struct fetch_pack_args *args,
                }
 
                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) {
@@ -618,7 +655,7 @@ 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);
                commit_list_sort_by_date(&complete);
@@ -653,18 +690,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;
 }
@@ -674,10 +705,8 @@ static int sideband_demux(int in, int out, void *data)
        int *xd = data;
        int ret;
 
-       sigchain_push(SIGPIPE, SIG_IGN);
        ret = recv_sideband("fetch-pack", xd[0], out);
        close(out);
-       sigchain_pop(SIGPIPE);
        return ret;
 }
 
@@ -701,9 +730,9 @@ static int get_pack(struct fetch_pack_args *args,
                demux.proc = sideband_demux;
                demux.data = xd;
                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];
@@ -711,7 +740,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;
@@ -767,7 +796,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);
@@ -783,9 +812,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;
 }
 
@@ -809,44 +838,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"))
@@ -855,18 +879,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]);
@@ -877,11 +910,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)
@@ -889,7 +922,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;
@@ -948,7 +981,7 @@ static void update_shallow(struct fetch_pack_args *args,
        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);
@@ -1051,7 +1084,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,
index bb7fd76e5939d812f1f89b787324ae6ec519ca15..c912e3d321c6a80952dbcd266786d1042a49e579 100644 (file)
@@ -10,6 +10,9 @@ 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;
 };
 
 /*
diff --git a/fsck.c b/fsck.c
index ca4c68537788496dea803b559e2ffd4cf1dbeea7..4a3069e204ea555bfb6d1ce05a0163860f852437 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -9,6 +9,7 @@
 #include "refs.h"
 #include "utf8.h"
 #include "sha1-array.h"
+#include "decorate.h"
 
 #define FSCK_FATAL -1
 #define FSCK_INFO -2
@@ -59,6 +60,7 @@
        FUNC(HAS_DOTGIT, WARN) \
        FUNC(NULL_SHA1, WARN) \
        FUNC(ZERO_PADDED_FILEMODE, WARN) \
+       FUNC(NUL_IN_COMMIT, WARN) \
        /* infos (reported as warnings, but ignored by default) */ \
        FUNC(BAD_TAG_NAME, INFO) \
        FUNC(MISSING_TAGGER_ENTRY, INFO)
@@ -289,35 +291,88 @@ static int report(struct fsck_options *options, struct object *object,
 
        va_start(ap, fmt);
        strbuf_vaddf(&sb, fmt, ap);
-       result = options->error_func(object, msg_type, sb.buf);
+       result = options->error_func(options, object, msg_type, sb.buf);
        strbuf_release(&sb);
        va_end(ap);
 
        return result;
 }
 
+static char *get_object_name(struct fsck_options *options, struct object *obj)
+{
+       if (!options->object_names)
+               return NULL;
+       return lookup_decoration(options->object_names, obj);
+}
+
+static void put_object_name(struct fsck_options *options, struct object *obj,
+       const char *fmt, ...)
+{
+       va_list ap;
+       struct strbuf buf = STRBUF_INIT;
+       char *existing;
+
+       if (!options->object_names)
+               return;
+       existing = lookup_decoration(options->object_names, obj);
+       if (existing)
+               return;
+       va_start(ap, fmt);
+       strbuf_vaddf(&buf, fmt, ap);
+       add_decoration(options->object_names, obj, strbuf_detach(&buf, NULL));
+       va_end(ap);
+}
+
+static const char *describe_object(struct fsck_options *o, struct object *obj)
+{
+       static struct strbuf buf = STRBUF_INIT;
+       char *name;
+
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, oid_to_hex(&obj->oid));
+       if (o->object_names && (name = lookup_decoration(o->object_names, obj)))
+               strbuf_addf(&buf, " (%s)", name);
+
+       return buf.buf;
+}
+
 static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *options)
 {
        struct tree_desc desc;
        struct name_entry entry;
        int res = 0;
+       const char *name;
 
        if (parse_tree(tree))
                return -1;
 
-       init_tree_desc(&desc, tree->buffer, tree->size);
-       while (tree_entry(&desc, &entry)) {
+       name = get_object_name(options, &tree->object);
+       if (init_tree_desc_gently(&desc, tree->buffer, tree->size))
+               return -1;
+       while (tree_entry_gently(&desc, &entry)) {
+               struct object *obj;
                int result;
 
                if (S_ISGITLINK(entry.mode))
                        continue;
-               if (S_ISDIR(entry.mode))
-                       result = options->walk(&lookup_tree(entry.sha1)->object, OBJ_TREE, data, options);
-               else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode))
-                       result = options->walk(&lookup_blob(entry.sha1)->object, OBJ_BLOB, data, options);
+
+               if (S_ISDIR(entry.mode)) {
+                       obj = &lookup_tree(entry.oid->hash)->object;
+                       if (name)
+                               put_object_name(options, obj, "%s%s/", name,
+                                       entry.path);
+                       result = options->walk(obj, OBJ_TREE, data, options);
+               }
+               else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode)) {
+                       obj = &lookup_blob(entry.oid->hash)->object;
+                       if (name)
+                               put_object_name(options, obj, "%s%s", name,
+                                       entry.path);
+                       result = options->walk(obj, OBJ_BLOB, data, options);
+               }
                else {
                        result = error("in tree %s: entry %s has bad mode %.6o",
-                                       oid_to_hex(&tree->object.oid), entry.path, entry.mode);
+                                       describe_object(options, &tree->object), entry.path, entry.mode);
                }
                if (result < 0)
                        return result;
@@ -329,20 +384,55 @@ static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *op
 
 static int fsck_walk_commit(struct commit *commit, void *data, struct fsck_options *options)
 {
+       int counter = 0, generation = 0, name_prefix_len = 0;
        struct commit_list *parents;
        int res;
        int result;
+       const char *name;
 
        if (parse_commit(commit))
                return -1;
 
+       name = get_object_name(options, &commit->object);
+       if (name)
+               put_object_name(options, &commit->tree->object, "%s:", name);
+
        result = options->walk((struct object *)commit->tree, OBJ_TREE, data, options);
        if (result < 0)
                return result;
        res = result;
 
        parents = commit->parents;
+       if (name && parents) {
+               int len = strlen(name), power;
+
+               if (len && name[len - 1] == '^') {
+                       generation = 1;
+                       name_prefix_len = len - 1;
+               }
+               else { /* parse ~<generation> suffix */
+                       for (generation = 0, power = 1;
+                            len && isdigit(name[len - 1]);
+                            power *= 10)
+                               generation += power * (name[--len] - '0');
+                       if (power > 1 && len && name[len - 1] == '~')
+                               name_prefix_len = len - 1;
+               }
+       }
+
        while (parents) {
+               if (name) {
+                       struct object *obj = &parents->item->object;
+
+                       if (++counter > 1)
+                               put_object_name(options, obj, "%s^%d",
+                                       name, counter);
+                       else if (generation > 0)
+                               put_object_name(options, obj, "%.*s~%d",
+                                       name_prefix_len, name, generation + 1);
+                       else
+                               put_object_name(options, obj, "%s^", name);
+               }
                result = options->walk((struct object *)parents->item, OBJ_COMMIT, data, options);
                if (result < 0)
                        return result;
@@ -355,8 +445,12 @@ static int fsck_walk_commit(struct commit *commit, void *data, struct fsck_optio
 
 static int fsck_walk_tag(struct tag *tag, void *data, struct fsck_options *options)
 {
+       char *name = get_object_name(options, &tag->object);
+
        if (parse_tag(tag))
                return -1;
+       if (name)
+               put_object_name(options, tag->tagged, "%s", name);
        return options->walk(tag->tagged, OBJ_ANY, data, options);
 }
 
@@ -374,7 +468,7 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options)
        case OBJ_TAG:
                return fsck_walk_tag((struct tag *)obj, data, options);
        default:
-               error("Unknown object type for %s", oid_to_hex(&obj->oid));
+               error("Unknown object type for %s", describe_object(options, obj));
                return -1;
        }
 }
@@ -427,7 +521,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;
@@ -442,7 +536,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;
@@ -450,11 +547,11 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
        while (desc.size) {
                unsigned mode;
                const char *name;
-               const unsigned char *sha1;
+               const struct object_id *oid;
 
-               sha1 = tree_entry_extract(&desc, &name, &mode);
+               oid = tree_entry_extract(&desc, &name, &mode);
 
-               has_null_sha1 |= is_null_sha1(sha1);
+               has_null_sha1 |= is_null_oid(oid);
                has_full_path |= !!strchr(name, '/');
                has_empty_name |= !*name;
                has_dot |= !strcmp(name, ".");
@@ -463,7 +560,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) {
                /*
@@ -504,7 +604,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)
@@ -610,6 +709,7 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
        struct commit_graft *graft;
        unsigned parent_count, parent_line_count = 0, author_count;
        int err;
+       const char *buffer_begin = buffer;
 
        if (verify_headers(buffer, size, &commit->object, options))
                return -1;
@@ -666,9 +766,17 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
        err = fsck_ident(&buffer, &commit->object, options);
        if (err)
                return err;
-       if (!commit->tree)
-               return report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
-
+       if (!commit->tree) {
+               err = report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
+               if (err)
+                       return err;
+       }
+       if (memchr(buffer_begin, '\0', size)) {
+               err = report(options, &commit->object, FSCK_MSG_NUL_IN_COMMIT,
+                            "NUL byte in the commit object body");
+               if (err)
+                       return err;
+       }
        return 0;
 }
 
@@ -808,12 +916,13 @@ int fsck_object(struct object *obj, void *data, unsigned long size,
                          obj->type);
 }
 
-int fsck_error_function(struct object *obj, int msg_type, const char *message)
+int fsck_error_function(struct fsck_options *o,
+       struct object *obj, int msg_type, const char *message)
 {
        if (msg_type == FSCK_WARN) {
-               warning("object %s: %s", oid_to_hex(&obj->oid), message);
+               warning("object %s: %s", describe_object(o, obj), message);
                return 0;
        }
-       error("object %s: %s", oid_to_hex(&obj->oid), message);
+       error("object %s: %s", describe_object(o, obj), message);
        return 1;
 }
diff --git a/fsck.h b/fsck.h
index dded84b5f9fceda7b2e9b3f13f4ccf464f6c7116..1891c1863be85c0607a86023e3da3d39d0dae22c 100644 (file)
--- a/fsck.h
+++ b/fsck.h
@@ -23,9 +23,11 @@ int is_valid_msg_type(const char *msg_id, const char *msg_type);
 typedef int (*fsck_walk_func)(struct object *obj, int type, void *data, struct fsck_options *options);
 
 /* callback for fsck_object, type is FSCK_ERROR or FSCK_WARN */
-typedef int (*fsck_error)(struct object *obj, int type, const char *message);
+typedef int (*fsck_error)(struct fsck_options *o,
+       struct object *obj, int type, const char *message);
 
-int fsck_error_function(struct object *obj, int type, const char *message);
+int fsck_error_function(struct fsck_options *o,
+       struct object *obj, int type, const char *message);
 
 struct fsck_options {
        fsck_walk_func walk;
@@ -33,6 +35,7 @@ struct fsck_options {
        unsigned strict:1;
        int *msg_type;
        struct sha1_array *skiplist;
+       struct decoration *object_names;
 };
 
 #define FSCK_OPTIONS_DEFAULT { NULL, fsck_error_function, 0, NULL }
index a268a2c52c0ed444b073d0411ca0dcc3f210ef51..db727ea0204aa13acea0f189ea03e59b5cdb918f 100644 (file)
--- a/gettext.c
+++ b/gettext.c
@@ -18,6 +18,8 @@
 #      endif
 #endif
 
+static const char *charset;
+
 /*
  * Guess the user's preferred languages from the value in LANGUAGE environment
  * variable and LC_MESSAGES locale category if NO_GETTEXT is not defined.
@@ -65,7 +67,6 @@ static int test_vsnprintf(const char *fmt, ...)
        return ret;
 }
 
-static const char *charset;
 static void init_gettext_charset(const char *domain)
 {
        /*
@@ -172,8 +173,27 @@ int gettext_width(const char *s)
 {
        static int is_utf8 = -1;
        if (is_utf8 == -1)
-               is_utf8 = !strcmp(charset, "UTF-8");
+               is_utf8 = is_utf8_locale();
 
        return is_utf8 ? utf8_strwidth(s) : strlen(s);
 }
 #endif
+
+int is_utf8_locale(void)
+{
+#ifdef NO_GETTEXT
+       if (!charset) {
+               const char *env = getenv("LC_ALL");
+               if (!env || !*env)
+                       env = getenv("LC_CTYPE");
+               if (!env || !*env)
+                       env = getenv("LANG");
+               if (!env)
+                       env = "";
+               if (strchr(env, '.'))
+                       env = strchr(env, '.') + 1;
+               charset = xstrdup(env);
+       }
+#endif
+       return is_encoding_utf8(charset);
+}
index 33696a40b8a11262d090a2eec4dfdce0fed6af0f..7eee64a34fa0a5e922606e6351b29d08cb26fe6b 100644 (file)
--- a/gettext.h
+++ b/gettext.h
@@ -90,5 +90,6 @@ const char *Q_(const char *msgid, const char *plu, unsigned long n)
 #endif
 
 const char *get_preferred_languages(void);
+extern int is_utf8_locale(void);
 
 #endif
index 77876d433a1ba2384a690155b51dac8118fa27b4..ee3d812695fa232f30682b0e546105ca0eea5d49 100755 (executable)
@@ -45,6 +45,9 @@ my ($diff_new_color) =
 my $normal_color = $repo->get_color("", "reset");
 
 my $diff_algorithm = $repo->config('diff.algorithm');
+my $diff_indent_heuristic = $repo->config_bool('diff.indentheuristic');
+my $diff_compaction_heuristic = $repo->config_bool('diff.compactionheuristic');
+my $diff_filter = $repo->config('interactive.difffilter');
 
 my $use_readkey = 0;
 my $use_termcap = 0;
@@ -748,13 +751,25 @@ sub parse_diff {
        if (defined $diff_algorithm) {
                splice @diff_cmd, 1, 0, "--diff-algorithm=${diff_algorithm}";
        }
+       if ($diff_indent_heuristic) {
+               splice @diff_cmd, 1, 0, "--indent-heuristic";
+       } elsif ($diff_compaction_heuristic) {
+               splice @diff_cmd, 1, 0, "--compaction-heuristic";
+       }
        if (defined $patch_mode_revision) {
                push @diff_cmd, get_diff_reference($patch_mode_revision);
        }
        my @diff = run_cmd_pipe("git", @diff_cmd, "--", $path);
        my @colored = ();
        if ($diff_use_color) {
-               @colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
+               my @display_cmd = ("git", @diff_cmd, qw(--color --), $path);
+               if (defined $diff_filter) {
+                       # quotemeta is overkill, but sufficient for shell-quoting
+                       my $diff = join(' ', map { quotemeta } @display_cmd);
+                       @display_cmd = ("$diff | $diff_filter");
+               }
+
+               @colored = run_cmd_pipe(@display_cmd);
        }
        my (@hunk) = { TEXT => [], DISPLAY => [], TYPE => 'header' };
 
@@ -765,7 +780,7 @@ sub parse_diff {
                }
                push @{$hunk[-1]{TEXT}}, $diff[$i];
                push @{$hunk[-1]{DISPLAY}},
-                       ($diff_use_color ? $colored[$i] : $diff[$i]);
+                       (@colored ? $colored[$i] : $diff[$i]);
        }
        return @hunk;
 }
index 5d1cb00d86b3700b2012cae1ed3b3b8b744acaf2..ae3cb013e7d5679bc4c63fe4cea35d40167178c5 100755 (executable)
@@ -33,7 +33,6 @@ Please use "git help bisect" to get the full man page.'
 
 OPTIONS_SPEC=
 . git-sh-setup
-. git-sh-i18n
 
 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
@@ -275,10 +274,11 @@ bisect_state() {
        check_and_set_terms $state
        case "$#,$state" in
        0,*)
-               die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;;
+               die "Please call 'bisect_state' with at least one argument." ;;
        1,"$TERM_BAD"|1,"$TERM_GOOD"|1,skip)
-               rev=$(git rev-parse --verify $(bisect_head)) ||
-                       die "$(gettext "Bad rev input: $(bisect_head)")"
+               bisected_head=$(bisect_head)
+               rev=$(git rev-parse --verify "$bisected_head") ||
+                       die "$(eval_gettext "Bad rev input: \$bisected_head")"
                bisect_write "$state" "$rev"
                check_expected_revs "$rev" ;;
        2,"$TERM_BAD"|*,"$TERM_GOOD"|*,skip)
index 474395471f623d6a02de9814a5490f3b1df3a0f1..87237b092b51df6255552f0756359eddf3b12042 100644 (file)
@@ -279,9 +279,6 @@ extern char *gitdirname(char *);
 #endif
 #include <openssl/ssl.h>
 #include <openssl/err.h>
-#ifdef NO_HMAC_CTX_CLEANUP
-#define HMAC_CTX_cleanup HMAC_cleanup
-#endif
 #endif
 
 /* On most systems <netdb.h> would have given us this, but
@@ -412,7 +409,9 @@ extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf,
 extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
 #ifndef NO_OPENSSL
 #ifdef APPLE_COMMON_CRYPTO
@@ -437,10 +436,14 @@ static inline int const_error(void)
        return -1;
 }
 #define error(...) (error(__VA_ARGS__), const_error())
+#define error_errno(...) (error_errno(__VA_ARGS__), const_error())
 #endif
 
 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 *);
 
@@ -474,6 +477,23 @@ static inline int skip_prefix(const char *str, const char *prefix,
        return 0;
 }
 
+/*
+ * Like skip_prefix, but promises never to read past "len" bytes of the input
+ * buffer, and returns the remaining number of bytes in "out" via "outlen".
+ */
+static inline int skip_prefix_mem(const char *buf, size_t len,
+                                 const char *prefix,
+                                 const char **out, size_t *outlen)
+{
+       size_t prefix_len = strlen(prefix);
+       if (prefix_len <= len && !memcmp(buf, prefix, prefix_len)) {
+               *out = buf + prefix_len;
+               *outlen = len - prefix_len;
+               return 1;
+       }
+       return 0;
+}
+
 /*
  * If buf ends with suffix, return 1 and subtract the length of the suffix
  * from *len. Otherwise, return 0 and leave *len untouched.
@@ -647,10 +667,22 @@ void *gitmemmem(const void *haystack, size_t haystacklen,
                 const void *needle, size_t needlelen);
 #endif
 
+#ifdef OVERRIDE_STRDUP
+#ifdef strdup
+#undef strdup
+#endif
+#define strdup gitstrdup
+char *gitstrdup(const char *s);
+#endif
+
 #ifdef NO_GETPAGESIZE
 #define getpagesize() sysconf(_SC_PAGESIZE)
 #endif
 
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
 #ifdef FREAD_READS_DIRECTORIES
 #ifdef fopen
 #undef fopen
@@ -769,6 +801,14 @@ extern FILE *fopen_for_writing(const char *path);
 #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
 #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
 
+#define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \
+       BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
+static inline void copy_array(void *dst, const void *src, size_t n, size_t size)
+{
+       if (n)
+               memcpy(dst, src, st_mult(size, n));
+}
+
 /*
  * These functions help you allocate structs with flex arrays, and copy
  * the data directly into the array. For example, if you had:
@@ -799,7 +839,7 @@ extern FILE *fopen_for_writing(const char *path);
  * you can do:
  *
  *   struct foo *f;
- *   FLEX_ALLOC_STR(f, name, src);
+ *   FLEXPTR_ALLOC_STR(f, name, src);
  *
  * and "name" will point to a block of memory after the struct, which will be
  * freed along with the struct (but the pointer can be repointed anywhere).
@@ -811,11 +851,14 @@ extern FILE *fopen_for_writing(const char *path);
  * times, and it must be assignable as an lvalue.
  */
 #define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \
-       (x) = NULL; /* silence -Wuninitialized for offset calculation */ \
-       (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \
+       size_t flex_array_len_ = (len); \
+       (x) = xcalloc(1, st_add3(sizeof(*(x)), flex_array_len_, 1)); \
+       memcpy((void *)(x)->flexname, (buf), flex_array_len_); \
 } while (0)
 #define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \
-       (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \
+       size_t flex_array_len_ = (len); \
+       (x) = xcalloc(1, st_add3(sizeof(*(x)), flex_array_len_, 1)); \
+       memcpy((x) + 1, (buf), flex_array_len_); \
        (x)->ptrname = (void *)((x)+1); \
 } while(0)
 #define FLEX_ALLOC_STR(x, flexname, str) \
@@ -823,14 +866,6 @@ extern FILE *fopen_for_writing(const char *path);
 #define FLEXPTR_ALLOC_STR(x, ptrname, str) \
        FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str))
 
-static inline void *xalloc_flex(size_t base_len, size_t offset,
-                               const void *src, size_t src_len)
-{
-       unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1));
-       memcpy(ret + offset, src, src_len);
-       return ret;
-}
-
 static inline char *xstrdup_or_null(const char *str)
 {
        return str ? xstrdup(str) : NULL;
@@ -945,6 +980,27 @@ 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 REG_STARTEND
+#error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd"
+#endif
+
+static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size,
+                             size_t nmatch, regmatch_t pmatch[], int eflags)
+{
+       assert(nmatch > 0 && pmatch);
+       pmatch[0].rm_so = 0;
+       pmatch[0].rm_eo = size;
+       return regexec(preg, buf, nmatch, pmatch, eflags | REG_STARTEND);
+}
+
 #ifndef DIR_HAS_BSD_GROUP_SEMANTICS
 # define FORCE_DIR_SET_GID S_ISGID
 #else
@@ -1045,4 +1101,6 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
 #define getc_unlocked(fh) getc(fh)
 #endif
 
+extern int cmd_main(int, const char **);
+
 #endif
index 02c0445be1057619e01e56bd6792f78fc011dc42..d50c85ed7ba719a0dc04f7ca96cf05216104599d 100755 (executable)
@@ -1156,7 +1156,7 @@ sub prepDirForOutput
     # FUTURE: This would more accurately emulate CVS by sending
     #   another copy of sticky after processing the files in that
     #   directory.  Or intermediate: perhaps send all sticky's for
-    #   $seendirs after after processing all files.
+    #   $seendirs after processing all files.
 }
 
 # update \n
@@ -2824,7 +2824,7 @@ sub statecleanup
 }
 
 # Return working directory CVS revision "1.X" out
-# of the the working directory "entries" state, for the given filename.
+# of the working directory "entries" state, for the given filename.
 # This is prefixed with a dash if the file is scheduled for removal
 # when it is committed.
 sub revparse
@@ -2935,7 +2935,7 @@ sub filecleanup
     return $filename;
 }
 
-# Remove prependdir from the path, so that is is relative to the directory
+# Remove prependdir from the path, so that it is relative to the directory
 # the CVS client was started from, rather than the top of the project.
 # Essentially the inverse of filecleanup().
 sub remove_prependdir
index 2b11b1d6fe33cf3f61dd35b8f48d6953f7a25bff..7bfb6737dfe7be46f3f29903bef844c3c2b1be11 100755 (executable)
@@ -44,10 +44,10 @@ launch_merge_tool () {
                        "$GIT_DIFF_PATH_TOTAL" "$MERGED"
                if use_ext_cmd
                then
-                       printf "Launch '%s' [Y/n]: " \
+                       printf "Launch '%s' [Y/n]? " \
                                "$GIT_DIFFTOOL_EXTCMD"
                else
-                       printf "Launch '%s' [Y/n]: " "$merge_tool"
+                       printf "Launch '%s' [Y/n]? " "$merge_tool"
                fi
                read ans || return
                if test "$ans" = n
@@ -86,6 +86,13 @@ else
        do
                launch_merge_tool "$1" "$2" "$5"
                status=$?
+               if test $status -ge 126
+               then
+                       # Command not found (127), not executable (126) or
+                       # exited via a signal (>= 128).
+                       exit $status
+               fi
+
                if test "$status" != 0 &&
                        test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
                then
index 488d14b153e50f69fcfb0c732cc8c23cf4b643de..e26294feab988d1bfc15d10acbe2774b29b5ec6f 100755 (executable)
@@ -37,14 +37,6 @@ USAGE
        exit($exitcode);
 }
 
-sub find_worktree
-{
-       # Git->repository->wc_path() does not honor changes to the working
-       # tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree'
-       # config variable.
-       return Git::command_oneline('rev-parse', '--show-toplevel');
-}
-
 sub print_tool_help
 {
        # See the comment at the bottom of file_diff() for the reason behind
@@ -67,14 +59,14 @@ sub exit_cleanup
 
 sub use_wt_file
 {
-       my ($repo, $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 = $repo->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);
 }
@@ -83,20 +75,17 @@ sub changed_files
 {
        my ($repo_path, $index, $worktree) = @_;
        $ENV{GIT_INDEX_FILE} = $index;
-       $ENV{GIT_WORK_TREE} = $worktree;
-       my $must_unset_git_dir = 0;
-       if (not defined($ENV{GIT_DIR})) {
-               $must_unset_git_dir = 1;
-               $ENV{GIT_DIR} = $repo_path;
-       }
 
-       my @refreshargs = qw/update-index --really-refresh -q --unmerged/;
-       my @gitargs = qw/diff-files --name-only -z/;
+       my @gitargs = ('--git-dir', $repo_path, '--work-tree', $worktree);
+       my @refreshargs = (
+               @gitargs, 'update-index',
+               '--really-refresh', '-q', '--unmerged');
        try {
                Git::command_oneline(@refreshargs);
        } catch Git::Error::Command with {};
 
-       my $line = Git::command_oneline(@gitargs);
+       my @diffargs = (@gitargs, 'diff-files', '--name-only', '-z');
+       my $line = Git::command_oneline(@diffargs);
        my @files;
        if (defined $line) {
                @files = split('\0', $line);
@@ -105,28 +94,23 @@ sub changed_files
        }
 
        delete($ENV{GIT_INDEX_FILE});
-       delete($ENV{GIT_WORK_TREE});
-       delete($ENV{GIT_DIR}) if ($must_unset_git_dir);
 
        return map { $_ => 1 } @files;
 }
 
 sub setup_dir_diff
 {
-       my ($repo, $workdir, $symlinks) = @_;
-
-       # Run the diff; exit immediately if no diff found
-       # 'Repository' and 'WorkingCopy' must be explicitly set to insure that
-       # if $GIT_DIR and $GIT_WORK_TREE are set in ENV, they are actually used
-       # by Git->repository->command*.
-       my $repo_path = $repo->repo_path();
-       my %repo_args = (Repository => $repo_path, WorkingCopy => $workdir);
-       my $diffrepo = Git->repository(%repo_args);
-
+       my ($worktree, $symlinks) = @_;
        my @gitargs = ('diff', '--raw', '--no-abbrev', '-z', @ARGV);
-       my $diffrtn = $diffrepo->command_oneline(@gitargs);
+       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';
@@ -137,7 +121,8 @@ 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;
@@ -175,12 +160,12 @@ EOF
 
                if ($lmode eq $symlink_mode) {
                        $symlink{$src_path}{left} =
-                               $diffrepo->command_oneline('show', "$lsha1");
+                               Git::command_oneline('show', $lsha1);
                }
 
                if ($rmode eq $symlink_mode) {
                        $symlink{$dst_path}{right} =
-                               $diffrepo->command_oneline('show', "$rsha1");
+                               Git::command_oneline('show', $rsha1);
                }
 
                if ($lmode ne $null_mode and $status !~ /^C/) {
@@ -188,10 +173,14 @@ EOF
                }
 
                if ($rmode ne $null_mode) {
-                       my ($use, $wt_sha1) = use_wt_file($repo, $workdir,
-                                                         $dst_path, $rsha1);
+                       # Avoid duplicate entries
+                       if ($working_tree_dups{$dst_path}++) {
+                               next;
+                       }
+                       my ($use, $wt_sha1) =
+                               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";
@@ -199,6 +188,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";
@@ -206,64 +199,52 @@ EOF
        mkpath($ldir) or exit_cleanup($tmpdir, 1);
        mkpath($rdir) or exit_cleanup($tmpdir, 1);
 
-       # If $GIT_DIR is not set prior to calling 'git update-index' and
-       # 'git checkout-index', then those commands will fail if difftool
-       # is called from a directory other than the repo root.
-       my $must_unset_git_dir = 0;
-       if (not defined($ENV{GIT_DIR})) {
-               $must_unset_git_dir = 1;
-               $ENV{GIT_DIR} = $repo_path;
-       }
-
        # Populate the left and right directories based on each index file
        my ($inpipe, $ctx);
        $ENV{GIT_INDEX_FILE} = "$tmpdir/lindex";
        ($inpipe, $ctx) =
-               $repo->command_input_pipe(qw(update-index -z --index-info));
+               Git::command_input_pipe('update-index', '-z', '--index-info');
        print($inpipe $lindex);
-       $repo->command_close_pipe($inpipe, $ctx);
+       Git::command_close_pipe($inpipe, $ctx);
 
        my $rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/");
        exit_cleanup($tmpdir, $rc) if $rc != 0;
 
        $ENV{GIT_INDEX_FILE} = "$tmpdir/rindex";
        ($inpipe, $ctx) =
-               $repo->command_input_pipe(qw(update-index -z --index-info));
+               Git::command_input_pipe('update-index', '-z', '--index-info');
        print($inpipe $rindex);
-       $repo->command_close_pipe($inpipe, $ctx);
+       Git::command_close_pipe($inpipe, $ctx);
 
        $rc = system('git', 'checkout-index', '--all', "--prefix=$rdir/");
        exit_cleanup($tmpdir, $rc) if $rc != 0;
 
        $ENV{GIT_INDEX_FILE} = "$tmpdir/wtindex";
        ($inpipe, $ctx) =
-               $repo->command_input_pipe(qw(update-index --info-only -z --index-info));
+               Git::command_input_pipe('update-index', '--info-only', '-z', '--index-info');
        print($inpipe $wtindex);
-       $repo->command_close_pipe($inpipe, $ctx);
+       Git::command_close_pipe($inpipe, $ctx);
 
        # If $GIT_DIR was explicitly set just for the update/checkout
        # commands, then it should be unset before continuing.
-       delete($ENV{GIT_DIR}) if ($must_unset_git_dir);
        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);
                }
@@ -273,7 +254,7 @@ EOF
        # temporary file to both the left and right directories to show the
        # change in the recorded SHA1 for the submodule.
        for my $path (keys %submodule) {
-               my $ok;
+               my $ok = 0;
                if (defined($submodule{$path}{left})) {
                        $ok = write_to_file("$ldir/$path",
                                "Subproject commit $submodule{$path}{left}");
@@ -289,7 +270,7 @@ EOF
        # shows only the link itself, not the contents of the link target.
        # This loop replicates that behavior.
        for my $path (keys %symlink) {
-               my $ok;
+               my $ok = 0;
                if (defined($symlink{$path}{left})) {
                        $ok = write_to_file("$ldir/$path",
                                        $symlink{$path}{left});
@@ -301,7 +282,7 @@ EOF
                exit_cleanup($tmpdir, 1) if not $ok;
        }
 
-       return ($ldir, $rdir, $tmpdir, @working_tree);
+       return ($ldir, $rdir, $tmpdir, @files);
 }
 
 sub write_to_file
@@ -410,9 +391,10 @@ sub dir_diff
        my $rc;
        my $error = 0;
        my $repo = Git->repository();
-       my $workdir = find_worktree();
-       my ($a, $b, $tmpdir, @worktree) =
-               setup_dir_diff($repo, $workdir, $symlinks);
+       my $repo_path = $repo->repo_path();
+       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);
@@ -433,31 +415,31 @@ 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->repo_path(),
-                               "$tmpdir/wtindex", "$workdir");
-                       %tmp_modified = changed_files($repo->repo_path(),
-                               "$tmpdir/wtindex", "$b");
+                       %wt_modified = changed_files(
+                               $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 .= "'$worktree/$file' and '$b/$file'.\n";
                        $errmsg .= "warning: Working tree file has been left.\n";
                        $errmsg .= "warning:\n";
                        warn $errmsg;
                        $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);
                }
        }
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 864b687057c9759f2b06a9a83e3ca18c51113d92..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,9 +370,15 @@ 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]
+       if {[is_config_true commit.gpgsign]} {
+               lappend cmd -S
+       }
        foreach p [concat $PARENT $MERGE_HEAD] {
                lappend cmd -p $p
        }
@@ -378,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.
        #
@@ -506,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 460d32fa22fc77f6621e5ec9a9c6ba6dc98050c2..9f253db5b37e5633c19914248a58a3f2feb3c512 100644 (file)
@@ -112,12 +112,16 @@ method _start {} {
        close $fh
        set _last_merged_branch $branch
 
-       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
+       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"]
@@ -149,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"
index 9aff249d5f533638170e7e14e03930a560978f46..208651c1afc1bdb6d8f7ee9ec8f2b9f08e7439b3 100644 (file)
@@ -1,47 +1,50 @@
 # Translation of git-gui to Japanese
 # Copyright (C) 2007 Shawn Pearce
 # This file is distributed under the same license as the git-gui package.
+#
 # しらいし ななこ <nanako3@bluebottle.com>, 2007.
+# Satoshi Yasushima <s.yasushima@gmail.com>, 2016.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: git-gui\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2010-02-02 19:03+0900\n"
-"Last-Translator: しらいし ななこ <nanako3@lavabit.com>\n"
+"POT-Creation-Date: 2016-05-27 17:52+0900\n"
+"PO-Revision-Date: 2016-06-22 12:50+0900\n"
+"Last-Translator: Satoshi Yasushima <s.yasushima@gmail.com>\n"
 "Language-Team: Japanese\n"
+"Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\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
-msgid "git-gui: fatal error"
-msgstr "git-gui: 致命的なエラー"
-
-#: git-gui.sh:743
+#: git-gui.sh:861
 #, tcl-format
 msgid "Invalid font specified in %s:"
 msgstr "%s に無効なフォントが指定されています:"
 
-#: git-gui.sh:779
+#: git-gui.sh:915
 msgid "Main Font"
 msgstr "主フォント"
 
-#: git-gui.sh:780
+#: git-gui.sh:916
 msgid "Diff/Console Font"
 msgstr "diff/コンソール・フォント"
 
-#: git-gui.sh:794
+#: 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: 致命的なエラー"
+
+#: git-gui.sh:932
 msgid "Cannot find git in PATH."
 msgstr "PATH 中に git が見つかりません"
 
-#: git-gui.sh:821
+#: git-gui.sh:959
 msgid "Cannot parse Git version string:"
 msgstr "Git バージョン名が理解できません:"
 
-#: git-gui.sh:839
+#: git-gui.sh:984
 #, tcl-format
 msgid ""
 "Git version cannot be determined.\n"
@@ -60,475 +63,502 @@ msgstr ""
 "\n"
 "'%s' はバージョン 1.5.0 と思って良いですか?\n"
 
-#: git-gui.sh:1128
+#: git-gui.sh:1281
 msgid "Git directory not found:"
 msgstr "Git ディレクトリが見つかりません:"
 
-#: git-gui.sh:1146
+#: git-gui.sh:1315
 msgid "Cannot move to top of working directory:"
 msgstr "作業ディレクトリの最上位に移動できません"
 
-#: git-gui.sh:1154
+#: git-gui.sh:1323
 msgid "Cannot use bare repository:"
 msgstr "裸のリポジトリは使えません:"
 
-#: git-gui.sh:1162
+#: git-gui.sh:1331
 msgid "No working directory"
 msgstr "作業ディレクトリがありません"
 
-#: git-gui.sh:1334 lib/checkout_op.tcl:306
+#: git-gui.sh:1503 lib/checkout_op.tcl:306
 msgid "Refreshing file status..."
 msgstr "ファイル状態を更新しています…"
 
-#: git-gui.sh:1390
+#: git-gui.sh:1563
 msgid "Scanning for modified files ..."
 msgstr "変更されたファイルをスキャンしています…"
 
-#: git-gui.sh:1454
+#: git-gui.sh:1639
 msgid "Calling prepare-commit-msg hook..."
 msgstr "prepare-commit-msg フックを実行中・・・"
 
-#: git-gui.sh:1471
+#: git-gui.sh:1656
 msgid "Commit declined by prepare-commit-msg hook."
 msgstr "prepare-commit-msg フックがコミットを拒否しました"
 
-#: git-gui.sh:1629 lib/browser.tcl:246
+#: git-gui.sh:1814 lib/browser.tcl:252
 msgid "Ready."
 msgstr "準備完了"
 
-#: git-gui.sh:1787
+#: git-gui.sh:1978
 #, tcl-format
-msgid "Displaying only %s of %s files."
-msgstr "全体で%s個の内の%sファイルだけ表示しています"
+msgid ""
+"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files."
+msgstr ""
+"表示可能な限界 (gui.maxfilesdisplayed = %s) に達しため、全体で%s個のファイル"
+"を表示できません"
 
-#: git-gui.sh:1913
+#: git-gui.sh:2101
 msgid "Unmodified"
 msgstr "変更無し"
 
-#: git-gui.sh:1915
+#: git-gui.sh:2103
 msgid "Modified, not staged"
 msgstr "変更あり、コミット未予定"
 
-#: git-gui.sh:1916 git-gui.sh:1924
+#: git-gui.sh:2104 git-gui.sh:2116
 msgid "Staged for commit"
 msgstr "コミット予定済"
 
-#: git-gui.sh:1917 git-gui.sh:1925
+#: git-gui.sh:2105 git-gui.sh:2117
 msgid "Portions staged for commit"
 msgstr "部分的にコミット予定済"
 
-#: git-gui.sh:1918 git-gui.sh:1926
+#: git-gui.sh:2106 git-gui.sh:2118
 msgid "Staged for commit, missing"
 msgstr "コミット予定済、ファイル無し"
 
-#: git-gui.sh:1920
+#: git-gui.sh:2108
 msgid "File type changed, not staged"
 msgstr "ファイル型変更、コミット未予定"
 
-#: git-gui.sh:1921
+#: git-gui.sh:2109 git-gui.sh:2110
+msgid "File type changed, old type staged for commit"
+msgstr "ファイル型変更、旧型コミット予定済"
+
+#: git-gui.sh:2111
 msgid "File type changed, staged"
 msgstr "ファイル型変更、コミット予定済"
 
-#: git-gui.sh:1923
+#: git-gui.sh:2112
+msgid "File type change staged, modification not staged"
+msgstr "ファイル型変更コミット予定済、変更コミット未予定"
+
+#: git-gui.sh:2113
+msgid "File type change staged, file missing"
+msgstr "ファイル型変更コミット予定済、ファイル無し"
+
+#: git-gui.sh:2115
 msgid "Untracked, not staged"
 msgstr "管理外、コミット未予定"
 
-#: git-gui.sh:1928
+#: git-gui.sh:2120
 msgid "Missing"
 msgstr "ファイル無し"
 
-#: git-gui.sh:1929
+#: git-gui.sh:2121
 msgid "Staged for removal"
 msgstr "削除予定済"
 
-#: git-gui.sh:1930
+#: git-gui.sh:2122
 msgid "Staged for removal, still present"
 msgstr "削除予定済、ファイル未削除"
 
-#: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935
-#: git-gui.sh:1936 git-gui.sh:1937
+#: 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 "要マージ解決"
 
-#: git-gui.sh:1972
+#: git-gui.sh:2164
 msgid "Starting gitk... please wait..."
 msgstr "gitk を起動中…お待ち下さい…"
 
-#: git-gui.sh:1984
+#: git-gui.sh:2176
 msgid "Couldn't find gitk in PATH"
 msgstr "PATH 中に gitk が見つかりません"
 
-#: git-gui.sh:2043
+#: git-gui.sh:2235
 msgid "Couldn't find git gui in PATH"
 msgstr "PATH 中に git gui が見つかりません"
 
-#: git-gui.sh:2455 lib/choose_repository.tcl:36
+#: git-gui.sh:2654 lib/choose_repository.tcl:41
 msgid "Repository"
 msgstr "リポジトリ"
 
-#: git-gui.sh:2456
+#: git-gui.sh:2655
 msgid "Edit"
 msgstr "編集"
 
-#: git-gui.sh:2458 lib/choose_rev.tcl:561
+#: git-gui.sh:2657 lib/choose_rev.tcl:567
 msgid "Branch"
 msgstr "ブランチ"
 
-#: git-gui.sh:2461 lib/choose_rev.tcl:548
+#: git-gui.sh:2660 lib/choose_rev.tcl:554
 msgid "Commit@@noun"
 msgstr "コミット"
 
-#: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
+#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
 msgid "Merge"
 msgstr "マージ"
 
-#: git-gui.sh:2465 lib/choose_rev.tcl:557
+#: git-gui.sh:2664 lib/choose_rev.tcl:563
 msgid "Remote"
 msgstr "リモート"
 
-#: git-gui.sh:2468
+#: git-gui.sh:2667
 msgid "Tools"
 msgstr "ツール"
 
-#: git-gui.sh:2477
+#: git-gui.sh:2676
 msgid "Explore Working Copy"
 msgstr "ワーキングコピーをブラウズ"
 
-#: git-gui.sh:2483
+#: git-gui.sh:2682
+msgid "Git Bash"
+msgstr ""
+
+#: git-gui.sh:2692
 msgid "Browse Current Branch's Files"
 msgstr "現在のブランチのファイルを見る"
 
-#: git-gui.sh:2487
+#: git-gui.sh:2696
 msgid "Browse Branch Files..."
 msgstr "ブランチのファイルを見る…"
 
-#: git-gui.sh:2492
+#: git-gui.sh:2701
 msgid "Visualize Current Branch's History"
 msgstr "現在のブランチの履歴を見る"
 
-#: git-gui.sh:2496
+#: git-gui.sh:2705
 msgid "Visualize All Branch History"
 msgstr "全てのブランチの履歴を見る"
 
-#: git-gui.sh:2503
+#: git-gui.sh:2712
 #, tcl-format
 msgid "Browse %s's Files"
 msgstr "ブランチ %s のファイルを見る"
 
-#: git-gui.sh:2505
+#: git-gui.sh:2714
 #, tcl-format
 msgid "Visualize %s's History"
 msgstr "ブランチ %s の履歴を見る"
 
-#: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67
+#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66
 msgid "Database Statistics"
 msgstr "データベース統計"
 
-#: git-gui.sh:2513 lib/database.tcl:34
+#: git-gui.sh:2722 lib/database.tcl:33
 msgid "Compress Database"
 msgstr "データベース圧縮"
 
-#: git-gui.sh:2516
+#: git-gui.sh:2725
 msgid "Verify Database"
 msgstr "データベース検証"
 
-#: git-gui.sh:2523 git-gui.sh:2527 git-gui.sh:2531 lib/shortcut.tcl:8
+#: 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 "デスクトップ・アイコンを作る"
 
-#: git-gui.sh:2539 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191
+#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
 msgid "Quit"
 msgstr "終了"
 
-#: git-gui.sh:2547
+#: git-gui.sh:2756
 msgid "Undo"
 msgstr "元に戻す"
 
-#: git-gui.sh:2550
+#: git-gui.sh:2759
 msgid "Redo"
 msgstr "やり直し"
 
-#: git-gui.sh:2554 git-gui.sh:3109
+#: git-gui.sh:2763 git-gui.sh:3368
 msgid "Cut"
 msgstr "切り取り"
 
-#: git-gui.sh:2557 git-gui.sh:3112 git-gui.sh:3186 git-gui.sh:3259
+#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530
 #: lib/console.tcl:69
 msgid "Copy"
 msgstr "コピー"
 
-#: git-gui.sh:2560 git-gui.sh:3115
+#: git-gui.sh:2769 git-gui.sh:3374
 msgid "Paste"
 msgstr "貼り付け"
 
-#: git-gui.sh:2563 git-gui.sh:3118 lib/branch_delete.tcl:26
-#: lib/remote_branch_delete.tcl:38
+#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39
+#: lib/branch_delete.tcl:28
 msgid "Delete"
 msgstr "削除"
 
-#: git-gui.sh:2567 git-gui.sh:3122 git-gui.sh:3263 lib/console.tcl:71
+#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71
 msgid "Select All"
 msgstr "全て選択"
 
-#: git-gui.sh:2576
+#: git-gui.sh:2785
 msgid "Create..."
 msgstr "作成…"
 
-#: git-gui.sh:2582
+#: git-gui.sh:2791
 msgid "Checkout..."
 msgstr "チェックアウト"
 
-#: git-gui.sh:2588
+#: git-gui.sh:2797
 msgid "Rename..."
 msgstr "名前変更…"
 
-#: git-gui.sh:2593
+#: git-gui.sh:2802
 msgid "Delete..."
 msgstr "削除…"
 
-#: git-gui.sh:2598
+#: git-gui.sh:2807
 msgid "Reset..."
 msgstr "リセット…"
 
-#: git-gui.sh:2608
+#: git-gui.sh:2817
 msgid "Done"
 msgstr "完了"
 
-#: git-gui.sh:2610
+#: git-gui.sh:2819
 msgid "Commit@@verb"
 msgstr "コミット"
 
-#: git-gui.sh:2619 git-gui.sh:3050
+#: git-gui.sh:2828 git-gui.sh:3309
 msgid "New Commit"
 msgstr "新規コミット"
 
-#: git-gui.sh:2627 git-gui.sh:3057
+#: git-gui.sh:2836 git-gui.sh:3316
 msgid "Amend Last Commit"
 msgstr "最新コミットを訂正"
 
-#: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99
+#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101
 msgid "Rescan"
 msgstr "再スキャン"
 
-#: git-gui.sh:2643
+#: git-gui.sh:2852
 msgid "Stage To Commit"
 msgstr "コミット予定する"
 
-#: git-gui.sh:2649
+#: git-gui.sh:2858
 msgid "Stage Changed Files To Commit"
 msgstr "変更されたファイルをコミット予定"
 
-#: git-gui.sh:2655
+#: git-gui.sh:2864
 msgid "Unstage From Commit"
 msgstr "コミットから降ろす"
 
-#: git-gui.sh:2661 lib/index.tcl:412
+#: git-gui.sh:2870 lib/index.tcl:442
 msgid "Revert Changes"
 msgstr "変更を元に戻す"
 
-#: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341
+#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612
 msgid "Show Less Context"
 msgstr "文脈を少なく"
 
-#: git-gui.sh:2673 git-gui.sh:3314 git-gui.sh:3345
+#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616
 msgid "Show More Context"
 msgstr "文脈を多く"
 
-#: git-gui.sh:2680 git-gui.sh:3024 git-gui.sh:3133
+#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392
 msgid "Sign Off"
 msgstr "署名"
 
-#: git-gui.sh:2696
+#: git-gui.sh:2905
 msgid "Local Merge..."
 msgstr "ローカル・マージ…"
 
-#: git-gui.sh:2701
+#: git-gui.sh:2910
 msgid "Abort Merge..."
 msgstr "マージ中止…"
 
-#: git-gui.sh:2713 git-gui.sh:2741
+#: git-gui.sh:2922 git-gui.sh:2950
 msgid "Add..."
 msgstr "追加"
 
-#: git-gui.sh:2717
+#: git-gui.sh:2926
 msgid "Push..."
 msgstr "プッシュ…"
 
-#: git-gui.sh:2721
+#: git-gui.sh:2930
 msgid "Delete Branch..."
 msgstr "ブランチ削除..."
 
-#: git-gui.sh:2731 git-gui.sh:3292
+#: git-gui.sh:2940 git-gui.sh:3563
 msgid "Options..."
 msgstr "オプション…"
 
-#: git-gui.sh:2742
+#: git-gui.sh:2951
 msgid "Remove..."
 msgstr "削除..."
 
-#: git-gui.sh:2751 lib/choose_repository.tcl:50
+#: git-gui.sh:2960 lib/choose_repository.tcl:55
 msgid "Help"
 msgstr "ヘルプ"
 
-#: git-gui.sh:2755 git-gui.sh:2759 lib/about.tcl:14
-#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
+#: git-gui.sh:2964 git-gui.sh:2968 lib/about.tcl:14
+#: lib/choose_repository.tcl:49 lib/choose_repository.tcl:58
 #, tcl-format
 msgid "About %s"
 msgstr "%s について"
 
-#: git-gui.sh:2783
+#: git-gui.sh:2992
 msgid "Online Documentation"
 msgstr "オンライン・ドキュメント"
 
-#: git-gui.sh:2786 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
+#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
 msgid "Show SSH Key"
 msgstr "SSH キーを表示"
 
-#: git-gui.sh:2893
+#: git-gui.sh:3014 git-gui.sh:3146
+msgid "Usage"
+msgstr "使い方"
+
+#: git-gui.sh:3095 lib/blame.tcl:573
+msgid "Error"
+msgstr "エラー"
+
+#: git-gui.sh:3126
 #, tcl-format
 msgid "fatal: cannot stat path %s: No such file or directory"
 msgstr ""
 "致命的: パス %s が stat できません。そのようなファイルやディレクトリはありま"
 "せん"
 
-#: git-gui.sh:2926
+#: git-gui.sh:3159
 msgid "Current Branch:"
 msgstr "現在のブランチ"
 
-#: git-gui.sh:2947
+#: git-gui.sh:3185
 msgid "Staged Changes (Will Commit)"
 msgstr "ステージングされた(コミット予定済の)変更"
 
-#: git-gui.sh:2967
+#: git-gui.sh:3205
 msgid "Unstaged Changes"
 msgstr "コミット予定に入っていない変更"
 
-#: git-gui.sh:3017
+#: git-gui.sh:3276
 msgid "Stage Changed"
 msgstr "変更をコミット予定に入れる"
 
-#: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193
+#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229
 msgid "Push"
 msgstr "プッシュ"
 
-#: git-gui.sh:3071
+#: git-gui.sh:3330
 msgid "Initial Commit Message:"
 msgstr "最初のコミットメッセージ:"
 
-#: git-gui.sh:3072
+#: git-gui.sh:3331
 msgid "Amended Commit Message:"
 msgstr "訂正したコミットメッセージ:"
 
-#: git-gui.sh:3073
+#: git-gui.sh:3332
 msgid "Amended Initial Commit Message:"
 msgstr "訂正した最初のコミットメッセージ:"
 
-#: git-gui.sh:3074
+#: git-gui.sh:3333
 msgid "Amended Merge Commit Message:"
 msgstr "訂正したマージコミットメッセージ:"
 
-#: git-gui.sh:3075
+#: git-gui.sh:3334
 msgid "Merge Commit Message:"
 msgstr "マージコミットメッセージ:"
 
-#: git-gui.sh:3076
+#: git-gui.sh:3335
 msgid "Commit Message:"
 msgstr "コミットメッセージ:"
 
-#: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73
+#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73
 msgid "Copy All"
 msgstr "全てコピー"
 
-#: git-gui.sh:3149 lib/blame.tcl:104
+#: git-gui.sh:3408 lib/blame.tcl:105
 msgid "File:"
 msgstr "ファイル:"
 
-#: git-gui.sh:3255
+#: git-gui.sh:3526
 msgid "Refresh"
 msgstr "再読み込み"
 
-#: git-gui.sh:3276
+#: git-gui.sh:3547
 msgid "Decrease Font Size"
 msgstr "フォントを小さく"
 
-#: git-gui.sh:3280
+#: git-gui.sh:3551
 msgid "Increase Font Size"
 msgstr "フォントを大きく"
 
-#: git-gui.sh:3288 lib/blame.tcl:281
+#: git-gui.sh:3559 lib/blame.tcl:294
 msgid "Encoding"
 msgstr "エンコーディング"
 
-#: git-gui.sh:3299
+#: git-gui.sh:3570
 msgid "Apply/Reverse Hunk"
 msgstr "パッチを適用/取り消す"
 
-#: git-gui.sh:3304
+#: git-gui.sh:3575
 msgid "Apply/Reverse Line"
 msgstr "パッチ行を適用/取り消す"
 
-#: git-gui.sh:3323
+#: git-gui.sh:3594
 msgid "Run Merge Tool"
 msgstr "マージツールを起動"
 
-#: git-gui.sh:3328
+#: git-gui.sh:3599
 msgid "Use Remote Version"
 msgstr "リモートの方を採用"
 
-#: git-gui.sh:3332
+#: git-gui.sh:3603
 msgid "Use Local Version"
 msgstr "ローカルの方を採用"
 
-#: git-gui.sh:3336
+#: git-gui.sh:3607
 msgid "Revert To Base"
 msgstr "ベース版を採用"
 
-#: git-gui.sh:3354
+#: git-gui.sh:3625
 msgid "Visualize These Changes In The Submodule"
 msgstr "サブモジュール内のこれらの変更を見る"
 
-#: git-gui.sh:3358
+#: git-gui.sh:3629
 msgid "Visualize Current Branch History In The Submodule"
 msgstr "サブモジュール内で現在のブランチの履歴を見る"
 
-#: git-gui.sh:3362
+#: git-gui.sh:3633
 msgid "Visualize All Branch History In The Submodule"
 msgstr "サブモジュール内で全てのブランチの履歴を見る"
 
-#: git-gui.sh:3367
+#: git-gui.sh:3638
 msgid "Start git gui In The Submodule"
 msgstr "サブモジュール内でgit guiを起動する"
 
-#: git-gui.sh:3389
+#: git-gui.sh:3673
 msgid "Unstage Hunk From Commit"
 msgstr "パッチをコミット予定から外す"
 
-#: git-gui.sh:3391
+#: git-gui.sh:3675
 msgid "Unstage Lines From Commit"
 msgstr "コミット予定から行を外す"
 
-#: git-gui.sh:3393
+#: git-gui.sh:3677
 msgid "Unstage Line From Commit"
 msgstr "コミット予定から行を外す"
 
-#: git-gui.sh:3396
+#: git-gui.sh:3680
 msgid "Stage Hunk For Commit"
 msgstr "パッチをコミット予定に加える"
 
-#: git-gui.sh:3398
+#: git-gui.sh:3682
 msgid "Stage Lines For Commit"
 msgstr "パッチ行をコミット予定に加える"
 
-#: git-gui.sh:3400
+#: git-gui.sh:3684
 msgid "Stage Line For Commit"
 msgstr "パッチ行をコミット予定に加える"
 
-#: git-gui.sh:3424
+#: git-gui.sh:3709
 msgid "Initializing..."
 msgstr "初期化しています…"
 
-#: git-gui.sh:3541
+#: git-gui.sh:3852
 #, tcl-format
 msgid ""
 "Possible environment issues exist.\n"
@@ -543,7 +573,7 @@ msgstr ""
 "以下の環境変数は %s が起動する Git サブプロセスによって無視されるでしょう:\n"
 "\n"
 
-#: git-gui.sh:3570
+#: git-gui.sh:3881
 msgid ""
 "\n"
 "This is due to a known issue with the\n"
@@ -553,7 +583,7 @@ msgstr ""
 "これは Cygwin で配布されている Tcl バイナリに\n"
 "関しての既知の問題によります"
 
-#: git-gui.sh:3575
+#: git-gui.sh:3886
 #, tcl-format
 msgid ""
 "\n"
@@ -568,249 +598,294 @@ msgstr ""
 "個人的な ~/.gitconfig ファイル内で user.name と user.email の値を設定\n"
 "するのが、%s の良い代用となります\n"
 
-#: lib/about.tcl:26
-msgid "git-gui - a graphical user interface for Git."
-msgstr "Git のグラフィカルUI git-gui"
+#: 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/blame.tcl:72
-msgid "File Viewer"
-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"
 
-#: lib/blame.tcl:78
-msgid "Commit:"
-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"
+msgstr ""
+"衝突のあったマージの途中です。\n"
+"\n"
+"ファイル %s にはマージ中の衝突が残っています。\n"
+"\n"
+"このファイルの衝突を解決し、コミット予定に加えて、コミットすることでマージを"
+"完了します。そうやって始めて、新たなマージを開始できるようになります。\n"
 
-#: lib/blame.tcl:271
-msgid "Copy Commit"
-msgstr "コミットをコピー"
+#: 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 ""
+"変更の途中です。\n"
+"\n"
+"ファイル %s は変更中です。\n"
+"\n"
+"現在のコミットを完了してからマージを開始して下さい。そうする方がマージに失敗"
+"したときの回復が楽です。\n"
 
-#: lib/blame.tcl:275
-msgid "Find Text..."
-msgstr "テキストを検索"
+#: lib/merge.tcl:108
+#, tcl-format
+msgid "%s of %s"
+msgstr "%s の %s ブランチ"
 
-#: lib/blame.tcl:284
-msgid "Do Full Copy Detection"
-msgstr "コピー検知"
+#: lib/merge.tcl:122
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "%s と %s をマージ中・・・"
 
-#: lib/blame.tcl:288
-msgid "Show History Context"
-msgstr "文脈を見せる"
+#: lib/merge.tcl:133
+msgid "Merge completed successfully."
+msgstr "マージが完了しました"
 
-#: lib/blame.tcl:291
-msgid "Blame Parent Commit"
-msgstr "親コミットを註釈"
+#: lib/merge.tcl:135
+msgid "Merge failed.  Conflict resolution is required."
+msgstr "マージが失敗しました。衝突の解決が必要です。"
 
-#: lib/blame.tcl:450
+#: lib/merge.tcl:160
 #, tcl-format
-msgid "Reading %s..."
-msgstr "%s ã\82\92読ã\82\93ã\81§ã\81\84ã\81¾ã\81\99â\80¦"
+msgid "Merge Into %s"
+msgstr "%s ã\81«ã\83\9eã\83¼ã\82¸"
 
-#: lib/blame.tcl:557
-msgid "Loading copy/move tracking annotations..."
-msgstr "コピー・移動追跡データを読んでいます…"
+#: lib/merge.tcl:166 lib/checkout_op.tcl:567 lib/tools_dlg.tcl:336
+msgid "Visualize"
+msgstr "可視化"
 
-#: lib/blame.tcl:577
-msgid "lines annotated"
-msgstr "行を注釈しました"
+#: lib/merge.tcl:174 lib/remote_branch_delete.tcl:43 lib/branch_delete.tcl:34
+#: lib/checkout_op.tcl:579 lib/branch_rename.tcl:32 lib/tools_dlg.tcl:41
+#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/option.tcl:127
+#: lib/transport.tcl:141 lib/choose_font.tcl:45 lib/branch_checkout.tcl:30
+#: lib/browser.tcl:292 lib/remote_add.tcl:34 lib/branch_create.tcl:37
+msgid "Cancel"
+msgstr "中止"
 
-#: lib/blame.tcl:769
-msgid "Loading original location annotations..."
-msgstr "元位置行の注釈データを読んでいます…"
+#: lib/merge.tcl:179
+msgid "Revision To Merge"
+msgstr "マージするリビジョン"
 
-#: lib/blame.tcl:772
-msgid "Annotation complete."
-msgstr "注釈完了しました"
+#: lib/merge.tcl:214
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr ""
+"訂正中には中止できません。\n"
+"\n"
+"まず今のコミット訂正を完了させて下さい。\n"
 
-#: lib/blame.tcl:802
-msgid "Busy"
-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/blame.tcl:803
-msgid "Annotation process is already running."
-msgstr "すでに blame プロセスを実行中です。"
+#: 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 ""
+"変更点をリセットしますか?\n"
+"\n"
+"変更点をリセットすると、コミットしていない全ての変更が失われます。\n"
+"\n"
+"リセットしてよろしいですか?"
 
-#: lib/blame.tcl:842
-msgid "Running thorough copy detection..."
-msgstr "コピー検知を実行中…"
+#: lib/merge.tcl:241
+msgid "Aborting"
+msgstr "中断しています"
 
-#: lib/blame.tcl:910
-msgid "Loading annotation..."
-msgstr "注釈を読み込んでいます…"
+#: lib/merge.tcl:241
+msgid "files reset"
+msgstr "リセットしたファイル"
 
-#: lib/blame.tcl:963
-msgid "Author:"
-msgstr "ä½\9cè\80\85:"
+#: lib/merge.tcl:269
+msgid "Abort failed."
+msgstr "中æ\96­ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82"
 
-#: lib/blame.tcl:967
-msgid "Committer:"
-msgstr "コミット者:"
+#: lib/merge.tcl:271
+msgid "Abort completed.  Ready."
+msgstr "中断完了。"
 
-#: lib/blame.tcl:972
-msgid "Original File:"
-msgstr "元ファイル"
+#: lib/error.tcl:20 lib/error.tcl:116
+msgid "error"
+msgstr "エラー"
 
-#: lib/blame.tcl:1020
-msgid "Cannot find HEAD commit:"
-msgstr "HEAD コミットが見つかりません"
+#: lib/error.tcl:36
+msgid "warning"
+msgstr "警告"
 
-#: lib/blame.tcl:1075
-msgid "Cannot find parent commit:"
-msgstr "親コミットが見つかりません:"
+#: lib/error.tcl:96
+msgid "You must correct the above errors before committing."
+msgstr "コミットする前に、以上のエラーを修正して下さい"
 
-#: lib/blame.tcl:1090
-msgid "Unable to display parent"
-msgstr "親を表示できません"
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Git から出た無効な日付: %s"
 
-#: lib/blame.tcl:1091 lib/diff.tcl:320
-msgid "Error loading diff:"
-msgstr "diff を読む際のエラーです:"
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "デフォールト"
 
-#: lib/blame.tcl:1231
-msgid "Originally By:"
-msgstr "原作者:"
+#: lib/encoding.tcl:448
+#, tcl-format
+msgid "System (%s)"
+msgstr "システム (%s)"
 
-#: lib/blame.tcl:1237
-msgid "In File:"
-msgstr "ã\83\95ã\82¡ã\82¤ã\83«:"
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "ã\81\9dã\81®ä»\96"
 
-#: lib/blame.tcl:1242
-msgid "Copied Or Moved Here By:"
-msgstr "複写・移動者:"
+#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "リモートブランチ削除"
 
-#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
-msgid "Checkout Branch"
-msgstr "ブランチをチェックアウト"
+#: lib/remote_branch_delete.tcl:48
+msgid "From Repository"
+msgstr "元のリポジトリ"
 
-#: lib/branch_checkout.tcl:23
-msgid "Checkout"
-msgstr "ã\83\81ã\82§ã\83\83ã\82¯ã\82¢ã\82¦ã\83\88"
+#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:165
+msgid "Remote:"
+msgstr "ã\83ªã\83¢ã\83¼ã\83\88:"
 
-#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
-#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282
-#: lib/checkout_op.tcl:579 lib/choose_font.tcl:43 lib/merge.tcl:172
-#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42
-#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352
-#: lib/transport.tcl:108
-msgid "Cancel"
-msgstr "中止"
+#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187
+msgid "Arbitrary Location:"
+msgstr "任意の位置:"
 
-#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328
-msgid "Revision"
-msgstr "ã\83ªã\83\93ã\82¸ã\83§ã\83³"
+#: lib/remote_branch_delete.tcl:88
+msgid "Branches"
+msgstr "ã\83\96ã\83©ã\83³ã\83\81"
 
-#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280
-msgid "Options"
-msgstr "オプション"
+#: lib/remote_branch_delete.tcl:110
+msgid "Delete Only If"
+msgstr "条件付で削除"
 
-#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
-msgid "Fetch Tracking Branch"
-msgstr "ã\83\88ã\83©ã\83\83ã\82­ã\83³ã\82°ã\83»ã\83\96ã\83©ã\83³ã\83\81ã\82\92ã\83\95ã\82§ã\83\83ã\83\81"
+#: lib/remote_branch_delete.tcl:112
+msgid "Merged Into:"
+msgstr "ã\83\9eã\83¼ã\82¸å\85\88:"
 
-#: lib/branch_checkout.tcl:44
-msgid "Detach From Local Branch"
-msgstr "ローカル・ブランチから削除"
+#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
+msgid "Always (Do not perform merge checks)"
+msgstr "無条件(マージ検査をしない)"
 
-#: lib/branch_create.tcl:22
-msgid "Create Branch"
-msgstr "ブランチを作成"
-
-#: lib/branch_create.tcl:27
-msgid "Create New Branch"
-msgstr "ブランチを新規作成"
-
-#: lib/branch_create.tcl:31 lib/choose_repository.tcl:381
-msgid "Create"
-msgstr "作成"
-
-#: lib/branch_create.tcl:40
-msgid "Branch Name"
-msgstr "ブランチ名"
-
-#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
-msgid "Name:"
-msgstr "名前:"
-
-#: lib/branch_create.tcl:58
-msgid "Match Tracking Branch Name"
-msgstr "トラッキング・ブランチ名を合わせる"
-
-#: lib/branch_create.tcl:66
-msgid "Starting Revision"
-msgstr "初期リビジョン"
-
-#: lib/branch_create.tcl:72
-msgid "Update Existing Branch:"
-msgstr "既存のブランチを更新:"
-
-#: lib/branch_create.tcl:75
-msgid "No"
-msgstr "いいえ"
+#: lib/remote_branch_delete.tcl:153
+msgid "A branch is required for 'Merged Into'."
+msgstr "'マージ先' にはブランチが必要です。"
 
-#: lib/branch_create.tcl:80
-msgid "Fast Forward Only"
-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/branch_create.tcl:85 lib/checkout_op.tcl:571
-msgid "Reset"
-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/branch_create.tcl:97
-msgid "Checkout After Creation"
-msgstr "作成してすぐチェックアウト"
+#: lib/remote_branch_delete.tcl:208
+msgid "Please select one or more branches to delete."
+msgstr "削除するブランチを選択して下さい。"
 
-#: lib/branch_create.tcl:131
-msgid "Please select a tracking branch."
-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/branch_create.tcl:140
+#: lib/remote_branch_delete.tcl:227
 #, tcl-format
-msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "トラッキング・ブランチ %s は遠隔リポジトリのブランチではありません。"
+msgid "Deleting branches from %s"
+msgstr "%s からブランチを削除しています。"
 
-#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
-msgid "Please supply a branch name."
-msgstr "ã\83\96ã\83©ã\83³ã\83\81å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¦ä¸\8bã\81\95ã\81\84。"
+#: lib/remote_branch_delete.tcl:300
+msgid "No repository selected."
+msgstr "ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81\8cé\81¸æ\8a\9eã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\9bã\82\93。"
 
-#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
+#: lib/remote_branch_delete.tcl:305
 #, tcl-format
-msgid "'%s' is not an acceptable branch name."
-msgstr "'%s' はブランチ名に使えません。"
+msgid "Scanning %s..."
+msgstr "%s をスキャンしています…"
 
-#: lib/branch_delete.tcl:15
+#: lib/branch_delete.tcl:16
 msgid "Delete Branch"
 msgstr "ブランチ削除"
 
-#: lib/branch_delete.tcl:20
+#: lib/branch_delete.tcl:21
 msgid "Delete Local Branch"
 msgstr "ローカル・ブランチを削除"
 
-#: lib/branch_delete.tcl:37
+#: lib/branch_delete.tcl:39
 msgid "Local Branches"
 msgstr "ローカル・ブランチ"
 
-#: lib/branch_delete.tcl:52
+#: lib/branch_delete.tcl:51
 msgid "Delete Only If Merged Into"
 msgstr "マージ済みの時のみ削除"
 
-#: lib/branch_delete.tcl:54 lib/remote_branch_delete.tcl:119
-msgid "Always (Do not perform merge checks)"
-msgstr "無条件(マージ検査をしない)"
-
 #: lib/branch_delete.tcl:103
 #, tcl-format
 msgid "The following branches are not completely merged into %s:"
 msgstr "以下のブランチは %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"
-"選択したブランチを削除して良いですか?"
-
 #: lib/branch_delete.tcl:141
 #, tcl-format
 msgid ""
@@ -820,62 +895,63 @@ msgstr ""
 "以下のブランチを削除できません:\n"
 "%s"
 
-#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
-msgid "Rename Branch"
-msgstr "ブランチの名前変更"
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "分離されたチェックアウト"
 
-#: lib/branch_rename.tcl:26
-msgid "Rename"
-msgstr "名前変更"
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "リビジョン式:"
 
-#: lib/branch_rename.tcl:36
-msgid "Branch:"
-msgstr "ã\83\96ã\83©ã\83³ã\83\81:"
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "ã\83­ã\83¼ã\82«ã\83«ã\83»ã\83\96ã\83©ã\83³ã\83\81"
 
-#: lib/branch_rename.tcl:39
-msgid "New Name:"
-msgstr "新しい名前:"
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "トラッキング・ブランチ"
 
-#: lib/branch_rename.tcl:75
-msgid "Please select a branch to rename."
-msgstr "名前を変更するブランチを選んで下さい。"
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "タグ"
 
-#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202
+#: lib/choose_rev.tcl:321
 #, tcl-format
-msgid "Branch '%s' already exists."
-msgstr "'%s'というブランチは既に存在します。"
+msgid "Invalid revision: %s"
+msgstr "無効なリビジョン: %s"
 
-#: lib/branch_rename.tcl:117
-#, tcl-format
-msgid "Failed to rename '%s'."
-msgstr "'%s'の名前変更に失敗しました。"
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "リビジョンが未選択です。"
 
-#: lib/browser.tcl:17
-msgid "Starting..."
-msgstr "起動中…"
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "リビジョン式が空です。"
 
-#: lib/browser.tcl:26
-msgid "File Browser"
-msgstr "ファイル・ブラウザ"
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "更新しました"
 
-#: lib/browser.tcl:126 lib/browser.tcl:143
-#, tcl-format
-msgid "Loading %s..."
-msgstr "%s をロード中…"
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "URL"
 
-#: lib/browser.tcl:187
-msgid "[Up To Parent]"
-msgstr "[上位フォルダへ]"
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "実行中…お待ち下さい…"
 
-#: lib/browser.tcl:267 lib/browser.tcl:273
-msgid "Browse Branch Files"
-msgstr "現在のブランチのファイルを見る"
+#: lib/console.tcl:81 lib/checkout_op.tcl:146 lib/database.tcl:30
+#: lib/sshkey.tcl:55
+msgid "Close"
+msgstr "閉じる"
 
-#: lib/browser.tcl:278 lib/choose_repository.tcl:398
-#: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497
-#: lib/choose_repository.tcl:1028
-msgid "Browse"
-msgstr "ブラウズ"
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "成功"
+
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "エラー: コマンドが失敗しました"
 
 #: lib/checkout_op.tcl:85
 #, tcl-format
@@ -887,11 +963,6 @@ msgstr "%s から %s をフェッチしています"
 msgid "fatal: Cannot resolve %s"
 msgstr "致命的エラー: %s を解決できません"
 
-#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:31
-#: lib/sshkey.tcl:53
-msgid "Close"
-msgstr "閉じる"
-
 #: lib/checkout_op.tcl:175
 #, tcl-format
 msgid "Branch '%s' does not exist."
@@ -902,6 +973,11 @@ msgstr "ブランチ'%s'は存在しません。"
 msgid "Failed to configure simplified git-pull for '%s'."
 msgstr "'%s' に簡易 git-pull を設定できませんでした"
 
+#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "'%s'というブランチは既に存在します。"
+
 #: lib/checkout_op.tcl:229
 #, tcl-format
 msgid ""
@@ -999,9 +1075,9 @@ msgstr "失なわれたコミットを回復するのは簡単ではありませ
 msgid "Reset '%s'?"
 msgstr "'%s' をリセットしますか?"
 
-#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343
-msgid "Visualize"
-msgstr "可視化"
+#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85
+msgid "Reset"
+msgstr "リセット"
 
 #: lib/checkout_op.tcl:635
 #, tcl-format
@@ -1019,1537 +1095,1590 @@ msgstr ""
 "ましたが、 Git の内部データを更新できませんでした。\n"
 "起こるはずのないエラーです。あきらめて %s を終了します。"
 
-#: lib/choose_font.tcl:39
-msgid "Select"
-msgstr "選択"
+#: lib/blame.tcl:73
+msgid "File Viewer"
+msgstr "ファイルピューワ"
 
-#: lib/choose_font.tcl:53
-msgid "Font Family"
-msgstr "ã\83\95ã\82©ã\83³ã\83\88ã\83»ã\83\95ã\82¡ã\83\9fã\83ªã\83¼"
+#: lib/blame.tcl:79
+msgid "Commit:"
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88:"
 
-#: lib/choose_font.tcl:74
-msgid "Font Size"
-msgstr "ã\83\95ã\82©ã\83³ã\83\88ã\81®å¤§ã\81\8dã\81\95"
+#: lib/blame.tcl:280
+msgid "Copy Commit"
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\82\92ã\82³ã\83\94ã\83¼"
 
-#: lib/choose_font.tcl:91
-msgid "Font Example"
-msgstr "ã\83\95ã\82©ã\83³ã\83\88ã\83»ã\82µã\83³ã\83\97ã\83«"
+#: lib/blame.tcl:284
+msgid "Find Text..."
+msgstr "ã\83\86ã\82­ã\82¹ã\83\88ã\82\92æ¤\9cç´¢"
 
-#: lib/choose_font.tcl:103
-msgid ""
-"This is example text.\n"
-"If you like this text, it can be your font."
-msgstr ""
-"これはサンプル文です。\n"
-"このフォントが気に入ればお使いになれます。"
+#: lib/blame.tcl:288
+msgid "Goto Line..."
+msgstr "指定行に移動…"
 
-#: lib/choose_repository.tcl:28
-msgid "Git Gui"
-msgstr "Git GUI"
+#: lib/blame.tcl:297
+msgid "Do Full Copy Detection"
+msgstr "コピー検知"
 
-#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:386
-msgid "Create New Repository"
-msgstr "æ\96°ã\81\97ã\81\84ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\82\92ä½\9cる"
+#: lib/blame.tcl:301
+msgid "Show History Context"
+msgstr "æ\96\87è\84\88ã\82\92è¦\8bã\81\9bる"
 
-#: lib/choose_repository.tcl:93
-msgid "New..."
-msgstr "新規…"
+#: lib/blame.tcl:304
+msgid "Blame Parent Commit"
+msgstr "親コミットを注釈"
 
-#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471
-msgid "Clone Existing Repository"
-msgstr "既存リポジトリを複製する"
+#: lib/blame.tcl:466
+#, tcl-format
+msgid "Reading %s..."
+msgstr "%s を読んでいます…"
 
-#: lib/choose_repository.tcl:106
-msgid "Clone..."
-msgstr "複製…"
+#: lib/blame.tcl:594
+msgid "Loading copy/move tracking annotations..."
+msgstr "コピー・移動追跡データを読んでいます…"
 
-#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016
-msgid "Open Existing Repository"
-msgstr "既存リポジトリを開く"
+#: lib/blame.tcl:614
+msgid "lines annotated"
+msgstr "行を注釈しました"
 
-#: lib/choose_repository.tcl:119
-msgid "Open..."
-msgstr "開く…"
+#: lib/blame.tcl:806
+msgid "Loading original location annotations..."
+msgstr "元位置行の注釈データを読んでいます…"
 
-#: lib/choose_repository.tcl:132
-msgid "Recent Repositories"
-msgstr "æ\9c\80è¿\91使ã\81£ã\81\9fã\83ªã\83\9dã\82¸ã\83\88ã\83ª"
+#: lib/blame.tcl:809
+msgid "Annotation complete."
+msgstr "注é\87\88å®\8cäº\86ã\81\97ã\81¾ã\81\97ã\81\9f"
 
-#: lib/choose_repository.tcl:138
-msgid "Open Recent Repository:"
-msgstr "最近使ったリポジトリを開く"
+#: lib/blame.tcl:839
+msgid "Busy"
+msgstr "実行中"
 
-#: lib/choose_repository.tcl:306 lib/choose_repository.tcl:313
-#: lib/choose_repository.tcl:320
-#, tcl-format
-msgid "Failed to create repository %s:"
-msgstr "リポジトリ %s を作製できません:"
+#: lib/blame.tcl:840
+msgid "Annotation process is already running."
+msgstr "すでに blame プロセスを実行中です。"
 
-#: lib/choose_repository.tcl:391
-msgid "Directory:"
-msgstr "ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª:"
+#: lib/blame.tcl:879
+msgid "Running thorough copy detection..."
+msgstr "ã\82³ã\83\94ã\83¼æ¤\9cç\9f¥ã\82\92å®\9fè¡\8c中â\80¦"
 
-#: lib/choose_repository.tcl:423 lib/choose_repository.tcl:550
-#: lib/choose_repository.tcl:1052
-msgid "Git Repository"
-msgstr "GIT リポジトリ"
+#: lib/blame.tcl:947
+msgid "Loading annotation..."
+msgstr "注釈を読み込んでいます…"
 
-#: lib/choose_repository.tcl:448
-#, tcl-format
-msgid "Directory %s already exists."
-msgstr "ディレクトリ '%s' は既に存在します。"
+#: lib/blame.tcl:1000
+msgid "Author:"
+msgstr "作者:"
 
-#: lib/choose_repository.tcl:452
-#, tcl-format
-msgid "File %s already exists."
-msgstr "ファイル '%s' は既に存在します。"
+#: lib/blame.tcl:1004
+msgid "Committer:"
+msgstr "コミット者:"
 
-#: lib/choose_repository.tcl:466
-msgid "Clone"
-msgstr "複製"
+#: lib/blame.tcl:1009
+msgid "Original File:"
+msgstr "元ファイル"
 
-#: lib/choose_repository.tcl:479
-msgid "Source Location:"
-msgstr "ソースの位置"
+#: lib/blame.tcl:1057
+msgid "Cannot find HEAD commit:"
+msgstr "HEAD コミットが見つかりません"
 
-#: lib/choose_repository.tcl:490
-msgid "Target Directory:"
-msgstr "先ディレクトリ:"
+#: lib/blame.tcl:1112
+msgid "Cannot find parent commit:"
+msgstr "親コミットが見つかりません:"
+
+#: lib/blame.tcl:1127
+msgid "Unable to display parent"
+msgstr "親を表示できません"
+
+#: lib/blame.tcl:1128 lib/diff.tcl:356
+msgid "Error loading diff:"
+msgstr "diff を読む際のエラーです:"
+
+#: lib/blame.tcl:1269
+msgid "Originally By:"
+msgstr "原作者:"
+
+#: lib/blame.tcl:1275
+msgid "In File:"
+msgstr "ファイル:"
+
+#: lib/blame.tcl:1280
+msgid "Copied Or Moved Here By:"
+msgstr "複写・移動者:"
+
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "Git のグラフィカルUI git-gui"
+
+#: 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 "新しいリポジトリを作る"
+
+#: 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:407 lib/branch_create.tcl:33
+msgid "Create"
+msgstr "作成"
+
+#: lib/choose_repository.tcl:417
+msgid "Directory:"
+msgstr "ディレクトリ:"
+
+#: lib/choose_repository.tcl:422 lib/choose_repository.tcl:509
+#: lib/choose_repository.tcl:518 lib/choose_repository.tcl:1074
+#: lib/browser.tcl:288
+msgid "Browse"
+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:502
+#: 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:508
+#: lib/choose_repository.tcl:528
 msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
 msgstr "標準(高速・中冗長度・ハードリンク)"
 
-#: lib/choose_repository.tcl:514
+#: lib/choose_repository.tcl:533
 msgid "Full Copy (Slower, Redundant Backup)"
 msgstr "全複写(低速・冗長バックアップ)"
 
-#: lib/choose_repository.tcl:520
+#: lib/choose_repository.tcl:538
 msgid "Shared (Fastest, Not Recommended, No Backup)"
 msgstr "共有(最高速・非推奨・バックアップ無し)"
 
-#: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603
-#: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819
-#: lib/choose_repository.tcl:1058 lib/choose_repository.tcl:1066
+#: 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:592
+#: lib/choose_repository.tcl:615
 msgid "Standard only available for local repository."
 msgstr "標準方式は同一計算機上のリポジトリにのみ使えます。"
 
-#: lib/choose_repository.tcl:596
+#: lib/choose_repository.tcl:619
 msgid "Shared only available for local repository."
 msgstr "共有方式は同一計算機上のリポジトリにのみ使えます。"
 
-#: lib/choose_repository.tcl:617
+#: lib/choose_repository.tcl:640
 #, tcl-format
 msgid "Location %s already exists."
 msgstr "'%s' は既に存在します。"
 
-#: lib/choose_repository.tcl:628
+#: lib/choose_repository.tcl:651
 msgid "Failed to configure origin"
 msgstr "origin を設定できませんでした"
 
-#: lib/choose_repository.tcl:640
+#: lib/choose_repository.tcl:663
 msgid "Counting objects"
 msgstr "オブジェクトを数えています"
 
-#: lib/choose_repository.tcl:641
+#: lib/choose_repository.tcl:664
 msgid "buckets"
 msgstr "バケツ"
 
-#: lib/choose_repository.tcl:665
+#: lib/choose_repository.tcl:688
 #, tcl-format
 msgid "Unable to copy objects/info/alternates: %s"
 msgstr "objects/info/alternates を複写できません: %s"
 
-#: lib/choose_repository.tcl:701
+#: lib/choose_repository.tcl:724
 #, tcl-format
 msgid "Nothing to clone from %s."
 msgstr "%s から複製する内容はありません"
 
-#: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917
-#: lib/choose_repository.tcl:929
+#: 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:716
+#: lib/choose_repository.tcl:739
 msgid "Hardlinks are unavailable.  Falling back to copying."
 msgstr "ハードリンクが作れないので、コピーします"
 
-#: lib/choose_repository.tcl:728
+#: lib/choose_repository.tcl:751
 #, tcl-format
 msgid "Cloning from %s"
 msgstr "%s から複製しています"
 
-#: lib/choose_repository.tcl:759
+#: lib/choose_repository.tcl:782
 msgid "Copying objects"
 msgstr "オブジェクトを複写しています"
 
-#: lib/choose_repository.tcl:760
+#: lib/choose_repository.tcl:783
 msgid "KiB"
 msgstr "KiB"
 
-#: lib/choose_repository.tcl:784
+#: lib/choose_repository.tcl:807
 #, tcl-format
 msgid "Unable to copy object: %s"
 msgstr "オブジェクトを複写できません: %s"
 
-#: lib/choose_repository.tcl:794
+#: lib/choose_repository.tcl:817
 msgid "Linking objects"
 msgstr "オブジェクトを連結しています"
 
-#: lib/choose_repository.tcl:795
+#: lib/choose_repository.tcl:818
 msgid "objects"
 msgstr "オブジェクト"
 
-#: lib/choose_repository.tcl:803
+#: lib/choose_repository.tcl:826
 #, tcl-format
 msgid "Unable to hardlink object: %s"
 msgstr "オブジェクトをハードリンクできません: %s"
 
-#: lib/choose_repository.tcl:858
+#: lib/choose_repository.tcl:881
 msgid "Cannot fetch branches and objects.  See console output for details."
 msgstr "ブランチやオブジェクトを取得できません。コンソール出力を見て下さい"
 
-#: lib/choose_repository.tcl:869
+#: lib/choose_repository.tcl:892
 msgid "Cannot fetch tags.  See console output for details."
 msgstr "タグを取得できません。コンソール出力を見て下さい"
 
-#: lib/choose_repository.tcl:893
+#: lib/choose_repository.tcl:916
 msgid "Cannot determine HEAD.  See console output for details."
 msgstr "HEAD を確定できません。コンソール出力を見て下さい"
 
-#: lib/choose_repository.tcl:902
+#: lib/choose_repository.tcl:925
 #, tcl-format
 msgid "Unable to cleanup %s"
 msgstr "%s を掃除できません"
 
-#: lib/choose_repository.tcl:908
+#: lib/choose_repository.tcl:931
 msgid "Clone failed."
 msgstr "複写に失敗しました。"
 
-#: lib/choose_repository.tcl:915
+#: lib/choose_repository.tcl:938
 msgid "No default branch obtained."
 msgstr "デフォールト・ブランチが取得されませんでした"
 
-#: lib/choose_repository.tcl:926
+#: lib/choose_repository.tcl:949
 #, tcl-format
 msgid "Cannot resolve %s as a commit."
 msgstr "%s をコミットとして解釈できません"
 
-#: lib/choose_repository.tcl:938
+#: lib/choose_repository.tcl:961
 msgid "Creating working directory"
 msgstr "作業ディレクトリを作成しています"
 
-#: lib/choose_repository.tcl:939 lib/index.tcl:67 lib/index.tcl:130
-#: lib/index.tcl:198
+#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
+#: lib/index.tcl:207
 msgid "files"
 msgstr "ファイル"
 
-#: lib/choose_repository.tcl:968
+#: 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:1011
+#: lib/choose_repository.tcl:1059
 msgid "Open"
 msgstr "開く"
 
-#: lib/choose_repository.tcl:1021
+#: lib/choose_repository.tcl:1069
 msgid "Repository:"
 msgstr "リポジトリ:"
 
-#: lib/choose_repository.tcl:1072
+#: lib/choose_repository.tcl:1118
 #, tcl-format
 msgid "Failed to open repository %s:"
 msgstr "リポジトリ %s を開けません:"
 
-#: lib/choose_rev.tcl:53
-msgid "This Detached Checkout"
-msgstr "分離されたチェックアウト"
+#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
+msgid "Rename Branch"
+msgstr "ブランチの名前変更"
 
-#: lib/choose_rev.tcl:60
-msgid "Revision Expression:"
-msgstr "リビジョン式:"
+#: lib/branch_rename.tcl:28
+msgid "Rename"
+msgstr "名前変更"
 
-#: lib/choose_rev.tcl:74
-msgid "Local Branch"
-msgstr "ã\83­ã\83¼ã\82«ã\83«ã\83»ã\83\96ã\83©ã\83³ã\83\81"
+#: lib/branch_rename.tcl:38
+msgid "Branch:"
+msgstr "ã\83\96ã\83©ã\83³ã\83\81:"
 
-#: lib/choose_rev.tcl:79
-msgid "Tracking Branch"
-msgstr "トラッキング・ブランチ"
+#: lib/branch_rename.tcl:46
+msgid "New Name:"
+msgstr "新しい名前:"
 
-#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
-msgid "Tag"
-msgstr "タグ"
+#: lib/branch_rename.tcl:81
+msgid "Please select a branch to rename."
+msgstr "名前を変更するブランチを選んで下さい。"
 
-#: lib/choose_rev.tcl:317
-#, tcl-format
-msgid "Invalid revision: %s"
-msgstr "無効なリビジョン: %s"
+#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
+msgid "Please supply a branch name."
+msgstr "ブランチ名を指定して下さい。"
 
-#: lib/choose_rev.tcl:338
-msgid "No revision selected."
-msgstr "リビジョンが未選択です。"
+#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
+#, tcl-format
+msgid "'%s' is not an acceptable branch name."
+msgstr "'%s' はブランチ名に使えません。"
 
-#: lib/choose_rev.tcl:346
-msgid "Revision expression is empty."
-msgstr "リビジョン式が空です。"
+#: lib/branch_rename.tcl:123
+#, tcl-format
+msgid "Failed to rename '%s'."
+msgstr "'%s'の名前変更に失敗しました。"
 
-#: lib/choose_rev.tcl:531
-msgid "Updated"
-msgstr "更新しました"
+#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
+msgid "Cannot write shortcut:"
+msgstr "ショートカットが書けません:"
 
-#: lib/choose_rev.tcl:559
-msgid "URL"
-msgstr "URL"
+#: lib/shortcut.tcl:137
+msgid "Cannot write icon:"
+msgstr "アイコンが書けません:"
 
-#: 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/search.tcl:48
+msgid "Find:"
+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/search.tcl:50
+msgid "Next"
+msgstr "次"
 
-#: lib/commit.tcl:48
-msgid "Error loading commit data for amend:"
-msgstr "訂正するコミットのデータを読めません:"
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr ""
 
-#: lib/commit.tcl:75
-msgid "Unable to obtain your identity:"
-msgstr "ユーザの正体を確認できません:"
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "正規表現"
 
-#: lib/commit.tcl:80
-msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "GIT_COMMITTER_IDENT が無効です:"
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "大文字小文字を区別"
 
-#: lib/commit.tcl:129
+#: lib/status_bar.tcl:87
 #, tcl-format
-msgid "warning: Tcl does not support encoding '%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"
-"\n"
-"The rescan will be automatically started now.\n"
-msgstr ""
-"最後にスキャンした状態はリポジトリの状態と合致しません。\n"
-"\n"
-"最後にスキャンして以後、別の Git プログラムがリポジトリを変更しています。新し"
-"くコミットする前に、再スキャンが必要です。\n"
-"\n"
-"自動的に再スキャンを開始します。\n"
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%1$s ... %4$*i %6$s 中の %2$*i (%7$3i%%)"
 
-#: 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"
+#: lib/tools_dlg.tcl:22
+msgid "Add Tool"
+msgstr "ツールの追加"
 
-#: lib/commit.tcl:180
-#, 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/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "新規ツールコマンドの追加"
 
-#: 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"
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "全体に追加"
 
-#: lib/commit.tcl:203
-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"
-"- 第1行: 何をしたか、を1行で要約。\n"
-"- 第2行: 空白\n"
-"- 残りの行: なぜ、この変更が良い変更か、の説明。\n"
+#: lib/tools_dlg.tcl:37 lib/remote_add.tcl:30
+msgid "Add"
+msgstr "追加"
 
-#: lib/commit.tcl:234
-msgid "Calling pre-commit hook..."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88å\89\8dã\83\95ã\83\83ã\82¯ã\82\92å®\9fè¡\8c中ã\83»ã\83»ã\83»"
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "ã\83\84ã\83¼ã\83«ã\81®è©³ç´°"
 
-#: lib/commit.tcl:249
-msgid "Commit declined by pre-commit hook."
-msgstr "コミット前フックがコミットを拒否しました"
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "'/' でサブメニューを区切ります:"
 
-#: lib/commit.tcl:272
-msgid "Calling commit-msg hook..."
-msgstr "コミット・メッセージ・フックを実行中・・・"
+#: lib/tools_dlg.tcl:51 lib/remote_add.tcl:41 lib/branch_create.tcl:44
+msgid "Name:"
+msgstr "名前:"
 
-#: lib/commit.tcl:287
-msgid "Commit declined by commit-msg hook."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\83»ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\83»ã\83\95ã\83\83ã\82¯ã\81\8cã\82³ã\83\9fã\83\83ã\83\88ã\82\92æ\8b\92å\90¦ã\81\97ã\81¾ã\81\97ã\81\9f"
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "ã\82³ã\83\9eã\83³ã\83\89:"
 
-#: lib/commit.tcl:300
-msgid "Committing changes..."
-msgstr "変更点をコミット中・・・"
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "起動する前にダイアログを表示"
 
-#: lib/commit.tcl:316
-msgid "write-tree failed:"
-msgstr "write-tree が失敗しました:"
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "ユーザにコミットを一つ選ばせる ($REVISION にセットします)"
 
-#: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382
-msgid "Commit failed."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82"
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr "ã\83¦ã\83¼ã\82¶ã\81«ä»\96ã\81®å¼\95æ\95°ã\82\92追å\8a ã\81\95ã\81\9bã\82\8b ($ARGS ã\81«ã\82»ã\83\83ã\83\88ã\81\97ã\81¾ã\81\99)"
 
-#: lib/commit.tcl:334
+#: 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/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "ツール名を指定して下さい。"
+
+#: lib/tools_dlg.tcl:126
 #, tcl-format
-msgid "Commit %s appears to be corrupt"
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88 %s ã\81¯å£\8aã\82\8cã\81¦ã\81\84ã\81¾ã\81\99"
+msgid "Tool '%s' already exists."
+msgstr "ã\83\84ã\83¼ã\83« '%s' ã\81¯æ\97¢ã\81«å­\98å\9c¨ã\81\97ã\81¾ã\81\99ã\80\82"
 
-#: lib/commit.tcl:339
+#: lib/tools_dlg.tcl:148
+#, tcl-format
 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"
+"Could not add tool:\n"
+"%s"
 msgstr ""
-"コミットする変更がありません。\n"
-"\n"
-"マージでなく、また、一つも変更点がありません。\n"
-"\n"
-"自動的に再スキャンを開始します。\n"
+"ツールを追加できません:\n"
+"%s"
 
-#: lib/commit.tcl:346
-msgid "No changes to commit."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\81\99ã\82\8bå¤\89æ\9b´ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82"
+#: lib/tools_dlg.tcl:187
+msgid "Remove Tool"
+msgstr "ã\83\84ã\83¼ã\83«ã\81®å\89\8aé\99¤"
 
-#: lib/commit.tcl:360
-msgid "commit-tree failed:"
-msgstr "commit-tree が失敗しました:"
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "ツールコマンドの削除"
 
-#: lib/commit.tcl:381
-msgid "update-ref failed:"
-msgstr "update-ref が失敗しました:"
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "削除"
 
-#: lib/commit.tcl:469
-#, tcl-format
-msgid "Created commit %s: %s"
-msgstr "コミット %s を作成しました: %s"
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(青色はローカルレポジトリのツールです)"
 
-#: lib/console.tcl:59
-msgid "Working... please wait..."
-msgstr "実行中…お待ち下さい…"
+#: lib/tools_dlg.tcl:292
+#, tcl-format
+msgid "Run Command: %s"
+msgstr "コマンドを起動: %s"
 
-#: lib/console.tcl:186
-msgid "Success"
-msgstr "成功"
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "引数"
 
-#: lib/console.tcl:200
-msgid "Error: Command Failed"
-msgstr "ã\82¨ã\83©ã\83¼: ã\82³ã\83\9eã\83³ã\83\89ã\81\8c失æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9f"
+#: lib/tools_dlg.tcl:321 lib/branch_checkout.tcl:35 lib/browser.tcl:297
+msgid "Revision"
+msgstr "ã\83ªã\83\93ã\82¸ã\83§ã\83³"
 
-#: lib/database.tcl:43
-msgid "Number of loose objects"
-msgstr "ばらばらなオブジェクトの数"
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "OK"
 
-#: lib/database.tcl:44
-msgid "Disk space used by loose objects"
-msgstr "ばらばらなオブジェクトの使用するディスク量"
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "ファイルを選択してから %s を起動してください。"
 
-#: lib/database.tcl:45
-msgid "Number of packed objects"
-msgstr "パックされたオブジェクトの数"
+#: lib/tools.tcl:91
+#, tcl-format
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "本当にファイル \"%2$s\"で %1$s を起動しますか?"
 
-#: lib/database.tcl:46
-msgid "Number of packs"
-msgstr "パックの数"
+#: lib/tools.tcl:95
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "本当に %s を起動しますか?"
 
-#: lib/database.tcl:47
-msgid "Disk space used by packed objects"
-msgstr "パックされたオブジェクトの使用するディスク量"
+#: lib/tools.tcl:116
+#, tcl-format
+msgid "Tool: %s"
+msgstr "ツール: %s"
 
-#: lib/database.tcl:48
-msgid "Packed objects waiting for pruning"
-msgstr "パックに存在するので捨てて良いオブジェクトの数"
+#: lib/tools.tcl:117
+#, tcl-format
+msgid "Running: %s"
+msgstr "実行中: %s"
 
-#: lib/database.tcl:49
-msgid "Garbage files"
-msgstr "ゴミファイル"
+#: lib/tools.tcl:155
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "ツールが完了しました: %s"
 
-#: lib/database.tcl:72
-msgid "Compressing the object database"
-msgstr "データベース圧縮"
+#: lib/tools.tcl:157
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "ツールが失敗しました: %s"
 
-#: lib/database.tcl:83
-msgid "Verifying the object database with fsck-objects"
-msgstr "fsck-objects でオブジェクト・データベースを検証しています"
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+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/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "自分の側の版を使いますか?"
 
-#: lib/date.tcl:25
-#, tcl-format
-msgid "Invalid date from Git: %s"
-msgstr "Git から出た無効な日付: %s"
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "相手制の版を使いますか?"
 
-#: lib/diff.tcl:64
+#: lib/mergetool.tcl:14
 #, tcl-format
 msgid ""
-"No differences detected.\n"
-"\n"
-"%s has no changes.\n"
+"Note that the diff shows only conflicting changes.\n"
 "\n"
-"The modification date of this file was updated by another application, but "
-"the content within the file was not changed.\n"
+"%s will be overwritten.\n"
 "\n"
-"A rescan will be automatically started to find other files which may have "
-"the same state."
+"This operation can be undone only by restarting the merge."
 msgstr ""
-"変更がありません。\n"
-"\n"
-"%s には変更がありません。\n"
+"競合する変更点だけが表示されていることに注意してください。\n"
 "\n"
-"このファイルの変更時刻は他のアプリケーションによって更新されていますがファイ"
-"ル内容には変更がありません。\n"
+"%s は上書きされます。\n"
 "\n"
-"同様な状態のファイルを探すために、自動的に再スキャンを開始します。"
+"やり直すにはマージ全体をやり直してください。"
 
-#: lib/diff.tcl:104
+#: lib/mergetool.tcl:45
 #, tcl-format
-msgid "Loading diff of %s..."
-msgstr "%s の変更点をロード中…"
-
-#: lib/diff.tcl:125
-msgid ""
-"LOCAL: deleted\n"
-"REMOTE:\n"
+msgid "File %s seems to have unresolved conflicts, still stage?"
 msgstr ""
-"LOCAL: 削除\n"
-"Remote:\n"
+"ファイル %s には解決していない競合部分がまだあるようですが、いいですか?"
 
-#: lib/diff.tcl:130
-msgid ""
-"REMOTE: deleted\n"
-"LOCAL:\n"
-msgstr ""
-"REMOTE: 削除\n"
-"LOCAL:\n"
+#: lib/mergetool.tcl:60
+#, tcl-format
+msgid "Adding resolution for %s"
+msgstr "%s への解決をステージします"
 
-#: lib/diff.tcl:137
-msgid "LOCAL:\n"
-msgstr "LOCAL:\n"
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
+msgstr "ツールでは削除やリンク競合は扱えません"
 
-#: lib/diff.tcl:140
-msgid "REMOTE:\n"
-msgstr "REMOTE\n"
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "競合ファイルは存在しません。"
 
-#: lib/diff.tcl:202 lib/diff.tcl:319
+#: lib/mergetool.tcl:246
 #, tcl-format
-msgid "Unable to display %s"
-msgstr "%s を表示できません"
-
-#: lib/diff.tcl:203
-msgid "Error loading file:"
-msgstr "ファイルを読む際のエラーです:"
+msgid "Not a GUI merge tool: '%s'"
+msgstr "GUI マージツールではありません: %s"
 
-#: lib/diff.tcl:210
-msgid "Git Repository (subproject)"
-msgstr "Git リポジトリ(サブプロジェクト)"
+#: lib/mergetool.tcl:275
+#, tcl-format
+msgid "Unsupported merge tool '%s'"
+msgstr "マージツール '%s' はサポートしていません"
 
-#: lib/diff.tcl:222
-msgid "* Binary file (not showing content)."
-msgstr "* バイナリファイル(内容は表示しません)"
+#: lib/mergetool.tcl:310
+msgid "Merge tool is already running, terminate it?"
+msgstr "マージツールはすでに起動しています。終了しますか?"
 
-#: lib/diff.tcl:227
+#: lib/mergetool.tcl:330
 #, tcl-format
 msgid ""
-"* Untracked file is %d bytes.\n"
-"* Showing only first %d bytes.\n"
+"Error retrieving versions:\n"
+"%s"
 msgstr ""
-"* 管理外のファイルの大きさは %d バイトです。\n"
-"* 最初の %d バイトだけ表示しています。\n"
+"版の取り出し時にエラーが出ました:\n"
+"%s"
 
-#: lib/diff.tcl:233
+#: lib/mergetool.tcl:350
 #, tcl-format
 msgid ""
+"Could not start the merge tool:\n"
 "\n"
-"* Untracked file clipped here by %s.\n"
-"* To see the entire file, use an external editor.\n"
+"%s"
 msgstr ""
+"マージツールが起動できません:\n"
 "\n"
-"\n"
-"* %s は管理外のファイルをここで切りおとしました。\n"
-"* 全体を見るには外部エディタを使ってください。\n"
-
-#: lib/diff.tcl:482
-msgid "Failed to unstage selected hunk."
-msgstr "選択されたパッチをコミット予定から外せません。"
+"%s"
 
-#: lib/diff.tcl:489
-msgid "Failed to stage selected hunk."
-msgstr "選択されたパッチをコミット予定に加えられません。"
+#: lib/mergetool.tcl:354
+msgid "Running merge tool..."
+msgstr "マージツールを実行しています..."
 
-#: lib/diff.tcl:568
-msgid "Failed to unstage selected line."
-msgstr "選択されたパッチ行をコミット予定から外せません。"
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
+msgid "Merge tool failed."
+msgstr "マージツールが失敗しました。"
 
-#: lib/diff.tcl:576
-msgid "Failed to stage selected line."
-msgstr "選択されたパッチ行をコミット予定に加えられません。"
+#: lib/option.tcl:11
+#, tcl-format
+msgid "Invalid global encoding '%s'"
+msgstr "全体エンコーディングに 無効な %s が指定されています"
 
-#: lib/encoding.tcl:443
-msgid "Default"
-msgstr "デフォールト"
+#: lib/option.tcl:19
+#, tcl-format
+msgid "Invalid repo encoding '%s'"
+msgstr "リポジトリエンコーディングに 無効な %s が指定されています"
 
-#: lib/encoding.tcl:448
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "既定値に戻す"
+
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "保存"
+
+#: lib/option.tcl:133
 #, tcl-format
-msgid "System (%s)"
-msgstr "システム (%s)"
+msgid "%s Repository"
+msgstr "%s リポジトリ"
 
-#: lib/encoding.tcl:459 lib/encoding.tcl:465
-msgid "Other"
-msgstr "その他"
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "大域(全てのリポジトリ)"
 
-#: lib/error.tcl:20 lib/error.tcl:114
-msgid "error"
-msgstr "ã\82¨ã\83©ã\83¼"
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "ã\83¦ã\83¼ã\82¶å\90\8d"
 
-#: lib/error.tcl:36
-msgid "warning"
-msgstr "警告"
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "電子メールアドレス"
 
-#: lib/error.tcl:94
-msgid "You must correct the above errors before committing."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\81\99ã\82\8bå\89\8dã\81«ã\80\81以ä¸\8aã\81®ã\82¨ã\83©ã\83¼ã\82\92修正ã\81\97ã\81¦ä¸\8bã\81\95ã\81\84"
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "ã\83\9eã\83¼ã\82¸ã\82³ã\83\9fã\83\83ã\83\88ã\81®è¦\81ç´\84"
 
-#: lib/index.tcl:6
-msgid "Unable to unlock the index."
-msgstr "ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93"
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "ã\83\9eã\83¼ã\82¸ã\81®å\86\97é\95·åº¦"
 
-#: lib/index.tcl:15
-msgid "Index Error"
-msgstr "索引エラー"
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "マージ後に diffstat を表示"
 
-#: lib/index.tcl:17
-msgid ""
-"Updating the Git index failed.  A rescan will be automatically started to "
-"resynchronize git-gui."
-msgstr ""
-"GIT インデックスの更新が失敗しました。git-gui と同期をとるために再スキャンし"
-"ます。"
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "マージツールを使用"
 
-#: lib/index.tcl:28
-msgid "Continue"
-msgstr "続行"
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "ファイル変更時刻を信頼する"
 
-#: lib/index.tcl:31
-msgid "Unlock Index"
-msgstr "ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81®ã\83­ã\83\83ã\82¯è§£é\99¤"
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "ã\83\95ã\82§ã\83\83ã\83\81中ã\81«ã\83\88ã\83©ã\83\83ã\82­ã\83³ã\82°ã\83\96ã\83©ã\83³ã\83\81ã\82\92å\88\88ã\82\8b"
 
-#: lib/index.tcl:289
-#, tcl-format
-msgid "Unstaging %s from commit"
-msgstr "コミットから '%s' を降ろす"
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "トラッキングブランチを合わせる"
 
-#: lib/index.tcl:328
-msgid "Ready to commit."
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88æº\96å\82\99å®\8cäº\86"
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "diff ã\81¨æ³¨é\87\88ã\81« textconv ã\82\92使ã\81\86"
 
-#: lib/index.tcl:341
-#, tcl-format
-msgid "Adding %s"
-msgstr "コミットに %s を加えています"
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "変更されたファイルのみコピー検知を行なう"
 
-#: lib/index.tcl:398
-#, tcl-format
-msgid "Revert changes in file %s?"
-msgstr "ファイル %s にした変更を元に戻しますか?"
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "最近使ったリポジトリ一覧の上限"
 
-#: lib/index.tcl:400
-#, tcl-format
-msgid "Revert changes in these %i files?"
-msgstr "これら %i 個のファイルにした変更を元に戻しますか?"
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "コピーを検知する最少文字数"
 
-#: lib/index.tcl:408
-msgid "Any unstaged changes will be permanently lost by the revert."
-msgstr "変更を元に戻すとコミット予定していない変更は全て失われます。"
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "注釈する履歴半径(日数)"
 
-#: lib/index.tcl:411
-msgid "Do Nothing"
-msgstr "何もしない"
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "diff の文脈行数"
 
-#: lib/index.tcl:429
-msgid "Reverting selected files"
-msgstr "選択されたファイルにした変更を元に戻します"
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "diff の追加引数"
 
-#: lib/index.tcl:433
-#, tcl-format
-msgid "Reverting %s"
-msgstr "%s にした変更を元に戻します"
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "コミットメッセージのテキスト幅"
 
-#: 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/option.tcl:159
+msgid "New Branch Name Template"
+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"
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+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"
-msgstr ""
-"衝突のあったマージの途中です。\n"
-"\n"
-"ファイル %s にはマージ中の衝突が残っています。\n"
-"\n"
-"このファイルの衝突を解決し、コミット予定に加えて、コミットすることでマージを"
-"完了します。そうやって始めて、新たなマージを開始できるようになります。\n"
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "分離 HEAD のコミット前に警告する"
 
-#: 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 ""
-"変更の途中です。\n"
-"\n"
-"ファイル %s は変更中です。\n"
-"\n"
-"現在のコミットを完了してからマージを開始して下さい。そうする方がマージに失敗"
-"したときの回復が楽です。\n"
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "管理外のファイルをコミット予定する"
 
-#: lib/merge.tcl:107
-#, tcl-format
-msgid "%s of %s"
-msgstr "%s の %s ブランチ"
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "管理外のファイルを表示する"
 
-#: lib/merge.tcl:120
-#, tcl-format
-msgid "Merging %s and %s..."
-msgstr "%s と %s をマージ中・・・"
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "タブ幅"
 
-#: lib/merge.tcl:131
-msgid "Merge completed successfully."
-msgstr "マージが完了しました"
+#: lib/option.tcl:210
+msgid "Change"
+msgstr "変更"
 
-#: lib/merge.tcl:133
-msgid "Merge failed.  Conflict resolution is required."
-msgstr "マージが失敗しました。衝突の解決が必要です。"
+#: lib/option.tcl:254
+msgid "Spelling Dictionary:"
+msgstr "スペルチェック辞書"
+
+#: lib/option.tcl:284
+msgid "Change Font"
+msgstr "フォントを変更"
 
-#: lib/merge.tcl:158
+#: lib/option.tcl:288
 #, tcl-format
-msgid "Merge Into %s"
-msgstr "%s ã\81«ã\83\9eã\83¼ã\82¸"
+msgid "Choose %s"
+msgstr "%s ã\82\92é\81¸æ\8a\9e"
 
-#: lib/merge.tcl:177
-msgid "Revision To Merge"
-msgstr "ã\83\9eã\83¼ã\82¸ã\81\99ã\82\8bã\83ªã\83\93ã\82¸ã\83§ã\83³"
+#: lib/option.tcl:294
+msgid "pt."
+msgstr "ã\83\9dã\82¤ã\83³ã\83\88"
 
-#: lib/merge.tcl:212
-msgid ""
-"Cannot abort while amending.\n"
-"\n"
-"You must finish amending this commit.\n"
-msgstr ""
-"訂正中には中止できません。\n"
-"\n"
-"まず今のコミット訂正を完了させて下さい。\n"
+#: lib/option.tcl:308
+msgid "Preferences"
+msgstr "設定"
 
-#: lib/merge.tcl:222
-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/option.tcl:310 lib/branch_checkout.tcl:39 lib/branch_create.tcl:69
+msgid "Options"
+msgstr "オプション"
 
-#: lib/merge.tcl:228
-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/option.tcl:345
+msgid "Failed to completely save options:"
+msgstr "完全にオプションを保存できません:"
 
-#: lib/merge.tcl:239
-msgid "Aborting"
-msgstr "中断しています"
+#: lib/database.tcl:42
+msgid "Number of loose objects"
+msgstr "ばらばらなオブジェクトの数"
 
-#: lib/merge.tcl:239
-msgid "files reset"
-msgstr "ã\83ªã\82»ã\83\83ã\83\88ã\81\97ã\81\9fã\83\95ã\82¡ã\82¤ã\83«"
+#: lib/database.tcl:43
+msgid "Disk space used by loose objects"
+msgstr "ã\81°ã\82\89ã\81°ã\82\89ã\81ªã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ä½¿ç\94¨ã\81\99ã\82\8bã\83\87ã\82£ã\82¹ã\82¯é\87\8f"
 
-#: lib/merge.tcl:267
-msgid "Abort failed."
-msgstr "中断に失敗しました。"
+#: lib/database.tcl:44
+msgid "Number of packed objects"
+msgstr "パックされたオブジェクトの数"
 
-#: lib/merge.tcl:269
-msgid "Abort completed.  Ready."
-msgstr "中断完了。"
+#: lib/database.tcl:45
+msgid "Number of packs"
+msgstr "パックの数"
 
-#: lib/mergetool.tcl:8
-msgid "Force resolution to the base version?"
-msgstr "共通の版を使いますか?"
+#: lib/database.tcl:46
+msgid "Disk space used by packed objects"
+msgstr "パックされたオブジェクトの使用するディスク量"
 
-#: lib/mergetool.tcl:9
-msgid "Force resolution to this branch?"
-msgstr "自分の側の版を使いますか?"
+#: lib/database.tcl:47
+msgid "Packed objects waiting for pruning"
+msgstr "パックに存在するので捨てて良いオブジェクトの数"
 
-#: lib/mergetool.tcl:10
-msgid "Force resolution to the other branch?"
-msgstr "相手制の版を使いますか?"
+#: lib/database.tcl:48
+msgid "Garbage files"
+msgstr "ゴミファイル"
 
-#: lib/mergetool.tcl:14
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "データベース圧縮"
+
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "fsck-objects でオブジェクト・データベースを検証しています"
+
+#: lib/database.tcl:107
 #, tcl-format
 msgid ""
-"Note that the diff shows only conflicting changes.\n"
+"This repository currently has approximately %i loose objects.\n"
 "\n"
-"%s will be overwritten.\n"
+"To maintain optimal performance it is strongly recommended that you compress "
+"the database.\n"
 "\n"
-"This operation can be undone only by restarting the merge."
+"Compress the database now?"
 msgstr ""
-"競合する変更点だけが表示されていることに注意してください。\n"
+"このリポジトリにはおおよそ %i 個の個別オブジェクトがあります\n"
 "\n"
-"%s は上書きされます。\n"
+"最適な性能を保つために、データベースを圧縮することを推奨します\n"
 "\n"
-"やり直すにはマージ全体をやり直してください。"
-
-#: lib/mergetool.tcl:45
-#, tcl-format
-msgid "File %s seems to have unresolved conflicts, still stage?"
-msgstr ""
-"ファイル %s には解決していない競合部分がまだあるようですが、いいですか?"
+"データベースを圧縮しますか?"
 
-#: lib/mergetool.tcl:60
+#: lib/transport.tcl:6 lib/remote_add.tcl:132
 #, tcl-format
-msgid "Adding resolution for %s"
-msgstr "%s への解決をステージします"
-
-#: lib/mergetool.tcl:141
-msgid "Cannot resolve deletion or link conflicts using a tool"
-msgstr "ツールでは削除やリンク競合は扱えません"
-
-#: lib/mergetool.tcl:146
-msgid "Conflict file does not exist"
-msgstr "競合ファイルは存在しません。"
+msgid "fetch %s"
+msgstr "%s を取得"
 
-#: lib/mergetool.tcl:264
+#: lib/transport.tcl:7
 #, tcl-format
-msgid "Not a GUI merge tool: '%s'"
-msgstr "GUI マージツールではありません: %s"
+msgid "Fetching new changes from %s"
+msgstr "%s から新しい変更をフェッチしています"
 
-#: lib/mergetool.tcl:268
+#: lib/transport.tcl:18
 #, tcl-format
-msgid "Unsupported merge tool '%s'"
-msgstr "マージツール '%s' はサポートしていません"
-
-#: lib/mergetool.tcl:303
-msgid "Merge tool is already running, terminate it?"
-msgstr "マージツールはすでに起動しています。終了しますか?"
+msgid "remote prune %s"
+msgstr "リモート刈込 %s"
 
-#: lib/mergetool.tcl:323
+#: lib/transport.tcl:19
 #, tcl-format
-msgid ""
-"Error retrieving versions:\n"
-"%s"
-msgstr ""
-"版の取り出し時にエラーが出ました:\n"
-"%s"
+msgid "Pruning tracking branches deleted from %s"
+msgstr "%s から削除されたトラッキング・ブランチを刈っています"
 
-#: lib/mergetool.tcl:343
-#, tcl-format
-msgid ""
-"Could not start the merge tool:\n"
-"\n"
-"%s"
-msgstr ""
-"マージツールが起動できません:\n"
-"\n"
-"%s"
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "すべてのリモートを取得"
 
-#: lib/mergetool.tcl:347
-msgid "Running merge tool..."
-msgstr "ã\83\9eã\83¼ã\82¸ã\83\84ã\83¼ã\83«ã\82\92å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\81¾ã\81\99..."
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "ã\81\99ã\81¹ã\81¦ã\81®ã\83ªã\83¢ã\83¼ã\83\88ã\81\8bã\82\89æ\96°ã\81\97ã\81\84å¤\89æ\9b´ã\82\92ã\83\95ã\82§ã\83\83ã\83\81ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99"
 
-#: lib/mergetool.tcl:375 lib/mergetool.tcl:383
-msgid "Merge tool failed."
-msgstr "ã\83\9eã\83¼ã\82¸ã\83\84ã\83¼ã\83«ã\81\8c失æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82"
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "ã\83ªã\83¢ã\83¼ã\83\88å\88\88è¾¼ ã\81\99ã\81¹ã\81¦ã\81®ã\83ªã\83¢ã\83¼ã\83\88"
 
-#: lib/option.tcl:11
-#, tcl-format
-msgid "Invalid global encoding '%s'"
-msgstr "全体エンコーディングに 無効な %s が指定されています"
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
+msgstr "すべてのリモートから削除されたトラッキング・ブランチを刈っています"
 
-#: lib/option.tcl:19
+#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110
+#: lib/remote_add.tcl:162
 #, tcl-format
-msgid "Invalid repo encoding '%s'"
-msgstr "リポジトリエンコーディングに 無効な %s が指定されています"
+msgid "push %s"
+msgstr "%s をプッシュ"
 
-#: lib/option.tcl:117
-msgid "Restore Defaults"
-msgstr "既定値に戻す"
+#: lib/transport.tcl:55
+#, tcl-format
+msgid "Pushing changes to %s"
+msgstr "%s へ変更をプッシュしています"
 
-#: lib/option.tcl:121
-msgid "Save"
-msgstr "保存"
+#: lib/transport.tcl:93
+#, tcl-format
+msgid "Mirroring to %s"
+msgstr "%s へミラーしています"
 
-#: lib/option.tcl:131
+#: lib/transport.tcl:111
 #, tcl-format
-msgid "%s Repository"
-msgstr "%s リポジトリ"
+msgid "Pushing %s %s to %s"
+msgstr "%3$s へ %1$s %2$s をプッシュしています"
 
-#: lib/option.tcl:132
-msgid "Global (All Repositories)"
-msgstr "大域(全てのリポジトリ)"
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "ブランチをプッシュ"
 
-#: lib/option.tcl:138
-msgid "User Name"
-msgstr "ユーザ名"
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "元のブランチ"
 
-#: lib/option.tcl:139
-msgid "Email Address"
-msgstr "é\9b»å­\90ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹"
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "é\80\81ã\82\8aå\85\88ã\83ªã\83\9dã\82¸ã\83\88ã\83ª"
 
-#: lib/option.tcl:141
-msgid "Summarize Merge Commits"
-msgstr "マージコミットの要約"
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "通信オプション"
 
-#: lib/option.tcl:142
-msgid "Merge Verbosity"
-msgstr "マージの冗長度"
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr "既存ブランチを上書き(変更を破棄する可能性があります)"
 
-#: lib/option.tcl:143
-msgid "Show Diffstat After Merge"
-msgstr "マージ後に diffstat を表示"
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Thin Pack を使う(遅いネットワーク接続)"
 
-#: lib/option.tcl:144
-msgid "Use Merge Tool"
-msgstr "ã\83\9eã\83¼ã\82¸ã\83\84ã\83¼ã\83«ã\82\92使ç\94¨"
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "ã\82¿ã\82°ã\82\92å\90«ã\82\81ã\82\8b"
 
-#: lib/option.tcl:146
-msgid "Trust File Modification Timestamps"
-msgstr "ファイル変更時刻を信頼する"
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "選択"
 
-#: lib/option.tcl:147
-msgid "Prune Tracking Branches During Fetch"
-msgstr "ã\83\95ã\82§ã\83\83ã\83\81中ã\81«ã\83\88ã\83©ã\83\83ã\82­ã\83³ã\82°ã\83\96ã\83©ã\83³ã\83\81ã\82\92å\88\88ã\82\8b"
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "ã\83\95ã\82©ã\83³ã\83\88ã\83»ã\83\95ã\82¡ã\83\9fã\83ªã\83¼"
 
-#: lib/option.tcl:148
-msgid "Match Tracking Branches"
-msgstr "ã\83\88ã\83©ã\83\83ã\82­ã\83³ã\82°ã\83\96ã\83©ã\83³ã\83\81ã\82\92å\90\88ã\82\8fã\81\9bã\82\8b"
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "ã\83\95ã\82©ã\83³ã\83\88ã\81®å¤§ã\81\8dã\81\95"
 
-#: lib/option.tcl:149
-msgid "Blame Copy Only On Changed Files"
-msgstr "変更されたファイルのみコピー検知を行なう"
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "フォント・サンプル"
 
-#: lib/option.tcl:150
-msgid "Minimum Letters To Blame Copy On"
-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/option.tcl:151
-msgid "Blame History Context Radius (days)"
-msgstr "註釈する履歴半径(日数)"
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "プッシュ先"
 
-#: lib/option.tcl:152
-msgid "Number of Diff Context Lines"
-msgstr "diff の文脈行数"
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "リモートを削除"
 
-#: lib/option.tcl:153
-msgid "Commit Message Text Width"
-msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®ã\83\86ã\82­ã\82¹ã\83\88å¹\85"
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "ã\81\8bã\82\89å\88\88è¾¼ã\82\80â\80¦"
 
-#: lib/option.tcl:154
-msgid "New Branch Name Template"
-msgstr "新しいブランチ名のテンプレート"
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "取得元"
 
-#: lib/option.tcl:155
-msgid "Default File Contents Encoding"
-msgstr "ファイル内容のデフォールトエンコーディング"
+#: 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 ""
+"変更がありません。\n"
+"\n"
+"%s には変更がありません。\n"
+"\n"
+"このファイルの変更時刻は他のアプリケーションによって更新されていますがファイ"
+"ル内容には変更がありません。\n"
+"\n"
+"同様な状態のファイルを探すために、自動的に再スキャンを開始します。"
 
-#: lib/option.tcl:203
-msgid "Change"
-msgstr "変更"
+#: lib/diff.tcl:117
+#, tcl-format
+msgid "Loading diff of %s..."
+msgstr "%s の変更点をロード中…"
 
-#: lib/option.tcl:230
-msgid "Spelling Dictionary:"
-msgstr "スペルチェック辞書"
+#: lib/diff.tcl:140
+msgid ""
+"LOCAL: deleted\n"
+"REMOTE:\n"
+msgstr ""
+"LOCAL: 削除\n"
+"Remote:\n"
 
-#: lib/option.tcl:254
-msgid "Change Font"
-msgstr "フォントを変更"
+#: lib/diff.tcl:145
+msgid ""
+"REMOTE: deleted\n"
+"LOCAL:\n"
+msgstr ""
+"REMOTE: 削除\n"
+"LOCAL:\n"
+
+#: lib/diff.tcl:152
+msgid "LOCAL:\n"
+msgstr "LOCAL:\n"
 
-#: lib/option.tcl:258
+#: lib/diff.tcl:155
+msgid "REMOTE:\n"
+msgstr "REMOTE\n"
+
+#: lib/diff.tcl:217 lib/diff.tcl:355
 #, tcl-format
-msgid "Choose %s"
-msgstr "%s を選択"
+msgid "Unable to display %s"
+msgstr "%s を表示できません"
 
-#: lib/option.tcl:264
-msgid "pt."
-msgstr "ã\83\9dã\82¤ã\83³ã\83\88"
+#: lib/diff.tcl:218
+msgid "Error loading file:"
+msgstr "ã\83\95ã\82¡ã\82¤ã\83«ã\82\92読ã\82\80é\9a\9bã\81®ã\82¨ã\83©ã\83¼ã\81§ã\81\99:"
 
-#: lib/option.tcl:278
-msgid "Preferences"
-msgstr "設定"
+#: lib/diff.tcl:225
+msgid "Git Repository (subproject)"
+msgstr "Git リポジトリ(サブプロジェクト)"
 
-#: lib/option.tcl:314
-msgid "Failed to completely save options:"
-msgstr "完全にオプションを保存できません:"
+#: lib/diff.tcl:237
+msgid "* Binary file (not showing content)."
+msgstr "* バイナリファイル(内容は表示しません)"
 
-#: lib/remote.tcl:163
-msgid "Remove Remote"
-msgstr "リモートを削除"
+#: lib/diff.tcl:242
+#, tcl-format
+msgid ""
+"* Untracked file is %d bytes.\n"
+"* Showing only first %d bytes.\n"
+msgstr ""
+"* 管理外のファイルの大きさは %d バイトです。\n"
+"* 最初の %d バイトだけ表示しています。\n"
 
-#: lib/remote.tcl:168
-msgid "Prune from"
-msgstr "から刈込む…"
+#: 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"
+"\n"
+"* %s は管理外のファイルをここで切りおとしました。\n"
+"* 全体を見るには外部エディタを使ってください。\n"
 
-#: lib/remote.tcl:173
-msgid "Fetch from"
-msgstr "取得元"
+#: lib/diff.tcl:578
+msgid "Failed to unstage selected hunk."
+msgstr "選択されたパッチをコミット予定から外せません。"
 
-#: lib/remote.tcl:215
-msgid "Push to"
-msgstr "プッシュ先"
+#: lib/diff.tcl:585
+msgid "Failed to stage selected hunk."
+msgstr "選択されたパッチをコミット予定に加えられません。"
 
-#: lib/remote_add.tcl:19
-msgid "Add Remote"
-msgstr "リモートを追加"
+#: lib/diff.tcl:664
+msgid "Failed to unstage selected line."
+msgstr "選択されたパッチ行をコミット予定から外せません。"
 
-#: lib/remote_add.tcl:24
-msgid "Add New Remote"
-msgstr "リモートを新規に追加"
+#: lib/diff.tcl:672
+msgid "Failed to stage selected line."
+msgstr "選択されたパッチ行をコミット予定に加えられません。"
 
-#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
-msgid "Add"
-msgstr "追加"
+#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
+msgid "Checkout Branch"
+msgstr "ブランチをチェックアウト"
 
-#: lib/remote_add.tcl:37
-msgid "Remote Details"
-msgstr "ã\83ªã\83¢ã\83¼ã\83\88ã\81®è©³ç´°"
+#: lib/branch_checkout.tcl:26
+msgid "Checkout"
+msgstr "ã\83\81ã\82§ã\83\83ã\82¯ã\82¢ã\82¦ã\83\88"
 
-#: lib/remote_add.tcl:50
-msgid "Location:"
-msgstr "場所:"
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "トラッキング・ブランチをフェッチ"
 
-#: lib/remote_add.tcl:62
-msgid "Further Action"
-msgstr "ã\81\9dã\81®ä»\96ã\81®å\8b\95ä½\9c"
+#: lib/branch_checkout.tcl:47
+msgid "Detach From Local Branch"
+msgstr "ã\83­ã\83¼ã\82«ã\83«ã\83»ã\83\96ã\83©ã\83³ã\83\81ã\81\8bã\82\89å\89\8aé\99¤"
 
-#: lib/remote_add.tcl:65
-msgid "Fetch Immediately"
-msgstr "即座に取得"
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "インデックスをロックできません"
 
-#: lib/remote_add.tcl:71
-msgid "Initialize Remote Repository and Push"
-msgstr "リモートレポジトリを初期化してプッシュ"
+#: lib/index.tcl:17
+msgid "Index Error"
+msgstr "索引エラー"
 
-#: lib/remote_add.tcl:77
-msgid "Do Nothing Else Now"
-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/index.tcl:30
+msgid "Continue"
+msgstr "続行"
 
-#: lib/remote_add.tcl:101
-msgid "Please supply a remote name."
-msgstr "ã\83ªã\83¢ã\83¼ã\83\88å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¦ä¸\8bã\81\95ã\81\84ã\80\82"
+#: lib/index.tcl:33
+msgid "Unlock Index"
+msgstr "ã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81®ã\83­ã\83\83ã\82¯è§£é\99¤"
 
-#: lib/remote_add.tcl:114
+#: lib/index.tcl:298
 #, tcl-format
-msgid "'%s' is not an acceptable remote name."
-msgstr "'%s' はリモート名に使えません。"
+msgid "Unstaging %s from commit"
+msgstr "コミットから '%s' を降ろす"
 
-#: lib/remote_add.tcl:125
-#, tcl-format
-msgid "Failed to add remote '%s' of location '%s'."
-msgstr "場所 '%2$s' のリモート '%1$s'の名前変更に失敗しました。"
+#: lib/index.tcl:337
+msgid "Ready to commit."
+msgstr "コミット準備完了"
 
-#: lib/remote_add.tcl:133 lib/transport.tcl:6
+#: lib/index.tcl:350
 #, tcl-format
-msgid "fetch %s"
-msgstr "%s を取得"
+msgid "Adding %s"
+msgstr "コミットに %s を加えています"
 
-#: lib/remote_add.tcl:134
+#: lib/index.tcl:380
 #, tcl-format
-msgid "Fetching the %s"
-msgstr "%s からフェッチしています"
+msgid "Stage %d untracked files?"
+msgstr "管理外の %d ファイルをコミット予定としますか?"
 
-#: lib/remote_add.tcl:157
+#: lib/index.tcl:428
 #, tcl-format
-msgid "Do not know how to initialize repository at location '%s'."
-msgstr "ã\83ªã\83\9dã\82¸ã\83\88ã\83ª '%s' ã\82\92å\88\9dæ\9c\9få\8c\96ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82"
+msgid "Revert changes in file %s?"
+msgstr "ã\83\95ã\82¡ã\82¤ã\83« %s ã\81«ã\81\97ã\81\9få¤\89æ\9b´ã\82\92å\85\83ã\81«æ\88»ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f"
 
-#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
-#: lib/transport.tcl:81
+#: lib/index.tcl:430
 #, tcl-format
-msgid "push %s"
-msgstr "%s をプッシュ"
+msgid "Revert changes in these %i files?"
+msgstr "これら %i 個のファイルにした変更を元に戻しますか?"
 
-#: lib/remote_add.tcl:164
-#, tcl-format
-msgid "Setting up the %s (at %s)"
-msgstr "%2$s にある %1$s をセットアップします"
+#: lib/index.tcl:438
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr "変更を元に戻すとコミット予定していない変更は全て失われます。"
 
-#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
-msgid "Delete Branch Remotely"
-msgstr "遠隔でブランチ削除"
+#: lib/index.tcl:441
+msgid "Do Nothing"
+msgstr "何もしない"
 
-#: lib/remote_branch_delete.tcl:47
-msgid "From Repository"
-msgstr "元のリポジトリ"
+#: lib/index.tcl:459
+msgid "Reverting selected files"
+msgstr "選択されたファイルにした変更を元に戻します"
 
-#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134
-msgid "Remote:"
-msgstr "リモート:"
+#: lib/index.tcl:463
+#, tcl-format
+msgid "Reverting %s"
+msgstr "%s にした変更を元に戻します"
 
-#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149
-msgid "Arbitrary Location:"
-msgstr "任意の位置:"
+#: lib/sshkey.tcl:31
+msgid "No keys found."
+msgstr "キーがありません。"
 
-#: lib/remote_branch_delete.tcl:84
-msgid "Branches"
-msgstr "ブランチ"
+#: lib/sshkey.tcl:34
+#, tcl-format
+msgid "Found a public key in: %s"
+msgstr "公開鍵がありました: %s"
 
-#: lib/remote_branch_delete.tcl:109
-msgid "Delete Only If"
-msgstr "条件付で削除"
+#: lib/sshkey.tcl:40
+msgid "Generate Key"
+msgstr "鍵を生成"
 
-#: lib/remote_branch_delete.tcl:111
-msgid "Merged Into:"
-msgstr "ã\83\9eã\83¼ã\82¸å\85\88:"
+#: lib/sshkey.tcl:58
+msgid "Copy To Clipboard"
+msgstr "ã\82¯ã\83ªã\83\83ã\83\97ã\83\9cã\83¼ã\83\89ã\81«ã\82³ã\83\94ã\83¼"
 
-#: lib/remote_branch_delete.tcl:152
-msgid "A branch is required for 'Merged Into'."
-msgstr "'マージ先' にはブランチが必要です。"
+#: lib/sshkey.tcl:72
+msgid "Your OpenSSH Public Key"
+msgstr "あなたの OpenSSH 公開鍵"
+
+#: lib/sshkey.tcl:80
+msgid "Generating..."
+msgstr "生成中..."
 
-#: lib/remote_branch_delete.tcl:184
+#: lib/sshkey.tcl:86
 #, tcl-format
 msgid ""
-"The following branches are not completely merged into %s:\n"
+"Could not start ssh-keygen:\n"
 "\n"
-" - %s"
+"%s"
 msgstr ""
-"以下のブランチは %s に完全にマージされていません:\n"
+"ssh-keygen を起動できません:\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 から"
-"フェッチして下さい。"
-
-#: lib/remote_branch_delete.tcl:207
-msgid "Please select one or more branches to delete."
-msgstr "削除するブランチを選択して下さい。"
+"%s"
 
-#: lib/remote_branch_delete.tcl:226
-#, tcl-format
-msgid "Deleting branches from %s"
-msgstr "%s からブランチを削除しています。"
+#: lib/sshkey.tcl:113
+msgid "Generation failed."
+msgstr "生成に失敗しました。"
 
-#: lib/remote_branch_delete.tcl:292
-msgid "No repository selected."
-msgstr "リポジトリが選択されていません。"
+#: lib/sshkey.tcl:120
+msgid "Generation succeeded, but no keys found."
+msgstr "生成には成功しましたが、鍵が見つかりません。"
 
-#: lib/remote_branch_delete.tcl:297
+#: lib/sshkey.tcl:123
 #, tcl-format
-msgid "Scanning %s..."
-msgstr "%s をスキャンしています…"
-
-#: lib/search.tcl:21
-msgid "Find:"
-msgstr "検索:"
-
-#: lib/search.tcl:23
-msgid "Next"
-msgstr "次"
+msgid "Your key is in: %s"
+msgstr "あなたの鍵は %s にあります"
 
-#: lib/search.tcl:24
-msgid "Prev"
-msgstr "前"
+#: 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/search.tcl:25
-msgid "Case-Sensitive"
-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/shortcut.tcl:21 lib/shortcut.tcl:62
-msgid "Cannot write shortcut:"
-msgstr "ショートカットが書けません:"
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "訂正するコミットのデータを読めません:"
 
-#: lib/shortcut.tcl:137
-msgid "Cannot write icon:"
-msgstr "ã\82¢ã\82¤ã\82³ã\83³ã\81\8cæ\9b¸ã\81\91ません:"
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "ã\83¦ã\83¼ã\82¶ã\81®æ­£ä½\93ã\82\92確èª\8dã\81§ã\81\8dません:"
 
-#: lib/spellcheck.tcl:57
-msgid "Unsupported spell checker"
-msgstr "サポートされていないスペルチェッカーです"
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "GIT_COMMITTER_IDENT が無効です:"
 
-#: lib/spellcheck.tcl:65
-msgid "Spell checking is unavailable"
-msgstr "スペルチェック機能は使えません"
+#: lib/commit.tcl:129
+#, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "警告: Tcl はエンコーディング '%s' をサポートしていません"
 
-#: lib/spellcheck.tcl:68
-msgid "Invalid spell checking configuration"
-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/spellcheck.tcl:70
+#: lib/commit.tcl:173
 #, tcl-format
-msgid "Reverting dictionary to %s."
-msgstr "辞書を %s に巻き戻します"
-
-#: lib/spellcheck.tcl:73
-msgid "Spell checker silently failed on startup"
-msgstr "スペルチェッカーの起動に失敗しました"
+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"
 
-#: lib/spellcheck.tcl:80
-msgid "Unrecognized spell checker"
-msgstr "スペルチェッカーが判別できません"
+#: 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/spellcheck.tcl:186
-msgid "No Suggestions"
-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/spellcheck.tcl:388
-msgid "Unexpected EOF from spell checker"
-msgstr "スペルチェッカーが予想外の EOF を返しました"
+#: 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"
+"- 第1行: 何をしたか、を1行で要約。\n"
+"- 第2行: 空白\n"
+"- 残りの行: なぜ、この変更が良い変更か、の説明。\n"
 
-#: lib/spellcheck.tcl:392
-msgid "Spell Checker Failed"
-msgstr "ã\82¹ã\83\9aã\83«ã\83\81ã\82§ã\83\83ã\82¯å¤±æ\95\97"
+#: lib/commit.tcl:235
+msgid "Calling pre-commit hook..."
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88å\89\8dã\83\95ã\83\83ã\82¯ã\82\92å®\9fè¡\8c中ã\83»ã\83»ã\83»"
 
-#: lib/sshkey.tcl:31
-msgid "No keys found."
-msgstr "ã\82­ã\83¼ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82"
+#: lib/commit.tcl:250
+msgid "Commit declined by pre-commit hook."
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88å\89\8dã\83\95ã\83\83ã\82¯ã\81\8cã\82³ã\83\9fã\83\83ã\83\88ã\82\92æ\8b\92å\90¦ã\81\97ã\81¾ã\81\97ã\81\9f"
 
-#: lib/sshkey.tcl:34
-#, tcl-format
-msgid "Found a public key in: %s"
-msgstr "公開鍵がありました: %s"
+#: 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/sshkey.tcl:40
-msgid "Generate Key"
-msgstr "鍵を生成"
+#: lib/commit.tcl:290
+msgid "Calling commit-msg hook..."
+msgstr "コミット・メッセージ・フックを実行中・・・"
 
-#: lib/sshkey.tcl:56
-msgid "Copy To Clipboard"
-msgstr "ã\82¯ã\83ªã\83\83ã\83\97ã\83\9cã\83¼ã\83\89ã\81«ã\82³ã\83\94ã\83¼"
+#: lib/commit.tcl:305
+msgid "Commit declined by commit-msg hook."
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88ã\83»ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\83»ã\83\95ã\83\83ã\82¯ã\81\8cã\82³ã\83\9fã\83\83ã\83\88ã\82\92æ\8b\92å\90¦ã\81\97ã\81¾ã\81\97ã\81\9f"
 
-#: lib/sshkey.tcl:70
-msgid "Your OpenSSH Public Key"
-msgstr "あなたの OpenSSH 公開鍵"
+#: lib/commit.tcl:318
+msgid "Committing changes..."
+msgstr "変更点をコミット中・・・"
 
-#: lib/sshkey.tcl:78
-msgid "Generating..."
-msgstr "生成中..."
+#: lib/commit.tcl:334
+msgid "write-tree failed:"
+msgstr "write-tree が失敗しました:"
+
+#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400
+msgid "Commit failed."
+msgstr "コミットに失敗しました。"
 
-#: lib/sshkey.tcl:84
+#: lib/commit.tcl:352
 #, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "コミット %s は壊れています"
+
+#: lib/commit.tcl:357
 msgid ""
-"Could not start ssh-keygen:\n"
+"No changes to commit.\n"
 "\n"
-"%s"
+"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 ""
-"ssh-keygen を起動できません:\n"
+"コミットする変更がありません。\n"
 "\n"
-"%s"
-
-#: lib/sshkey.tcl:111
-msgid "Generation failed."
-msgstr "生成に失敗しました。"
+"マージでなく、また、一つも変更点がありません。\n"
+"\n"
+"自動的に再スキャンを開始します。\n"
 
-#: lib/sshkey.tcl:118
-msgid "Generation succeeded, but no keys found."
-msgstr "生成には成功しましたが、鍵が見つかりません。"
+#: lib/commit.tcl:364
+msgid "No changes to commit."
+msgstr "コミットする変更がありません。"
 
-#: lib/sshkey.tcl:121
-#, tcl-format
-msgid "Your key is in: %s"
-msgstr "あなたの鍵は %s にあります"
+#: lib/commit.tcl:378
+msgid "commit-tree failed:"
+msgstr "commit-tree が失敗しました:"
 
-#: lib/status_bar.tcl:83
-#, tcl-format
-msgid "%s ... %*i of %*i %s (%3i%%)"
-msgstr "%1$s ... %4$*i %6$s 中の %2$*i (%7$3i%%)"
+#: lib/commit.tcl:399
+msgid "update-ref failed:"
+msgstr "update-ref が失敗しました:"
 
-#: lib/tools.tcl:75
+#: lib/commit.tcl:492
 #, tcl-format
-msgid "Running %s requires a selected file."
-msgstr "ã\83\95ã\82¡ã\82¤ã\83«ã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ã\81\8bã\82\89 %s ã\82\92èµ·å\8b\95ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82"
+msgid "Created commit %s: %s"
+msgstr "ã\82³ã\83\9fã\83\83ã\83\88 %s ã\82\92ä½\9cæ\88\90ã\81\97ã\81¾ã\81\97ã\81\9f: %s"
 
-#: lib/tools.tcl:90
-#, tcl-format
-msgid "Are you sure you want to run %s?"
-msgstr "本当に %s を起動しますか?"
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "起動中…"
 
-#: lib/tools.tcl:110
-#, tcl-format
-msgid "Tool: %s"
-msgstr "ツール: %s"
+#: lib/browser.tcl:27
+msgid "File Browser"
+msgstr "ファイル・ブラウザ"
 
-#: lib/tools.tcl:111
+#: lib/browser.tcl:132 lib/browser.tcl:149
 #, tcl-format
-msgid "Running: %s"
-msgstr "実行中: %s"
+msgid "Loading %s..."
+msgstr "%s をロード中…"
 
-#: lib/tools.tcl:149
-#, tcl-format
-msgid "Tool completed successfully: %s"
-msgstr "ツールが完了しました: %s"
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[上位フォルダへ]"
 
-#: lib/tools.tcl:151
-#, tcl-format
-msgid "Tool failed: %s"
-msgstr "ツールが失敗しました: %s"
+#: lib/browser.tcl:275 lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "現在のブランチのファイルを見る"
 
-#: lib/tools_dlg.tcl:22
-msgid "Add Tool"
-msgstr "ã\83\84ã\83¼ã\83«ã\81®追加"
+#: lib/remote_add.tcl:20
+msgid "Add Remote"
+msgstr "ã\83ªã\83¢ã\83¼ã\83\88ã\82\92追加"
 
-#: lib/tools_dlg.tcl:28
-msgid "Add New Tool Command"
-msgstr "新規ツールコマンドの追加"
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "リモートを新規に追加"
 
-#: lib/tools_dlg.tcl:33
-msgid "Add globally"
-msgstr "全体に追加"
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "リモートの詳細"
 
-#: lib/tools_dlg.tcl:45
-msgid "Tool Details"
-msgstr "ツールの詳細"
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "場所:"
 
-#: lib/tools_dlg.tcl:48
-msgid "Use '/' separators to create a submenu tree:"
-msgstr "'/' でサブメニューを区切ります:"
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "その他の動作"
 
-#: lib/tools_dlg.tcl:61
-msgid "Command:"
-msgstr "コマンド:"
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "即座に取得"
 
-#: lib/tools_dlg.tcl:74
-msgid "Show a dialog before running"
-msgstr "起動する前にダイアログを表示"
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "リモートレポジトリを初期化してプッシュ"
 
-#: lib/tools_dlg.tcl:80
-msgid "Ask the user to select a revision (sets $REVISION)"
-msgstr "ユーザにコミットを一つ選ばせる ($REVISION にセットします)"
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "何もしない"
 
-#: lib/tools_dlg.tcl:85
-msgid "Ask the user for additional arguments (sets $ARGS)"
-msgstr "ã\83¦ã\83¼ã\82¶ã\81«ä»\96ã\81®å¼\95æ\95°ã\82\92追å\8a ã\81\95ã\81\9bã\82\8b ($ARGS ã\81«ã\82»ã\83\83ã\83\88ã\81\97ã\81¾ã\81\99)"
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "ã\83ªã\83¢ã\83¼ã\83\88å\90\8dã\82\92æ\8c\87å®\9aã\81\97ã\81¦ä¸\8bã\81\95ã\81\84ã\80\82"
 
-#: lib/tools_dlg.tcl:92
-msgid "Don't show the command output window"
-msgstr "コマンドからの出力ウィンドウを見せない"
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "'%s' はリモート名に使えません。"
 
-#: lib/tools_dlg.tcl:97
-msgid "Run only if a diff is selected ($FILENAME not empty)"
-msgstr "パッチが選ばれているときだけ動かす($FILENAME が空でない)"
+#: lib/remote_add.tcl:124
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "場所 '%2$s' のリモート '%1$s'の名前変更に失敗しました。"
 
-#: lib/tools_dlg.tcl:121
-msgid "Please supply a name for the tool."
-msgstr "ツール名を指定して下さい。"
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "%s からフェッチしています"
 
-#: lib/tools_dlg.tcl:129
+#: lib/remote_add.tcl:156
 #, tcl-format
-msgid "Tool '%s' already exists."
-msgstr "ã\83\84ã\83¼ã\83« '%s' ã\81¯æ\97¢ã\81«å­\98å\9c¨ã\81\97ã\81¾ã\81\99。"
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "ã\83ªã\83\9dã\82¸ã\83\88ã\83ª '%s' ã\82\92å\88\9dæ\9c\9få\8c\96ã\81§ã\81\8dã\81¾ã\81\9bã\82\93。"
 
-#: lib/tools_dlg.tcl:151
+#: lib/remote_add.tcl:163
 #, tcl-format
-msgid ""
-"Could not add tool:\n"
-"%s"
-msgstr ""
-"ツールを追加できません:\n"
-"%s"
+msgid "Setting up the %s (at %s)"
+msgstr "%2$s にある %1$s をセットアップします"
 
-#: lib/tools_dlg.tcl:190
-msgid "Remove Tool"
-msgstr "ツールの削除"
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "行番号"
 
-#: lib/tools_dlg.tcl:196
-msgid "Remove Tool Commands"
-msgstr "ツールコマンドの削除"
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "移動"
 
-#: lib/tools_dlg.tcl:200
-msgid "Remove"
-msgstr "削除"
+#: lib/branch_create.tcl:23
+msgid "Create Branch"
+msgstr "ブランチを作成"
 
-#: lib/tools_dlg.tcl:236
-msgid "(Blue denotes repository-local tools)"
-msgstr "(青色はローカルレポジトリのツールです)"
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "ブランチを新規作成"
 
-#: lib/tools_dlg.tcl:297
-#, tcl-format
-msgid "Run Command: %s"
-msgstr "コマンドを起動: %s"
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "ブランチ名"
 
-#: lib/tools_dlg.tcl:311
-msgid "Arguments"
-msgstr "引数"
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "トラッキング・ブランチ名を合わせる"
 
-#: lib/tools_dlg.tcl:348
-msgid "OK"
-msgstr "OK"
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "初期リビジョン"
 
-#: lib/transport.tcl:7
-#, tcl-format
-msgid "Fetching new changes from %s"
-msgstr "%s から新しい変更をフェッチしています"
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "既存のブランチを更新:"
 
-#: lib/transport.tcl:18
-#, tcl-format
-msgid "remote prune %s"
-msgstr "遠隔刈込 %s"
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "いいえ"
 
-#: lib/transport.tcl:19
-#, tcl-format
-msgid "Pruning tracking branches deleted from %s"
-msgstr "%s から削除されたトラッキング・ブランチを刈っています"
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "早送りのみ"
 
-#: lib/transport.tcl:26
-#, tcl-format
-msgid "Pushing changes to %s"
-msgstr "%s へ変更をプッシュしています"
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "作成してすぐチェックアウト"
 
-#: lib/transport.tcl:64
-#, tcl-format
-msgid "Mirroring to %s"
-msgstr "%s へミラーしています"
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "トラッキング・ブランチを選択して下さい。"
 
-#: lib/transport.tcl:82
+#: lib/branch_create.tcl:141
 #, tcl-format
-msgid "Pushing %s %s to %s"
-msgstr "%3$s へ %1$s %2$s をプッシュしています"
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr ""
+"トラッキング・ブランチ %s はリモートリポジトリのブランチではありません。"
 
-#: lib/transport.tcl:100
-msgid "Push Branches"
-msgstr "ã\83\96ã\83©ã\83³ã\83\81ã\82\92ã\83\97ã\83\83ã\82·ã\83¥"
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "ã\82µã\83\9dã\83¼ã\83\88ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\82¹ã\83\9aã\83«ã\83\81ã\82§ã\83\83ã\82«ã\83¼ã\81§ã\81\99"
 
-#: lib/transport.tcl:114
-msgid "Source Branches"
-msgstr "元のブランチ"
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "スペルチェック機能は使えません"
 
-#: lib/transport.tcl:131
-msgid "Destination Repository"
-msgstr "送り先リポジトリ"
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "スペルチェックの設定が不正です"
 
-#: lib/transport.tcl:169
-msgid "Transfer Options"
-msgstr "通信オプション"
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "辞書を %s に巻き戻します"
 
-#: lib/transport.tcl:171
-msgid "Force overwrite existing branch (may discard changes)"
-msgstr "既存ブランチを上書き(変更を破棄する可能性があります)"
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "スペルチェッカーの起動に失敗しました"
 
-#: lib/transport.tcl:175
-msgid "Use thin pack (for slow network connections)"
-msgstr "Thin Pack を使う(遅いネットワーク接続)"
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "スペルチェッカーが判別できません"
 
-#: lib/transport.tcl:179
-msgid "Include tags"
-msgstr "タグを含める"
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "提案なし"
+
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "スペルチェッカーが予想外の EOF を返しました"
+
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "スペルチェック失敗"
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 8643f74cb09f278c37851c418e839c7d160f36ca..bcf0d92ec223bf9e1f0995c5acef6376d1299502 100755 (executable)
@@ -5,14 +5,11 @@
 # Resolve two or more trees.
 #
 
+. git-sh-setup
+
 LF='
 '
 
-die () {
-    echo >&2 "$*"
-    exit 1
-}
-
 # The first parameters up to -- are merge bases; the rest are heads.
 bases= head= remotes= sep_seen=
 for arg
@@ -33,7 +30,7 @@ do
        esac
 done
 
-# Reject if this is not an Octopus -- resolve should be used instead.
+# Reject if this is not an octopus -- resolve should be used instead.
 case "$remotes" in
 ?*' '?*)
        ;;
@@ -44,6 +41,12 @@ esac
 # MRC is the current "merge reference commit"
 # MRT is the current "merge result tree"
 
+if ! git diff-index --quiet --cached HEAD --
+then
+    gettextln "Error: Your local changes to the following files would be overwritten by merge"
+    git diff-index --cached --name-only HEAD -- | sed -e 's/^/    /'
+    exit 2
+fi
 MRC=$(git rev-parse --verify -q $head)
 MRT=$(git write-tree)
 NON_FF_MERGE=0
@@ -55,8 +58,8 @@ do
                # We allow only last one to have a hand-resolvable
                # conflicts.  Last round failed and we still had
                # a head to merge.
-               echo "Automated merge did not work."
-               echo "Should not be doing an Octopus."
+               gettextln "Automated merge did not work."
+               gettextln "Should not be doing an octopus."
                exit 2
        esac
 
@@ -67,11 +70,11 @@ do
                eval pretty_name=\${GITHEAD_$SHA1_UP:-$pretty_name}
        fi
        common=$(git merge-base --all $SHA1 $MRC) ||
-               die "Unable to find common commit with $pretty_name"
+               die "$(eval_gettext "Unable to find common commit with \$pretty_name")"
 
        case "$LF$common$LF" in
        *"$LF$SHA1$LF"*)
-               echo "Already up-to-date with $pretty_name"
+               eval_gettextln "Already up-to-date with \$pretty_name"
                continue
                ;;
        esac
@@ -83,7 +86,7 @@ do
                # tree as the intermediate result of the merge.
                # We still need to count this as part of the parent set.
 
-               echo "Fast-forwarding to: $pretty_name"
+               eval_gettextln "Fast-forwarding to: \$pretty_name"
                git read-tree -u -m $head $SHA1 || exit
                MRC=$SHA1 MRT=$(git write-tree)
                continue
@@ -91,12 +94,12 @@ do
 
        NON_FF_MERGE=1
 
-       echo "Trying simple merge with $pretty_name"
+       eval_gettextln "Trying simple merge with \$pretty_name"
        git read-tree -u -m --aggressive  $common $MRT $SHA1 || exit 2
        next=$(git write-tree 2>/dev/null)
        if test $? -ne 0
        then
-               echo "Simple merge did not work, trying automatic merge."
+               gettextln "Simple merge did not work, trying automatic merge."
                git-merge-index -o git-merge-one-file -a ||
                OCTOPUS_FAILURE=1
                next=$(git write-tree 2>/dev/null)
index 54ac8e484674710ca21ea0038d07dcbefbe2fb1e..9a8b97a2aba9aa9fabb095558c03cb8f27df3d50 100644 (file)
@@ -100,7 +100,7 @@ check_unchanged () {
                while true
                do
                        echo "$MERGED seems unchanged."
-                       printf "Was the merge successful? [y/n] "
+                       printf "Was the merge successful [y/n]? "
                        read answer || return 1
                        case "$answer" in
                        y*|Y*) return 0 ;;
@@ -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 () {
@@ -372,3 +406,28 @@ get_merge_tool () {
        fi
        echo "$merge_tool"
 }
+
+mergetool_find_win32_cmd () {
+       executable=$1
+       sub_directory=$2
+
+       # Use $executable if it exists in $PATH
+       if type -p "$executable" >/dev/null 2>&1
+       then
+               printf '%s' "$executable"
+               return
+       fi
+
+       # Look for executable in the typical locations
+       for directory in $(env | grep -Ei '^PROGRAM(FILES(\(X86\))?|W6432)=' |
+               cut -d '=' -f 2- | sort -u)
+       do
+               if test -n "$directory" && test -x "$directory/$sub_directory/$executable"
+               then
+                       printf '%s' "$directory/$sub_directory/$executable"
+                       return
+               fi
+       done
+
+       printf '%s' "$executable"
+}
index 9f77e3a8bb0b1197f860912b6d0e56b40b607cb9..e52b4e4f24088d7552d88aa5a3c9ffc308f6a4cf 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=
@@ -126,7 +127,12 @@ resolve_deleted_merge () {
                case "$ans" in
                [mMcC]*)
                        git add -- "$MERGED"
-                       cleanup_temp_files --save-backup
+                       if test "$merge_keep_backup" = "true"
+                       then
+                               cleanup_temp_files --save-backup
+                       else
+                               cleanup_temp_files
+                       fi
                        return 0
                        ;;
                [dD]*)
@@ -135,6 +141,10 @@ resolve_deleted_merge () {
                        return 0
                        ;;
                [aA]*)
+                       if test "$merge_keep_temporaries" = "false"
+                       then
+                               cleanup_temp_files
+                       fi
                        return 1
                        ;;
                esac
@@ -282,8 +292,14 @@ merge_file () {
                return
        fi
 
-       mv -- "$MERGED" "$BACKUP"
-       cp -- "$BACKUP" "$MERGED"
+       if test -f "$MERGED"
+       then
+               mv -- "$MERGED" "$BACKUP"
+               cp -- "$BACKUP" "$MERGED"
+       fi
+       # Create a parent directory to handle delete/delete conflicts
+       # where the base's directory no longer exists.
+       mkdir -p "$(dirname "$MERGED")"
 
        checkout_staged_file 1 "$MERGED" "$BASE"
        checkout_staged_file 2 "$MERGED" "$LOCAL"
@@ -295,7 +311,9 @@ merge_file () {
                describe_file "$local_mode" "local" "$LOCAL"
                describe_file "$remote_mode" "remote" "$REMOTE"
                resolve_deleted_merge
-               return
+               status=$?
+               rmdir -p "$(dirname "$MERGED")" 2>/dev/null
+               return $status
        fi
 
        if is_symlink "$local_mode" || is_symlink "$remote_mode"
@@ -348,55 +366,10 @@ 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
-               printf "Continue merging other unresolved paths (y/n) ? "
+               printf "Continue merging other unresolved paths [y/n]? "
                read ans || return 1
                case "$ans" in
                [yY]*)
@@ -409,57 +382,113 @@ 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"
+                       ;;
+               --)
+                       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)"
+       merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
+       merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
 
-files=
+       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
+       fi
+
+       files=$(git -c core.quotePath=false \
+               diff --name-only --diff-filter=U \
+               ${orderfile:+"$orderfile"} -- "$@")
 
-if test $# -eq 0
-then
        cd_to_toplevel
 
-       if test -e "$GIT_DIR/MERGE_RR"
+       if test -z "$files"
        then
-               files=$(git rerere remaining)
-       else
-               files=$(git ls-files -u | sed -e 's/^[^ ]*      //' | sort -u)
+               print_noop_and_exit
        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
+       printf "Merging:\n"
+       printf "%s\n" "$files"
 
-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
 
-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
+}
 
-exit $rc
+main "$@"
index 825b9f32d5540ab1f8d373fff2d3bf79caabee00..f427bf6299ed3239ce4e73b674dbb2273dc5e086 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
@@ -822,7 +823,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 +842,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 +1006,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 +1059,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
@@ -1064,8 +1070,15 @@ class GitLFS(LargeFileSystem):
         if pointerProcess.wait():
             os.remove(contentFile)
             die('git-lfs pointer command failed. Did you install the extension?')
-        pointerContents = [i+'\n' for i in pointerFile.split('\n')[2:][:-1]]
-        oid = pointerContents[1].split(' ')[1].split(':')[1][:-1]
+
+        # Git LFS removed the preamble in the output of the 'pointer' command
+        # starting from version 1.2.0. Check for the preamble here to support
+        # earlier versions.
+        # c.f. https://github.com/github/git-lfs/commit/da2935d9a739592bc775c98d8ef4df9c72ea3b43
+        if pointerFile.startswith('Git LFS pointer for'):
+            pointerFile = re.sub(r'Git LFS pointer for.*\n\n', '', pointerFile)
+
+        oid = re.search(r'^oid \w+:(\w+)', pointerFile, re.MULTILINE).group(1)
         localLargeFile = os.path.join(
             os.getcwd(),
             '.git', 'lfs', 'objects', oid[:2], oid[2:4],
@@ -1073,7 +1086,7 @@ class GitLFS(LargeFileSystem):
         )
         # LFS Spec states that pointer files should not have the executable bit set.
         gitMode = '100644'
-        return (gitMode, pointerContents, localLargeFile)
+        return (gitMode, pointerFile, localLargeFile)
 
     def pushFile(self, localLargeFile):
         uploadProcess = subprocess.Popen(
@@ -1160,6 +1173,15 @@ class P4UserMap:
             self.users[output["User"]] = output["FullName"] + " <" + output["Email"] + ">"
             self.emails[output["Email"]] = output["User"]
 
+        mapUserConfigRegex = re.compile(r"^\s*(\S+)\s*=\s*(.+)\s*<(\S+)>\s*$", re.VERBOSE)
+        for mapUserConfig in gitConfigList("git-p4.mapUser"):
+            mapUser = mapUserConfigRegex.findall(mapUserConfig)
+            if mapUser and len(mapUser[0]) == 3:
+                user = mapUser[0][0]
+                fullname = mapUser[0][1]
+                email = mapUser[0][2]
+                self.users[user] = fullname + " <" + email + ">"
+                self.emails[email] = user
 
         s = ''
         for (key, val) in self.users.items():
@@ -1522,7 +1544,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"])
@@ -1537,10 +1559,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')
 
@@ -1558,6 +1587,7 @@ class P4Submit(Command, P4UserMap):
         filesToDelete = set()
         editedFiles = set()
         pureRenameCopy = set()
+        symlinks = set()
         filesToChangeExecBit = {}
 
         for line in diff:
@@ -1574,6 +1604,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:
@@ -1711,7 +1746,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")
@@ -1918,7 +1953,7 @@ class P4Submit(Command, P4UserMap):
         if self.useClientSpec:
             self.clientSpecDirs = getClientSpec()
 
-        # Check for the existance of P4 branches
+        # Check for the existence of P4 branches
         branchesDetected = (len(p4BranchesInGit().keys()) > 1)
 
         if self.useClientSpec and not branchesDetected:
@@ -2258,7 +2293,7 @@ class P4Sync(Command, P4UserMap):
         self.useClientSpec_from_options = False
         self.clientSpecDirs = None
         self.tempBranches = []
-        self.tempBranchLocation = "git-p4-tmp"
+        self.tempBranchLocation = "refs/git-p4-tmp"
         self.largeFileSystem = None
 
         if gitConfig('git-p4.largeFileSystem'):
@@ -2311,6 +2346,15 @@ class P4Sync(Command, P4UserMap):
             fnum = fnum + 1
         return files
 
+    def extractJobsFromCommit(self, commit):
+        jobs = []
+        jnum = 0
+        while commit.has_key("job%s" % jnum):
+            job = commit["job%s" % jnum]
+            jobs.append(job)
+            jnum = jnum + 1
+        return jobs
+
     def stripRepoPath(self, path, prefixes):
         """When streaming files, this is called to map a p4 depot path
            to where it should go in git.  The prefixes are either
@@ -2649,13 +2693,14 @@ class P4Sync(Command, P4UserMap):
             return True
         hasPrefix = [p for p in self.branchPrefixes
                         if p4PathStartsWith(path, p)]
-        if hasPrefix and self.verbose:
+        if not hasPrefix and self.verbose:
             print('Ignoring file outside of prefix: {0}'.format(path))
         return hasPrefix
 
     def commit(self, details, files, branch, parent = ""):
         epoch = details["time"]
         author = details["user"]
+        jobs = self.extractJobsFromCommit(details)
 
         if self.verbose:
             print('commit into {0}'.format(branch))
@@ -2683,6 +2728,8 @@ class P4Sync(Command, P4UserMap):
 
         self.gitStream.write("data <<EOT\n")
         self.gitStream.write(details["desc"])
+        if len(jobs) > 0:
+            self.gitStream.write("\nJobs: %s" % (' '.join(jobs)))
         self.gitStream.write("\n[git-p4: depot-paths = \"%s\": change = %s" %
                              (','.join(self.branchPrefixes), details["change"]))
         if len(details['options']) > 0:
index 9ae898bc1d7d301983893e6df404c696b80a87f5..375239341fbfe885e51a25e9e0dc2d4fee791345 100644 (file)
@@ -9,8 +9,8 @@
 # below were not inside any function, and expected to return
 # to the function that dot-sourced us.
 #
-# However, FreeBSD /bin/sh misbehaves on such a construct and
-# continues to run the statements that follow such a "return".
+# However, older (9.x) versions of FreeBSD /bin/sh misbehave on such a
+# construct and continue to run the statements that follow such a "return".
 # As a work-around, we introduce an extra layer of a function
 # here, and immediately call it after defining it.
 git_rebase__am () {
index 4cde685b43a4463bac5f96bcb4f8ed8b3e9347be..41fd374c725de1f42965b829c2bed5c48c92e19c 100644 (file)
@@ -82,6 +82,7 @@ rewritten_pending="$state_dir"/rewritten-pending
 cr=$(printf "\015")
 
 strategy_args=${strategy:+--strategy=$strategy}
+test -n "$strategy_opts" &&
 eval '
        for strategy_opt in '"$strategy_opts"'
        do
@@ -92,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
@@ -120,14 +130,14 @@ mark_action_done () {
        sed -e 1q < "$todo" >> "$done"
        sed -e 1d < "$todo" >> "$todo".new
        mv -f "$todo".new "$todo"
-       new_count=$(git stripspace --strip-comments <"$done" | wc -l)
+       new_count=$(( $(git stripspace --strip-comments <"$done" | wc -l) ))
        echo $new_count >"$msgnum"
        total=$(($new_count + $(git stripspace --strip-comments <"$todo" | wc -l)))
        echo $total >"$end"
        if test "$last_count" != "$new_count"
        then
                last_count=$new_count
-               printf "Rebasing (%d/%d)\r" $new_count $total
+               eval_gettext "Rebasing (\$new_count/\$total)"; printf "\r"
                test -z "$verbose" || echo
        fi
 }
@@ -143,29 +153,28 @@ reschedule_last_action () {
 }
 
 append_todo_help () {
-       git stripspace --comment-lines >>"$todo" <<\EOF
-
+       gettext "
 Commands:
  p, pick = use commit
  r, reword = use commit, but edit the commit message
  e, edit = use commit, but stop for amending
  s, squash = use commit, but meld into previous commit
- f, fixup = like "squash", but discard this commit's log message
+ f, fixup = like \"squash\", but discard this commit's log message
  x, exec = run command (the rest of the line) using shell
  d, drop = remove commit
 
 These lines can be re-ordered; they are executed from top to bottom.
+" | git stripspace --comment-lines >>"$todo"
 
-EOF
        if test $(get_missing_commit_check_level) = error
        then
-               git stripspace --comment-lines >>"$todo" <<\EOF
+               gettext "
 Do not remove any line. Use 'drop' explicitly to remove a commit.
-EOF
+" | git stripspace --comment-lines >>"$todo"
        else
-               git stripspace --comment-lines >>"$todo" <<\EOF
+               gettext "
 If you remove a line here THAT COMMIT WILL BE LOST.
-EOF
+" | git stripspace --comment-lines >>"$todo"
        fi
 }
 
@@ -191,7 +200,6 @@ make_patch () {
 die_with_patch () {
        echo "$1" > "$state_dir"/stopped-sha
        make_patch "$1"
-       git rerere
        die "$2"
 }
 
@@ -200,18 +208,20 @@ exit_with_patch () {
        make_patch $1
        git rev-parse --verify HEAD > "$amend"
        gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-       warn "You can amend the commit now, with"
-       warn
-       warn "  git commit --amend $gpg_sign_opt_quoted"
-       warn
-       warn "Once you are satisfied with your changes, run"
-       warn
-       warn "  git rebase --continue"
+       warn "$(eval_gettext "\
+You can amend the commit now, with
+
+       git commit --amend \$gpg_sign_opt_quoted
+
+Once you are satisfied with your changes, run
+
+       git rebase --continue")"
        warn
        exit $2
 }
 
 die_abort () {
+       apply_autostash
        rm -rf "$state_dir"
        die "$1"
 }
@@ -221,10 +231,12 @@ has_action () {
 }
 
 is_empty_commit() {
-       tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null ||
-               die "$1: not a commit that can be picked")
-       ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null ||
-               ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904)
+       tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null) || {
+               sha1=$1
+               die "$(eval_gettext "\$sha1: not a commit that can be picked")"
+       }
+       ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null) ||
+               ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
        test "$tree" = "$ptree"
 }
 
@@ -260,7 +272,7 @@ pick_one () {
 
        case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac
        case "$force_rebase" in '') ;; ?*) ff= ;; esac
-       output git rev-parse --verify $sha1 || die "Invalid commit name: $sha1"
+       output git rev-parse --verify $sha1 || die "$(eval_gettext "Invalid commit name: \$sha1")"
 
        if is_empty_commit "$sha1"
        then
@@ -302,7 +314,7 @@ pick_one_preserving_merges () {
                                git rev-parse HEAD > "$rewritten"/$current_commit
                        done <"$state_dir"/current-commit
                        rm "$state_dir"/current-commit ||
-                       die "Cannot write current commit's replacement sha1"
+                               die "$(gettext "Cannot write current commit's replacement sha1")"
                fi
        fi
 
@@ -354,9 +366,9 @@ pick_one_preserving_merges () {
        done
        case $fast_forward in
        t)
-               output warn "Fast-forward to $sha1"
+               output warn "$(eval_gettext "Fast-forward to \$sha1")"
                output git reset --hard $sha1 ||
-                       die "Cannot fast-forward to $sha1"
+                       die "$(eval_gettext "Cannot fast-forward to \$sha1")"
                ;;
        f)
                first_parent=$(expr "$new_parents" : ' \([^ ]*\)')
@@ -365,12 +377,12 @@ pick_one_preserving_merges () {
                then
                        # detach HEAD to current parent
                        output git checkout $first_parent 2> /dev/null ||
-                               die "Cannot move HEAD to $first_parent"
+                               die "$(eval_gettext "Cannot move HEAD to \$first_parent")"
                fi
 
                case "$new_parents" in
                ' '*' '*)
-                       test "a$1" = a-n && die "Refusing to squash a merge: $sha1"
+                       test "a$1" = a-n && die "$(eval_gettext "Refusing to squash a merge: \$sha1")"
 
                        # redo merge
                        author_script_content=$(get_author_ident_from_commit $sha1)
@@ -384,7 +396,7 @@ pick_one_preserving_merges () {
                                $merge_args $strategy_args -m "$msg_content" $new_parents'
                        then
                                printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG
-                               die_with_patch $sha1 "Error redoing merge $sha1"
+                               die_with_patch $sha1 "$(eval_gettext "Error redoing merge \$sha1")"
                        fi
                        echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list"
                        ;;
@@ -392,40 +404,44 @@ pick_one_preserving_merges () {
                        output eval git cherry-pick \
                                ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
                                "$strategy_args" "$@" ||
-                               die_with_patch $sha1 "Could not pick $sha1"
+                               die_with_patch $sha1 "$(eval_gettext "Could not pick \$sha1")"
                        ;;
                esac
                ;;
        esac
 }
 
-nth_string () {
-       case "$1" in
-       *1[0-9]|*[04-9]) echo "$1"th;;
-       *1) echo "$1"st;;
-       *2) echo "$1"nd;;
-       *3) echo "$1"rd;;
-       esac
+this_nth_commit_message () {
+       n=$1
+       eval_gettext "This is the commit message #\${n}:"
+}
+
+skip_nth_commit_message () {
+       n=$1
+       eval_gettext "The commit message #\${n} will be skipped:"
 }
 
 update_squash_messages () {
        if test -f "$squash_msg"; then
                mv "$squash_msg" "$squash_msg".bak || exit
                count=$(($(sed -n \
-                       -e "1s/^. This is a combination of \(.*\) commits\./\1/p" \
+                       -e "1s/^$comment_char.*\([0-9][0-9]*\).*/\1/p" \
                        -e "q" < "$squash_msg".bak)+1))
                {
-                       printf '%s\n' "$comment_char This is a combination of $count commits."
+                       printf '%s\n' "$comment_char $(eval_ngettext \
+                               "This is a combination of \$count commit." \
+                               "This is a combination of \$count commits." \
+                               $count)"
                        sed -e 1d -e '2,/^./{
                                /^$/d
                        }' <"$squash_msg".bak
                } >"$squash_msg"
        else
-               commit_message HEAD > "$fixup_msg" || die "Cannot write $fixup_msg"
+               commit_message HEAD > "$fixup_msg" || die "$(gettext "Cannot write \$fixup_msg")"
                count=2
                {
-                       printf '%s\n' "$comment_char This is a combination of 2 commits."
-                       printf '%s\n' "$comment_char The first commit's message is:"
+                       printf '%s\n' "$comment_char $(gettext "This is a combination of 2 commits.")"
+                       printf '%s\n' "$comment_char $(gettext "This is the 1st commit message:")"
                        echo
                        cat "$fixup_msg"
                } >"$squash_msg"
@@ -434,13 +450,13 @@ update_squash_messages () {
        squash)
                rm -f "$fixup_msg"
                echo
-               printf '%s\n' "$comment_char This is the $(nth_string $count) commit message:"
+               printf '%s\n' "$comment_char $(this_nth_commit_message $count)"
                echo
                commit_message $2
                ;;
        fixup)
                echo
-               printf '%s\n' "$comment_char The $(nth_string $count) commit message will be skipped:"
+               printf '%s\n' "$comment_char $(skip_nth_commit_message $count)"
                echo
                # Change the space after the comment character to TAB:
                commit_message $2 | git stripspace --comment-lines | sed -e 's/ /       /'
@@ -459,12 +475,14 @@ peek_next_command () {
 # messages, effectively causing the combined commit to be used as the
 # new basis for any further squash/fixups.  Args: sha1 rest
 die_failed_squash() {
+       sha1=$1
+       rest=$2
        mv "$squash_msg" "$msg" || exit
        rm -f "$fixup_msg"
        cp "$msg" "$GIT_DIR"/MERGE_MSG || exit
        warn
-       warn "Could not apply $1... $2"
-       die_with_patch $1 ""
+       warn "$(eval_gettext "Could not apply \$sha1... \$rest")"
+       die_with_patch $sha1 ""
 }
 
 flush_rewritten_pending() {
@@ -488,6 +506,8 @@ record_in_rewritten() {
 }
 
 do_pick () {
+       sha1=$1
+       rest=$2
        if test "$(git rev-parse HEAD)" = "$squash_onto"
        then
                # Set the correct commit message and author info on the
@@ -499,15 +519,15 @@ do_pick () {
                # resolve before manually running git commit --amend then git
                # rebase --continue.
                git commit --allow-empty --allow-empty-message --amend \
-                          --no-post-rewrite -n -q -C $1 &&
-                       pick_one -n $1 &&
+                          --no-post-rewrite -n -q -C $sha1 &&
+                       pick_one -n $sha1 &&
                        git commit --allow-empty --allow-empty-message \
-                                  --amend --no-post-rewrite -n -q -C $1 \
+                                  --amend --no-post-rewrite -n -q -C $sha1 \
                                   ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                       die_with_patch $1 "Could not apply $1... $2"
+                                  die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
        else
-               pick_one $1 ||
-                       die_with_patch $1 "Could not apply $1... $2"
+               pick_one $sha1 ||
+                       die_with_patch $sha1 "$(eval_gettext "Could not apply \$sha1... \$rest")"
        fi
 }
 
@@ -535,10 +555,11 @@ do_next () {
                mark_action_done
                do_pick $sha1 "$rest"
                git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} || {
-                       warn "Could not amend commit after successfully picking $sha1... $rest"
-                       warn "This is most likely due to an empty commit message, or the pre-commit hook"
-                       warn "failed. If the pre-commit hook failed, you may need to resolve the issue before"
-                       warn "you are able to reword the commit."
+                       warn "$(eval_gettext "\
+Could not amend commit after successfully picking \$sha1... \$rest
+This is most likely due to an empty commit message, or the pre-commit hook
+failed. If the pre-commit hook failed, you may need to resolve the issue before
+you are able to reword the commit.")"
                        exit_with_patch $sha1 1
                }
                record_in_rewritten $sha1
@@ -548,7 +569,8 @@ do_next () {
 
                mark_action_done
                do_pick $sha1 "$rest"
-               warn "Stopped at $sha1... $rest"
+               sha1_abbrev=$(git rev-parse --short $sha1)
+               warn "$(eval_gettext "Stopped at \$sha1_abbrev... \$rest")"
                exit_with_patch $sha1 0
                ;;
        squash|s|fixup|f)
@@ -563,7 +585,7 @@ do_next () {
                comment_for_reflog $squash_style
 
                test -f "$done" && has_action "$done" ||
-                       die "Cannot '$squash_style' without a previous commit"
+                       die "$(eval_gettext "Cannot '\$squash_style' without a previous commit")"
 
                mark_action_done
                update_squash_messages $squash_style $sha1
@@ -605,7 +627,7 @@ do_next () {
        x|"exec")
                read -r command rest < "$todo"
                mark_action_done
-               printf 'Executing: %s\n' "$rest"
+               eval_gettextln "Executing: \$rest"
                "${SHELL:-@SHELL_PATH@}" -c "$rest" # Actual execution
                status=$?
                # Run in subshell because require_clean_work_tree can die.
@@ -613,13 +635,14 @@ do_next () {
                (require_clean_work_tree "rebase" 2>/dev/null) || dirty=t
                if test "$status" -ne 0
                then
-                       warn "Execution failed: $rest"
+                       warn "$(eval_gettext "Execution failed: \$rest")"
                        test "$dirty" = f ||
-                       warn "and made changes to the index and/or the working tree"
+                               warn "$(gettext "and made changes to the index and/or the working tree")"
 
-                       warn "You can fix the problem, and then run"
-                       warn
-                       warn "  git rebase --continue"
+                       warn "$(gettext "\
+You can fix the problem, and then run
+
+       git rebase --continue")"
                        warn
                        if test $status -eq 127         # command not found
                        then
@@ -628,18 +651,20 @@ do_next () {
                        exit "$status"
                elif test "$dirty" = t
                then
-                       warn "Execution succeeded: $rest"
-                       warn "but left changes to the index and/or the working tree"
-                       warn "Commit or stash your changes, and then run"
-                       warn
-                       warn "  git rebase --continue"
+                       # TRANSLATORS: after these lines is a command to be issued by the user
+                       warn "$(eval_gettext "\
+Execution succeeded: \$rest
+but left changes to the index and/or the working tree
+Commit or stash your changes, and then run
+
+       git rebase --continue")"
                        warn
                        exit 1
                fi
                ;;
        *)
-               warn "Unknown command: $command $sha1 $rest"
-               fixtodo="Please fix this using 'git rebase --edit-todo'."
+               warn "$(eval_gettext "Unknown command: \$command \$sha1 \$rest")"
+               fixtodo="$(gettext "Please fix this using 'git rebase --edit-todo'.")"
                if git rev-parse --verify -q "$sha1" >/dev/null
                then
                        die_with_patch $sha1 "$fixtodo"
@@ -674,7 +699,7 @@ do_next () {
                "$hook" rebase < "$rewritten_list"
                true # we don't care if this hook failed
        fi &&
-       warn "Successfully rebased and updated $head_name."
+               warn "$(eval_gettext "Successfully rebased and updated \$head_name.")"
 
        return 1 # not failure; just to break the do_rest loop
 }
@@ -721,7 +746,7 @@ skip_unnecessary_picks () {
                record_in_rewritten "$onto"
                ;;
        esac ||
-       die "Could not skip unnecessary pick commands"
+               die "$(gettext "Could not skip unnecessary pick commands")"
 }
 
 transform_todo_ids () {
@@ -865,12 +890,12 @@ add_exec_commands () {
 # $3: the input filename
 check_commit_sha () {
        badsha=0
-       if test -z $1
+       if test -z "$1"
        then
                badsha=1
        else
                sha1_verif="$(git rev-parse --verify --quiet $1^{commit})"
-               if test -z $sha1_verif
+               if test -z "$sha1_verif"
                then
                        badsha=1
                fi
@@ -879,9 +904,9 @@ check_commit_sha () {
        if test $badsha -ne 0
        then
                line="$(sed -n -e "${2}p" "$3")"
-               warn "Warning: the SHA-1 is missing or isn't" \
-                       "a commit in the following line:"
              warn " - $line"
+               warn "$(eval_gettext "\
+Warning: the SHA-1 is missing or isn't a commit in the following line:
- \$line")"
                warn
        fi
 
@@ -912,9 +937,9 @@ check_bad_cmd_and_sha () {
                        ;;
                *)
                        line="$(sed -n -e "${lineno}p" "$1")"
-                       warn "Warning: the command isn't recognized" \
-                               "in the following line:"
                      warn " - $line"
+                       warn "$(eval_gettext "\
+Warning: the command isn't recognized in the following line:
- \$line")"
                        warn
                        retval=1
                        ;;
@@ -951,7 +976,7 @@ warn_lines () {
 # Switch to the branch in $into and notify it in the reflog
 checkout_onto () {
        GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
-       output git checkout $onto || die_abort "could not detach HEAD"
+       output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
        git update-ref ORIG_HEAD $orig_head
 }
 
@@ -989,28 +1014,26 @@ check_todo_list () {
                then
                        test "$check_level" = error && raise_error=t
 
-                       warn "Warning: some commits may have been dropped" \
-                               "accidentally."
-                       warn "Dropped commits (newer to older):"
+                       warn "$(gettext "\
+Warning: some commits may have been dropped accidentally.
+Dropped commits (newer to older):")"
 
                        # Make the list user-friendly and display
                        opt="--no-walk=sorted --format=oneline --abbrev-commit --stdin"
                        git rev-list $opt <"$todo".miss | warn_lines
 
-                       warn "To avoid this message, use \"drop\" to" \
-                               "explicitly remove a commit."
-                       warn
-                       warn "Use 'git config rebase.missingCommitsCheck' to change" \
-                               "the level of warnings."
-                       warn "The possible behaviours are: ignore, warn, error."
+                       warn "$(gettext "\
+To avoid this message, use \"drop\" to explicitly remove a commit.
+
+Use 'git config rebase.missingCommitsCheck' to change the level of warnings.
+The possible behaviours are: ignore, warn, error.")"
                        warn
                fi
                ;;
        ignore)
                ;;
        *)
-               warn "Unrecognized setting $check_level for option" \
-                       "rebase.missingCommitsCheck. Ignoring."
+               warn "$(eval_gettext "Unrecognized setting \$check_level for option rebase.missingCommitsCheck. Ignoring.")"
                ;;
        esac
 
@@ -1027,8 +1050,8 @@ check_todo_list () {
                # placed before the commit of the next action
                checkout_onto
 
-               warn "You can fix this with 'git rebase --edit-todo'."
-               die "Or you can abort the rebase with 'git rebase --abort'."
+               warn "$(gettext "You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.")"
+               die "$(gettext "Or you can abort the rebase with 'git rebase --abort'.")"
        fi
 }
 
@@ -1037,8 +1060,8 @@ check_todo_list () {
 # below were not inside any function, and expected to return
 # to the function that dot-sourced us.
 #
-# However, FreeBSD /bin/sh misbehaves on such a construct and
-# continues to run the statements that follow such a "return".
+# However, older (9.x) versions of FreeBSD /bin/sh misbehave on such a
+# construct and continue to run the statements that follow such a "return".
 # As a work-around, we introduce an extra layer of a function
 # here, and immediately call it after defining it.
 git_rebase__interactive () {
@@ -1052,41 +1075,43 @@ continue)
 
                test ! -f "$GIT_DIR"/CHERRY_PICK_HEAD ||
                rm "$GIT_DIR"/CHERRY_PICK_HEAD ||
-               die "Could not remove CHERRY_PICK_HEAD"
+               die "$(gettext "Could not remove CHERRY_PICK_HEAD")"
        else
                if ! test -f "$author_script"
                then
                        gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
-                       die "You have staged changes in your working tree. If these changes are meant to be
+                       die "$(eval_gettext "\
+You have staged changes in your working tree.
+If these changes are meant to be
 squashed into the previous commit, run:
 
-  git commit --amend $gpg_sign_opt_quoted
+  git commit --amend \$gpg_sign_opt_quoted
 
 If they are meant to go into a new commit, run:
 
-  git commit $gpg_sign_opt_quoted
+  git commit \$gpg_sign_opt_quoted
 
-In both case, once you're done, continue with:
+In both cases, once you're done, continue with:
 
   git rebase --continue
-"
+")"
                fi
                . "$author_script" ||
-                       die "Error trying to find the author identity to amend commit"
+                       die "$(gettext "Error trying to find the author identity to amend commit")"
                if test -f "$amend"
                then
                        current_head=$(git rev-parse --verify HEAD)
                        test "$current_head" = $(cat "$amend") ||
-                       die "\
-You have uncommitted changes in your working tree. Please, commit them
-first and then run 'git rebase --continue' again."
+                       die "$(gettext "\
+You have uncommitted changes in your working tree. Please commit them
+first and then run 'git rebase --continue' again.")"
                        do_with_author git commit --amend --no-verify -F "$msg" -e \
                                ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                               die "Could not commit staged changes."
+                               die "$(gettext "Could not commit staged changes.")"
                else
                        do_with_author git commit --no-verify -F "$msg" -e \
                                ${gpg_sign_opt:+"$gpg_sign_opt"} ||
-                               die "Could not commit staged changes."
+                               die "$(gettext "Could not commit staged changes.")"
                fi
        fi
 
@@ -1110,40 +1135,36 @@ edit-todo)
        mv -f "$todo".new "$todo"
        collapse_todo_ids
        append_todo_help
-       git stripspace --comment-lines >>"$todo" <<\EOF
-
+       gettext "
 You are editing the todo file of an ongoing interactive rebase.
 To continue rebase after editing, run:
     git rebase --continue
 
-EOF
+" | git stripspace --comment-lines >>"$todo"
 
        git_sequence_editor "$todo" ||
-               die "Could not execute editor"
+               die "$(gettext "Could not execute editor")"
        expand_todo_ids
 
        exit
        ;;
 esac
 
-git var GIT_COMMITTER_IDENT >/dev/null ||
-       die "You need to set your committer info first"
-
 comment_for_reflog start
 
 if test ! -z "$switch_to"
 then
        GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
        output git checkout "$switch_to" -- ||
-       die "Could not checkout $switch_to"
+               die "$(eval_gettext "Could not checkout \$switch_to")"
 
        comment_for_reflog start
 fi
 
-orig_head=$(git rev-parse --verify HEAD) || die "No HEAD?"
-mkdir -p "$state_dir" || die "Could not create temporary $state_dir"
+orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
+mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
 
-: > "$state_dir"/interactive || die "Could not mark as interactive"
+: > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")"
 write_basic_state
 if test t = "$preserve_merges"
 then
@@ -1153,12 +1174,12 @@ then
                for c in $(git merge-base --all $orig_head $upstream)
                do
                        echo $onto > "$rewritten"/$c ||
-                               die "Could not init rewritten commits"
+                               die "$(gettext "Could not init rewritten commits")"
                done
        else
                mkdir "$rewritten" &&
                echo $onto > "$rewritten"/root ||
-                       die "Could not init rewritten commits"
+                       die "$(gettext "Could not init rewritten commits")"
        fi
        # No cherry-pick because our first pass is to determine
        # parents to rewrite and skipping dropped commits would
@@ -1257,18 +1278,20 @@ todocount=${todocount##* }
 
 cat >>"$todo" <<EOF
 
-$comment_char Rebase $shortrevisions onto $shortonto ($todocount command(s))
+$comment_char $(eval_ngettext \
+       "Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \
+       "Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \
+       "$todocount")
 EOF
 append_todo_help
-git stripspace --comment-lines >>"$todo" <<\EOF
-
+gettext "
 However, if you remove everything, the rebase will be aborted.
 
-EOF
+" | git stripspace --comment-lines >>"$todo"
 
 if test -z "$keep_empty"
 then
-       printf '%s\n' "$comment_char Note that empty commits are commented out" >>"$todo"
+       printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo"
 fi
 
 
@@ -1278,7 +1301,7 @@ has_action "$todo" ||
 cp "$todo" "$todo".backup
 collapse_todo_ids
 git_sequence_editor "$todo" ||
-       die_abort "Could not execute editor"
+       die_abort "$(gettext "Could not execute editor")"
 
 has_action "$todo" ||
        return 2
index 2cc2a6d2734c0ef12222004f22d717f4f724d82f..06a4723d4db3db74ea17ace60d824e83cdee25e9 100644 (file)
@@ -67,7 +67,9 @@ call_merge () {
                GIT_MERGE_VERBOSITY=1 && export GIT_MERGE_VERBOSITY
        fi
        test -z "$strategy" && strategy=recursive
-       eval 'git-merge-$strategy' $strategy_opts '"$cmt^" -- "$hd" "$cmt"'
+       # If cmt doesn't have a parent, don't include it as a base
+       base=$(git rev-parse --verify --quiet $cmt^)
+       eval 'git-merge-$strategy' $strategy_opts $base ' -- "$hd" "$cmt"'
        rv=$?
        case "$rv" in
        0)
@@ -105,8 +107,8 @@ finish_rb_merge () {
 # below were not inside any function, and expected to return
 # to the function that dot-sourced us.
 #
-# However, FreeBSD /bin/sh misbehaves on such a construct and
-# continues to run the statements that follow such a "return".
+# However, older (9.x) versions of FreeBSD /bin/sh misbehave on such a
+# construct and continue to run the statements that follow such a "return".
 # As a work-around, we introduce an extra layer of a function
 # here, and immediately call it after defining it.
 git_rebase__merge () {
index cf60c4390870ef28cff08b6a173a435d41e2d470..04f6e44bc8c779d7f4c60c19066820533279324a 100755 (executable)
@@ -45,7 +45,6 @@ skip!              skip current patch and continue
 edit-todo!         edit the todo list during an interactive rebase
 "
 . git-sh-setup
-. git-sh-i18n
 set_reflog_action rebase
 require_work_tree_exists
 cd_to_toplevel
@@ -87,7 +86,10 @@ preserve_merges=
 autosquash=
 keep_empty=
 test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
-gpg_sign_opt=
+case "$(git config --bool commit.gpgsign)" in
+true)  gpg_sign_opt=-S ;;
+*)     gpg_sign_opt= ;;
+esac
 
 read_basic_state () {
        test -f "$state_dir/head-name" &&
@@ -151,7 +153,7 @@ move_to_original_branch () {
                git symbolic-ref \
                        -m "rebase finished: returning to $head_name" \
                        HEAD $head_name ||
-               die "$(gettext "Could not move back to $head_name")"
+               die "$(eval_gettext "Could not move back to \$head_name")"
                ;;
        esac
 }
@@ -248,6 +250,7 @@ do
                ;;
        --exec=*)
                cmd="${cmd}exec ${1#--exec=}${LF}"
+               test -z "$interactive_rebase" && interactive_rebase=implied
                ;;
        --interactive)
                interactive_rebase=explicit
@@ -348,12 +351,6 @@ do
 done
 test $# -gt 2 && usage
 
-if test -n "$cmd" &&
-   test "$interactive_rebase" != explicit
-then
-       die "$(gettext "The --exec option must be used with the --interactive option")"
-fi
-
 if test -n "$action"
 then
        test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
@@ -451,7 +448,7 @@ then
                then
                        . git-parse-remote
                        error_on_missing_default_upstream "rebase" "rebase" \
-                               "against" "git rebase <branch>"
+                               "against" "git rebase $(gettext '<branch>')"
                fi
 
                test "$fork_point" = auto && fork_point=t
index d356901348042a7f2ec67211857e4d551d169d52..da81be40cb7f9af1a960be2c22f8e75c9d16822e 100755 (executable)
 use 5.008;
 use strict;
 use warnings;
+use POSIX qw/strftime/;
 use Term::ReadLine;
 use Getopt::Long;
 use Text::ParseWords;
-use Data::Dumper;
 use Term::ANSIColor;
 use File::Temp qw/ tempdir tempfile /;
 use File::Spec::Functions qw(catfile);
@@ -533,7 +533,7 @@ my %parse_alias = (
                        $aliases{$alias} = \@addr
                }}},
        mailrc => sub { my $fh = shift; while (<$fh>) {
-               if (/^alias\s+(\S+)\s+(.*)$/) {
+               if (/^alias\s+(\S+)\s+(.*?)\s*$/) {
                        # spaces delimit multiple addresses
                        $aliases{$1} = [ quotewords('\s+', 0, $2) ];
                }}},
@@ -621,6 +621,8 @@ if (@rev_list_opts) {
        push @files, $repo->command('format-patch', '-o', tempdir(CLEANUP => 1), @rev_list_opts);
 }
 
+@files = handle_backup_files(@files);
+
 if ($validate) {
        foreach my $f (@files) {
                unless (-p $f) {
@@ -827,9 +829,10 @@ 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 $prompting = 0;
 if (!@initial_to && !defined $to_cmd) {
-       my $to = ask("Who should the emails be sent to (if any)? ",
+       my $to = ask("$to_whom ",
                     default => "",
                     valid_re => qr/\@.*\./, confirm_only => 1);
        push @initial_to, parse_address_line($to) if defined $to; # sanitized/validated later
@@ -924,7 +927,7 @@ sub validate_address {
                        cleanup_compose_files();
                        exit(0);
                }
-               $address = ask("Who should the email be sent to (if any)? ",
+               $address = ask("$to_whom ",
                        default => "",
                        valid_re => qr/\@.*\./, confirm_only => 1);
        }
@@ -949,7 +952,7 @@ my ($message_id_stamp, $message_id_serial);
 sub make_message_id {
        my $uniq;
        if (!defined $message_id_stamp) {
-               $message_id_stamp = sprintf("%s-%s", time, $$);
+               $message_id_stamp = strftime("%Y%m%d%H%M%S.$$", gmtime(time));
                $message_id_serial = 0;
        }
        $message_id_serial++;
@@ -964,7 +967,7 @@ sub make_message_id {
                require Sys::Hostname;
                $du_part = 'user@' . Sys::Hostname::hostname();
        }
-       my $message_id_template = "<%s-git-send-email-%s>";
+       my $message_id_template = "<%s-%s>";
        $message_id = sprintf($message_id_template, $uniq, $du_part);
        #print "new message id = $message_id\n"; # Was useful for debugging
 }
@@ -1726,6 +1729,44 @@ sub validate_patch {
        return;
 }
 
+sub handle_backup {
+       my ($last, $lastlen, $file, $known_suffix) = @_;
+       my ($suffix, $skip);
+
+       $skip = 0;
+       if (defined $last &&
+           ($lastlen < length($file)) &&
+           (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";
+                       $skip = 1;
+               } else {
+                       my $answer = ask("Do you really want to send $file? (y|N): ",
+                                        valid_re => qr/^(?:y|n)/i,
+                                        default => 'n');
+                       $skip = ($answer ne 'y');
+                       if ($skip) {
+                               $known_suffix = $suffix;
+                       }
+               }
+       }
+       return ($skip, $known_suffix);
+}
+
+sub handle_backup_files {
+       my @file = @_;
+       my ($last, $lastlen, $known_suffix, $skip, @result);
+       for my $file (@file) {
+               ($skip, $known_suffix) = handle_backup($last, $lastlen,
+                                                      $file, $known_suffix);
+               push @result, $file unless $skip;
+               $last = $file;
+               $lastlen = length($file);
+       }
+       return @result;
+}
+
 sub file_has_nonascii {
        my $fn = shift;
        open(my $fh, '<', $fn)
index e6c3116e181318fa4c1036b0a26a1d0f24a4ace7..1ef1889dbd806494b8659023a091920b07692035 100644 (file)
@@ -53,6 +53,13 @@ gettext_without_eval_gettext)
                        git sh-i18n--envsubst "$1"
                )
        }
+
+       eval_ngettext () {
+               ngettext "$1" "$2" "$3" | (
+                       export PATH $(git sh-i18n--envsubst --variables "$2");
+                       git sh-i18n--envsubst "$2"
+               )
+       }
        ;;
 poison)
        # Emit garbage so that tests that incorrectly rely on translatable
@@ -64,6 +71,10 @@ poison)
        eval_gettext () {
                printf "%s" "# GETTEXT POISON #"
        }
+
+       eval_ngettext () {
+               printf "%s" "# GETTEXT POISON #"
+       }
        ;;
 *)
        gettext () {
@@ -76,6 +87,13 @@ poison)
                        git sh-i18n--envsubst "$1"
                )
        }
+
+       eval_ngettext () {
+               (test "$3" = 1 && printf "%s" "$1" || printf "%s" "$2") | (
+                       export PATH $(git sh-i18n--envsubst --variables "$2");
+                       git sh-i18n--envsubst "$2"
+               )
+       }
        ;;
 esac
 
index c48139a49420ea2318e23d8667eb20bae9772463..240c7ebcd1449935d359e12b8bae817179f567bf 100644 (file)
@@ -43,6 +43,9 @@ git_broken_path_fix () {
 
 # @@BROKEN_PATH_FIX@@
 
+# Source git-sh-i18n for gettext support.
+. "$(git --exec-path)/git-sh-i18n"
+
 die () {
        die_with_status 1 "$@"
 }
@@ -83,16 +86,16 @@ if test -n "$OPTIONS_SPEC"; then
 else
        dashless=$(basename -- "$0" | sed -e 's/-/ /')
        usage() {
-               die "usage: $dashless $USAGE"
+               die "$(eval_gettext "usage: \$dashless \$USAGE")"
        }
 
        if [ -z "$LONG_USAGE" ]
        then
-               LONG_USAGE="usage: $dashless $USAGE"
+               LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE")"
        else
-               LONG_USAGE="usage: $dashless $USAGE
+               LONG_USAGE="$(eval_gettext "usage: \$dashless \$USAGE
 
-$LONG_USAGE"
+$LONG_USAGE")"
        fi
 
        case "$1" in
@@ -160,9 +163,11 @@ git_pager() {
        else
                GIT_PAGER=cat
        fi
-       : ${LESS=-FRX}
-       : ${LV=-c}
-       export LESS LV
+       for vardef in @@PAGER_ENV@@
+       do
+               var=${vardef%%=*}
+               eval ": \"\${$vardef}\" && export $var"
+       done
 
        eval "$GIT_PAGER" '"$@"'
 }
@@ -182,7 +187,7 @@ is_bare_repository () {
 cd_to_toplevel () {
        cdup=$(git rev-parse --show-toplevel) &&
        cd "$cdup" || {
-               echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
+               gettextln "Cannot chdir to \$cdup, the toplevel of the working tree" >&2
                exit 1
        }
 }
@@ -190,13 +195,16 @@ cd_to_toplevel () {
 require_work_tree_exists () {
        if test "z$(git rev-parse --is-bare-repository)" != zfalse
        then
-               die "fatal: $0 cannot be used without a working tree."
+               program_name=$0
+               die "$(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 ||
-       die "fatal: $0 cannot be used without a working 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.")"
+       }
 }
 
 require_clean_work_tree () {
@@ -206,24 +214,49 @@ require_clean_work_tree () {
 
        if ! git diff-files --quiet --ignore-submodules
        then
-               echo >&2 "Cannot $1: You have unstaged changes."
+               action=$1
+               case "$action" in
+               rebase)
+                       gettextln "Cannot rebase: You have unstaged changes." >&2
+                       ;;
+               "rewrite branches")
+                       gettextln "Cannot rewrite branches: You have unstaged changes." >&2
+                       ;;
+               "pull with rebase")
+                       gettextln "Cannot pull with rebase: You have unstaged changes." >&2
+                       ;;
+               *)
+                       eval_gettextln "Cannot \$action: You have unstaged changes." >&2
+                       ;;
+               esac
                err=1
        fi
 
        if ! git diff-index --cached --quiet --ignore-submodules HEAD --
        then
-               if [ $err = 0 ]
+               if test $err = 0
                then
-                   echo >&2 "Cannot $1: Your index contains uncommitted changes."
+                       action=$1
+                       case "$action" in
+                       rebase)
+                               gettextln "Cannot rebase: Your index contains uncommitted changes." >&2
+                               ;;
+                       "pull with rebase")
+                               gettextln "Cannot pull with rebase: Your index contains uncommitted changes." >&2
+                               ;;
+                       *)
+                               eval_gettextln "Cannot \$action: Your index contains uncommitted changes." >&2
+                               ;;
+                       esac
                else
-                   echo >&2 "Additionally, your index contains uncommitted changes."
+                   gettextln "Additionally, your index contains uncommitted changes." >&2
                fi
                err=1
        fi
 
-       if [ $err = 1 ]
+       if test $err = 1
        then
-               test -n "$2" && echo >&2 "$2"
+               test -n "$2" && echo "$2" >&2
                exit 1
        fi
 }
@@ -336,15 +369,15 @@ git_dir_init () {
        then
                test -z "$(git rev-parse --show-cdup)" || {
                        exit=$?
-                       echo >&2 "You need to run this command from the toplevel of the working tree."
+                       gettextln "You need to run this command from the toplevel of the working tree." >&2
                        exit $exit
                }
        fi
        test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || {
-               echo >&2 "Unable to determine absolute path of git directory"
+               gettextln "Unable to determine absolute path of git directory" >&2
                exit 1
        }
-       : ${GIT_OBJECT_DIRECTORY="$(git rev-parse --git-path objects)"}
+       : "${GIT_OBJECT_DIRECTORY="$(git rev-parse --git-path objects)"}"
 }
 
 if test -z "$NONGIT_OK"
index c7c65e25f50e7b558952a5180081ad499f2a90fc..10c284d1aa2273a3dfe5cc39f1d6738830d02462 100755 (executable)
@@ -15,7 +15,6 @@ SUBDIRECTORY_OK=Yes
 OPTIONS_SPEC=
 START_DIR=$(pwd)
 . git-sh-setup
-. git-sh-i18n
 require_work_tree
 cd_to_toplevel
 
@@ -101,7 +100,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
@@ -116,7 +115,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"
@@ -185,7 +184,7 @@ store_stash () {
 
        git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit
        ret=$?
-       test $ret != 0 && test -z $quiet &&
+       test $ret != 0 && test -z "$quiet" &&
        die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")"
        return $ret
 }
@@ -249,7 +248,7 @@ save_stash () {
 
        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="$*"
@@ -266,7 +265,7 @@ save_stash () {
        create_stash "$stash_msg" $untracked
        store_stash -m "$stash_msg" -q $w_commit ||
        die "$(gettext "Cannot save the current status")"
-       say Saved working directory and index state "$stash_msg"
+       say "$(eval_gettext "Saved working directory and index state \$stash_msg")"
 
        if test -z "$patch_mode"
        then
@@ -277,7 +276,7 @@ save_stash () {
                        git clean --force --quiet -d $CLEAN_X_OPTION
                fi
 
-               if test "$keep_index" = "t" && test -n $i_tree
+               if test "$keep_index" = "t" && test -n "$i_tree"
                then
                        git read-tree --reset -u $i_tree
                fi
@@ -385,9 +384,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
@@ -405,6 +403,9 @@ parse_flags_and_rev()
                                        die "$(eval_gettext "unknown option: \$opt")"
                                FLAGS="${FLAGS}${FLAGS:+ }$opt"
                        ;;
+                       *)
+                               REV="${REV}${REV:+ }'$opt'"
+                       ;;
                esac
        done
 
@@ -423,6 +424,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")"
@@ -495,7 +505,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 "
@@ -549,7 +559,7 @@ pop_stash() {
                drop_stash "$@"
        else
                status=$?
-               say "The stash is kept in case you need it again."
+               say "$(gettext "The stash is kept in case you need it again.")"
                exit $status
        fi
 }
index 43c68deee9db2b243d39eba704878eb7551ada2d..a024a135d6663c8a8d5ceb926e3f42df1f577411 100755 (executable)
@@ -8,15 +8,14 @@ dashless=$(basename "$0" | sed -e 's/-/ /')
 USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] init [--] [<path>...]
-   or: $dashless [--quiet] deinit [-f|--force] [--] <path>...
-   or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] [--recursive] [--] [<path>...]
+   or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
+   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>...]"
 OPTIONS_SPEC=
 SUBDIRECTORY_OK=Yes
 . git-sh-setup
-. git-sh-i18n
 . git-parse-remote
 require_work_tree
 wt_prefix=$(git rev-parse --show-prefix)
@@ -45,120 +44,13 @@ update=
 prefix=
 custom_name=
 depth=
-
-# The function takes at most 2 arguments. The first argument is the
-# URL that navigates to the submodule origin repo. When relative, this URL
-# is relative to the superproject origin URL repo. The second up_path
-# argument, if specified, is the relative path that navigates
-# from the submodule working tree to the superproject working tree.
-#
-# The output of the function is the origin URL of the submodule.
-#
-# The output will either be an absolute URL or filesystem path (if the
-# superproject origin URL is an absolute URL or filesystem path,
-# respectively) or a relative file system path (if the superproject
-# origin URL is a relative file system path).
-#
-# When the output is a relative file system path, the path is either
-# relative to the submodule working tree, if up_path is specified, or to
-# the superproject working tree otherwise.
-resolve_relative_url ()
-{
-       remote=$(get_default_remote)
-       remoteurl=$(git config "remote.$remote.url") ||
-               remoteurl=$(pwd) # the repository is its own authoritative upstream
-       url="$1"
-       remoteurl=${remoteurl%/}
-       sep=/
-       up_path="$2"
-
-       case "$remoteurl" in
-       *:*|/*)
-               is_relative=
-               ;;
-       ./*|../*)
-               is_relative=t
-               ;;
-       *)
-               is_relative=t
-               remoteurl="./$remoteurl"
-               ;;
-       esac
-
-       while test -n "$url"
-       do
-               case "$url" in
-               ../*)
-                       url="${url#../}"
-                       case "$remoteurl" in
-                       */*)
-                               remoteurl="${remoteurl%/*}"
-                               ;;
-                       *:*)
-                               remoteurl="${remoteurl%:*}"
-                               sep=:
-                               ;;
-                       *)
-                               if test -z "$is_relative" || test "." = "$remoteurl"
-                               then
-                                       die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
-                               else
-                                       remoteurl=.
-                               fi
-                               ;;
-                       esac
-                       ;;
-               ./*)
-                       url="${url#./}"
-                       ;;
-               *)
-                       break;;
-               esac
-       done
-       remoteurl="$remoteurl$sep${url%/}"
-       echo "${is_relative:+${up_path}}${remoteurl#./}"
-}
-
-# Resolve a path to be relative to another path.  This is intended for
-# converting submodule paths when git-submodule is run in a subdirectory
-# and only handles paths where the directory separator is '/'.
-#
-# The output is the first argument as a path relative to the second argument,
-# which defaults to $wt_prefix if it is omitted.
-relative_path ()
-{
-       local target curdir result
-       target=$1
-       curdir=${2-$wt_prefix}
-       curdir=${curdir%/}
-       result=
-
-       while test -n "$curdir"
-       do
-               case "$target" in
-               "$curdir/"*)
-                       target=${target#"$curdir"/}
-                       break
-                       ;;
-               esac
-
-               result="${result}../"
-               if test "$curdir" = "${curdir%/*}"
-               then
-                       curdir=
-               else
-                       curdir="${curdir%/*}"
-               fi
-       done
-
-       echo "$result$target"
-}
+progress=
 
 die_if_unmatched ()
 {
        if test "$1" = "#unmatched"
        then
-               exit 1
+               exit ${2:-1}
        fi
 }
 
@@ -192,6 +84,17 @@ isnumber()
        n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
 }
 
+# Sanitize the local git environment for use within a submodule. We
+# can't simply use clear_local_git_env since we want to preserve some
+# of the settings from GIT_CONFIG_PARAMETERS.
+sanitize_submodule_env()
+{
+       save_config=$GIT_CONFIG_PARAMETERS
+       clear_local_git_env
+       GIT_CONFIG_PARAMETERS=$save_config
+       export GIT_CONFIG_PARAMETERS
+}
+
 #
 # Add a new submodule to the working tree, .gitmodules and the index
 #
@@ -281,7 +184,7 @@ cmd_add()
                die "$(gettext "Relative path can only be used from the toplevel of the working tree")"
 
                # dereference source url relative to parent's url
-               realrepo=$(resolve_relative_url "$repo") || exit
+               realrepo=$(git submodule--helper resolve-relative-url "$repo") || exit
                ;;
        *:*|/*)
                # absolute url
@@ -337,19 +240,20 @@ Use -f if you really want to add it." >&2
                then
                        if test -z "$force"
                        then
-                               echo >&2 "$(eval_gettext "A git directory for '\$sm_name' is found locally with remote(s):")"
+                               eval_gettextln >&2 "A git directory for '\$sm_name' is found locally with remote(s):"
                                GIT_DIR=".git/modules/$sm_name" GIT_WORK_TREE=. git remote -v | grep '(fetch)' | sed -e s,^,"  ", -e s,' (fetch)',, >&2
-                               echo >&2 "$(eval_gettext "If you want to reuse this local git directory instead of cloning again from")"
-                               echo >&2 "  $realrepo"
-                               echo >&2 "$(eval_gettext "use the '--force' option. If the local git directory is not the correct repo")"
-                               die "$(eval_gettext "or you are unsure what this means choose another name with the '--name' option.")"
+                               die "$(eval_gettextln "\
+If you want to reuse this local git directory instead of cloning again from
+  \$realrepo
+use the '--force' option. If the local git directory is not the correct repo
+or you are unsure what this means choose another name with the '--name' option.")"
                        else
-                               echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
+                               eval_gettextln "Reactivating local git directory for submodule '\$sm_name'."
                        fi
                fi
-               git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" "$reference" "$depth" || exit
+               git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${depth:+"$depth"} || exit
                (
-                       clear_local_git_env
+                       sanitize_submodule_env
                        cd "$sm_path" &&
                        # ash fails to wordsplit ${branch:+-b "$branch"...}
                        case "$branch" in
@@ -407,20 +311,23 @@ cmd_foreach()
        # command in the subshell (and a recursive call to this function)
        exec 3<&0
 
-       git submodule--helper list --prefix "$wt_prefix"|
+       {
+               git submodule--helper list --prefix "$wt_prefix" ||
+               echo "#unmatched" $?
+       } |
        while read mode sha1 stage sm_path
        do
-               die_if_unmatched "$mode"
+               die_if_unmatched "$mode" "$sha1"
                if test -e "$sm_path"/.git
                then
-                       displaypath=$(relative_path "$sm_path")
-                       say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
+                       displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
+                       say "$(eval_gettext "Entering '\$displaypath'")"
                        name=$(git submodule--helper name "$sm_path")
                        (
                                prefix="$prefix$sm_path/"
-                               clear_local_git_env
+                               sanitize_submodule_env
                                cd "$sm_path" &&
-                               sm_path=$(relative_path "$sm_path") &&
+                               sm_path=$(git submodule--helper relative-path "$sm_path" "$wt_prefix") &&
                                # we make $path available to scripts ...
                                path=$sm_path &&
                                if test $# -eq 1
@@ -434,7 +341,7 @@ cmd_foreach()
                                        cmd_foreach "--recursive" "$@"
                                fi
                        ) <&3 3<&- ||
-                       die "$(eval_gettext "Stopping at '\$prefix\$displaypath'; script returned non-zero status.")"
+                       die "$(eval_gettext "Stopping at '\$displaypath'; script returned non-zero status.")"
                fi
        done
 }
@@ -467,60 +374,16 @@ cmd_init()
                shift
        done
 
-       git submodule--helper list --prefix "$wt_prefix" "$@" |
-       while read mode sha1 stage sm_path
-       do
-               die_if_unmatched "$mode"
-               name=$(git submodule--helper name "$sm_path") || exit
-
-               displaypath=$(relative_path "$sm_path")
-
-               # Copy url setting when it is not set yet
-               if test -z "$(git config "submodule.$name.url")"
-               then
-                       url=$(git config -f .gitmodules submodule."$name".url)
-                       test -z "$url" &&
-                       die "$(eval_gettext "No url found for submodule path '\$displaypath' in .gitmodules")"
-
-                       # Possibly a url relative to parent
-                       case "$url" in
-                       ./*|../*)
-                               url=$(resolve_relative_url "$url") || exit
-                               ;;
-                       esac
-                       git config submodule."$name".url "$url" ||
-                       die "$(eval_gettext "Failed to register url for submodule path '\$displaypath'")"
-
-                       say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$displaypath'")"
-               fi
-
-               # Copy "update" setting when it is not set yet
-               if upd="$(git config -f .gitmodules submodule."$name".update)" &&
-                  test -n "$upd" &&
-                  test -z "$(git config submodule."$name".update)"
-               then
-                       case "$upd" in
-                       checkout | rebase | merge | none)
-                               ;; # known modes of updating
-                       *)
-                               echo >&2 "warning: unknown update mode '$upd' suggested for submodule '$name'"
-                               upd=none
-                               ;;
-                       esac
-                       git config submodule."$name".update "$upd" ||
-                       die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")"
-               fi
-       done
+       git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init ${GIT_QUIET:+--quiet} ${prefix:+--prefix "$prefix"} "$@"
 }
 
 #
 # Unregister submodules from .git/config and remove their work tree
 #
-# $@ = requested paths (use '.' to deinit all submodules)
-#
 cmd_deinit()
 {
        # parse $args after "submodule ... deinit".
+       deinit_all=
        while test $# -ne 0
        do
                case "$1" in
@@ -530,6 +393,9 @@ cmd_deinit()
                -q|--quiet)
                        GIT_QUIET=1
                        ;;
+               --all)
+                       deinit_all=t
+                       ;;
                --)
                        shift
                        break
@@ -544,18 +410,26 @@ cmd_deinit()
                shift
        done
 
-       if test $# = 0
+       if test -n "$deinit_all" && test "$#" -ne 0
        then
-               die "$(eval_gettext "Use '.' if you really want to deinitialize all submodules")"
+               echo >&2 "$(eval_gettext "pathspec and --all are incompatible")"
+               usage
+       fi
+       if test $# = 0 && test -z "$deinit_all"
+       then
+               die "$(eval_gettext "Use '--all' if you really want to deinitialize all submodules")"
        fi
 
-       git submodule--helper list --prefix "$wt_prefix" "$@" |
+       {
+               git submodule--helper list --prefix "$wt_prefix" "$@" ||
+               echo "#unmatched" $?
+       } |
        while read mode sha1 stage sm_path
        do
-               die_if_unmatched "$mode"
+               die_if_unmatched "$mode" "$sha1"
                name=$(git submodule--helper name "$sm_path") || exit
 
-               displaypath=$(relative_path "$sm_path")
+               displaypath=$(git submodule--helper relative-path "$sm_path" "$wt_prefix")
 
                # Remove the submodule work tree (unless the user already did it)
                if test -d "$sm_path"
@@ -563,8 +437,9 @@ cmd_deinit()
                        # Protect submodules containing a .git directory
                        if test -d "$sm_path/.git"
                        then
-                               echo >&2 "$(eval_gettext "Submodule work tree '\$displaypath' contains a .git directory")"
-                               die "$(eval_gettext "(use 'rm -rf' if you really want to remove it including all of its history)")"
+                               die "$(eval_gettext "\
+Submodule work tree '\$displaypath' contains a .git directory
+(use 'rm -rf' if you really want to remove it including all of its history)")"
                        fi
 
                        if test -z "$force"
@@ -592,20 +467,21 @@ cmd_deinit()
 }
 
 is_tip_reachable () (
-       clear_local_git_env
+       sanitize_submodule_env &&
        cd "$1" &&
        rev=$(git rev-list -n 1 "$2" --not --all 2>/dev/null) &&
        test -z "$rev"
 )
 
 fetch_in_submodule () (
-       clear_local_git_env
+       sanitize_submodule_env &&
        cd "$1" &&
        case "$2" in
        '')
                git fetch ;;
        *)
-               git fetch $(get_default_remote) "$2" ;;
+               shift
+               git fetch $(get_default_remote) "$@" ;;
        esac
 )
 
@@ -623,6 +499,9 @@ cmd_update()
                -q|--quiet)
                        GIT_QUIET=1
                        ;;
+               --progress)
+                       progress="--progress"
+                       ;;
                -i|--init)
                        init=1
                        ;;
@@ -655,6 +534,12 @@ cmd_update()
                --checkout)
                        update="checkout"
                        ;;
+               --recommend-shallow)
+                       recommend_shallow="--recommend-shallow"
+                       ;;
+               --no-recommend-shallow)
+                       recommend_shallow="--no-recommend-shallow"
+                       ;;
                --depth)
                        case "$2" in '') usage ;; esac
                        depth="--depth=$2"
@@ -663,6 +548,14 @@ cmd_update()
                --depth=*)
                        depth=$1
                        ;;
+               -j|--jobs)
+                       case "$2" in '') usage ;; esac
+                       jobs="--jobs=$2"
+                       shift
+                       ;;
+               --jobs=*)
+                       jobs=$1
+                       ;;
                --)
                        shift
                        break
@@ -682,20 +575,25 @@ cmd_update()
                cmd_init "--" "$@" || return
        fi
 
-       cloned_modules=
-       git submodule--helper list --prefix "$wt_prefix" "$@" | {
+       {
+       git submodule--helper update-clone ${GIT_QUIET:+--quiet} \
+               ${progress:+"$progress"} \
+               ${wt_prefix:+--prefix "$wt_prefix"} \
+               ${prefix:+--recursive-prefix "$prefix"} \
+               ${update:+--update "$update"} \
+               ${reference:+"$reference"} \
+               ${depth:+--depth "$depth"} \
+               ${recommend_shallow:+"$recommend_shallow"} \
+               ${jobs:+$jobs} \
+               "$@" || echo "#unmatched" $?
+       } | {
        err=
-       while read mode sha1 stage sm_path
+       while read mode sha1 stage just_cloned sm_path
        do
-               die_if_unmatched "$mode"
-               if test "$stage" = U
-               then
-                       echo >&2 "Skipping unmerged submodule $prefix$sm_path"
-                       continue
-               fi
+               die_if_unmatched "$mode" "$sha1"
+
                name=$(git submodule--helper name "$sm_path") || exit
                url=$(git config submodule."$name".url)
-               branch=$(get_submodule_config "$name" branch master)
                if ! test -z "$update"
                then
                        update_module=$update
@@ -707,47 +605,31 @@ cmd_update()
                        fi
                fi
 
-               displaypath=$(relative_path "$prefix$sm_path")
-
-               if test "$update_module" = "none"
-               then
-                       echo "Skipping submodule '$displaypath'"
-                       continue
-               fi
-
-               if test -z "$url"
-               then
-                       # Only mention uninitialized submodules when its
-                       # path have been specified
-                       test "$#" != "0" &&
-                       say "$(eval_gettext "Submodule path '\$displaypath' not initialized
-Maybe you want to use 'update --init'?")"
-                       continue
-               fi
+               displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
 
-               if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
+               if test $just_cloned -eq 1
                then
-                       git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$prefix" --path "$sm_path" --name "$name" --url "$url" "$reference" "$depth" || exit
-                       cloned_modules="$cloned_modules;$name"
                        subsha1=
+                       update_module=checkout
                else
-                       subsha1=$(clear_local_git_env; cd "$sm_path" &&
+                       subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
                                git rev-parse --verify HEAD) ||
                        die "$(eval_gettext "Unable to find current revision in submodule path '\$displaypath'")"
                fi
 
                if test -n "$remote"
                then
+                       branch=$(git submodule--helper remote-branch "$sm_path")
                        if test -z "$nofetch"
                        then
                                # Fetch remote before determining tracking $sha1
-                               (clear_local_git_env; cd "$sm_path" && git-fetch) ||
+                               fetch_in_submodule "$sm_path" $depth ||
                                die "$(eval_gettext "Unable to fetch in submodule path '\$sm_path'")"
                        fi
-                       remote_name=$(clear_local_git_env; cd "$sm_path" && get_default_remote)
-                       sha1=$(clear_local_git_env; cd "$sm_path" &&
+                       remote_name=$(sanitize_submodule_env; cd "$sm_path" && get_default_remote)
+                       sha1=$(sanitize_submodule_env; cd "$sm_path" &&
                                git rev-parse --verify "${remote_name}/${branch}") ||
-                       die "$(eval_gettext "Unable to find current ${remote_name}/${branch} revision in submodule path '\$sm_path'")"
+                       die "$(eval_gettext "Unable to find current \${remote_name}/\${branch} revision in submodule path '\$sm_path'")"
                fi
 
                if test "$subsha1" != "$sha1" || test -n "$force"
@@ -764,23 +646,16 @@ Maybe you want to use 'update --init'?")"
                                # Run fetch only if $sha1 isn't present or it
                                # is not reachable from a ref.
                                is_tip_reachable "$sm_path" "$sha1" ||
-                               fetch_in_submodule "$sm_path" ||
+                               fetch_in_submodule "$sm_path" $depth ||
                                die "$(eval_gettext "Unable to fetch in submodule path '\$displaypath'")"
 
                                # Now we tried the usual fetch, but $sha1 may
                                # not be reachable from any of the refs
                                is_tip_reachable "$sm_path" "$sha1" ||
-                               fetch_in_submodule "$sm_path" "$sha1" ||
-                               die "$(eval_gettext "Fetched in submodule path '\$displaypath', but it did not contain $sha1. Direct fetching of that commit failed.")"
+                               fetch_in_submodule "$sm_path" $depth "$sha1" ||
+                               die "$(eval_gettext "Fetched in submodule path '\$displaypath', but it did not contain \$sha1. Direct fetching of that commit failed.")"
                        fi
 
-                       # Is this something we just cloned?
-                       case ";$cloned_modules;" in
-                       *";$name;"*)
-                               # then there is no local change to integrate
-                               update_module=checkout ;;
-                       esac
-
                        must_die_on_failure=
                        case "$update_module" in
                        checkout)
@@ -802,15 +677,15 @@ Maybe you want to use 'update --init'?")"
                                ;;
                        !*)
                                command="${update_module#!}"
-                               die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$prefix\$sm_path'")"
-                               say_msg="$(eval_gettext "Submodule path '\$prefix\$sm_path': '\$command \$sha1'")"
+                               die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$displaypath'")"
+                               say_msg="$(eval_gettext "Submodule path '\$displaypath': '\$command \$sha1'")"
                                must_die_on_failure=yes
                                ;;
                        *)
                                die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
                        esac
 
-                       if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
+                       if (sanitize_submodule_env; cd "$sm_path" && $command "$sha1")
                        then
                                say "$say_msg"
                        elif test -n "$must_die_on_failure"
@@ -825,8 +700,9 @@ Maybe you want to use 'update --init'?")"
                if test -n "$recursive"
                then
                        (
-                               prefix="$prefix$sm_path/"
-                               clear_local_git_env
+                               prefix=$(git submodule--helper relative-path "$prefix$sm_path/" "$wt_prefix")
+                               wt_prefix=
+                               sanitize_submodule_env
                                cd "$sm_path" &&
                                eval cmd_update
                        )
@@ -834,7 +710,7 @@ Maybe you want to use 'update --init'?")"
                        if test $res -gt 0
                        then
                                die_msg="$(eval_gettext "Failed to recurse into submodule path '\$displaypath'")"
-                               if test $res -eq 1
+                               if test $res -ne 2
                                then
                                        err="${err};$die_msg"
                                        continue
@@ -864,7 +740,7 @@ Maybe you want to use 'update --init'?")"
 
 set_name_rev () {
        revname=$( (
-               clear_local_git_env
+               sanitize_submodule_env
                cd "$1" && {
                        git describe "$2" 2>/dev/null ||
                        git describe --tags "$2" 2>/dev/null ||
@@ -1008,7 +884,7 @@ cmd_summary() {
                ! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_dst^0 >/dev/null &&
                missing_dst=t
 
-               display_name=$(relative_path "$name")
+               display_name=$(git submodule--helper relative-path "$name" "$wt_prefix")
 
                total_commits=
                case "$missing_src,$missing_dst" in
@@ -1120,13 +996,16 @@ cmd_status()
                shift
        done
 
-       git submodule--helper list --prefix "$wt_prefix" "$@" |
+       {
+               git submodule--helper list --prefix "$wt_prefix" "$@" ||
+               echo "#unmatched" $?
+       } |
        while read mode sha1 stage sm_path
        do
-               die_if_unmatched "$mode"
+               die_if_unmatched "$mode" "$sha1"
                name=$(git submodule--helper name "$sm_path") || exit
                url=$(git config submodule."$name".url)
-               displaypath=$(relative_path "$prefix$sm_path")
+               displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
                if test "$stage" = U
                then
                        say "U$sha1 $displaypath"
@@ -1148,7 +1027,7 @@ cmd_status()
                else
                        if test -z "$cached"
                        then
-                               sha1=$(clear_local_git_env; cd "$sm_path" && git rev-parse --verify HEAD)
+                               sha1=$(sanitize_submodule_env; cd "$sm_path" && git rev-parse --verify HEAD)
                        fi
                        set_name_rev "$sm_path" "$sha1"
                        say "+$sha1 $displaypath$revname"
@@ -1158,7 +1037,8 @@ cmd_status()
                then
                        (
                                prefix="$displaypath/"
-                               clear_local_git_env
+                               sanitize_submodule_env
+                               wt_prefix=
                                cd "$sm_path" &&
                                eval cmd_status
                        ) ||
@@ -1197,10 +1077,13 @@ cmd_sync()
                esac
        done
        cd_to_toplevel
-       git submodule--helper list --prefix "$wt_prefix" "$@" |
+       {
+               git submodule--helper list --prefix "$wt_prefix" "$@" ||
+               echo "#unmatched" $?
+       } |
        while read mode sha1 stage sm_path
        do
-               die_if_unmatched "$mode"
+               die_if_unmatched "$mode" "$sha1"
                name=$(git submodule--helper name "$sm_path")
                url=$(git config -f .gitmodules --get submodule."$name".url)
 
@@ -1213,9 +1096,9 @@ cmd_sync()
                        # guarantee a trailing /
                        up_path=${up_path%/}/ &&
                        # path from submodule work tree to submodule origin repo
-                       sub_origin_url=$(resolve_relative_url "$url" "$up_path") &&
+                       sub_origin_url=$(git submodule--helper resolve-relative-url "$url" "$up_path") &&
                        # path from superproject work tree to submodule origin repo
-                       super_config_url=$(resolve_relative_url "$url") || exit
+                       super_config_url=$(git submodule--helper resolve-relative-url "$url") || exit
                        ;;
                *)
                        sub_origin_url="$url"
@@ -1225,14 +1108,14 @@ cmd_sync()
 
                if git config "submodule.$name.url" >/dev/null 2>/dev/null
                then
-                       displaypath=$(relative_path "$prefix$sm_path")
+                       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
                        (
-                               clear_local_git_env
+                               sanitize_submodule_env
                                cd "$sm_path"
                                remote=$(get_default_remote)
                                git config remote."$remote".url "$sub_origin_url"
index 05eced06cde8a1ff83262d452dc8edbcc1f3dea8..fa423647858fede0cf63a27b2c11eb392b639a09 100755 (executable)
@@ -44,6 +44,7 @@ use Git qw(
        command_close_pipe
        command_bidi_pipe
        command_close_bidi_pipe
+       get_record
 );
 
 BEGIN {
@@ -339,7 +340,7 @@ if ($cmd && $cmd =~ /(?:clone|init|multi-init)$/) {
                        die "failed to open $ENV{GIT_DIR}: $!\n";
                $ENV{GIT_DIR} = $1 if <$fh> =~ /^gitdir: (.+)$/;
        }
-} else {
+} elsif ($cmd) {
        my ($git_dir, $cdup);
        git_cmd_try {
                $git_dir = command_oneline([qw/rev-parse --git-dir/]);
@@ -356,7 +357,7 @@ if ($cmd && $cmd =~ /(?:clone|init|multi-init)$/) {
 
 my %opts = %{$cmd{$cmd}->[2]} if (defined $cmd);
 
-read_git_config(\%opts);
+read_git_config(\%opts) if $ENV{GIT_DIR};
 if ($cmd && ($cmd eq 'log' || $cmd eq 'blame')) {
        Getopt::Long::Configure('pass_through');
 }
@@ -507,7 +508,10 @@ sub init_subdir {
 
 sub cmd_clone {
        my ($url, $path) = @_;
-       if (!defined $path &&
+       if (!$url) {
+               die "SVN repository location required ",
+                   "as a command-line argument\n";
+       } elsif (!defined $path &&
            (defined $_trunk || @_branches || @_tags ||
             defined $_stdlayout) &&
            $url !~ m#^[a-z\+]+://#) {
@@ -1696,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 #########################
@@ -1730,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';
@@ -1832,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);
@@ -1877,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 6cc0c077f9761f9b56e5fb7e666722b437c4fae4..dce529fcbfd6e5d8526b0e88b43f6c568876ce9d 100644 (file)
--- a/git.c
+++ b/git.c
@@ -15,7 +15,6 @@ const char git_more_info_string[] =
           "concept guides. See 'git help <command>' or 'git help <concept>'\n"
           "to read about a specific subcommand or concept.");
 
-static struct startup_info git_startup_info;
 static int use_pager = -1;
 static char *orig_cwd;
 static const char *env_names[] = {
@@ -36,8 +35,7 @@ static void save_env_before_alias(void)
        orig_cwd = xgetcwd();
        for (i = 0; i < ARRAY_SIZE(env_names); i++) {
                orig_env[i] = getenv(env_names[i]);
-               if (orig_env[i])
-                       orig_env[i] = xstrdup(orig_env[i]);
+               orig_env[i] = xstrdup_or_null(orig_env[i]);
        }
 }
 
@@ -165,6 +163,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;
@@ -311,6 +323,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;
@@ -345,6 +358,13 @@ 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 (prefix)
+                       die("can't use --super-prefix from a subdirectory");
+       }
+
        if (!help && p->option & NEED_WORK_TREE)
                setup_work_tree();
 
@@ -376,7 +396,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 },
@@ -422,10 +442,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 },
@@ -445,7 +465,7 @@ 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 },
@@ -523,21 +543,34 @@ 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)
@@ -546,6 +579,9 @@ static void execv_dashed_external(const char **argv)
        const char *tmp;
        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();
@@ -610,49 +646,19 @@ static int run_argv(int *argcp, const char ***argv)
        return done_alias;
 }
 
-/*
- * Many parts of Git have subprograms communicate via pipe, expect the
- * upstream of a pipe to die with SIGPIPE when the downstream of a
- * pipe does not need to read all that is written.  Some third-party
- * programs that ignore or block SIGPIPE for their own reason forget
- * to restore SIGPIPE handling to the default before spawning Git and
- * break this carefully orchestrated machinery.
- *
- * Restore the way SIGPIPE is handled to default, which is what we
- * expect.
- */
-static void restore_sigpipe_to_default(void)
-{
-       sigset_t unblock;
-
-       sigemptyset(&unblock);
-       sigaddset(&unblock, SIGPIPE);
-       sigprocmask(SIG_UNBLOCK, &unblock, NULL);
-       signal(SIGPIPE, SIG_DFL);
-}
-
-int main(int argc, char **av)
+int cmd_main(int argc, const char **argv)
 {
-       const char **argv = (const char **) av;
        const char *cmd;
        int done_help = 0;
 
-       startup_info = &git_startup_info;
-
-       cmd = git_extract_argv0_path(argv[0]);
+       cmd = argv[0];
        if (!cmd)
                cmd = "git-help";
-
-       /*
-        * Always open file descriptors 0/1/2 to avoid clobbering files
-        * in die().  It also avoids messing up when the pipes are dup'ed
-        * onto stdin/stdout/stderr in the child processes we spawn.
-        */
-       sanitize_stdfds();
-
-       restore_sigpipe_to_default();
-
-       git_setup_gettext();
+       else {
+               const char *slash = find_last_dir_sep(cmd);
+               if (slash)
+                       cmd = slash + 1;
+       }
 
        trace_command_performance(argv);
 
diff --git a/git.spec.in b/git.spec.in
deleted file mode 100644 (file)
index d61d537..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-# Pass --without docs to rpmbuild if you don't want the documentation
-
-Name:          git
-Version:       @@VERSION@@
-Release:       1%{?dist}
-Summary:       Core git tools
-License:       GPL
-Group:                 Development/Tools
-URL:           http://kernel.org/pub/software/scm/git/
-Source:        http://kernel.org/pub/software/scm/git/%{name}-%{version}.tar.gz
-BuildRequires: zlib-devel >= 1.2, openssl-devel, curl-devel, expat-devel, gettext  %{!?_without_docs:, xmlto, asciidoc > 6.0.3}
-BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
-Requires:      perl-Git = %{version}-%{release}
-Requires:      zlib >= 1.2, rsync, less, openssh-clients, expat
-Provides:      git-core = %{version}-%{release}
-Obsoletes:     git-core <= 1.5.4.2
-Obsoletes:     git-p4
-
-%description
-Git is a fast, scalable, distributed revision control system with an
-unusually rich command set that provides both high-level operations
-and full access to internals.
-
-The git rpm installs the core tools with minimal dependencies.  To
-install all git packages, including tools for integrating with other
-SCMs, install the git-all meta-package.
-
-%package all
-Summary:       Meta-package to pull in all git tools
-Group:         Development/Tools
-Requires:      git = %{version}-%{release}
-Requires:      git-svn = %{version}-%{release}
-Requires:      git-cvs = %{version}-%{release}
-Requires:      git-arch = %{version}-%{release}
-Requires:      git-email = %{version}-%{release}
-Requires:      gitk = %{version}-%{release}
-Requires:      gitweb = %{version}-%{release}
-Requires:      git-gui = %{version}-%{release}
-Obsoletes:     git <= 1.5.4.2
-
-%description all
-Git is a fast, scalable, distributed revision control system with an
-unusually rich command set that provides both high-level operations
-and full access to internals.
-
-This is a dummy package which brings in all subpackages.
-
-%package svn
-Summary:        Git tools for importing Subversion repositories
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}, subversion
-%description svn
-Git tools for importing Subversion repositories.
-
-%package cvs
-Summary:        Git tools for importing CVS repositories
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}, cvs, cvsps
-%description cvs
-Git tools for importing CVS repositories.
-
-%package arch
-Summary:        Git tools for importing Arch repositories
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}, tla
-%description arch
-Git tools for importing Arch repositories.
-
-%package email
-Summary:        Git tools for sending email
-Group:          Development/Tools
-Requires:      git = %{version}-%{release}
-%description email
-Git tools for sending email.
-
-%package gui
-Summary:        Git GUI tool
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}, tk >= 8.4
-%description gui
-Git GUI tool
-
-%package -n gitk
-Summary:        Git revision tree visualiser ('gitk')
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}, tk >= 8.4
-%description -n gitk
-Git revision tree visualiser ('gitk')
-
-%package -n gitweb
-Summary:       Git web interface
-Group:          Development/Tools
-Requires:       git = %{version}-%{release}
-%description -n gitweb
-Browsing git repository on the web
-
-%package -n perl-Git
-Summary:        Perl interface to Git
-Group:          Development/Libraries
-Requires:       git = %{version}-%{release}
-Requires:       perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
-BuildRequires:  perl(Error)
-BuildRequires:  perl(ExtUtils::MakeMaker)
-
-%description -n perl-Git
-Perl interface to Git
-
-%define path_settings ETC_GITCONFIG=/etc/gitconfig prefix=%{_prefix} mandir=%{_mandir} htmldir=%{_docdir}/%{name}-%{version}
-%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-
-%prep
-%setup -q
-
-%build
-make %{_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" \
-     %{path_settings} \
-     all %{!?_without_docs: doc}
-
-%install
-rm -rf $RPM_BUILD_ROOT
-make %{_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" DESTDIR=$RPM_BUILD_ROOT \
-     %{path_settings} \
-     INSTALLDIRS=vendor install %{!?_without_docs: install-doc}
-test ! -d $RPM_BUILD_ROOT%{python_sitelib} || rm -fr $RPM_BUILD_ROOT%{python_sitelib}
-find $RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} ';'
-find $RPM_BUILD_ROOT -type f -name '*.bs' -empty -exec rm -f {} ';'
-find $RPM_BUILD_ROOT -type f -name perllocal.pod -exec rm -f {} ';'
-
-(find $RPM_BUILD_ROOT%{_bindir} -type f | grep -vE "archimport|svn|cvs|email|gitk|git-gui|git-citool" | sed -e s@^$RPM_BUILD_ROOT@@)               > bin-man-doc-files
-(find $RPM_BUILD_ROOT%{_libexecdir}/git-core -type f | grep -vE "archimport|svn|cvs|email|gitk|git-gui|git-citool" | sed -e s@^$RPM_BUILD_ROOT@@)               >> bin-man-doc-files
-(find $RPM_BUILD_ROOT%{perl_vendorlib} -type f | sed -e s@^$RPM_BUILD_ROOT@@) >> perl-files
-%if %{!?_without_docs:1}0
-(find $RPM_BUILD_ROOT%{_mandir} $RPM_BUILD_ROOT/Documentation -type f | grep -vE "archimport|svn|git-cvs|email|gitk|git-gui|git-citool" | sed -e s@^$RPM_BUILD_ROOT@@ -e 's/$/*/' ) >> bin-man-doc-files
-%else
-rm -rf $RPM_BUILD_ROOT%{_mandir}
-%endif
-rm -rf $RPM_BUILD_ROOT%{_datadir}/locale
-
-mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d
-install -m 644 -T contrib/completion/git-completion.bash $RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d/git
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files -f bin-man-doc-files
-%defattr(-,root,root)
-%{_datadir}/git-core/
-%doc README COPYING Documentation/*.txt
-%{!?_without_docs: %doc Documentation/*.html Documentation/howto}
-%{!?_without_docs: %doc Documentation/technical}
-%{_sysconfdir}/bash_completion.d
-
-%files svn
-%defattr(-,root,root)
-%{_libexecdir}/git-core/*svn*
-%doc Documentation/*svn*.txt
-%{!?_without_docs: %{_mandir}/man1/*svn*.1*}
-%{!?_without_docs: %doc Documentation/*svn*.html }
-
-%files cvs
-%defattr(-,root,root)
-%doc Documentation/*git-cvs*.txt
-%{_bindir}/git-cvsserver
-%{_libexecdir}/git-core/*cvs*
-%{!?_without_docs: %{_mandir}/man1/*cvs*.1*}
-%{!?_without_docs: %doc Documentation/*git-cvs*.html }
-
-%files arch
-%defattr(-,root,root)
-%doc Documentation/git-archimport.txt
-%{_libexecdir}/git-core/git-archimport
-%{!?_without_docs: %{_mandir}/man1/git-archimport.1*}
-%{!?_without_docs: %doc Documentation/git-archimport.html }
-
-%files email
-%defattr(-,root,root)
-%doc Documentation/*email*.txt
-%{_libexecdir}/git-core/*email*
-%{!?_without_docs: %{_mandir}/man1/*email*.1*}
-%{!?_without_docs: %doc Documentation/*email*.html }
-
-%files gui
-%defattr(-,root,root)
-%{_libexecdir}/git-core/git-gui
-%{_libexecdir}/git-core/git-citool
-%{_libexecdir}/git-core/git-gui--askpass
-%{_datadir}/git-gui/
-%{!?_without_docs: %{_mandir}/man1/git-gui.1*}
-%{!?_without_docs: %doc Documentation/git-gui.html}
-%{!?_without_docs: %{_mandir}/man1/git-citool.1*}
-%{!?_without_docs: %doc Documentation/git-citool.html}
-
-%files -n gitk
-%defattr(-,root,root)
-%doc Documentation/*gitk*.txt
-%{_bindir}/*gitk*
-%{_datadir}/gitk/
-%{!?_without_docs: %{_mandir}/man1/*gitk*.1*}
-%{!?_without_docs: %doc Documentation/*gitk*.html }
-
-%files -n gitweb
-%defattr(-,root,root)
-%doc gitweb/README gitweb/INSTALL Documentation/*gitweb*.txt
-%{_datadir}/gitweb
-%{!?_without_docs: %{_mandir}/man1/*gitweb*.1*}
-%{!?_without_docs: %{_mandir}/man5/*gitweb*.5*}
-%{!?_without_docs: %doc Documentation/*gitweb*.html }
-
-%files -n perl-Git -f perl-files
-%defattr(-,root,root)
-
-%files all
-# No files for you!
-
-%changelog
-* Sun Sep 18 2011 Jakub Narebski <jnareb@gmail.com>
-- Add gitweb manpages to 'gitweb' subpackage
-
-* Wed Jun 30 2010 Junio C Hamano <gitster@pobox.com>
-- Add 'gitweb' subpackage.
-
-* Fri Mar 26 2010 Ian Ward Comfort <icomfort@stanford.edu>
-- Ship bash completion support from contrib/ in the core package.
-
-* Sun Jan 31 2010 Junio C Hamano <gitster@pobox.com>
-- Do not use %define inside %{!?...} construct.
-
-* Sat Jan 30 2010 Junio C Hamano <gitster@pobox.com>
-- We don't ship Python bits until a real foreign scm interface comes.
-
-* Mon Feb 04 2009 David J. Mellor <dmellor@whistlingcat.com>
-- fixed broken git help -w after renaming the git-core package to git.
-
-* Fri Sep 12 2008 Quy Tonthat <qtonthat@gmail.com>
-- move git-cvsserver to bindir.
-
-* Sun Jun 15 2008 Junio C Hamano <gitster@pobox.com>
-- Remove curl from Requires list.
-
-* Fri Feb 15 2008 Kristian Høgsberg <krh@redhat.com>
-- Rename git-core to just git and rename meta package from git to git-all.
-
-* Sun Feb 03 2008 James Bowes <jbowes@dangerouslyinc.com>
-- Add a BuildRequires for gettext
-
-* Fri Jan 11 2008 Junio C Hamano <gitster@pobox.com>
-- Include gitk message files
-
-* Sun Jan 06 2008 James Bowes <jbowes@dangerouslyinc.com>
-- Make the metapackage require the same version of the subpackages.
-
-* Wed Dec 12 2007 Junio C Hamano <gitster@pobox.com>
-- Adjust htmldir to point at /usr/share/doc/git-core-$version/
-
-* Sun Jul 15 2007 Sean Estabrooks <seanlkml@sympatico.ca>
-- Removed p4import.
-
-* Tue Jun 26 2007 Quy Tonthat <qtonthat@gmail.com>
-- Fixed problems looking for wrong manpages.
-
-* Thu Jun 21 2007 Shawn O. Pearce <spearce@spearce.org>
-- Added documentation files for git-gui
-
-* Tue May 13 2007 Quy Tonthat <qtonthat@gmail.com>
-- Added lib files for git-gui
-- Added Documentation/technical (As needed by Git Users Manual)
-
-* Tue May 8 2007 Quy Tonthat <qtonthat@gmail.com>
-- Added howto files
-
-* Tue Mar 27 2007 Eygene Ryabinkin <rea-git@codelabs.ru>
-- Added the git-p4 package: Perforce import stuff.
-
-* Mon Feb 13 2007 Nicolas Pitre <nico@fluxnic.net>
-- Update core package description (Git isn't as stupid as it used to be)
-
-* Mon Feb 12 2007 Junio C Hamano <junkio@cox.net>
-- Add git-gui and git-citool.
-
-* Mon Nov 14 2005 H. Peter Anvin <hpa@zytor.com> 0.99.9j-1
-- Change subpackage names to git-<name> instead of git-core-<name>
-- Create empty root package which brings in all subpackages
-- Rename git-tk -> gitk
-
-* Thu Nov 10 2005 Chris Wright <chrisw@osdl.org> 0.99.9g-1
-- zlib dependency fix
-- Minor cleanups from split
-- Move arch import to separate package as well
-
-* Tue Sep 27 2005 Jim Radford <radford@blackbean.org>
-- Move programs with non-standard dependencies (svn, cvs, email)
-  into separate packages
-
-* Tue Sep 27 2005 H. Peter Anvin <hpa@zytor.com>
-- parallelize build
-- COPTS -> CFLAGS
-
-* Fri Sep 16 2005 Chris Wright <chrisw@osdl.org> 0.99.6-1
-- update to 0.99.6
-
-* Fri Sep 16 2005 Horst H. von Brand <vonbrand@inf.utfsm.cl>
-- Linus noticed that less is required, added to the dependencies
-
-* Sun Sep 11 2005 Horst H. von Brand <vonbrand@inf.utfsm.cl>
-- Updated dependencies
-- Don't assume manpages are gzipped
-
-* Thu Aug 18 2005 Chris Wright <chrisw@osdl.org> 0.99.4-4
-- drop sh_utils, sh-utils, diffutils, mktemp, and openssl Requires
-- use RPM_OPT_FLAGS in spec file, drop patch0
-
-* Wed Aug 17 2005 Tom "spot" Callaway <tcallawa@redhat.com> 0.99.4-3
-- use dist tag to differentiate between branches
-- use rpm optflags by default (patch0)
-- own %{_datadir}/git-core/
-
-* Mon Aug 15 2005 Chris Wright <chrisw@osdl.org>
-- update spec file to fix Buildroot, Requires, and drop Vendor
-
-* Sun Aug 07 2005 Horst H. von Brand <vonbrand@inf.utfsm.cl>
-- Redid the description
-- Cut overlong make line, loosened changelog a bit
-- I think Junio (or perhaps OSDL?) should be vendor...
-
-* Thu Jul 14 2005 Eric Biederman <ebiederm@xmission.com>
-- Add the man pages, and the --without docs build option
-
-* Wed Jul 7 2005 Chris Wright <chris@osdl.org>
-- initial git spec file
index 05d7910b7cdbd6fea7c835491caa774a46e4b7f8..7cf68f07b773f7e520c1e6ba680bff65e5bc7f3a 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;
 }
@@ -2090,7 +2104,7 @@ sub format_ref_marker {
                                -href => href(
                                        action=>$dest_action,
                                        hash=>$dest
-                               )}, $name);
+                               )}, esc_html($name));
 
                        $markers .= " <span class=\"".esc_attr($class)."\" title=\"".esc_attr($ref)."\">" .
                                $link . "</span>";
@@ -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,12 +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;
 }
@@ -7059,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 = '';
@@ -7114,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
index 3dc2fe397e32d79713780596f0ef4666c14b5955..e44cc27da15f03629989ee0083664d0af09c55b3 100644 (file)
@@ -3,6 +3,7 @@
 #include "strbuf.h"
 #include "gpg-interface.h"
 #include "sigchain.h"
+#include "tempfile.h"
 
 static char *configured_signing_key;
 static const char *gpg_program = "gpg";
@@ -32,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)
@@ -53,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);
+                       }
                }
        }
 }
@@ -150,42 +158,30 @@ const char *get_signing_key(void)
 int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key)
 {
        struct child_process gpg = CHILD_PROCESS_INIT;
-       const char *args[4];
-       ssize_t len;
+       int ret;
        size_t i, j, bottom;
+       struct strbuf gpg_status = STRBUF_INIT;
 
-       gpg.argv = args;
-       gpg.in = -1;
-       gpg.out = -1;
-       args[0] = gpg_program;
-       args[1] = "-bsau";
-       args[2] = signing_key;
-       args[3] = NULL;
+       argv_array_pushl(&gpg.args,
+                        gpg_program,
+                        "--status-fd=2",
+                        "-bsau", signing_key,
+                        NULL);
 
-       if (start_command(&gpg))
-               return error(_("could not run gpg."));
+       bottom = signature->len;
 
        /*
         * When the username signingkey is bad, program could be terminated
         * because gpg exits without reading and then write gets SIGPIPE.
         */
        sigchain_push(SIGPIPE, SIG_IGN);
-
-       if (write_in_full(gpg.in, buffer->buf, buffer->len) != buffer->len) {
-               close(gpg.in);
-               close(gpg.out);
-               finish_command(&gpg);
-               return error(_("gpg did not accept the data"));
-       }
-       close(gpg.in);
-
-       bottom = signature->len;
-       len = strbuf_read(signature, gpg.out, 1024);
-       close(gpg.out);
-
+       ret = pipe_command(&gpg, buffer->buf, buffer->len,
+                          signature, 1024, &gpg_status, 0);
        sigchain_pop(SIGPIPE);
 
-       if (finish_command(&gpg) || !len || len < 0)
+       ret |= !strstr(gpg_status.buf, "\n[GNUPG:] SIG_CREATED ");
+       strbuf_release(&gpg_status);
+       if (ret)
                return error(_("gpg failed to sign the data"));
 
        /* Strip CR from the line endings, in case we are on Windows. */
@@ -210,50 +206,39 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
                         struct strbuf *gpg_output, struct strbuf *gpg_status)
 {
        struct child_process gpg = CHILD_PROCESS_INIT;
-       const char *args_gpg[] = {NULL, "--status-fd=1", "--verify", "FILE", "-", NULL};
-       char path[PATH_MAX];
+       static struct tempfile temp;
        int fd, ret;
        struct strbuf buf = STRBUF_INIT;
-       struct strbuf *pbuf = &buf;
 
-       args_gpg[0] = gpg_program;
-       fd = git_mkstemp(path, PATH_MAX, ".git_vtag_tmpXXXXXX");
+       fd = mks_tempfile_t(&temp, ".git_vtag_tmpXXXXXX");
        if (fd < 0)
-               return error(_("could not create temporary file '%s': %s"),
-                            path, strerror(errno));
-       if (write_in_full(fd, signature, signature_size) < 0)
-               return error(_("failed writing detached signature to '%s': %s"),
-                            path, strerror(errno));
+               return error_errno(_("could not create temporary file"));
+       if (write_in_full(fd, signature, signature_size) < 0) {
+               error_errno(_("failed writing detached signature to '%s'"),
+                           temp.filename.buf);
+               delete_tempfile(&temp);
+               return -1;
+       }
        close(fd);
 
-       gpg.argv = args_gpg;
-       gpg.in = -1;
-       gpg.out = -1;
-       if (gpg_output)
-               gpg.err = -1;
-       args_gpg[3] = path;
-       if (start_command(&gpg)) {
-               unlink(path);
-               return error(_("could not run gpg."));
-       }
+       argv_array_pushl(&gpg.args,
+                        gpg_program,
+                        "--status-fd=1",
+                        "--keyid-format=long",
+                        "--verify", temp.filename.buf, "-",
+                        NULL);
 
-       write_in_full(gpg.in, payload, payload_size);
-       close(gpg.in);
+       if (!gpg_status)
+               gpg_status = &buf;
 
-       if (gpg_output) {
-               strbuf_read(gpg_output, gpg.err, 0);
-               close(gpg.err);
-       }
-       if (gpg_status)
-               pbuf = gpg_status;
-       strbuf_read(pbuf, gpg.out, 0);
-       close(gpg.out);
-
-       ret = finish_command(&gpg);
+       sigchain_push(SIGPIPE, SIG_IGN);
+       ret = pipe_command(&gpg, payload, payload_size,
+                          gpg_status, 0, gpg_output, 0);
+       sigchain_pop(SIGPIPE);
 
-       unlink_or_warn(path);
+       delete_tempfile(&temp);
 
-       ret |= !strstr(pbuf->buf, "\n[GNUPG:] GOODSIG ");
+       ret |= !strstr(gpg_status->buf, "\n[GNUPG:] GOODSIG ");
        strbuf_release(&buf); /* no matter it was used or not */
 
        return ret;
diff --git a/graph.c b/graph.c
index 1350bdde3be4346e8bc2038c57e4883d0ab12b25..d4e8519c904df6e18869de527f7fe6d57adf2a26 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -2,7 +2,6 @@
 #include "commit.h"
 #include "color.h"
 #include "graph.h"
-#include "diff.h"
 #include "revision.h"
 
 /* Internal API */
@@ -17,8 +16,8 @@
 static void graph_padding_line(struct git_graph *graph, struct strbuf *sb);
 
 /*
- * Print a strbuf to stdout.  If the graph is non-NULL, all lines but the
- * first will be prefixed with the graph output.
+ * Print a strbuf.  If the graph is non-NULL, all lines but the first will be
+ * prefixed with the graph output.
  *
  * If the strbuf ends with a newline, the output will end after this
  * newline.  A new graph line will not be printed after the final newline.
@@ -28,8 +27,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,6 +65,17 @@ 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;
 
@@ -195,14 +212,28 @@ 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));
@@ -245,7 +276,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;
 }
@@ -669,6 +699,13 @@ static void graph_output_padding_line(struct git_graph *graph,
        graph_pad_horizontally(graph, sb, graph->num_new_columns * 2);
 }
 
+
+int graph_width(struct git_graph *graph)
+{
+       return graph->width;
+}
+
+
 static void graph_output_skip_line(struct git_graph *graph, struct strbuf *sb)
 {
        /*
@@ -1138,6 +1175,7 @@ int graph_next_line(struct git_graph *graph, struct strbuf *sb)
 static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
 {
        int i;
+       int chars_written = 0;
 
        if (graph->state != GRAPH_COMMIT) {
                graph_next_line(graph, sb);
@@ -1153,14 +1191,21 @@ static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
         */
        for (i = 0; i < graph->num_columns; i++) {
                struct column *col = &graph->columns[i];
+
                strbuf_write_column(sb, col, '|');
-               if (col->commit == graph->commit && graph->num_parents > 2)
-                       strbuf_addchars(sb, ' ', (graph->num_parents - 2) * 2);
-               else
+               chars_written++;
+
+               if (col->commit == graph->commit && graph->num_parents > 2) {
+                       int len = (graph->num_parents - 2) * 2;
+                       strbuf_addchars(sb, ' ', len);
+                       chars_written += len;
+               } else {
                        strbuf_addch(sb, ' ');
+                       chars_written++;
+               }
        }
 
-       graph_pad_horizontally(graph, sb, graph->num_columns);
+       graph_pad_horizontally(graph, sb, chars_written);
 
        /*
         * Update graph->prev_state since we have output a padding line
@@ -1178,6 +1223,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;
 
@@ -1193,9 +1240,12 @@ void graph_show_commit(struct git_graph *graph)
 
        while (!shown_commit_line && !graph_is_commit_finished(graph)) {
                shown_commit_line = graph_next_line(graph, &msgbuf);
-               fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
-               if (!shown_commit_line)
-                       putchar('\n');
+               fwrite(msgbuf.buf, sizeof(char), msgbuf.len,
+                       graph->revs->diffopt.file);
+               if (!shown_commit_line) {
+                       putc('\n', graph->revs->diffopt.file);
+                       graph_show_line_prefix(&graph->revs->diffopt);
+               }
                strbuf_setlen(&msgbuf, 0);
        }
 
@@ -1206,11 +1256,13 @@ void graph_show_oneline(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return;
 
        graph_next_line(graph, &msgbuf);
-       fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
+       fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file);
        strbuf_release(&msgbuf);
 }
 
@@ -1218,11 +1270,13 @@ void graph_show_padding(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
+       graph_show_line_prefix(default_diffopt);
+
        if (!graph)
                return;
 
        graph_padding_line(graph, &msgbuf);
-       fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
+       fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file);
        strbuf_release(&msgbuf);
 }
 
@@ -1231,6 +1285,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;
 
@@ -1239,30 +1295,29 @@ int graph_show_remainder(struct git_graph *graph)
 
        for (;;) {
                graph_next_line(graph, &msgbuf);
-               fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
+               fwrite(msgbuf.buf, sizeof(char), msgbuf.len,
+                       graph->revs->diffopt.file);
                strbuf_setlen(&msgbuf, 0);
                shown = 1;
 
-               if (!graph_is_commit_finished(graph))
-                       putchar('\n');
-               else
+               if (!graph_is_commit_finished(graph)) {
+                       putc('\n', graph->revs->diffopt.file);
+                       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, stdout);
-               return;
-       }
-
        /*
         * Print the strbuf line by line,
         * and display the graph info before each line but the first.
@@ -1277,7 +1332,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, stdout);
+               fwrite(p, sizeof(char), len, file);
                if (next_p && *next_p != '\0')
                        graph_show_oneline(graph);
                p = next_p;
@@ -1285,28 +1340,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, stdout);
-               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
@@ -1318,7 +1365,7 @@ void graph_show_commit_msg(struct git_graph *graph,
                 * new line.
                 */
                if (!newline_terminated)
-                       putchar('\n');
+                       putc('\n', file);
 
                graph_show_remainder(graph);
 
@@ -1326,6 +1373,6 @@ void graph_show_commit_msg(struct git_graph *graph,
                 * If sb ends with a newline, our output should too.
                 */
                if (newline_terminated)
-                       putchar('\n');
+                       putc('\n', file);
        }
 }
diff --git a/graph.h b/graph.h
index 0be62bd8b1227a16b8e67f6309605d6f4a98c247..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.
  *
@@ -67,6 +80,11 @@ int graph_is_commit_finished(struct git_graph const *graph);
 int graph_next_line(struct git_graph *graph, struct strbuf *sb);
 
 
+/*
+ * Return current width of the graph in on-screen characters.
+ */
+int graph_width(struct git_graph *graph);
+
 /*
  * graph_show_*: helper functions for printing to stdout
  */
@@ -108,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 528b652f713d2b6db5f48e3829448212cc3837bf..1194d35b5d06d7960d4464884952e755914e2519 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -4,6 +4,8 @@
 #include "xdiff-interface.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "commit.h"
+#include "quote.h"
 
 static int grep_source_load(struct grep_source *gs);
 static int grep_source_is_binary(struct grep_source *gs);
@@ -161,17 +163,7 @@ void grep_init(struct grep_opt *opt, const char *prefix)
        color_set(opt->color_sep, def->color_sep);
 }
 
-void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
-{
-       if (pattern_type != GREP_PATTERN_TYPE_UNSPECIFIED)
-               grep_set_pattern_type_option(pattern_type, opt);
-       else if (opt->pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
-               grep_set_pattern_type_option(opt->pattern_type_option, opt);
-       else if (opt->extended_regexp_option)
-               grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, opt);
-}
-
-void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt)
+static void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt)
 {
        switch (pattern_type) {
        case GREP_PATTERN_TYPE_UNSPECIFIED:
@@ -203,6 +195,16 @@ void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct gr
        }
 }
 
+void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
+{
+       if (pattern_type != GREP_PATTERN_TYPE_UNSPECIFIED)
+               grep_set_pattern_type_option(pattern_type, opt);
+       else if (opt->pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
+               grep_set_pattern_type_option(opt->pattern_type_option, opt);
+       else if (opt->extended_regexp_option)
+               grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, opt);
+}
+
 static struct grep_pat *create_grep_pat(const char *pat, size_t patlen,
                                        const char *origin, int no,
                                        enum grep_pat_token t,
@@ -322,11 +324,16 @@ static void compile_pcre_regexp(struct grep_pat *p, const struct grep_opt *opt)
        int erroffset;
        int options = PCRE_MULTILINE;
 
-       if (opt->ignore_case)
+       if (opt->ignore_case) {
+               if (has_non_ascii(p->pattern))
+                       p->pcre_tables = pcre_maketables();
                options |= PCRE_CASELESS;
+       }
+       if (is_utf8_locale() && has_non_ascii(p->pattern))
+               options |= PCRE_UTF8;
 
        p->pcre_regexp = pcre_compile(p->pattern, options, &error, &erroffset,
-                       NULL);
+                                     p->pcre_tables);
        if (!p->pcre_regexp)
                compile_regexp_failed(p, error);
 
@@ -360,6 +367,7 @@ static void free_pcre_regexp(struct grep_pat *p)
 {
        pcre_free(p->pcre_regexp);
        pcre_free(p->pcre_extra_info);
+       pcre_free((void *)p->pcre_tables);
 }
 #else /* !USE_LIBPCRE */
 static void compile_pcre_regexp(struct grep_pat *p, const struct grep_opt *opt)
@@ -396,26 +404,68 @@ static int is_fixed(const char *s, size_t len)
        return 1;
 }
 
+static void compile_fixed_regexp(struct grep_pat *p, struct grep_opt *opt)
+{
+       struct strbuf sb = STRBUF_INIT;
+       int err;
+       int regflags;
+
+       basic_regex_quote_buf(&sb, p->pattern);
+       regflags = opt->regflags & ~REG_EXTENDED;
+       if (opt->ignore_case)
+               regflags |= REG_ICASE;
+       err = regcomp(&p->regexp, sb.buf, regflags);
+       if (opt->debug)
+               fprintf(stderr, "fixed %s\n", sb.buf);
+       strbuf_release(&sb);
+       if (err) {
+               char errbuf[1024];
+               regerror(err, &p->regexp, errbuf, sizeof(errbuf));
+               regfree(&p->regexp);
+               compile_regexp_failed(p, errbuf);
+       }
+}
+
 static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
 {
+       int icase, ascii_only;
        int err;
 
        p->word_regexp = opt->word_regexp;
        p->ignore_case = opt->ignore_case;
+       icase          = opt->regflags & REG_ICASE || p->ignore_case;
+       ascii_only     = !has_non_ascii(p->pattern);
 
+       /*
+        * Even when -F (fixed) asks us to do a non-regexp search, we
+        * may not be able to correctly case-fold when -i
+        * (ignore-case) is asked (in which case, we'll synthesize a
+        * regexp to match the pattern that matches regexp special
+        * characters literally, while ignoring case differences).  On
+        * the other hand, even without -F, if the pattern does not
+        * have any regexp special characters and there is no need for
+        * case-folding search, we can internally turn it into a
+        * simple string match using kws.  p->fixed tells us if we
+        * want to use kws.
+        */
        if (opt->fixed || is_fixed(p->pattern, p->patternlen))
-               p->fixed = 1;
+               p->fixed = !icase || ascii_only;
        else
                p->fixed = 0;
 
        if (p->fixed) {
-               if (opt->regflags & REG_ICASE || p->ignore_case)
-                       p->kws = kwsalloc(tolower_trans_tbl);
-               else
-                       p->kws = kwsalloc(NULL);
+               p->kws = kwsalloc(icase ? tolower_trans_tbl : NULL);
                kwsincr(p->kws, p->pattern, p->patternlen);
                kwsprep(p->kws);
                return;
+       } else if (opt->fixed) {
+               /*
+                * We come here when the pattern has the non-ascii
+                * characters we cannot case-fold, and asked to
+                * ignore-case.
+                */
+               compile_fixed_regexp(p, opt);
+               return;
        }
 
        if (opt->pcre) {
@@ -643,10 +693,10 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
 
        for (p = opt->header_list; p; p = p->next) {
                if (p->token != GREP_PATTERN_HEAD)
-                       die("bug: a non-header pattern in grep header list.");
+                       die("BUG: a non-header pattern in grep header list.");
                if (p->field < GREP_HEADER_FIELD_MIN ||
                    GREP_HEADER_FIELD_MAX <= p->field)
-                       die("bug: unknown header field %d", p->field);
+                       die("BUG: unknown header field %d", p->field);
                compile_regexp(p, opt);
        }
 
@@ -659,7 +709,7 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
 
                h = compile_pattern_atom(&pp);
                if (!h || pp != p->next)
-                       die("bug: malformed header expr");
+                       die("BUG: malformed header expr");
                if (!header_group[p->field]) {
                        header_group[p->field] = h;
                        continue;
@@ -848,17 +898,6 @@ static int fixmatch(struct grep_pat *p, char *line, char *eol,
        }
 }
 
-static int regmatch(const regex_t *preg, char *line, char *eol,
-                   regmatch_t *match, int eflags)
-{
-#ifdef REG_STARTEND
-       match->rm_so = 0;
-       match->rm_eo = eol - line;
-       eflags |= REG_STARTEND;
-#endif
-       return regexec(preg, line, 1, match, eflags);
-}
-
 static int patmatch(struct grep_pat *p, char *line, char *eol,
                    regmatch_t *match, int eflags)
 {
@@ -869,7 +908,8 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
        else if (p->pcre_regexp)
                hit = !pcrematch(p, line, eol, match, eflags);
        else
-               hit = !regmatch(&p->regexp, line, eol, match, eflags);
+               hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
+                                  eflags);
 
        return hit;
 }
@@ -1396,9 +1436,17 @@ static int fill_textconv_grep(struct userdiff_driver *driver,
        return 0;
 }
 
+static int is_empty_line(const char *bol, const char *eol)
+{
+       while (bol < eol && isspace(*bol))
+               bol++;
+       return bol == eol;
+}
+
 static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int collect_hits)
 {
        char *bol;
+       char *peek_bol = NULL;
        unsigned long left;
        unsigned lno = 1;
        unsigned last_hit = 0;
@@ -1456,7 +1504,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
                case GREP_BINARY_TEXT:
                        break;
                default:
-                       die("bug: unknown binary handling mode");
+                       die("BUG: unknown binary handling mode");
                }
        }
 
@@ -1543,8 +1591,24 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
                                show_function = 1;
                        goto next_line;
                }
-               if (show_function && match_funcname(opt, gs, bol, eol))
-                       show_function = 0;
+               if (show_function && (!peek_bol || peek_bol < bol)) {
+                       unsigned long peek_left = left;
+                       char *peek_eol = eol;
+
+                       /*
+                        * Trailing empty lines are not interesting.
+                        * Peek past them to see if they belong to the
+                        * body of the current function.
+                        */
+                       peek_bol = bol;
+                       while (is_empty_line(peek_bol, peek_eol)) {
+                               peek_bol = peek_eol + 1;
+                               peek_eol = end_of_line(peek_bol, &peek_left);
+                       }
+
+                       if (match_funcname(opt, gs, peek_bol, peek_eol))
+                               show_function = 0;
+               }
                if (show_function ||
                    (last_hit && lno <= last_hit + opt->post_context)) {
                        /* If the last hit is within the post context,
@@ -1732,7 +1796,7 @@ static int grep_source_load_file(struct grep_source *gs)
        if (lstat(filename, &st) < 0) {
        err_ret:
                if (errno != ENOENT)
-                       error(_("'%s': %s"), filename, strerror(errno));
+                       error_errno(_("failed to stat '%s'"), filename);
                return -1;
        }
        if (!S_ISREG(st.st_mode))
@@ -1743,7 +1807,7 @@ static int grep_source_load_file(struct grep_source *gs)
                goto err_ret;
        data = xmallocz(size);
        if (st.st_size != read_in_full(i, data, size)) {
-               error(_("'%s': short read %s"), filename, strerror(errno));
+               error_errno(_("'%s': short read"), filename);
                close(i);
                free(data);
                return -1;
diff --git a/grep.h b/grep.h
index 95f197a8d9bfc2a264530d17fcfa90f68dfa840d..5856a23e4620773cbda2e2944f93946c2701f923 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -48,6 +48,7 @@ struct grep_pat {
        regex_t regexp;
        pcre *pcre_regexp;
        pcre_extra *pcre_extra_info;
+       const unsigned char *pcre_tables;
        kwset_t kws;
        unsigned fixed:1;
        unsigned ignore_case:1;
@@ -144,7 +145,6 @@ struct grep_opt {
 extern void init_grep_defaults(void);
 extern int grep_config(const char *var, const char *value, void *);
 extern void grep_init(struct grep_opt *, const char *prefix);
-void grep_set_pattern_type_option(enum grep_pattern_type, struct grep_opt *opt);
 void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt);
 
 extern void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t);
diff --git a/help.c b/help.c
index 19328ea992299d2b66b1b8de8a4a609a4d25388b..53e2a67e0052b7abb9f01e075f76c4eb5f35cbfc 100644 (file)
--- a/help.c
+++ b/help.c
@@ -170,8 +170,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 +189,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 +236,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:"));
 
@@ -324,8 +321,7 @@ const char *help_unknown_cmd(const char *cmd)
 
        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 +355,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."));
@@ -419,6 +414,12 @@ int cmd_version(int argc, const char **argv, const char *prefix)
         * with external projects that rely on the output of "git version".
         */
        printf("git version %s\n", git_version_string);
+       while (*++argv) {
+               if (!strcmp(*argv, "--build-options")) {
+                       printf("sizeof-long: %d\n", (int)sizeof(long));
+                       /* NEEDSWORK: also save and output GIT-BUILD_OPTIONS? */
+               }
+       }
        return 0;
 }
 
diff --git a/hex.c b/hex.c
index 0519f853b26e527aa529c75da6c302663881102e..845b01a874b45314a22e6000bb4e7762c3dd846a 100644 (file)
--- a/hex.c
+++ b/hex.c
@@ -39,16 +39,8 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
 {
        int i;
        for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
-               unsigned int val;
-               /*
-                * hex[1]=='\0' is caught when val is checked below,
-                * but if hex[0] is NUL we have to avoid reading
-                * past the end of the string:
-                */
-               if (!hex[0])
-                       return -1;
-               val = (hexval(hex[0]) << 4) | hexval(hex[1]);
-               if (val & ~0xff)
+               int val = hex2chr(hex);
+               if (val < 0)
                        return -1;
                *sha1++ = val;
                hex += 2;
@@ -77,11 +69,17 @@ char *sha1_to_hex_r(char *buffer, const unsigned char *sha1)
        return buffer;
 }
 
+char *oid_to_hex_r(char *buffer, const struct object_id *oid)
+{
+       return sha1_to_hex_r(buffer, oid->hash);
+}
+
 char *sha1_to_hex(const unsigned char *sha1)
 {
        static int bufno;
        static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
-       return sha1_to_hex_r(hexbuffer[3 & ++bufno], sha1);
+       bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
+       return sha1_to_hex_r(hexbuffer[bufno], sha1);
 }
 
 char *oid_to_hex(const struct object_id *oid)
index 8870a2681eb375505e4273b03a0d3e034e59a48e..eef0a361f4f9bcc7f8fb278268334cb40a32fcb3 100644 (file)
@@ -75,55 +75,57 @@ static void format_write(int fd, const char *fmt, ...)
        write_or_die(fd, buffer, n);
 }
 
-static void http_status(unsigned code, const char *msg)
+static void http_status(struct strbuf *hdr, unsigned code, const char *msg)
 {
-       format_write(1, "Status: %u %s\r\n", code, msg);
+       strbuf_addf(hdr, "Status: %u %s\r\n", code, msg);
 }
 
-static void hdr_str(const char *name, const char *value)
+static void hdr_str(struct strbuf *hdr, const char *name, const char *value)
 {
-       format_write(1, "%s: %s\r\n", name, value);
+       strbuf_addf(hdr, "%s: %s\r\n", name, value);
 }
 
-static void hdr_int(const char *name, uintmax_t value)
+static void hdr_int(struct strbuf *hdr, const char *name, uintmax_t value)
 {
-       format_write(1, "%s: %" PRIuMAX "\r\n", name, value);
+       strbuf_addf(hdr, "%s: %" PRIuMAX "\r\n", name, value);
 }
 
-static void hdr_date(const char *name, unsigned long when)
+static void hdr_date(struct strbuf *hdr, const char *name, unsigned long when)
 {
        const char *value = show_date(when, 0, DATE_MODE(RFC2822));
-       hdr_str(name, value);
+       hdr_str(hdr, name, value);
 }
 
-static void hdr_nocache(void)
+static void hdr_nocache(struct strbuf *hdr)
 {
-       hdr_str("Expires", "Fri, 01 Jan 1980 00:00:00 GMT");
-       hdr_str("Pragma", "no-cache");
-       hdr_str("Cache-Control", "no-cache, max-age=0, must-revalidate");
+       hdr_str(hdr, "Expires", "Fri, 01 Jan 1980 00:00:00 GMT");
+       hdr_str(hdr, "Pragma", "no-cache");
+       hdr_str(hdr, "Cache-Control", "no-cache, max-age=0, must-revalidate");
 }
 
-static void hdr_cache_forever(void)
+static void hdr_cache_forever(struct strbuf *hdr)
 {
        unsigned long now = time(NULL);
-       hdr_date("Date", now);
-       hdr_date("Expires", now + 31536000);
-       hdr_str("Cache-Control", "public, max-age=31536000");
+       hdr_date(hdr, "Date", now);
+       hdr_date(hdr, "Expires", now + 31536000);
+       hdr_str(hdr, "Cache-Control", "public, max-age=31536000");
 }
 
-static void end_headers(void)
+static void end_headers(struct strbuf *hdr)
 {
-       write_or_die(1, "\r\n", 2);
+       strbuf_add(hdr, "\r\n", 2);
+       write_or_die(1, hdr->buf, hdr->len);
+       strbuf_release(hdr);
 }
 
-__attribute__((format (printf, 1, 2)))
-static NORETURN void not_found(const char *err, ...)
+__attribute__((format (printf, 2, 3)))
+static NORETURN void not_found(struct strbuf *hdr, const char *err, ...)
 {
        va_list params;
 
-       http_status(404, "Not Found");
-       hdr_nocache();
-       end_headers();
+       http_status(hdr, 404, "Not Found");
+       hdr_nocache(hdr);
+       end_headers(hdr);
 
        va_start(params, err);
        if (err && *err)
@@ -132,14 +134,14 @@ static NORETURN void not_found(const char *err, ...)
        exit(0);
 }
 
-__attribute__((format (printf, 1, 2)))
-static NORETURN void forbidden(const char *err, ...)
+__attribute__((format (printf, 2, 3)))
+static NORETURN void forbidden(struct strbuf *hdr, const char *err, ...)
 {
        va_list params;
 
-       http_status(403, "Forbidden");
-       hdr_nocache();
-       end_headers();
+       http_status(hdr, 403, "Forbidden");
+       hdr_nocache(hdr);
+       end_headers(hdr);
 
        va_start(params, err);
        if (err && *err)
@@ -148,21 +150,23 @@ static NORETURN void forbidden(const char *err, ...)
        exit(0);
 }
 
-static void select_getanyfile(void)
+static void select_getanyfile(struct strbuf *hdr)
 {
        if (!getanyfile)
-               forbidden("Unsupported service: getanyfile");
+               forbidden(hdr, "Unsupported service: getanyfile");
 }
 
-static void send_strbuf(const char *type, struct strbuf *buf)
+static void send_strbuf(struct strbuf *hdr,
+                       const char *type, struct strbuf *buf)
 {
-       hdr_int(content_length, buf->len);
-       hdr_str(content_type, type);
-       end_headers();
+       hdr_int(hdr, content_length, buf->len);
+       hdr_str(hdr, content_type, type);
+       end_headers(hdr);
        write_or_die(1, buf->buf, buf->len);
 }
 
-static void send_local_file(const char *the_type, const char *name)
+static void send_local_file(struct strbuf *hdr, const char *the_type,
+                               const char *name)
 {
        char *p = git_pathdup("%s", name);
        size_t buf_alloc = 8192;
@@ -172,14 +176,14 @@ static void send_local_file(const char *the_type, const char *name)
 
        fd = open(p, O_RDONLY);
        if (fd < 0)
-               not_found("Cannot open '%s': %s", p, strerror(errno));
+               not_found(hdr, "Cannot open '%s': %s", p, strerror(errno));
        if (fstat(fd, &sb) < 0)
                die_errno("Cannot stat '%s'", p);
 
-       hdr_int(content_length, sb.st_size);
-       hdr_str(content_type, the_type);
-       hdr_date(last_modified, sb.st_mtime);
-       end_headers();
+       hdr_int(hdr, content_length, sb.st_size);
+       hdr_str(hdr, content_type, the_type);
+       hdr_date(hdr, last_modified, sb.st_mtime);
+       end_headers(hdr);
 
        for (;;) {
                ssize_t n = xread(fd, buf, buf_alloc);
@@ -194,32 +198,32 @@ static void send_local_file(const char *the_type, const char *name)
        free(p);
 }
 
-static void get_text_file(char *name)
+static void get_text_file(struct strbuf *hdr, char *name)
 {
-       select_getanyfile();
-       hdr_nocache();
-       send_local_file("text/plain", name);
+       select_getanyfile(hdr);
+       hdr_nocache(hdr);
+       send_local_file(hdr, "text/plain", name);
 }
 
-static void get_loose_object(char *name)
+static void get_loose_object(struct strbuf *hdr, char *name)
 {
-       select_getanyfile();
-       hdr_cache_forever();
-       send_local_file("application/x-git-loose-object", name);
+       select_getanyfile(hdr);
+       hdr_cache_forever(hdr);
+       send_local_file(hdr, "application/x-git-loose-object", name);
 }
 
-static void get_pack_file(char *name)
+static void get_pack_file(struct strbuf *hdr, char *name)
 {
-       select_getanyfile();
-       hdr_cache_forever();
-       send_local_file("application/x-git-packed-objects", name);
+       select_getanyfile(hdr);
+       hdr_cache_forever(hdr);
+       send_local_file(hdr, "application/x-git-packed-objects", name);
 }
 
-static void get_idx_file(char *name)
+static void get_idx_file(struct strbuf *hdr, char *name)
 {
-       select_getanyfile();
-       hdr_cache_forever();
-       send_local_file("application/x-git-packed-objects-toc", name);
+       select_getanyfile(hdr);
+       hdr_cache_forever(hdr);
+       send_local_file(hdr, "application/x-git-packed-objects-toc", name);
 }
 
 static void http_config(void)
@@ -241,14 +245,14 @@ static void http_config(void)
        strbuf_release(&var);
 }
 
-static struct rpc_service *select_service(const char *name)
+static struct rpc_service *select_service(struct strbuf *hdr, const char *name)
 {
        const char *svc_name;
        struct rpc_service *svc = NULL;
        int i;
 
        if (!skip_prefix(name, "git-", &svc_name))
-               forbidden("Unsupported service: '%s'", name);
+               forbidden(hdr, "Unsupported service: '%s'", name);
 
        for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
                struct rpc_service *s = &rpc_service[i];
@@ -259,14 +263,14 @@ static struct rpc_service *select_service(const char *name)
        }
 
        if (!svc)
-               forbidden("Unsupported service: '%s'", name);
+               forbidden(hdr, "Unsupported service: '%s'", name);
 
        if (svc->enabled < 0) {
                const char *user = getenv("REMOTE_USER");
                svc->enabled = (user && *user) ? 1 : 0;
        }
        if (!svc->enabled)
-               forbidden("Service not enabled: '%s'", svc->name);
+               forbidden(hdr, "Service not enabled: '%s'", svc->name);
        return svc;
 }
 
@@ -442,34 +446,34 @@ static int show_text_ref(const char *name, const struct object_id *oid,
        return 0;
 }
 
-static void get_info_refs(char *arg)
+static void get_info_refs(struct strbuf *hdr, char *arg)
 {
        const char *service_name = get_parameter("service");
        struct strbuf buf = STRBUF_INIT;
 
-       hdr_nocache();
+       hdr_nocache(hdr);
 
        if (service_name) {
                const char *argv[] = {NULL /* service name */,
                        "--stateless-rpc", "--advertise-refs",
                        ".", NULL};
-               struct rpc_service *svc = select_service(service_name);
+               struct rpc_service *svc = select_service(hdr, service_name);
 
                strbuf_addf(&buf, "application/x-git-%s-advertisement",
                        svc->name);
-               hdr_str(content_type, buf.buf);
-               end_headers();
+               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;
                run_service(argv, 0);
 
        } else {
-               select_getanyfile();
+               select_getanyfile(hdr);
                for_each_namespaced_ref(show_text_ref, &buf);
-               send_strbuf("text/plain", &buf);
+               send_strbuf(hdr, "text/plain", &buf);
        }
        strbuf_release(&buf);
 }
@@ -484,9 +488,9 @@ static int show_head_ref(const char *refname, const struct object_id *oid,
                const char *target = resolve_ref_unsafe(refname,
                                                        RESOLVE_REF_READING,
                                                        unused.hash, NULL);
-               const char *target_nons = strip_namespace(target);
 
-               strbuf_addf(buf, "ref: %s\n", target_nons);
+               if (target)
+                       strbuf_addf(buf, "ref: %s\n", strip_namespace(target));
        } else {
                strbuf_addf(buf, "%s\n", oid_to_hex(oid));
        }
@@ -494,24 +498,24 @@ static int show_head_ref(const char *refname, const struct object_id *oid,
        return 0;
 }
 
-static void get_head(char *arg)
+static void get_head(struct strbuf *hdr, char *arg)
 {
        struct strbuf buf = STRBUF_INIT;
 
-       select_getanyfile();
+       select_getanyfile(hdr);
        head_ref_namespaced(show_head_ref, &buf);
-       send_strbuf("text/plain", &buf);
+       send_strbuf(hdr, "text/plain", &buf);
        strbuf_release(&buf);
 }
 
-static void get_info_packs(char *arg)
+static void get_info_packs(struct strbuf *hdr, char *arg)
 {
        size_t objdirlen = strlen(get_object_directory());
        struct strbuf buf = STRBUF_INIT;
        struct packed_git *p;
        size_t cnt = 0;
 
-       select_getanyfile();
+       select_getanyfile(hdr);
        prepare_packed_git();
        for (p = packed_git; p; p = p->next) {
                if (p->pack_local)
@@ -525,12 +529,12 @@ static void get_info_packs(char *arg)
        }
        strbuf_addch(&buf, '\n');
 
-       hdr_nocache();
-       send_strbuf("text/plain; charset=utf-8", &buf);
+       hdr_nocache(hdr);
+       send_strbuf(hdr, "text/plain; charset=utf-8", &buf);
        strbuf_release(&buf);
 }
 
-static void check_content_type(const char *accepted_type)
+static void check_content_type(struct strbuf *hdr, const char *accepted_type)
 {
        const char *actual_type = getenv("CONTENT_TYPE");
 
@@ -538,9 +542,9 @@ static void check_content_type(const char *accepted_type)
                actual_type = "";
 
        if (strcmp(actual_type, accepted_type)) {
-               http_status(415, "Unsupported Media Type");
-               hdr_nocache();
-               end_headers();
+               http_status(hdr, 415, "Unsupported Media Type");
+               hdr_nocache(hdr);
+               end_headers(hdr);
                format_write(1,
                        "Expected POST with Content-Type '%s',"
                        " but received '%s' instead.\n",
@@ -549,23 +553,23 @@ static void check_content_type(const char *accepted_type)
        }
 }
 
-static void service_rpc(char *service_name)
+static void service_rpc(struct strbuf *hdr, char *service_name)
 {
        const char *argv[] = {NULL, "--stateless-rpc", ".", NULL};
-       struct rpc_service *svc = select_service(service_name);
+       struct rpc_service *svc = select_service(hdr, service_name);
        struct strbuf buf = STRBUF_INIT;
 
        strbuf_reset(&buf);
        strbuf_addf(&buf, "application/x-git-%s-request", svc->name);
-       check_content_type(buf.buf);
+       check_content_type(hdr, buf.buf);
 
-       hdr_nocache();
+       hdr_nocache(hdr);
 
        strbuf_reset(&buf);
        strbuf_addf(&buf, "application/x-git-%s-result", svc->name);
-       hdr_str(content_type, buf.buf);
+       hdr_str(hdr, content_type, buf.buf);
 
-       end_headers();
+       end_headers(hdr);
 
        argv[0] = svc->name;
        run_service(argv, svc->buffer_input);
@@ -576,11 +580,13 @@ static int dead;
 static NORETURN void die_webcgi(const char *err, va_list params)
 {
        if (dead <= 1) {
+               struct strbuf hdr = STRBUF_INIT;
+
                vreportf("fatal: ", err, params);
 
-               http_status(500, "Internal Server Error");
-               hdr_nocache();
-               end_headers();
+               http_status(&hdr, 500, "Internal Server Error");
+               hdr_nocache(&hdr);
+               end_headers(&hdr);
        }
        exit(0); /* we successfully reported a failure ;-) */
 }
@@ -617,7 +623,7 @@ static char* getdir(void)
 static struct service_cmd {
        const char *method;
        const char *pattern;
-       void (*imp)(char *);
+       void (*imp)(struct strbuf *, char *);
 } services[] = {
        {"GET", "/HEAD$", get_head},
        {"GET", "/info/refs$", get_info_refs},
@@ -632,17 +638,30 @@ static struct service_cmd {
        {"POST", "/git-receive-pack$", service_rpc}
 };
 
-int main(int argc, char **argv)
+static int bad_request(struct strbuf *hdr, const struct service_cmd *c)
+{
+       const char *proto = getenv("SERVER_PROTOCOL");
+
+       if (proto && !strcmp(proto, "HTTP/1.1")) {
+               http_status(hdr, 405, "Method Not Allowed");
+               hdr_str(hdr, "Allow",
+                       !strcmp(c->method, "GET") ? "GET, HEAD" : c->method);
+       } else
+               http_status(hdr, 400, "Bad Request");
+       hdr_nocache(hdr);
+       end_headers(hdr);
+       return 0;
+}
+
+int cmd_main(int argc, const char **argv)
 {
        char *method = getenv("REQUEST_METHOD");
        char *dir;
        struct service_cmd *cmd = NULL;
        char *cmd_arg = NULL;
        int i;
+       struct strbuf hdr = STRBUF_INIT;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
        set_die_routine(die_webcgi);
        set_die_is_recursing_routine(die_webcgi_recursing);
 
@@ -662,18 +681,8 @@ int main(int argc, char **argv)
                if (!regexec(&re, dir, 1, out, 0)) {
                        size_t n;
 
-                       if (strcmp(method, c->method)) {
-                               const char *proto = getenv("SERVER_PROTOCOL");
-                               if (proto && !strcmp(proto, "HTTP/1.1")) {
-                                       http_status(405, "Method Not Allowed");
-                                       hdr_str("Allow", !strcmp(c->method, "GET") ?
-                                               "GET, HEAD" : c->method);
-                               } else
-                                       http_status(400, "Bad Request");
-                               hdr_nocache();
-                               end_headers();
-                               return 0;
-                       }
+                       if (strcmp(method, c->method))
+                               return bad_request(&hdr, c);
 
                        cmd = c;
                        n = out[0].rm_eo - out[0].rm_so;
@@ -685,19 +694,19 @@ int main(int argc, char **argv)
        }
 
        if (!cmd)
-               not_found("Request not supported: '%s'", dir);
+               not_found(&hdr, "Request not supported: '%s'", dir);
 
        setup_path();
        if (!enter_repo(dir, 0))
-               not_found("Not a git repository: '%s'", dir);
+               not_found(&hdr, "Not a git repository: '%s'", dir);
        if (!getenv("GIT_HTTP_EXPORT_ALL") &&
            access("git-daemon-export-ok", F_OK) )
-               not_found("Repository not exported: '%s'", dir);
+               not_found(&hdr, "Repository not exported: '%s'", dir);
 
        http_config();
        max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER",
                                           max_request_buffer);
 
-       cmd->imp(cmd_arg);
+       cmd->imp(&hdr, cmd_arg);
        return 0;
 }
index ba3ea106708de01fc933e6743ab109bef2697f75..3b556d66196277b2730f7e3d366a28a9d5ad1c56 100644 (file)
@@ -6,7 +6,7 @@
 static const char http_fetch_usage[] = "git http-fetch "
 "[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";
 
-int main(int argc, const char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct walker *walker;
        int commits_on_stdin = 0;
@@ -22,10 +22,6 @@ int main(int argc, const char **argv)
        int get_verbosely = 0;
        int get_recover = 0;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
-
        while (arg < argc && argv[arg][0] == '-') {
                if (argv[arg][1] == 't') {
                        get_tree = 1;
index bd60668707b956160edd9fb22767758023571ebb..704b1c837c9feaa1215e5fd9767c04275a4c1beb 100644 (file)
@@ -211,7 +211,7 @@ static void curl_setup_http(CURL *curl, const char *url,
 static struct curl_slist *get_dav_token_headers(struct remote_lock *lock, enum dav_header_flag options)
 {
        struct strbuf buf = STRBUF_INIT;
-       struct curl_slist *dav_headers = NULL;
+       struct curl_slist *dav_headers = http_copy_default_headers();
 
        if (options & DAV_HEADER_IF) {
                strbuf_addf(&buf, "If: (<%s>)", lock->token);
@@ -417,7 +417,7 @@ static void start_put(struct transfer_request *request)
 static void start_move(struct transfer_request *request)
 {
        struct active_request_slot *slot;
-       struct curl_slist *dav_headers = NULL;
+       struct curl_slist *dav_headers = http_copy_default_headers();
 
        slot = get_active_slot();
        slot->callback_func = process_response;
@@ -845,7 +845,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
        char *ep;
        char timeout_header[25];
        struct remote_lock *lock = NULL;
-       struct curl_slist *dav_headers = NULL;
+       struct curl_slist *dav_headers = http_copy_default_headers();
        struct xml_ctx ctx;
        char *escaped;
 
@@ -1126,7 +1126,7 @@ static void remote_ls(const char *path, int flags,
        struct slot_results results;
        struct strbuf in_buffer = STRBUF_INIT;
        struct buffer out_buffer = { STRBUF_INIT, 0 };
-       struct curl_slist *dav_headers = NULL;
+       struct curl_slist *dav_headers = http_copy_default_headers();
        struct xml_ctx ctx;
        struct remote_ls_ctx ls;
 
@@ -1137,7 +1137,7 @@ static void remote_ls(const char *path, int flags,
        ls.userData = userData;
        ls.userFunc = userFunc;
 
-       strbuf_addf(&out_buffer.buf, PROPFIND_ALL_REQUEST);
+       strbuf_addstr(&out_buffer.buf, PROPFIND_ALL_REQUEST);
 
        dav_headers = curl_slist_append(dav_headers, "Depth: 1");
        dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml");
@@ -1204,7 +1204,7 @@ static int locking_available(void)
        struct slot_results results;
        struct strbuf in_buffer = STRBUF_INIT;
        struct buffer out_buffer = { STRBUF_INIT, 0 };
-       struct curl_slist *dav_headers = NULL;
+       struct curl_slist *dav_headers = http_copy_default_headers();
        struct xml_ctx ctx;
        int lock_flags = 0;
        char *escaped;
@@ -1312,10 +1312,10 @@ static struct object_list **process_tree(struct tree *tree,
        while (tree_entry(&desc, &entry))
                switch (object_type(entry.mode)) {
                case OBJ_TREE:
-                       p = process_tree(lookup_tree(entry.sha1), p);
+                       p = process_tree(lookup_tree(entry.oid->hash), p);
                        break;
                case OBJ_BLOB:
-                       p = process_blob(lookup_blob(entry.sha1), p);
+                       p = process_blob(lookup_blob(entry.oid->hash), p);
                        break;
                default:
                        /* Subproject commit - not in this repository */
@@ -1692,12 +1692,12 @@ static void run_request_queue(void)
 #endif
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct transfer_request *request;
        struct transfer_request *next_request;
        int nr_refspec = 0;
-       char **refspec = NULL;
+       const char **refspec = NULL;
        struct remote_lock *ref_lock = NULL;
        struct remote_lock *info_ref_lock = NULL;
        struct rev_info revs;
@@ -1709,15 +1709,11 @@ int main(int argc, char **argv)
        int new_refs;
        struct ref *ref, *local_refs;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
-
        repo = xcalloc(1, sizeof(*repo));
 
        argv++;
        for (i = 1; i < argc; i++, argv++) {
-               char *arg = *argv;
+               const char *arg = *argv;
 
                if (*arg == '-') {
                        if (!strcmp(arg, "--all")) {
index 2c721f0c30d786e043dec819dc421788311c7e4b..c2f81cd6af9d9da0f10fa2e657e6fe62bdbdc4bc 100644 (file)
@@ -2,6 +2,7 @@
 #include "commit.h"
 #include "walker.h"
 #include "http.h"
+#include "list.h"
 
 struct alt_base {
        char *base;
@@ -23,7 +24,7 @@ struct object_request {
        struct alt_base *repo;
        enum object_request_state state;
        struct http_object_request *req;
-       struct object_request *next;
+       struct list_head node;
 };
 
 struct alternates_request {
@@ -41,7 +42,7 @@ struct walker_data {
        struct alt_base *alt;
 };
 
-static struct object_request *object_queue_head;
+static LIST_HEAD(object_queue_head);
 
 static void fetch_alternates(struct walker *walker, const char *base);
 
@@ -110,19 +111,10 @@ static void process_object_response(void *callback_data)
 
 static void release_object_request(struct object_request *obj_req)
 {
-       struct object_request *entry = object_queue_head;
-
        if (obj_req->req !=NULL && obj_req->req->localfile != -1)
                error("fd leakage in release: %d", obj_req->req->localfile);
-       if (obj_req == object_queue_head) {
-               object_queue_head = obj_req->next;
-       } else {
-               while (entry->next != NULL && entry->next != obj_req)
-                       entry = entry->next;
-               if (entry->next == obj_req)
-                       entry->next = entry->next->next;
-       }
 
+       list_del(&obj_req->node);
        free(obj_req);
 }
 
@@ -130,8 +122,10 @@ static void release_object_request(struct object_request *obj_req)
 static int fill_active_slot(struct walker *walker)
 {
        struct object_request *obj_req;
+       struct list_head *pos, *tmp, *head = &object_queue_head;
 
-       for (obj_req = object_queue_head; obj_req; obj_req = obj_req->next) {
+       list_for_each_safe(pos, tmp, head) {
+               obj_req = list_entry(pos, struct object_request, node);
                if (obj_req->state == WAITING) {
                        if (has_sha1_file(obj_req->sha1))
                                obj_req->state = COMPLETE;
@@ -148,7 +142,6 @@ static int fill_active_slot(struct walker *walker)
 static void prefetch(struct walker *walker, unsigned char *sha1)
 {
        struct object_request *newreq;
-       struct object_request *tail;
        struct walker_data *data = walker->data;
 
        newreq = xmalloc(sizeof(*newreq));
@@ -157,18 +150,9 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
        newreq->repo = data->alt;
        newreq->state = WAITING;
        newreq->req = NULL;
-       newreq->next = NULL;
 
        http_is_verbose = walker->get_verbosely;
-
-       if (object_queue_head == NULL) {
-               object_queue_head = newreq;
-       } else {
-               tail = object_queue_head;
-               while (tail->next != NULL)
-                       tail = tail->next;
-               tail->next = newreq;
-       }
+       list_add_tail(&newreq->node, &object_queue_head);
 
 #ifdef USE_CURL_MULTI
        fill_active_slots();
@@ -290,9 +274,8 @@ static void process_alternates_response(void *callback_data)
                                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",
-                                               target.buf);
+                               warning("adding alternate object store: %s",
+                                       target.buf);
                                newalt = xmalloc(sizeof(*newalt));
                                newalt->next = NULL;
                                newalt->base = strbuf_detach(&target, NULL);
@@ -318,6 +301,9 @@ static void fetch_alternates(struct walker *walker, const char *base)
        struct alternates_request alt_req;
        struct walker_data *cdata = walker->data;
 
+       if (http_follow_config != HTTP_FOLLOW_ALWAYS)
+               return;
+
        /*
         * If another request has already started fetching alternates,
         * wait for them to arrive and return to processing this request's
@@ -447,15 +433,19 @@ static void abort_object_request(struct object_request *obj_req)
        release_object_request(obj_req);
 }
 
-static int fetch_object(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
+static int fetch_object(struct walker *walker, unsigned char *sha1)
 {
        char *hex = sha1_to_hex(sha1);
        int ret = 0;
-       struct object_request *obj_req = object_queue_head;
+       struct object_request *obj_req = NULL;
        struct http_object_request *req;
+       struct list_head *pos, *head = &object_queue_head;
 
-       while (obj_req != NULL && hashcmp(obj_req->sha1, sha1))
-               obj_req = obj_req->next;
+       list_for_each(pos, head) {
+               obj_req = list_entry(pos, struct object_request, node);
+               if (!hashcmp(obj_req->sha1, sha1))
+                       break;
+       }
        if (obj_req == NULL)
                return error("Couldn't find request for %s in the queue", hex);
 
@@ -488,6 +478,18 @@ static int fetch_object(struct walker *walker, struct alt_base *repo, unsigned c
                req->localfile = -1;
        }
 
+       /*
+        * we turned off CURLOPT_FAILONERROR to avoid losing a
+        * persistent connection and got CURLE_OK.
+        */
+       if (req->http_code >= 300 && req->curl_result == CURLE_OK &&
+                       (starts_with(req->url, "http://") ||
+                        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);
        } else if (req->curl_result != CURLE_OK &&
@@ -518,7 +520,7 @@ static int fetch(struct walker *walker, unsigned char *sha1)
        struct walker_data *data = walker->data;
        struct alt_base *altbase = data->alt;
 
-       if (!fetch_object(walker, altbase, sha1))
+       if (!fetch_object(walker, sha1))
                return 0;
        while (altbase) {
                if (!http_fetch_pack(walker, altbase, sha1))
diff --git a/http.c b/http.c
index 69da4454d8f754598d0316d0e1cb34870aba2b8e..051fe6e5ab77a5dc6e53dce7011d0fc445f15ab0 100644 (file)
--- a/http.c
+++ b/http.c
@@ -11,6 +11,7 @@
 #include "gettext.h"
 #include "transport.h"
 
+static struct trace_key trace_curl = TRACE_KEY_INIT(CURL);
 #if LIBCURL_VERSION_NUM >= 0x070a08
 long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER;
 #else
@@ -89,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;
@@ -98,6 +111,8 @@ static int http_proactive_auth;
 static const char *user_agent;
 static int curl_empty_auth;
 
+enum http_follow_config http_follow_config = HTTP_FOLLOW_INITIAL;
+
 #if LIBCURL_VERSION_NUM >= 0x071700
 /* Use CURLOPT_KEYPASSWD as is */
 #elif LIBCURL_VERSION_NUM >= 0x070903
@@ -114,6 +129,7 @@ static unsigned long http_auth_methods = CURLAUTH_ANY;
 
 static struct curl_slist *pragma_header;
 static struct curl_slist *no_pragma_header;
+static struct curl_slist *extra_http_headers;
 
 static struct active_request_slot *active_queue_head;
 
@@ -199,6 +215,13 @@ static void finish_active_slot(struct active_request_slot *slot)
                slot->callback_func(slot->callback_data);
 }
 
+static void xmulti_remove_handle(struct active_request_slot *slot)
+{
+#ifdef USE_CURL_MULTI
+       curl_multi_remove_handle(curlm, slot->curl);
+#endif
+}
+
 #ifdef USE_CURL_MULTI
 static void process_curl_messages(void)
 {
@@ -214,7 +237,7 @@ static void process_curl_messages(void)
                               slot->curl != curl_message->easy_handle)
                                slot = slot->next;
                        if (slot != NULL) {
-                               curl_multi_remove_handle(curlm, slot->curl);
+                               xmulti_remove_handle(slot);
                                slot->curl_result = curl_result;
                                finish_active_slot(slot);
                        } else {
@@ -293,7 +316,7 @@ static int http_options(const char *var, const char *value, void *cb)
                return git_config_string(&http_proxy_authmethod, var, value);
 
        if (!strcmp("http.cookiefile", var))
-               return git_config_string(&curl_cookie_file, var, value);
+               return git_config_pathname(&curl_cookie_file, var, value);
        if (!strcmp("http.savecookies", var)) {
                curl_save_cookies = git_config_bool(var, value);
                return 0;
@@ -314,6 +337,15 @@ static int http_options(const char *var, const char *value, void *cb)
                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);
@@ -323,13 +355,36 @@ static int http_options(const char *var, const char *value, void *cb)
 #endif
        }
 
+       if (!strcmp("http.extraheader", var)) {
+               if (!value) {
+                       return config_error_nonbool(var);
+               } else if (!*value) {
+                       curl_slist_free_all(extra_http_headers);
+                       extra_http_headers = NULL;
+               } else {
+                       extra_http_headers =
+                               curl_slist_append(extra_http_headers, value);
+               }
+               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 void init_curl_http_auth(CURL *result)
 {
-       if (!http_auth.username) {
+       if (!http_auth.username || !*http_auth.username) {
                if (curl_empty_auth)
                        curl_easy_setopt(result, CURLOPT_USERPWD, ":");
                return;
@@ -446,8 +501,7 @@ static int sockopt_callback(void *client, curl_socket_t fd, curlsocktype type)
 
        rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&ka, len);
        if (rc < 0)
-               warning("unable to set SO_KEEPALIVE on socket %s",
-                       strerror(errno));
+               warning_errno("unable to set SO_KEEPALIVE on socket");
 
        return 0; /* CURL_SOCKOPT_OK only exists since curl 7.21.5 */
 }
@@ -464,6 +518,125 @@ static void set_curl_keepalive(CURL *c)
 }
 #endif
 
+static void redact_sensitive_header(struct strbuf *header)
+{
+       const char *sensitive_header;
+
+       if (skip_prefix(header->buf, "Authorization:", &sensitive_header) ||
+           skip_prefix(header->buf, "Proxy-Authorization:", &sensitive_header)) {
+               /* The first token is the type, which is OK to log */
+               while (isspace(*sensitive_header))
+                       sensitive_header++;
+               while (*sensitive_header && !isspace(*sensitive_header))
+                       sensitive_header++;
+               /* Everything else is opaque and possibly sensitive */
+               strbuf_setlen(header,  sensitive_header - header->buf);
+               strbuf_addstr(header, " <redacted>");
+       }
+}
+
+static void curl_dump_header(const char *text, unsigned char *ptr, size_t size, int hide_sensitive_header)
+{
+       struct strbuf out = STRBUF_INIT;
+       struct strbuf **headers, **header;
+
+       strbuf_addf(&out, "%s, %10.10ld bytes (0x%8.8lx)\n",
+               text, (long)size, (long)size);
+       trace_strbuf(&trace_curl, &out);
+       strbuf_reset(&out);
+       strbuf_add(&out, ptr, size);
+       headers = strbuf_split_max(&out, '\n', 0);
+
+       for (header = headers; *header; header++) {
+               if (hide_sensitive_header)
+                       redact_sensitive_header(*header);
+               strbuf_insert((*header), 0, text, strlen(text));
+               strbuf_insert((*header), strlen(text), ": ", 2);
+               strbuf_rtrim((*header));
+               strbuf_addch((*header), '\n');
+               trace_strbuf(&trace_curl, (*header));
+       }
+       strbuf_list_free(headers);
+       strbuf_release(&out);
+}
+
+static void curl_dump_data(const char *text, unsigned char *ptr, size_t size)
+{
+       size_t i;
+       struct strbuf out = STRBUF_INIT;
+       unsigned int width = 60;
+
+       strbuf_addf(&out, "%s, %10.10ld bytes (0x%8.8lx)\n",
+               text, (long)size, (long)size);
+       trace_strbuf(&trace_curl, &out);
+
+       for (i = 0; i < size; i += width) {
+               size_t w;
+
+               strbuf_reset(&out);
+               strbuf_addf(&out, "%s: ", text);
+               for (w = 0; (w < width) && (i + w < size); w++) {
+                       unsigned char ch = ptr[i + w];
+
+                       strbuf_addch(&out,
+                                      (ch >= 0x20) && (ch < 0x80)
+                                      ? ch : '.');
+               }
+               strbuf_addch(&out, '\n');
+               trace_strbuf(&trace_curl, &out);
+       }
+       strbuf_release(&out);
+}
+
+static int curl_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
+{
+       const char *text;
+       enum { NO_FILTER = 0, DO_FILTER = 1 };
+
+       switch (type) {
+       case CURLINFO_TEXT:
+               trace_printf_key(&trace_curl, "== Info: %s", data);
+       default:                /* we ignore unknown types by default */
+               return 0;
+
+       case CURLINFO_HEADER_OUT:
+               text = "=> Send header";
+               curl_dump_header(text, (unsigned char *)data, size, DO_FILTER);
+               break;
+       case CURLINFO_DATA_OUT:
+               text = "=> Send data";
+               curl_dump_data(text, (unsigned char *)data, size);
+               break;
+       case CURLINFO_SSL_DATA_OUT:
+               text = "=> Send SSL data";
+               curl_dump_data(text, (unsigned char *)data, size);
+               break;
+       case CURLINFO_HEADER_IN:
+               text = "<= Recv header";
+               curl_dump_header(text, (unsigned char *)data, size, NO_FILTER);
+               break;
+       case CURLINFO_DATA_IN:
+               text = "<= Recv data";
+               curl_dump_data(text, (unsigned char *)data, size);
+               break;
+       case CURLINFO_SSL_DATA_IN:
+               text = "<= Recv SSL data";
+               curl_dump_data(text, (unsigned char *)data, size);
+               break;
+       }
+       return 0;
+}
+
+void setup_curl_trace(CURL *handle)
+{
+       if (!trace_want(&trace_curl))
+               return;
+       curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L);
+       curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, curl_trace);
+       curl_easy_setopt(handle, CURLOPT_DEBUGDATA, NULL);
+}
+
+
 static CURL *get_curl_handle(void)
 {
        CURL *result = curl_easy_init();
@@ -489,6 +662,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);
 
@@ -540,7 +729,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);
@@ -557,14 +745,15 @@ static CURL *get_curl_handle(void)
        if (is_transport_allowed("ftps"))
                allowed_protocols |= CURLPROTO_FTPS;
        curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS, allowed_protocols);
+       curl_easy_setopt(result, CURLOPT_PROTOCOLS, allowed_protocols);
 #else
        if (transport_restrict_protocols())
                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, 1);
+               curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
+       setup_curl_trace(result);
 
        curl_easy_setopt(result, CURLOPT_USERAGENT,
                user_agent ? user_agent : git_user_agent());
@@ -590,7 +779,7 @@ static CURL *get_curl_handle(void)
         * precedence here, as in CURL.
         */
        if (!curl_http_proxy) {
-               if (!strcmp(http_auth.protocol, "https")) {
+               if (http_auth.protocol && !strcmp(http_auth.protocol, "https")) {
                        var_override(&curl_http_proxy, getenv("HTTPS_PROXY"));
                        var_override(&curl_http_proxy, getenv("https_proxy"));
                } else {
@@ -605,7 +794,10 @@ static CURL *get_curl_handle(void)
        if (curl_http_proxy) {
                curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy);
 #if LIBCURL_VERSION_NUM >= 0x071800
-               if (starts_with(curl_http_proxy, "socks5"))
+               if (starts_with(curl_http_proxy, "socks5h"))
+                       curl_easy_setopt(result,
+                               CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
+               else if (starts_with(curl_http_proxy, "socks5"))
                        curl_easy_setopt(result,
                                CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
                else if (starts_with(curl_http_proxy, "socks4a"))
@@ -675,8 +867,10 @@ void http_init(struct remote *remote, const char *url, int proactive_auth)
        if (remote)
                var_override(&http_proxy_authmethod, remote->http_proxy_authmethod);
 
-       pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache");
-       no_pragma_header = curl_slist_append(no_pragma_header, "Pragma:");
+       pragma_header = curl_slist_append(http_copy_default_headers(),
+               "Pragma: no-cache");
+       no_pragma_header = curl_slist_append(http_copy_default_headers(),
+               "Pragma:");
 
 #ifdef USE_CURL_MULTI
        {
@@ -743,9 +937,7 @@ void http_cleanup(void)
        while (slot != NULL) {
                struct active_request_slot *next = slot->next;
                if (slot->curl != NULL) {
-#ifdef USE_CURL_MULTI
-                       curl_multi_remove_handle(curlm, slot->curl);
-#endif
+                       xmulti_remove_handle(slot);
                        curl_easy_cleanup(slot->curl);
                }
                free(slot);
@@ -762,6 +954,9 @@ void http_cleanup(void)
 #endif
        curl_global_cleanup();
 
+       curl_slist_free_all(extra_http_headers);
+       extra_http_headers = NULL;
+
        curl_slist_free_all(pragma_header);
        pragma_header = NULL;
 
@@ -861,6 +1056,16 @@ 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
@@ -881,6 +1086,8 @@ int start_active_slot(struct active_request_slot *slot)
 
        if (curlm_result != CURLM_OK &&
            curlm_result != CURLM_CALL_MULTI_PERFORM) {
+               warning("curl_multi_add_handle failed: %s",
+                       curl_multi_strerror(curlm_result));
                active_requests--;
                slot->in_use = 0;
                return 0;
@@ -1020,13 +1227,13 @@ void run_active_slot(struct active_request_slot *slot)
 static void release_active_slot(struct active_request_slot *slot)
 {
        closedown_active_slot(slot);
-       if (slot->curl && curl_session_count > min_curl_sessions) {
-#ifdef USE_CURL_MULTI
-               curl_multi_remove_handle(curlm, slot->curl);
-#endif
-               curl_easy_cleanup(slot->curl);
-               slot->curl = NULL;
-               curl_session_count--;
+       if (slot->curl) {
+               xmulti_remove_handle(slot);
+               if (curl_session_count > min_curl_sessions) {
+                       curl_easy_cleanup(slot->curl);
+                       slot->curl = NULL;
+                       curl_session_count--;
+               }
        }
 #ifdef USE_CURL_MULTI
        fill_active_slots();
@@ -1084,7 +1291,7 @@ void append_remote_object_url(struct strbuf *buf, const char *url,
 
        strbuf_addf(buf, "objects/%.*s/", 2, hex);
        if (!only_two_digit_prefix)
-               strbuf_addf(buf, "%s", hex+2);
+               strbuf_addstr(buf, hex + 2);
 }
 
 char *get_remote_object_url(const char *url, const char *hex,
@@ -1101,9 +1308,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"
@@ -1160,6 +1370,16 @@ int run_one_slot(struct active_request_slot *slot,
        return handle_curl_result(results);
 }
 
+struct curl_slist *http_copy_default_headers(void)
+{
+       struct curl_slist *headers = NULL, *h;
+
+       for (h = extra_http_headers; h; h = h->next)
+               headers = curl_slist_append(headers, h->data);
+
+       return headers;
+}
+
 static CURLcode curlinfo_strbuf(CURL *curl, CURLINFO info, struct strbuf *buf)
 {
        char *ptr;
@@ -1377,7 +1597,7 @@ static int http_request(const char *url,
 {
        struct active_request_slot *slot;
        struct slot_results results;
-       struct curl_slist *headers = NULL;
+       struct curl_slist *headers = http_copy_default_headers();
        struct strbuf buf = STRBUF_INIT;
        const char *accept_language;
        int ret;
@@ -1412,6 +1632,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);
 
@@ -1460,16 +1683,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;
@@ -1478,14 +1701,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;
 }
 
@@ -1824,8 +2049,19 @@ static size_t fwrite_sha1_file(char *ptr, size_t eltsize, size_t nmemb,
        unsigned char expn[4096];
        size_t size = eltsize * nmemb;
        int posn = 0;
-       struct http_object_request *freq =
-               (struct http_object_request *)data;
+       struct http_object_request *freq = data;
+       struct active_request_slot *slot = freq->slot;
+
+       if (slot) {
+               CURLcode c = curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE,
+                                               &slot->http_code);
+               if (c != CURLE_OK)
+                       die("BUG: curl_easy_getinfo for HTTP code failed: %s",
+                               curl_easy_strerror(c));
+               if (slot->http_code >= 300)
+                       return size;
+       }
+
        do {
                ssize_t retval = xwrite(freq->localfile,
                                        (char *) ptr + posn, size - posn);
@@ -1891,8 +2127,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
        }
 
        if (freq->localfile < 0) {
-               error("Couldn't create temporary file %s: %s",
-                     freq->tmpfile, strerror(errno));
+               error_errno("Couldn't create temporary file %s", freq->tmpfile);
                goto abort;
        }
 
@@ -1937,8 +2172,8 @@ struct http_object_request *new_http_object_request(const char *base_url,
                        prev_posn = 0;
                        lseek(freq->localfile, 0, SEEK_SET);
                        if (ftruncate(freq->localfile, 0) < 0) {
-                               error("Couldn't truncate temporary file %s: %s",
-                                         freq->tmpfile, strerror(errno));
+                               error_errno("Couldn't truncate temporary file %s",
+                                           freq->tmpfile);
                                goto abort;
                        }
                }
@@ -1947,6 +2182,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
        freq->slot = get_active_slot();
 
        curl_easy_setopt(freq->slot->curl, CURLOPT_FILE, freq);
+       curl_easy_setopt(freq->slot->curl, CURLOPT_FAILONERROR, 0);
        curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file);
        curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr);
        curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url);
diff --git a/http.h b/http.h
index 4ef4bbda7d86d8ca5238d45897b277709b30414a..02bccb7b0caf9f2b1be0b98cb16c6fc84b95cc74 100644 (file)
--- a/http.h
+++ b/http.h
@@ -106,6 +106,7 @@ extern void step_active_slots(void);
 extern void http_init(struct remote *remote, const char *url,
                      int proactive_auth);
 extern void http_cleanup(void);
+extern struct curl_slist *http_copy_default_headers(void);
 
 extern long int git_curl_ipresolve;
 extern int active_requests;
@@ -115,6 +116,13 @@ 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??? */
@@ -138,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;
@@ -224,4 +233,6 @@ extern int finish_http_object_request(struct http_object_request *freq);
 extern void abort_http_object_request(struct http_object_request *freq);
 extern void release_http_object_request(struct http_object_request *freq);
 
+/* setup routine for curl_easy_setopt CURLOPT_DEBUGFUNCTION */
+void setup_curl_trace(CURL *handle);
 #endif /* HTTP_H */
diff --git a/ident.c b/ident.c
index 6e125821f0563c46eaf8253f31e19d9d97a94e7e..ac4ae02b485637002869b3fc7a78033d7a5b6aec 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -75,14 +75,12 @@ static int add_mailname_host(struct strbuf *buf)
        mailname = fopen("/etc/mailname", "r");
        if (!mailname) {
                if (errno != ENOENT)
-                       warning("cannot open /etc/mailname: %s",
-                               strerror(errno));
+                       warning_errno("cannot open /etc/mailname");
                return -1;
        }
        if (strbuf_getline(&mailnamebuf, mailname) == EOF) {
                if (ferror(mailname))
-                       warning("cannot read /etc/mailname: %s",
-                               strerror(errno));
+                       warning_errno("cannot read /etc/mailname");
                strbuf_release(&mailnamebuf);
                fclose(mailname);
                return -1;
@@ -103,7 +101,7 @@ static int canonical_name(const char *host, struct strbuf *out)
        memset (&hints, '\0', sizeof (hints));
        hints.ai_flags = AI_CANONNAME;
        if (!getaddrinfo(host, NULL, &hints, &ai)) {
-               if (ai && strchr(ai->ai_canonname, '.')) {
+               if (ai && ai->ai_canonname && strchr(ai->ai_canonname, '.')) {
                        strbuf_addstr(out, ai->ai_canonname);
                        status = 0;
                }
@@ -125,7 +123,7 @@ static void add_domainname(struct strbuf *out, int *is_bogus)
        char buf[1024];
 
        if (gethostname(buf, sizeof(buf))) {
-               warning("cannot get host name: %s", strerror(errno));
+               warning_errno("cannot get host name");
                strbuf_addstr(out, "(none)");
                *is_bogus = 1;
                return;
@@ -186,6 +184,11 @@ static const char *ident_default_date(void)
        return git_default_date.buf;
 }
 
+void reset_ident_date(void)
+{
+       strbuf_reset(&git_default_date);
+}
+
 static int crud(unsigned char c)
 {
        return  c <= 32  ||
@@ -328,17 +331,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,21 +354,23 @@ const char *fmt_ident(const char *name, const char *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");
+                       }
                        name = ident_default_name();
                        using_default = 1;
                        if (strict && default_name_is_bogus) {
-                               fputs(env_hint, stderr);
+                               fputs(_(env_hint), stderr);
                                die("unable to auto-detect name (got '%s')", name);
                        }
-                       if (strict && ident_use_config_only
-                           && !(ident_config_given & IDENT_NAME_GIVEN))
-                               die("user.useConfigOnly set but no name given");
                }
                if (!*name) {
                        struct passwd *pw;
                        if (strict) {
                                if (using_default)
-                                       fputs(env_hint, stderr);
+                                       fputs(_(env_hint), stderr);
                                die("empty ident name (for <%s>) not allowed", email);
                        }
                        pw = xgetpwuid_self(NULL);
@@ -374,14 +379,16 @@ const char *fmt_ident(const char *name, const char *email,
        }
 
        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);
+                       fputs(_(env_hint), stderr);
                        die("unable to auto-detect email address (got '%s')", email);
                }
-               if (strict && ident_use_config_only
-                   && !(ident_config_given & IDENT_MAIL_GIVEN))
-                       die("user.useConfigOnly set but no mail given");
        }
 
        strbuf_reset(&ident);
index 2c52027c84455819740bed9f53970e175b9ca133..5c7e27a89459a9a63018cc469262c82891c6f7b7 100644 (file)
@@ -287,17 +287,20 @@ static int ssl_socket_connect(struct imap_socket *sock, int use_tls_only, int ve
        SSL_library_init();
        SSL_load_error_strings();
 
-       if (use_tls_only)
-               meth = TLSv1_method();
-       else
-               meth = SSLv23_method();
-
+       meth = SSLv23_method();
        if (!meth) {
                ssl_socket_perror("SSLv23_method");
                return -1;
        }
 
        ctx = SSL_CTX_new(meth);
+       if (!ctx) {
+               ssl_socket_perror("SSL_CTX_new");
+               return -1;
+       }
+
+       if (use_tls_only)
+               SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
 
        if (verify)
                SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
@@ -508,7 +511,7 @@ static int nfsnprintf(char *buf, int blen, const char *fmt, ...)
 
        va_start(va, fmt);
        if (blen <= 0 || (unsigned)(ret = vsnprintf(buf, blen, fmt, va)) >= (unsigned)blen)
-               die("Fatal: buffer too small. Please report a bug.");
+               die("BUG: buffer too small. Please report a bug.");
        va_end(va);
        return ret;
 }
@@ -862,7 +865,6 @@ static char hexchar(unsigned int b)
 static char *cram(const char *challenge_64, const char *user, const char *pass)
 {
        int i, resp_len, encoded_len, decoded_len;
-       HMAC_CTX hmac;
        unsigned char hash[16];
        char hex[33];
        char *response, *response_64, *challenge;
@@ -877,10 +879,8 @@ static char *cram(const char *challenge_64, const char *user, const char *pass)
                                      (unsigned char *)challenge_64, encoded_len);
        if (decoded_len < 0)
                die("invalid challenge %s", challenge_64);
-       HMAC_Init(&hmac, (unsigned char *)pass, strlen(pass), EVP_md5());
-       HMAC_Update(&hmac, (unsigned char *)challenge, decoded_len);
-       HMAC_Final(&hmac, hash, NULL);
-       HMAC_CTX_cleanup(&hmac);
+       if (!HMAC(EVP_md5(), pass, strlen(pass), (unsigned char *)challenge, decoded_len, hash, NULL))
+               die("HMAC error");
 
        hex[32] = 0;
        for (i = 0; i < 16; i++) {
@@ -890,7 +890,7 @@ static char *cram(const char *challenge_64, const char *user, const char *pass)
 
        /* response: "<user> <digest in hex>" */
        response = xstrfmt("%s %s", user, hex);
-       resp_len = strlen(response) + 1;
+       resp_len = strlen(response);
 
        response_64 = xmallocz(ENCODED_SIZE(resp_len));
        encoded_len = EVP_EncodeBlock((unsigned char *)response_64,
@@ -1082,10 +1082,8 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f
                        cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap");
                        cred.host = xstrdup(srvc->host);
 
-                       if (srvc->user)
-                               cred.username = xstrdup(srvc->user);
-                       if (srvc->pass)
-                               cred.password = xstrdup(srvc->pass);
+                       cred.username = xstrdup_or_null(srvc->user);
+                       cred.password = xstrdup_or_null(srvc->pass);
 
                        credential_fill(&cred);
 
@@ -1095,11 +1093,6 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f
                                srvc->pass = xstrdup(cred.password);
                }
 
-               if (CAP(NOLOGIN)) {
-                       fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n", srvc->user, srvc->host);
-                       goto bail;
-               }
-
                if (srvc->auth_method) {
                        struct imap_cmd_cb cb;
 
@@ -1123,6 +1116,11 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f
                                goto bail;
                        }
                } else {
+                       if (CAP(NOLOGIN)) {
+                               fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n",
+                                       srvc->user, srvc->host);
+                               goto bail;
+                       }
                        if (!imap->buf.sock.ssl)
                                imap_warn("*** IMAP Warning *** Password is being "
                                          "sent in the clear\n");
@@ -1410,6 +1408,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc)
        curl_easy_setopt(curl, CURLOPT_USERNAME, server.user);
        curl_easy_setopt(curl, CURLOPT_PASSWORD, server.pass);
 
+       strbuf_addstr(&path, server.use_ssl ? "imaps://" : "imap://");
        strbuf_addstr(&path, server.host);
        if (!path.len || path.buf[path.len - 1] != '/')
                strbuf_addch(&path, '/');
@@ -1443,6 +1442,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc)
 
        if (0 < verbosity || getenv("GIT_CURL_VERBOSE"))
                curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+       setup_curl_trace(curl);
 
        return curl;
 }
@@ -1494,16 +1494,12 @@ static int curl_append_msgs_to_imap(struct imap_server_conf *server,
 }
 #endif
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct strbuf all_msgs = STRBUF_INIT;
        int total;
        int nongit_ok;
 
-       git_extract_argv0_path(argv[0]);
-
-       git_setup_gettext();
-
        setup_git_directory_gently(&nongit_ok);
        git_imap_config();
 
diff --git a/iterator.h b/iterator.h
new file mode 100644 (file)
index 0000000..0f6900e
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef ITERATOR_H
+#define ITERATOR_H
+
+/*
+ * Generic constants related to iterators.
+ */
+
+/*
+ * The attempt to advance the iterator was successful; the iterator
+ * reflects the new current entry.
+ */
+#define ITER_OK 0
+
+/*
+ * The iterator is exhausted and has been freed.
+ */
+#define ITER_DONE -1
+
+/*
+ * The iterator experienced an error. The iteration has been aborted
+ * and the iterator has been freed.
+ */
+#define ITER_ERROR -2
+
+/*
+ * Return values for selector functions for merge iterators. The
+ * numerical values of these constants are important and must be
+ * compatible with ITER_DONE and ITER_ERROR.
+ */
+enum iterator_selection {
+       /* End the iteration without an error: */
+       ITER_SELECT_DONE = ITER_DONE,
+
+       /* Report an error and abort the iteration: */
+       ITER_SELECT_ERROR = ITER_ERROR,
+
+       /*
+        * The next group of constants are masks that are useful
+        * mainly internally.
+        */
+
+       /* The LSB selects whether iter0/iter1 is the "current" iterator: */
+       ITER_CURRENT_SELECTION_MASK = 0x01,
+
+       /* iter0 is the "current" iterator this round: */
+       ITER_CURRENT_SELECTION_0 = 0x00,
+
+       /* iter1 is the "current" iterator this round: */
+       ITER_CURRENT_SELECTION_1 = 0x01,
+
+       /* Yield the value from the current iterator? */
+       ITER_YIELD_CURRENT = 0x02,
+
+       /* Discard the value from the secondary iterator? */
+       ITER_SKIP_SECONDARY = 0x04,
+
+       /*
+        * The constants that a selector function should usually
+        * return.
+        */
+
+       /* Yield the value from iter0: */
+       ITER_SELECT_0 = ITER_CURRENT_SELECTION_0 | ITER_YIELD_CURRENT,
+
+       /* Yield the value from iter0 and discard the one from iter1: */
+       ITER_SELECT_0_SKIP_1 = ITER_SELECT_0 | ITER_SKIP_SECONDARY,
+
+       /* Discard the value from iter0 without yielding anything this round: */
+       ITER_SKIP_0 = ITER_CURRENT_SELECTION_1 | ITER_SKIP_SECONDARY,
+
+       /* Yield the value from iter1: */
+       ITER_SELECT_1 = ITER_CURRENT_SELECTION_1 | ITER_YIELD_CURRENT,
+
+       /* Yield the value from iter1 and discard the one from iter0: */
+       ITER_SELECT_1_SKIP_0 = ITER_SELECT_1 | ITER_SKIP_SECONDARY,
+
+       /* Discard the value from iter1 without yielding anything this round: */
+       ITER_SKIP_1 = ITER_CURRENT_SELECTION_0 | ITER_SKIP_SECONDARY
+};
+
+#endif /* ITERATOR_H */
index bbe31ed6fbb7c103c739f7e9a3c45cde5d36fcec..65f3558b3be695ce5259df9a2da4f28e95b35b71 100644 (file)
@@ -113,7 +113,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)
@@ -480,8 +480,7 @@ static struct commit *check_single_commit(struct rev_info *revs)
                struct object *obj = revs->pending.objects[i].item;
                if (obj->flags & UNINTERESTING)
                        continue;
-               while (obj->type == OBJ_TAG)
-                       obj = deref_tag(obj, NULL, 0);
+               obj = deref_tag(obj, NULL, 0);
                if (obj->type != OBJ_COMMIT)
                        die("Non commit %s?", revs->pending.objects[i].name);
                if (commit)
@@ -520,7 +519,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines,
        char *data = NULL;
 
        if (diff_populate_filespec(spec, 0))
-               die("Cannot read blob %s", sha1_to_hex(spec->sha1));
+               die("Cannot read blob %s", oid_to_hex(&spec->oid));
 
        ALLOC_ARRAY(ends, size);
        ends[cur++] = 0;
@@ -841,7 +840,7 @@ static char *get_nth_line(long line, unsigned long *ends, void *data)
 
 static void print_line(const char *prefix, char first,
                       long line, unsigned long *ends, void *data,
-                      const char *color, const char *reset)
+                      const char *color, const char *reset, FILE *file)
 {
        char *begin = get_nth_line(line, ends, data);
        char *end = get_nth_line(line+1, ends, data);
@@ -852,14 +851,14 @@ static void print_line(const char *prefix, char first,
                had_nl = 1;
        }
 
-       fputs(prefix, stdout);
-       fputs(color, stdout);
-       putchar(first);
-       fwrite(begin, 1, end-begin, stdout);
-       fputs(reset, stdout);
-       putchar('\n');
+       fputs(prefix, file);
+       fputs(color, file);
+       putc(first, file);
+       fwrite(begin, 1, end-begin, file);
+       fputs(reset, file);
+       putc('\n', file);
        if (!had_nl)
-               fputs("\\ No newline at end of file\n", stdout);
+               fputs("\\ No newline at end of file\n", file);
 }
 
 static char *output_prefix(struct diff_options *opt)
@@ -894,16 +893,16 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
        if (!pair || !diff)
                return;
 
-       if (pair->one->sha1_valid)
+       if (pair->one->oid_valid)
                fill_line_ends(pair->one, &p_lines, &p_ends);
        fill_line_ends(pair->two, &t_lines, &t_ends);
 
-       printf("%s%sdiff --git a/%s b/%s%s\n", prefix, c_meta, pair->one->path, pair->two->path, c_reset);
-       printf("%s%s--- %s%s%s\n", prefix, c_meta,
-              pair->one->sha1_valid ? "a/" : "",
-              pair->one->sha1_valid ? pair->one->path : "/dev/null",
+       fprintf(opt->file, "%s%sdiff --git a/%s b/%s%s\n", prefix, c_meta, pair->one->path, pair->two->path, c_reset);
+       fprintf(opt->file, "%s%s--- %s%s%s\n", prefix, c_meta,
+              pair->one->oid_valid ? "a/" : "",
+              pair->one->oid_valid ? pair->one->path : "/dev/null",
               c_reset);
-       printf("%s%s+++ b/%s%s\n", prefix, c_meta, pair->two->path, c_reset);
+       fprintf(opt->file, "%s%s+++ b/%s%s\n", prefix, c_meta, pair->two->path, c_reset);
        for (i = 0; i < range->ranges.nr; i++) {
                long p_start, p_end;
                long t_start = range->ranges.ranges[i].start;
@@ -945,7 +944,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
                }
 
                /* Now output a diff hunk for this range */
-               printf("%s%s@@ -%ld,%ld +%ld,%ld @@%s\n",
+               fprintf(opt->file, "%s%s@@ -%ld,%ld +%ld,%ld @@%s\n",
                       prefix, c_frag,
                       p_start+1, p_end-p_start, t_start+1, t_end-t_start,
                       c_reset);
@@ -953,18 +952,18 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
                        int k;
                        for (; t_cur < diff->target.ranges[j].start; t_cur++)
                                print_line(prefix, ' ', t_cur, t_ends, pair->two->data,
-                                          c_context, c_reset);
+                                          c_context, c_reset, opt->file);
                        for (k = diff->parent.ranges[j].start; k < diff->parent.ranges[j].end; k++)
                                print_line(prefix, '-', k, p_ends, pair->one->data,
-                                          c_old, c_reset);
+                                          c_old, c_reset, opt->file);
                        for (; t_cur < diff->target.ranges[j].end && t_cur < t_end; t_cur++)
                                print_line(prefix, '+', t_cur, t_ends, pair->two->data,
-                                          c_new, c_reset);
+                                          c_new, c_reset, opt->file);
                        j++;
                }
                for (; t_cur < t_end; t_cur++)
                        print_line(prefix, ' ', t_cur, t_ends, pair->two->data,
-                                  c_context, c_reset);
+                                  c_context, c_reset, opt->file);
        }
 
        free(p_ends);
@@ -977,7 +976,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
  */
 static void dump_diff_hacky(struct rev_info *rev, struct line_log_data *range)
 {
-       puts(output_prefix(&rev->diffopt));
+       fprintf(rev->diffopt.file, "%s\n", output_prefix(&rev->diffopt));
        while (range) {
                dump_diff_hacky_one(rev, range);
                range = range->next;
@@ -1011,12 +1010,12 @@ static int process_diff_filepair(struct rev_info *rev,
        if (rg->ranges.nr == 0)
                return 0;
 
-       assert(pair->two->sha1_valid);
+       assert(pair->two->oid_valid);
        diff_populate_filespec(pair->two, 0);
        file_target.ptr = pair->two->data;
        file_target.size = pair->two->size;
 
-       if (pair->one->sha1_valid) {
+       if (pair->one->oid_valid) {
                diff_populate_filespec(pair->one, 0);
                file_parent.ptr = pair->one->data;
                file_parent.size = pair->one->size;
index 917cc5d7c9ee04d07199f18b78342b84c0375fcd..f3ca6aafb799eadc6255d61711d0aba8cb516463 100644 (file)
@@ -110,16 +110,16 @@ static void process_tree(struct rev_info *revs,
 
                if (S_ISDIR(entry.mode))
                        process_tree(revs,
-                                    lookup_tree(entry.sha1),
+                                    lookup_tree(entry.oid->hash),
                                     show, base, entry.path,
                                     cb_data);
                else if (S_ISGITLINK(entry.mode))
-                       process_gitlink(revs, entry.sha1,
+                       process_gitlink(revs, entry.oid->hash,
                                        show, base, entry.path,
                                        cb_data);
                else
                        process_blob(revs,
-                                    lookup_blob(entry.sha1),
+                                    lookup_blob(entry.oid->hash),
                                     show, base, entry.path,
                                     cb_data);
        }
diff --git a/list.h b/list.h
new file mode 100644 (file)
index 0000000..a226a87
--- /dev/null
+++ b/list.h
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2002 Free Software Foundation, Inc.
+ * (originally part of the GNU C Library and Userspace RCU)
+ * Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+ *
+ * Copyright (C) 2009 Pierre-Marc Fournier
+ * Conversion to RCU list.
+ * Copyright (C) 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LIST_H
+#define LIST_H 1
+
+/*
+ * The definitions of this file are adopted from those which can be
+ * found in the Linux kernel headers to enable people familiar with the
+ * latter find their way in these sources as well.
+ */
+
+/* Basic type for the double-link list. */
+struct list_head {
+       struct list_head *next, *prev;
+};
+
+/* avoid conflicts with BSD-only sys/queue.h */
+#undef LIST_HEAD
+/* Define a variable with the head and tail of the list. */
+#define LIST_HEAD(name) \
+       struct list_head name = { &(name), &(name) }
+
+/* Initialize a new list head. */
+#define INIT_LIST_HEAD(ptr) \
+       (ptr)->next = (ptr)->prev = (ptr)
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+/* Add new element at the head of the list. */
+static inline void list_add(struct list_head *newp, struct list_head *head)
+{
+       head->next->prev = newp;
+       newp->next = head->next;
+       newp->prev = head;
+       head->next = newp;
+}
+
+/* Add new element at the tail of the list. */
+static inline void list_add_tail(struct list_head *newp, struct list_head *head)
+{
+       head->prev->next = newp;
+       newp->next = head;
+       newp->prev = head->prev;
+       head->prev = newp;
+}
+
+/* Remove element from list. */
+static inline void __list_del(struct list_head *prev, struct list_head *next)
+{
+       next->prev = prev;
+       prev->next = next;
+}
+
+/* Remove element from list. */
+static inline void list_del(struct list_head *elem)
+{
+       __list_del(elem->prev, elem->next);
+}
+
+/* Remove element from list, initializing the element's list pointers. */
+static inline void list_del_init(struct list_head *elem)
+{
+       list_del(elem);
+       INIT_LIST_HEAD(elem);
+}
+
+/* Delete from list, add to another list as head. */
+static inline void list_move(struct list_head *elem, struct list_head *head)
+{
+       __list_del(elem->prev, elem->next);
+       list_add(elem, head);
+}
+
+/* Replace an old entry. */
+static inline void list_replace(struct list_head *old, struct list_head *newp)
+{
+       newp->next = old->next;
+       newp->prev = old->prev;
+       newp->prev->next = newp;
+       newp->next->prev = newp;
+}
+
+/* Join two lists. */
+static inline void list_splice(struct list_head *add, struct list_head *head)
+{
+       /* Do nothing if the list which gets added is empty. */
+       if (add != add->next) {
+               add->next->prev = head;
+               add->prev->next = head->next;
+               head->next->prev = add->prev;
+               head->next = add->next;
+       }
+}
+
+/* Get typed element from list at a given position. */
+#define list_entry(ptr, type, member) \
+       ((type *) ((char *) (ptr) - offsetof(type, member)))
+
+/* Get first entry from a list. */
+#define list_first_entry(ptr, type, member) \
+       list_entry((ptr)->next, type, member)
+
+/* Iterate forward over the elements of the list. */
+#define list_for_each(pos, head) \
+       for (pos = (head)->next; pos != (head); pos = pos->next)
+
+/*
+ * Iterate forward over the elements list. The list elements can be
+ * removed from the list while doing this.
+ */
+#define list_for_each_safe(pos, p, head) \
+       for (pos = (head)->next, p = pos->next; \
+               pos != (head); \
+               pos = p, p = pos->next)
+
+/* Iterate backward over the elements of the list. */
+#define list_for_each_prev(pos, head) \
+       for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
+/*
+ * Iterate backwards over the elements list. The list elements can be
+ * removed from the list while doing this.
+ */
+#define list_for_each_prev_safe(pos, p, head) \
+       for (pos = (head)->prev, p = pos->prev; \
+               pos != (head); \
+               pos = p, p = pos->prev)
+
+static inline int list_empty(struct list_head *head)
+{
+       return head == head->next;
+}
+
+static inline void list_replace_init(struct list_head *old,
+                                    struct list_head *newp)
+{
+       struct list_head *head = old->next;
+
+       list_del(old);
+       list_add_tail(newp, head);
+       INIT_LIST_HEAD(old);
+}
+
+#endif /* LIST_H */
index ff4a43a982a6a67ec826fdb01153a9e35e720751..ad8be42f912b456492ca1704ce067fea4713401a 100644 (file)
@@ -47,7 +47,9 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
        assert(opts);
 
        /*
-        * The tentative merge result is the or common ancestor for an internal merge.
+        * The tentative merge result is the common ancestor for an
+        * internal merge.  For the final merge, it is "ours" by
+        * default but -Xours/-Xtheirs can tweak the choice.
         */
        if (opts->virtual_ancestor) {
                stolen = orig;
@@ -383,8 +385,12 @@ int ll_merge(mmbuffer_t *result_buf,
                }
        }
        driver = find_ll_merge_driver(ll_driver_name);
-       if (opts->virtual_ancestor && driver->recursive)
-               driver = find_ll_merge_driver(driver->recursive);
+
+       if (opts->virtual_ancestor) {
+               if (driver->recursive)
+                       driver = find_ll_merge_driver(driver->recursive);
+               marker_size += 2;
+       }
        return driver->fn(driver, result_buf, path, ancestor, ancestor_label,
                          ours, our_label, theirs, their_label,
                          opts, marker_size);
index 80d056d2ede0a5279c0b5c05c35b46336f564533..9268cdf325f3881104d6d12ef31639536b15dcb2 100644 (file)
@@ -149,13 +149,15 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
 void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
 {
        if (err == EEXIST) {
-               strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
-                   "If no other git process is currently running, this probably means a\n"
-                   "git process crashed in this repository earlier. Make sure no other git\n"
-                   "process is running and remove the file manually to continue.",
+               strbuf_addf(buf, _("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."),
                            absolute_path(path), strerror(err));
        } else
-               strbuf_addf(buf, "Unable to create '%s.lock': %s",
+               strbuf_addf(buf, _("Unable to create '%s.lock': %s"),
                            absolute_path(path), strerror(err));
 }
 
index 3d301937b0a7e84ccfb03798be1be4047f0654cd..d26ad27b2b2df207872cb20ce9cc0299ee0aff8e 100644 (file)
  *   * calling `fdopen_lock_file()` to get a `FILE` pointer for the
  *     open file and writing to the file using stdio.
  *
+ *   Note that the file descriptor returned by hold_lock_file_for_update()
+ *   is marked O_CLOEXEC, so the new contents must be written by the
+ *   current process, not a spawned one.
+ *
  * When finished writing, the caller can:
  *
  * * Close the file descriptor and rename the lockfile to its final
index 60f983934d5ea2c8e276d2c493d78caf56e9a39a..8c2415747a2606aefb29fd6e0092c86da3c72589 100644 (file)
@@ -159,12 +159,12 @@ void load_ref_decorations(int flags)
        }
 }
 
-static void show_parents(struct commit *commit, int abbrev)
+static void show_parents(struct commit *commit, int abbrev, FILE *file)
 {
        struct commit_list *p;
        for (p = commit->parents; p ; p = p->next) {
                struct commit *parent = p->item;
-               printf(" %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
+               fprintf(file, " %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
        }
 }
 
@@ -172,7 +172,7 @@ static void show_children(struct rev_info *opt, struct commit *commit, int abbre
 {
        struct commit_list *p = lookup_decoration(&opt->children, &commit->object);
        for ( ; p; p = p->next) {
-               printf(" %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
+               fprintf(opt->diffopt.file, " %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
        }
 }
 
@@ -263,8 +263,6 @@ void format_decorations_extended(struct strbuf *sb,
 
                        if (current_and_HEAD &&
                            decoration->type == DECORATION_REF_HEAD) {
-                               strbuf_addstr(sb, color_reset);
-                               strbuf_addstr(sb, color_commit);
                                strbuf_addstr(sb, " -> ");
                                strbuf_addstr(sb, color_reset);
                                strbuf_addstr(sb, decorate_get_color(use_color, current_and_HEAD->type));
@@ -286,11 +284,11 @@ void show_decorations(struct rev_info *opt, struct commit *commit)
        struct strbuf sb = STRBUF_INIT;
 
        if (opt->show_source && commit->util)
-               printf("\t%s", (char *) commit->util);
+               fprintf(opt->diffopt.file, "\t%s", (char *) commit->util);
        if (!opt->show_decorations)
                return;
        format_decorations(&sb, commit, opt->diffopt.use_color);
-       fputs(sb.buf, stdout);
+       fputs(sb.buf, opt->diffopt.file);
        strbuf_release(&sb);
 }
 
@@ -364,18 +362,18 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
                subject = "Subject: ";
        }
 
-       printf("From %s Mon Sep 17 00:00:00 2001\n", name);
+       fprintf(opt->diffopt.file, "From %s Mon Sep 17 00:00:00 2001\n", name);
        graph_show_oneline(opt->graph);
        if (opt->message_id) {
-               printf("Message-Id: <%s>\n", opt->message_id);
+               fprintf(opt->diffopt.file, "Message-Id: <%s>\n", opt->message_id);
                graph_show_oneline(opt->graph);
        }
        if (opt->ref_message_ids && opt->ref_message_ids->nr > 0) {
                int i, n;
                n = opt->ref_message_ids->nr;
-               printf("In-Reply-To: <%s>\n", opt->ref_message_ids->items[n-1].string);
+               fprintf(opt->diffopt.file, "In-Reply-To: <%s>\n", opt->ref_message_ids->items[n-1].string);
                for (i = 0; i < n; i++)
-                       printf("%s<%s>\n", (i > 0 ? "\t" : "References: "),
+                       fprintf(opt->diffopt.file, "%s<%s>\n", (i > 0 ? "\t" : "References: "),
                               opt->ref_message_ids->items[i].string);
                graph_show_oneline(opt->graph);
        }
@@ -432,7 +430,7 @@ static void show_sig_lines(struct rev_info *opt, int status, const char *bol)
        reset = diff_get_color_opt(&opt->diffopt, DIFF_RESET);
        while (*bol) {
                eol = strchrnul(bol, '\n');
-               printf("%s%.*s%s%s", color, (int)(eol - bol), bol, reset,
+               fprintf(opt->diffopt.file, "%s%.*s%s%s", color, (int)(eol - bol), bol, reset,
                       *eol ? "\n" : "");
                graph_show_oneline(opt->graph);
                bol = (*eol) ? (eol + 1) : eol;
@@ -553,17 +551,17 @@ void show_log(struct rev_info *opt)
 
                if (!opt->graph)
                        put_revision_mark(opt, commit);
-               fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit), stdout);
+               fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit), opt->diffopt.file);
                if (opt->print_parents)
-                       show_parents(commit, abbrev_commit);
+                       show_parents(commit, abbrev_commit, opt->diffopt.file);
                if (opt->children.name)
                        show_children(opt, commit, abbrev_commit);
                show_decorations(opt, commit);
                if (opt->graph && !graph_is_commit_finished(opt->graph)) {
-                       putchar('\n');
+                       putc('\n', opt->diffopt.file);
                        graph_show_remainder(opt->graph);
                }
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
                return;
        }
 
@@ -589,7 +587,7 @@ void show_log(struct rev_info *opt)
                if (opt->diffopt.line_termination == '\n' &&
                    !opt->missing_newline)
                        graph_show_padding(opt->graph);
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
        }
        opt->shown_one = 1;
 
@@ -603,32 +601,32 @@ void show_log(struct rev_info *opt)
         * Print header line of header..
         */
 
-       if (opt->commit_format == CMIT_FMT_EMAIL) {
+       if (cmit_fmt_is_mail(opt->commit_format)) {
                log_write_email_headers(opt, commit, &ctx.subject, &extra_headers,
                                        &ctx.need_8bit_cte);
        } else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
-               fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout);
+               fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), opt->diffopt.file);
                if (opt->commit_format != CMIT_FMT_ONELINE)
-                       fputs("commit ", stdout);
+                       fputs("commit ", opt->diffopt.file);
 
                if (!opt->graph)
                        put_revision_mark(opt, commit);
                fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit),
-                     stdout);
+                     opt->diffopt.file);
                if (opt->print_parents)
-                       show_parents(commit, abbrev_commit);
+                       show_parents(commit, abbrev_commit, opt->diffopt.file);
                if (opt->children.name)
                        show_children(opt, commit, abbrev_commit);
                if (parent)
-                       printf(" (from %s)",
+                       fprintf(opt->diffopt.file, " (from %s)",
                               find_unique_abbrev(parent->object.oid.hash,
                                                  abbrev_commit));
-               fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), stdout);
+               fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), opt->diffopt.file);
                show_decorations(opt, commit);
                if (opt->commit_format == CMIT_FMT_ONELINE) {
-                       putchar(' ');
+                       putc(' ', opt->diffopt.file);
                } else {
-                       putchar('\n');
+                       putc('\n', opt->diffopt.file);
                        graph_show_oneline(opt->graph);
                }
                if (opt->reflog_info) {
@@ -683,9 +681,12 @@ void show_log(struct rev_info *opt)
        ctx.fmt = opt->commit_format;
        ctx.mailmap = opt->mailmap;
        ctx.color = opt->diffopt.use_color;
+       ctx.expand_tabs_in_log = opt->expand_tabs_in_log;
        ctx.output_encoding = get_log_output_encoding();
        if (opt->from_ident.mail_begin && opt->from_ident.name_begin)
                ctx.from_ident = &opt->from_ident;
+       if (opt->graph)
+               ctx.graph_width = graph_width(opt->graph);
        pretty_print_commit(&ctx, commit, &msgbuf);
 
        if (opt->add_signoff)
@@ -693,7 +694,7 @@ void show_log(struct rev_info *opt)
 
        if ((ctx.fmt != CMIT_FMT_USERFORMAT) &&
            ctx.notes_message && *ctx.notes_message) {
-               if (ctx.fmt == CMIT_FMT_EMAIL) {
+               if (cmit_fmt_is_mail(ctx.fmt)) {
                        strbuf_addstr(&msgbuf, "---\n");
                        opt->shown_dashes = 1;
                }
@@ -701,7 +702,7 @@ void show_log(struct rev_info *opt)
        }
 
        if (opt->show_log_size) {
-               printf("log size %i\n", (int)msgbuf.len);
+               fprintf(opt->diffopt.file, "log size %i\n", (int)msgbuf.len);
                graph_show_oneline(opt->graph);
        }
 
@@ -714,14 +715,11 @@ 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, stdout);
+       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);
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
        }
 
        strbuf_release(&msgbuf);
@@ -758,7 +756,7 @@ int log_tree_diff_flush(struct rev_info *opt)
                                struct strbuf *msg = NULL;
                                msg = opt->diffopt.output_prefix(&opt->diffopt,
                                        opt->diffopt.output_prefix_data);
-                               fwrite(msg->buf, msg->len, 1, stdout);
+                               fwrite(msg->buf, msg->len, 1, opt->diffopt.file);
                        }
 
                        /*
@@ -773,8 +771,8 @@ int log_tree_diff_flush(struct rev_info *opt)
                         */
                        if (!opt->shown_dashes &&
                            (pch & opt->diffopt.output_format) == pch)
-                               printf("---");
-                       putchar('\n');
+                               fprintf(opt->diffopt.file, "---");
+                       putc('\n', opt->diffopt.file);
                }
        }
        diff_flush(&opt->diffopt);
@@ -861,17 +859,18 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
 int log_tree_commit(struct rev_info *opt, struct commit *commit)
 {
        struct log_info log;
-       int shown;
+       int shown, close_file = opt->diffopt.close_file;
 
        log.commit = commit;
        log.parent = NULL;
        opt->loginfo = &log;
+       opt->diffopt.close_file = 0;
 
        if (opt->line_level_traverse)
                return line_log_print(opt, commit);
 
        if (opt->track_linear && !opt->linear && !opt->reverse_output_stage)
-               printf("\n%s\n", opt->break_bar);
+               fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
        shown = log_tree_diff(opt, commit, &log);
        if (!shown && opt->loginfo && opt->always_show_header) {
                log.parent = NULL;
@@ -879,8 +878,10 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
                shown = 1;
        }
        if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
-               printf("\n%s\n", opt->break_bar);
+               fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
        opt->loginfo = NULL;
-       maybe_flush_or_die(stdout, "stdout");
+       maybe_flush_or_die(opt->diffopt.file, "stdout");
+       if (close_file)
+               fclose(opt->diffopt.file);
        return shown;
 }
index 9f19ca10805a5f54a49b3a8fa2093f583bcea8c3..a489d9d0fbcc37a1198247a8daae4b3104ebe284 100644 (file)
@@ -54,6 +54,86 @@ static void parse_bogus_from(struct mailinfo *mi, const struct strbuf *line)
        get_sane_name(&mi->name, &mi->name, &mi->email);
 }
 
+static const char *unquote_comment(struct strbuf *outbuf, const char *in)
+{
+       int c;
+       int take_next_litterally = 0;
+
+       strbuf_addch(outbuf, '(');
+
+       while ((c = *in++) != 0) {
+               if (take_next_litterally == 1) {
+                       take_next_litterally = 0;
+               } else {
+                       switch (c) {
+                       case '\\':
+                               take_next_litterally = 1;
+                               continue;
+                       case '(':
+                               in = unquote_comment(outbuf, in);
+                               continue;
+                       case ')':
+                               strbuf_addch(outbuf, ')');
+                               return in;
+                       }
+               }
+
+               strbuf_addch(outbuf, c);
+       }
+
+       return in;
+}
+
+static const char *unquote_quoted_string(struct strbuf *outbuf, const char *in)
+{
+       int c;
+       int take_next_litterally = 0;
+
+       while ((c = *in++) != 0) {
+               if (take_next_litterally == 1) {
+                       take_next_litterally = 0;
+               } else {
+                       switch (c) {
+                       case '\\':
+                               take_next_litterally = 1;
+                               continue;
+                       case '"':
+                               return in;
+                       }
+               }
+
+               strbuf_addch(outbuf, c);
+       }
+
+       return in;
+}
+
+static void unquote_quoted_pair(struct strbuf *line)
+{
+       struct strbuf outbuf;
+       const char *in = line->buf;
+       int c;
+
+       strbuf_init(&outbuf, line->len);
+
+       while ((c = *in++) != 0) {
+               switch (c) {
+               case '"':
+                       in = unquote_quoted_string(&outbuf, in);
+                       continue;
+               case '(':
+                       in = unquote_comment(&outbuf, in);
+                       continue;
+               }
+
+               strbuf_addch(&outbuf, c);
+       }
+
+       strbuf_swap(&outbuf, line);
+       strbuf_release(&outbuf);
+
+}
+
 static void handle_from(struct mailinfo *mi, const struct strbuf *from)
 {
        char *at;
@@ -63,6 +143,8 @@ static void handle_from(struct mailinfo *mi, const struct strbuf *from)
        strbuf_init(&f, from->len);
        strbuf_addbuf(&f, from);
 
+       unquote_quoted_pair(&f);
+
        at = strchr(f.buf, '@');
        if (!at) {
                parse_bogus_from(mi, from);
@@ -179,12 +261,6 @@ static void handle_content_type(struct mailinfo *mi, struct strbuf *line)
        }
 }
 
-static void handle_message_id(struct mailinfo *mi, const struct strbuf *line)
-{
-       if (mi->add_message_id)
-               mi->message_id = strdup(line->buf);
-}
-
 static void handle_content_transfer_encoding(struct mailinfo *mi,
                                             const struct strbuf *line)
 {
@@ -495,31 +571,32 @@ static int check_header(struct mailinfo *mi,
                len = strlen("Message-Id: ");
                strbuf_add(&sb, line->buf + len, line->len - len);
                decode_header(mi, &sb);
-               handle_message_id(mi, &sb);
+               if (mi->add_message_id)
+                       mi->message_id = strbuf_detach(&sb, NULL);
                ret = 1;
                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;
@@ -577,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;
@@ -622,12 +697,61 @@ 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);
@@ -638,7 +762,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
        }
 
        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
@@ -651,7 +775,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);
@@ -891,6 +1015,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);
 }
@@ -1006,6 +1132,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;
@@ -1019,6 +1146,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 f4a0f1cf27bf0a10626cc5b1fd628e12cbda3a7e..c1a79c100c9a71083a58401081fb2929420ce361 100644 (file)
--- a/mailmap.c
+++ b/mailmap.c
@@ -103,10 +103,8 @@ static void add_mapping(struct string_list *map,
        } else {
                struct mailmap_info *mi = xcalloc(1, sizeof(struct mailmap_info));
                debug_mm("mailmap: adding (complex) entry for '%s'\n", old_email);
-               if (new_name)
-                       mi->name = xstrdup(new_name);
-               if (new_email)
-                       mi->email = xstrdup(new_email);
+               mi->name = xstrdup_or_null(new_name);
+               mi->email = xstrdup_or_null(new_email);
                string_list_insert(&me->namemap, old_name)->util = mi;
        }
 
@@ -189,8 +187,7 @@ static int read_mailmap_file(struct string_list *map, const char *filename,
        if (!f) {
                if (errno == ENOENT)
                        return 0;
-               return error("unable to open mailmap at %s: %s",
-                            filename, strerror(errno));
+               return error_errno("unable to open mailmap at %s", filename);
        }
 
        while (fgets(buffer, sizeof(buffer), f) != NULL)
@@ -250,7 +247,8 @@ int read_mailmap(struct string_list *map, char **repo_abbrev)
                git_mailmap_blob = "HEAD:.mailmap";
 
        err |= read_mailmap_file(map, ".mailmap", repo_abbrev);
-       err |= read_mailmap_blob(map, git_mailmap_blob, repo_abbrev);
+       if (startup_info->have_repository)
+               err |= read_mailmap_blob(map, git_mailmap_blob, repo_abbrev);
        err |= read_mailmap_file(map, git_mailmap_file, repo_abbrev);
        return err;
 }
index 1ce0954a3e5915a6bcc30448c9d99fdaba32bcab..396b7338df2c53009900fbd3df36dd06a7219493 100644 (file)
@@ -48,17 +48,17 @@ static int score_matches(unsigned mode1, unsigned mode2, const char *path)
 }
 
 static void *fill_tree_desc_strict(struct tree_desc *desc,
-                                  const unsigned char *hash)
+                                  const struct object_id *hash)
 {
        void *buffer;
        enum object_type type;
        unsigned long size;
 
-       buffer = read_sha1_file(hash, &type, &size);
+       buffer = read_sha1_file(hash->hash, &type, &size);
        if (!buffer)
-               die("unable to read tree (%s)", sha1_to_hex(hash));
+               die("unable to read tree (%s)", oid_to_hex(hash));
        if (type != OBJ_TREE)
-               die("%s is not a tree", sha1_to_hex(hash));
+               die("%s is not a tree", oid_to_hex(hash));
        init_tree_desc(desc, buffer, size);
        return buffer;
 }
@@ -73,7 +73,7 @@ static int base_name_entries_compare(const struct name_entry *a,
 /*
  * Inspect two trees, and give a score that tells how similar they are.
  */
-static int score_trees(const unsigned char *hash1, const unsigned char *hash2)
+static int score_trees(const struct object_id *hash1, const struct object_id *hash2)
 {
        struct tree_desc one;
        struct tree_desc two;
@@ -104,7 +104,7 @@ static int score_trees(const unsigned char *hash1, const unsigned char *hash2)
                else if (cmp > 0)
                        /* path2 does not appear in one */
                        score += score_missing(e2.mode, e2.path);
-               else if (hashcmp(e1.sha1, e2.sha1))
+               else if (oidcmp(e1.oid, e2.oid))
                        /* they are different */
                        score += score_differs(e1.mode, e2.mode, e1.path);
                else
@@ -119,8 +119,8 @@ static int score_trees(const unsigned char *hash1, const unsigned char *hash2)
 /*
  * Match one itself and its subtrees with two and pick the best match.
  */
-static void match_trees(const unsigned char *hash1,
-                       const unsigned char *hash2,
+static void match_trees(const struct object_id *hash1,
+                       const struct object_id *hash2,
                        int *best_score,
                        char **best_match,
                        const char *base,
@@ -131,7 +131,7 @@ static void match_trees(const unsigned char *hash1,
 
        while (one.size) {
                const char *path;
-               const unsigned char *elem;
+               const struct object_id *elem;
                unsigned mode;
                int score;
 
@@ -191,15 +191,15 @@ static int splice_tree(const unsigned char *hash1,
        while (desc.size) {
                const char *name;
                unsigned mode;
-               const unsigned char *sha1;
+               const struct object_id *oid;
 
-               sha1 = tree_entry_extract(&desc, &name, &mode);
+               oid = tree_entry_extract(&desc, &name, &mode);
                if (strlen(name) == toplen &&
                    !memcmp(name, prefix, toplen)) {
                        if (!S_ISDIR(mode))
                                die("entry %s in tree %s is not a tree",
                                    name, sha1_to_hex(hash1));
-                       rewrite_here = (unsigned char *) sha1;
+                       rewrite_here = (unsigned char *) oid->hash;
                        break;
                }
                update_tree_entry(&desc);
@@ -229,9 +229,9 @@ static int splice_tree(const unsigned char *hash1,
  * other hand, it could cover tree one and we might need to pick a
  * subtree of it.
  */
-void shift_tree(const unsigned char *hash1,
-               const unsigned char *hash2,
-               unsigned char *shifted,
+void shift_tree(const struct object_id *hash1,
+               const struct object_id *hash2,
+               struct object_id *shifted,
                int depth_limit)
 {
        char *add_prefix;
@@ -262,7 +262,7 @@ void shift_tree(const unsigned char *hash1,
        match_trees(hash2, hash1, &del_score, &del_prefix, "", depth_limit);
 
        /* Assume we do not have to do any shifting */
-       hashcpy(shifted, hash2);
+       oidcpy(shifted, hash2);
 
        if (add_score < del_score) {
                /* We need to pick a subtree of two */
@@ -271,16 +271,16 @@ void shift_tree(const unsigned char *hash1,
                if (!*del_prefix)
                        return;
 
-               if (get_tree_entry(hash2, del_prefix, shifted, &mode))
+               if (get_tree_entry(hash2->hash, del_prefix, shifted->hash, &mode))
                        die("cannot find path %s in tree %s",
-                           del_prefix, sha1_to_hex(hash2));
+                           del_prefix, oid_to_hex(hash2));
                return;
        }
 
        if (!*add_prefix)
                return;
 
-       splice_tree(hash1, add_prefix, hash2, shifted);
+       splice_tree(hash1->hash, add_prefix, hash2->hash, shifted->hash);
 }
 
 /*
@@ -288,22 +288,22 @@ void shift_tree(const unsigned char *hash1,
  * Unfortunately we cannot fundamentally tell which one to
  * be prefixed, as recursive merge can work in either direction.
  */
-void shift_tree_by(const unsigned char *hash1,
-                  const unsigned char *hash2,
-                  unsigned char *shifted,
+void shift_tree_by(const struct object_id *hash1,
+                  const struct object_id *hash2,
+                  struct object_id *shifted,
                   const char *shift_prefix)
 {
-       unsigned char sub1[20], sub2[20];
+       struct object_id sub1, sub2;
        unsigned mode1, mode2;
        unsigned candidate = 0;
 
        /* Can hash2 be a tree at shift_prefix in tree hash1? */
-       if (!get_tree_entry(hash1, shift_prefix, sub1, &mode1) &&
+       if (!get_tree_entry(hash1->hash, shift_prefix, sub1.hash, &mode1) &&
            S_ISDIR(mode1))
                candidate |= 1;
 
        /* Can hash1 be a tree at shift_prefix in tree hash2? */
-       if (!get_tree_entry(hash2, shift_prefix, sub2, &mode2) &&
+       if (!get_tree_entry(hash2->hash, shift_prefix, sub2.hash, &mode2) &&
            S_ISDIR(mode2))
                candidate |= 2;
 
@@ -313,19 +313,19 @@ void shift_tree_by(const unsigned char *hash1,
                int score;
 
                candidate = 0;
-               score = score_trees(sub1, hash2);
+               score = score_trees(&sub1, hash2);
                if (score > best_score) {
                        candidate = 1;
                        best_score = score;
                }
-               score = score_trees(sub2, hash1);
+               score = score_trees(&sub2, hash1);
                if (score > best_score)
                        candidate = 2;
        }
 
        if (!candidate) {
                /* Neither is plausible -- do not shift */
-               hashcpy(shifted, hash2);
+               oidcpy(shifted, hash2);
                return;
        }
 
@@ -334,11 +334,11 @@ void shift_tree_by(const unsigned char *hash1,
                 * shift tree2 down by adding shift_prefix above it
                 * to match tree1.
                 */
-               splice_tree(hash1, shift_prefix, hash2, shifted);
+               splice_tree(hash1->hash, shift_prefix, hash2->hash, shifted->hash);
        else
                /*
                 * shift tree2 up by removing shift_prefix from it
                 * to match tree1.
                 */
-               hashcpy(shifted, sub2);
+               oidcpy(shifted, &sub2);
 }
index b880ae50e7ee4f8e88bda83618529ea30462e4ef..23d6992f4037b37a9c3e133001af16595e8da394 100644 (file)
 #include "dir.h"
 #include "submodule.h"
 
+static void flush_output(struct merge_options *o)
+{
+       if (o->buffer_output < 2 && o->obuf.len) {
+               fputs(o->obuf.buf, stdout);
+               strbuf_reset(&o->obuf);
+       }
+}
+
+static int err(struct merge_options *o, const char *err, ...)
+{
+       va_list params;
+
+       if (o->buffer_output < 2)
+               flush_output(o);
+       else {
+               strbuf_complete(&o->obuf, '\n');
+               strbuf_addstr(&o->obuf, "error: ");
+       }
+       va_start(params, err);
+       strbuf_vaddf(&o->obuf, err, params);
+       va_end(params);
+       if (o->buffer_output > 1)
+               strbuf_addch(&o->obuf, '\n');
+       else {
+               error("%s", o->obuf.buf);
+               strbuf_reset(&o->obuf);
+       }
+
+       return -1;
+}
+
 static struct tree *shift_tree_object(struct tree *one, struct tree *two,
                                      const char *subtree_shift)
 {
        struct object_id shifted;
 
        if (!*subtree_shift) {
-               shift_tree(one->object.oid.hash, two->object.oid.hash, shifted.hash, 0);
+               shift_tree(&one->object.oid, &two->object.oid, &shifted, 0);
        } else {
-               shift_tree_by(one->object.oid.hash, two->object.oid.hash, shifted.hash,
+               shift_tree_by(&one->object.oid, &two->object.oid, &shifted,
                              subtree_shift);
        }
        if (!oidcmp(&two->object.oid, &shifted))
@@ -42,12 +73,9 @@ static struct tree *shift_tree_object(struct tree *one, struct tree *two,
 static struct commit *make_virtual_commit(struct tree *tree, const char *comment)
 {
        struct commit *commit = alloc_commit_node();
-       struct merge_remote_desc *desc = xmalloc(sizeof(*desc));
 
-       desc->name = comment;
-       desc->obj = (struct object *)commit;
+       set_merge_remote_desc(commit, comment, (struct object *)commit);
        commit->tree = tree;
-       commit->util = desc;
        commit->object.parsed = 1;
        return commit;
 }
@@ -56,11 +84,11 @@ static struct commit *make_virtual_commit(struct tree *tree, const char *comment
  * Since we use get_tree_entry(), which does not put the read object into
  * the object pool, we cannot rely on a == b.
  */
-static int sha_eq(const unsigned char *a, const unsigned char *b)
+static int oid_eq(const struct object_id *a, const struct object_id *b)
 {
        if (!a && !b)
                return 2;
-       return a && b && hashcmp(a, b) == 0;
+       return a && b && oidcmp(a, b) == 0;
 }
 
 enum rename_type {
@@ -90,7 +118,7 @@ struct rename_conflict_info {
 struct stage_data {
        struct {
                unsigned mode;
-               unsigned char sha[20];
+               struct object_id oid;
        } stages[4];
        struct rename_conflict_info *rename_conflict_info;
        unsigned processed:1;
@@ -134,11 +162,11 @@ static inline void setup_rename_conflict_info(enum rename_type rename_type,
                int ostage2 = ostage1 ^ 1;
 
                ci->ren1_other.path = pair1->one->path;
-               hashcpy(ci->ren1_other.sha1, src_entry1->stages[ostage1].sha);
+               oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid);
                ci->ren1_other.mode = src_entry1->stages[ostage1].mode;
 
                ci->ren2_other.path = pair2->one->path;
-               hashcpy(ci->ren2_other.sha1, src_entry2->stages[ostage2].sha);
+               oidcpy(&ci->ren2_other.oid, &src_entry2->stages[ostage2].oid);
                ci->ren2_other.mode = src_entry2->stages[ostage2].mode;
        }
 }
@@ -148,14 +176,6 @@ static int show(struct merge_options *o, int v)
        return (!o->call_depth && o->verbosity >= v) || o->verbosity >= 5;
 }
 
-static void flush_output(struct merge_options *o)
-{
-       if (o->obuf.len) {
-               fputs(o->obuf.buf, stdout);
-               strbuf_reset(&o->obuf);
-       }
-}
-
 __attribute__((format (printf, 3, 4)))
 static void output(struct merge_options *o, int v, const char *fmt, ...)
 {
@@ -177,37 +197,50 @@ static void output(struct merge_options *o, int v, const char *fmt, ...)
 
 static void output_commit_title(struct merge_options *o, struct commit *commit)
 {
-       int i;
-       flush_output(o);
-       for (i = o->call_depth; i--;)
-               fputs("  ", stdout);
+       strbuf_addchars(&o->obuf, ' ', o->call_depth * 2);
        if (commit->util)
-               printf("virtual %s\n", merge_remote_util(commit)->name);
+               strbuf_addf(&o->obuf, "virtual %s\n",
+                       merge_remote_util(commit)->name);
        else {
-               printf("%s ", find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV));
+               strbuf_add_unique_abbrev(&o->obuf, commit->object.oid.hash,
+                                        DEFAULT_ABBREV);
+               strbuf_addch(&o->obuf, ' ');
                if (parse_commit(commit) != 0)
-                       printf(_("(bad commit)\n"));
+                       strbuf_addstr(&o->obuf, _("(bad commit)\n"));
                else {
                        const char *title;
                        const char *msg = get_commit_buffer(commit, NULL);
                        int len = find_commit_subject(msg, &title);
                        if (len)
-                               printf("%.*s\n", len, title);
+                               strbuf_addf(&o->obuf, "%.*s\n", len, title);
                        unuse_commit_buffer(commit, msg);
                }
        }
+       flush_output(o);
 }
 
-static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
+static int add_cacheinfo(struct merge_options *o,
+               unsigned int mode, const struct object_id *oid,
                const char *path, int stage, int refresh, int options)
 {
        struct cache_entry *ce;
-       ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage,
-                             (refresh ? (CE_MATCH_REFRESH |
-                                         CE_MATCH_IGNORE_MISSING) : 0 ));
+       int ret;
+
+       ce = make_cache_entry(mode, oid ? oid->hash : null_sha1, path, stage, 0);
        if (!ce)
-               return error(_("addinfo_cache failed for path '%s'"), path);
-       return add_cache_entry(ce, options);
+               return err(o, _("addinfo_cache failed for path '%s'"), path);
+
+       ret = add_cache_entry(ce, options);
+       if (refresh) {
+               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);
+       }
+       return ret;
 }
 
 static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
@@ -259,15 +292,17 @@ struct tree *write_tree_from_memory(struct merge_options *o)
                                fprintf(stderr, "BUG: %d %.*s\n", ce_stage(ce),
                                        (int)ce_namelen(ce), ce->name);
                }
-               die("Bug in merge-recursive.c");
+               die("BUG: unmerged index entries in merge-recursive.c");
        }
 
        if (!active_cache_tree)
                active_cache_tree = cache_tree();
 
        if (!cache_tree_fully_valid(active_cache_tree) &&
-           cache_tree_update(&the_index, 0) < 0)
-               die(_("error building trees"));
+           cache_tree_update(&the_index, 0) < 0) {
+               err(o, _("error building trees"));
+               return NULL;
+       }
 
        result = lookup_tree(active_cache_tree->sha1);
 
@@ -314,11 +349,11 @@ static struct stage_data *insert_stage_data(const char *path,
        struct string_list_item *item;
        struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
        get_tree_entry(o->object.oid.hash, path,
-                       e->stages[1].sha, &e->stages[1].mode);
+                       e->stages[1].oid.hash, &e->stages[1].mode);
        get_tree_entry(a->object.oid.hash, path,
-                       e->stages[2].sha, &e->stages[2].mode);
+                       e->stages[2].oid.hash, &e->stages[2].mode);
        get_tree_entry(b->object.oid.hash, path,
-                       e->stages[3].sha, &e->stages[3].mode);
+                       e->stages[3].oid.hash, &e->stages[3].mode);
        item = string_list_insert(entries, path);
        item->util = e;
        return e;
@@ -349,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)].sha, 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
@@ -373,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'.
@@ -400,7 +433,7 @@ static void record_df_conflict_files(struct merge_options *o,
         * and the file need to be present, then the D/F file will be
         * reinstated with a new unique name at the time it is processed.
         */
-       struct string_list df_sorted_entries;
+       struct string_list df_sorted_entries = STRING_LIST_INIT_NODUP;
        const char *last_file = NULL;
        int last_len = 0;
        int i;
@@ -413,14 +446,13 @@ static void record_df_conflict_files(struct merge_options *o,
                return;
 
        /* Ensure D/F conflicts are adjacent in the entries list. */
-       memset(&df_sorted_entries, 0, sizeof(struct string_list));
        for (i = 0; i < entries->nr; i++) {
                struct string_list_item *next = &entries->items[i];
                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++) {
@@ -533,7 +565,8 @@ static struct string_list *get_renames(struct merge_options *o,
        return renames;
 }
 
-static int update_stages(const char *path, const struct diff_filespec *o,
+static int update_stages(struct merge_options *opt, const char *path,
+                        const struct diff_filespec *o,
                         const struct diff_filespec *a,
                         const struct diff_filespec *b)
 {
@@ -552,13 +585,13 @@ static int update_stages(const char *path, const struct diff_filespec *o,
                if (remove_file_from_cache(path))
                        return -1;
        if (o)
-               if (add_cacheinfo(o->mode, o->sha1, path, 1, 0, options))
+               if (add_cacheinfo(opt, o->mode, &o->oid, path, 1, 0, options))
                        return -1;
        if (a)
-               if (add_cacheinfo(a->mode, a->sha1, path, 2, 0, options))
+               if (add_cacheinfo(opt, a->mode, &a->oid, path, 2, 0, options))
                        return -1;
        if (b)
-               if (add_cacheinfo(b->mode, b->sha1, path, 3, 0, options))
+               if (add_cacheinfo(opt, b->mode, &b->oid, path, 3, 0, options))
                        return -1;
        return 0;
 }
@@ -572,9 +605,9 @@ static void update_entry(struct stage_data *entry,
        entry->stages[1].mode = o->mode;
        entry->stages[2].mode = a->mode;
        entry->stages[3].mode = b->mode;
-       hashcpy(entry->stages[1].sha, o->sha1);
-       hashcpy(entry->stages[2].sha, a->sha1);
-       hashcpy(entry->stages[3].sha, b->sha1);
+       oidcpy(&entry->stages[1].oid, &o->oid);
+       oidcpy(&entry->stages[2].oid, &a->oid);
+       oidcpy(&entry->stages[3].oid, &b->oid);
 }
 
 static int remove_file(struct merge_options *o, int clean,
@@ -622,7 +655,7 @@ static char *unique_path(struct merge_options *o, const char *path, const char *
        base_len = newpath.len;
        while (string_list_has_string(&o->current_file_set, newpath.buf) ||
               string_list_has_string(&o->current_directory_set, newpath.buf) ||
-              file_exists(newpath.buf)) {
+              (!o->call_depth && file_exists(newpath.buf))) {
                strbuf_setlen(&newpath, base_len);
                strbuf_addf(&newpath, "_%d", suffix++);
        }
@@ -631,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;
@@ -651,30 +690,29 @@ 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)
 {
        int pos = cache_name_pos(path, strlen(path));
 
-       if (pos < 0)
-               pos = -1 - pos;
-       while (pos < active_nr &&
-              !strcmp(path, active_cache[pos]->name)) {
-               /*
-                * If stage #0, it is definitely tracked.
-                * If it has stage #2 then it was tracked
-                * before this merge started.  All other
-                * cases the path was not tracked.
-                */
-               switch (ce_stage(active_cache[pos])) {
-               case 0:
-               case 2:
+       if (0 <= pos)
+               /* we have been tracking this path */
+               return 1;
+
+       /*
+        * Look for an unmerged entry for the path,
+        * specifically stage #2, which would indicate
+        * that "our" side before the merge started
+        * had the path tracked (and resulted in a conflict).
+        */
+       for (pos = -1 - pos;
+            pos < active_nr && !strcmp(path, active_cache[pos]->name);
+            pos++)
+               if (ce_stage(active_cache[pos]) == 2)
                        return 1;
-               }
-               pos++;
-       }
        return 0;
 }
 
@@ -709,12 +747,10 @@ static int make_room_for_path(struct merge_options *o, const char *path)
        /* Make sure leading directories are created */
        status = safe_create_leading_directories_const(path);
        if (status) {
-               if (status == SCLD_EXISTS) {
+               if (status == SCLD_EXISTS)
                        /* something else exists */
-                       error(msg, path, _(": perhaps a D/F conflict?"));
-                       return -1;
-               }
-               die(msg, path, "");
+                       return err(o, msg, path, _(": perhaps a D/F conflict?"));
+               return err(o, msg, path, "");
        }
 
        /*
@@ -722,7 +758,7 @@ static int make_room_for_path(struct merge_options *o, const char *path)
         * tracking it.
         */
        if (would_lose_untracked(path))
-               return error(_("refusing to lose untracked file at '%s'"),
+               return err(o, _("refusing to lose untracked file at '%s'"),
                             path);
 
        /* Successful unlink is good.. */
@@ -732,16 +768,18 @@ static int make_room_for_path(struct merge_options *o, const char *path)
        if (errno == ENOENT)
                return 0;
        /* .. but not some other error (who really cares what?) */
-       return error(msg, path, _(": perhaps a D/F conflict?"));
+       return err(o, msg, path, _(": perhaps a D/F conflict?"));
 }
 
-static void update_file_flags(struct merge_options *o,
-                             const unsigned char *sha,
-                             unsigned mode,
-                             const char *path,
-                             int update_cache,
-                             int update_wd)
+static int update_file_flags(struct merge_options *o,
+                            const struct object_id *oid,
+                            unsigned mode,
+                            const char *path,
+                            int update_cache,
+                            int update_wd)
 {
+       int ret = 0;
+
        if (o->call_depth)
                update_wd = 0;
 
@@ -760,11 +798,13 @@ static void update_file_flags(struct merge_options *o,
                        goto update_index;
                }
 
-               buf = read_sha1_file(sha, &type, &size);
+               buf = read_sha1_file(oid->hash, &type, &size);
                if (!buf)
-                       die(_("cannot read object %s '%s'"), sha1_to_hex(sha), path);
-               if (type != OBJ_BLOB)
-                       die(_("blob expected for %s '%s'"), sha1_to_hex(sha), path);
+                       return err(o, _("cannot read object %s '%s'"), oid_to_hex(oid), path);
+               if (type != OBJ_BLOB) {
+                       ret = err(o, _("blob expected for %s '%s'"), oid_to_hex(oid), path);
+                       goto free_buf;
+               }
                if (S_ISREG(mode)) {
                        struct strbuf strbuf = STRBUF_INIT;
                        if (convert_to_working_tree(path, buf, size, &strbuf)) {
@@ -776,8 +816,7 @@ static void update_file_flags(struct merge_options *o,
 
                if (make_room_for_path(o, path) < 0) {
                        update_wd = 0;
-                       free(buf);
-                       goto update_index;
+                       goto free_buf;
                }
                if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
                        int fd;
@@ -786,8 +825,11 @@ static void update_file_flags(struct merge_options *o,
                        else
                                mode = 0666;
                        fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
-                       if (fd < 0)
-                               die_errno(_("failed to open '%s'"), path);
+                       if (fd < 0) {
+                               ret = err(o, _("failed to open '%s': %s"),
+                                         path, strerror(errno));
+                               goto free_buf;
+                       }
                        write_in_full(fd, buf, size);
                        close(fd);
                } else if (S_ISLNK(mode)) {
@@ -795,31 +837,35 @@ static void update_file_flags(struct merge_options *o,
                        safe_create_leading_directories_const(path);
                        unlink(path);
                        if (symlink(lnk, path))
-                               die_errno(_("failed to symlink '%s'"), path);
+                               ret = err(o, _("failed to symlink '%s': %s"),
+                                       path, strerror(errno));
                        free(lnk);
                } else
-                       die(_("do not know what to do with %06o %s '%s'"),
-                           mode, sha1_to_hex(sha), path);
+                       ret = err(o,
+                                 _("do not know what to do with %06o %s '%s'"),
+                                 mode, oid_to_hex(oid), path);
+ free_buf:
                free(buf);
        }
  update_index:
-       if (update_cache)
-               add_cacheinfo(mode, sha, path, 0, update_wd, ADD_CACHE_OK_TO_ADD);
+       if (!ret && update_cache)
+               add_cacheinfo(o, mode, oid, path, 0, update_wd, ADD_CACHE_OK_TO_ADD);
+       return ret;
 }
 
-static void update_file(struct merge_options *o,
-                       int clean,
-                       const unsigned char *sha,
-                       unsigned mode,
-                       const char *path)
+static int update_file(struct merge_options *o,
+                      int clean,
+                      const struct object_id *oid,
+                      unsigned mode,
+                      const char *path)
 {
-       update_file_flags(o, sha, mode, path, o->call_depth || clean, !o->call_depth);
+       return update_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth);
 }
 
 /* Low level file merging, update and removal */
 
 struct merge_file_info {
-       unsigned char sha[20];
+       struct object_id oid;
        unsigned mode;
        unsigned clean:1,
                 merge:1;
@@ -871,9 +917,9 @@ static int merge_3way(struct merge_options *o,
                name2 = mkpathdup("%s", branch2);
        }
 
-       read_mmblob(&orig, one->sha1);
-       read_mmblob(&src1, a->sha1);
-       read_mmblob(&src2, b->sha1);
+       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);
@@ -887,138 +933,144 @@ static int merge_3way(struct merge_options *o,
        return merge_status;
 }
 
-static struct merge_file_info merge_file_1(struct merge_options *o,
+static int merge_file_1(struct merge_options *o,
                                           const struct diff_filespec *one,
                                           const struct diff_filespec *a,
                                           const struct diff_filespec *b,
                                           const char *branch1,
-                                          const char *branch2)
+                                          const char *branch2,
+                                          struct merge_file_info *result)
 {
-       struct merge_file_info result;
-       result.merge = 0;
-       result.clean = 1;
+       result->merge = 0;
+       result->clean = 1;
 
        if ((S_IFMT & a->mode) != (S_IFMT & b->mode)) {
-               result.clean = 0;
+               result->clean = 0;
                if (S_ISREG(a->mode)) {
-                       result.mode = a->mode;
-                       hashcpy(result.sha, a->sha1);
+                       result->mode = a->mode;
+                       oidcpy(&result->oid, &a->oid);
                } else {
-                       result.mode = b->mode;
-                       hashcpy(result.sha, b->sha1);
+                       result->mode = b->mode;
+                       oidcpy(&result->oid, &b->oid);
                }
        } else {
-               if (!sha_eq(a->sha1, one->sha1) && !sha_eq(b->sha1, one->sha1))
-                       result.merge = 1;
+               if (!oid_eq(&a->oid, &one->oid) && !oid_eq(&b->oid, &one->oid))
+                       result->merge = 1;
 
                /*
                 * Merge modes
                 */
                if (a->mode == b->mode || a->mode == one->mode)
-                       result.mode = b->mode;
+                       result->mode = b->mode;
                else {
-                       result.mode = a->mode;
+                       result->mode = a->mode;
                        if (b->mode != one->mode) {
-                               result.clean = 0;
-                               result.merge = 1;
+                               result->clean = 0;
+                               result->merge = 1;
                        }
                }
 
-               if (sha_eq(a->sha1, b->sha1) || sha_eq(a->sha1, one->sha1))
-                       hashcpy(result.sha, b->sha1);
-               else if (sha_eq(b->sha1, one->sha1))
-                       hashcpy(result.sha, a->sha1);
+               if (oid_eq(&a->oid, &b->oid) || oid_eq(&a->oid, &one->oid))
+                       oidcpy(&result->oid, &b->oid);
+               else if (oid_eq(&b->oid, &one->oid))
+                       oidcpy(&result->oid, &a->oid);
                else if (S_ISREG(a->mode)) {
                        mmbuffer_t result_buf;
-                       int merge_status;
+                       int ret = 0, merge_status;
 
                        merge_status = merge_3way(o, &result_buf, one, a, b,
                                                  branch1, branch2);
 
                        if ((merge_status < 0) || !result_buf.ptr)
-                               die(_("Failed to execute internal merge"));
+                               ret = err(o, _("Failed to execute internal merge"));
 
-                       if (write_sha1_file(result_buf.ptr, result_buf.size,
-                                           blob_type, result.sha))
-                               die(_("Unable to add %s to database"),
-                                   a->path);
+                       if (!ret && write_sha1_file(result_buf.ptr, result_buf.size,
+                                                   blob_type, result->oid.hash))
+                               ret = err(o, _("Unable to add %s to database"),
+                                         a->path);
 
                        free(result_buf.ptr);
-                       result.clean = (merge_status == 0);
+                       if (ret)
+                               return ret;
+                       result->clean = (merge_status == 0);
                } else if (S_ISGITLINK(a->mode)) {
-                       result.clean = merge_submodule(result.sha,
-                                                      one->path, one->sha1,
-                                                      a->sha1, b->sha1,
+                       result->clean = merge_submodule(result->oid.hash,
+                                                      one->path,
+                                                      one->oid.hash,
+                                                      a->oid.hash,
+                                                      b->oid.hash,
                                                       !o->call_depth);
                } else if (S_ISLNK(a->mode)) {
-                       hashcpy(result.sha, a->sha1);
+                       oidcpy(&result->oid, &a->oid);
 
-                       if (!sha_eq(a->sha1, b->sha1))
-                               result.clean = 0;
-               } else {
-                       die(_("unsupported object type in the tree"));
-               }
+                       if (!oid_eq(&a->oid, &b->oid))
+                               result->clean = 0;
+               } else
+                       die("BUG: unsupported object type in the tree");
        }
 
-       return result;
+       return 0;
 }
 
-static struct merge_file_info
-merge_file_special_markers(struct merge_options *o,
+static int merge_file_special_markers(struct merge_options *o,
                           const struct diff_filespec *one,
                           const struct diff_filespec *a,
                           const struct diff_filespec *b,
                           const char *branch1,
                           const char *filename1,
                           const char *branch2,
-                          const char *filename2)
+                          const char *filename2,
+                          struct merge_file_info *mfi)
 {
        char *side1 = NULL;
        char *side2 = NULL;
-       struct merge_file_info mfi;
+       int ret;
 
        if (filename1)
                side1 = xstrfmt("%s:%s", branch1, filename1);
        if (filename2)
                side2 = xstrfmt("%s:%s", branch2, filename2);
 
-       mfi = merge_file_1(o, one, a, b,
-                          side1 ? side1 : branch1, side2 ? side2 : branch2);
+       ret = merge_file_1(o, one, a, b,
+                          side1 ? side1 : branch1,
+                          side2 ? side2 : branch2, mfi);
        free(side1);
        free(side2);
-       return mfi;
+       return ret;
 }
 
-static struct merge_file_info merge_file_one(struct merge_options *o,
+static int merge_file_one(struct merge_options *o,
                                         const char *path,
-                                        const unsigned char *o_sha, int o_mode,
-                                        const unsigned char *a_sha, int a_mode,
-                                        const unsigned char *b_sha, int b_mode,
+                                        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 char *branch1,
-                                        const char *branch2)
+                                        const char *branch2,
+                                        struct merge_file_info *mfi)
 {
        struct diff_filespec one, a, b;
 
        one.path = a.path = b.path = (char *)path;
-       hashcpy(one.sha1, o_sha);
+       oidcpy(&one.oid, o_oid);
        one.mode = o_mode;
-       hashcpy(a.sha1, a_sha);
+       oidcpy(&a.oid, a_oid);
        a.mode = a_mode;
-       hashcpy(b.sha1, b_sha);
+       oidcpy(&b.oid, b_oid);
        b.mode = b_mode;
-       return merge_file_1(o, &one, &a, &b, branch1, branch2);
+       return merge_file_1(o, &one, &a, &b, branch1, branch2, mfi);
 }
 
-static void handle_change_delete(struct merge_options *o,
+static int handle_change_delete(struct merge_options *o,
                                 const char *path,
-                                const unsigned char *o_sha, int o_mode,
-                                const unsigned char *a_sha, int a_mode,
-                                const unsigned char *b_sha, int b_mode,
+                                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 char *change, const char *change_past)
 {
        char *renamed = NULL;
-       if (dir_in_way(path, !o->call_depth)) {
-               renamed = unique_path(o, path, a_sha ? o->branch1 : o->branch2);
+       int ret = 0;
+       if (dir_in_way(path, !o->call_depth, 0)) {
+               renamed = unique_path(o, path, a_oid ? o->branch1 : o->branch2);
        }
 
        if (o->call_depth) {
@@ -1027,21 +1079,23 @@ static void handle_change_delete(struct merge_options *o,
                 * correct; since there is no true "middle point" between
                 * them, simply reuse the base version for virtual merge base.
                 */
-               remove_file_from_cache(path);
-               update_file(o, 0, o_sha, o_mode, renamed ? renamed : path);
-       } else if (!a_sha) {
+               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);
-                       update_file(o, 0, b_sha, b_mode, 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);
-                       update_file(o, 0, b_sha, b_mode, renamed);
+                       ret = update_file(o, 0, b_oid, b_mode, renamed);
                }
        } else {
                if (!renamed) {
@@ -1054,7 +1108,7 @@ static void handle_change_delete(struct merge_options *o,
                               "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);
-                       update_file(o, 0, a_sha, a_mode, renamed);
+                       ret = update_file(o, 0, a_oid, a_mode, renamed);
                }
                /*
                 * No need to call update_file() on path when !renamed, since
@@ -1064,59 +1118,60 @@ static void handle_change_delete(struct merge_options *o,
                 */
        }
        free(renamed);
+
+       return ret;
 }
 
-static void conflict_rename_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 struct diff_filespec *orig = pair->one;
        const struct diff_filespec *dest = pair->two;
-       const unsigned char *a_sha = NULL;
-       const unsigned char *b_sha = NULL;
+       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_sha = dest->sha1;
+               a_oid = &dest->oid;
                a_mode = dest->mode;
        } else {
-               b_sha = dest->sha1;
+               b_oid = &dest->oid;
                b_mode = dest->mode;
        }
 
-       handle_change_delete(o,
-                            o->call_depth ? orig->path : dest->path,
-                            orig->sha1, orig->mode,
-                            a_sha, a_mode,
-                            b_sha, b_mode,
-                            _("rename"), _("renamed"));
-
-       if (o->call_depth) {
-               remove_file_from_cache(dest->path);
-       } else {
-               update_stages(dest->path, NULL,
-                             rename_branch == o->branch1 ? dest : NULL,
-                             rename_branch == o->branch1 ? NULL : dest);
-       }
+       if (handle_change_delete(o,
+                                o->call_depth ? orig->path : dest->path,
+                                &orig->oid, orig->mode,
+                                a_oid, a_mode,
+                                b_oid, b_mode,
+                                _("rename"), _("renamed")))
+               return -1;
 
+       if (o->call_depth)
+               return remove_file_from_cache(dest->path);
+       else
+               return update_stages(o, dest->path, NULL,
+                                    rename_branch == o->branch1 ? dest : NULL,
+                                    rename_branch == o->branch1 ? NULL : dest);
 }
 
 static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,
                                                 struct stage_data *entry,
                                                 int stage)
 {
-       unsigned char *sha = entry->stages[stage].sha;
+       struct object_id *oid = &entry->stages[stage].oid;
        unsigned mode = entry->stages[stage].mode;
-       if (mode == 0 || is_null_sha1(sha))
+       if (mode == 0 || is_null_oid(oid))
                return NULL;
-       hashcpy(target->sha1, sha);
+       oidcpy(&target->oid, oid);
        target->mode = mode;
        return target;
 }
 
-static void handle_file(struct merge_options *o,
+static int handle_file(struct merge_options *o,
                        struct diff_filespec *rename,
                        int stage,
                        struct rename_conflict_info *ci)
@@ -1126,6 +1181,7 @@ static void handle_file(struct merge_options *o,
        const char *cur_branch, *other_branch;
        struct diff_filespec other;
        struct diff_filespec *add;
+       int ret;
 
        if (stage == 2) {
                dst_entry = ci->dst_entry1;
@@ -1140,28 +1196,32 @@ static void handle_file(struct merge_options *o,
        add = filespec_from_entry(&other, dst_entry, stage ^ 1);
        if (add) {
                char *add_name = unique_path(o, rename->path, other_branch);
-               update_file(o, 0, add->sha1, add->mode, add_name);
+               if (update_file(o, 0, &add->oid, add->mode, add_name))
+                       return -1;
 
                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);
                }
        }
-       update_file(o, 0, rename->sha1, rename->mode, dst_name);
-       if (stage == 2)
-               update_stages(rename->path, NULL, rename, add);
+       if ((ret = update_file(o, 0, &rename->oid, rename->mode, dst_name)))
+               ; /* fall through, do allow dst_name to be released */
+       else if (stage == 2)
+               ret = update_stages(o, rename->path, NULL, rename, add);
        else
-               update_stages(rename->path, NULL, add, rename);
+               ret = update_stages(o, rename->path, NULL, add, rename);
 
        if (dst_name != rename->path)
                free(dst_name);
+
+       return ret;
 }
 
-static void conflict_rename_rename_1to2(struct merge_options *o,
+static int conflict_rename_rename_1to2(struct merge_options *o,
                                        struct rename_conflict_info *ci)
 {
        /* One file was renamed in both branches, but to different names. */
@@ -1179,18 +1239,21 @@ static void conflict_rename_rename_1to2(struct merge_options *o,
                struct merge_file_info mfi;
                struct diff_filespec other;
                struct diff_filespec *add;
-               mfi = merge_file_one(o, one->path,
-                                one->sha1, one->mode,
-                                a->sha1, a->mode,
-                                b->sha1, b->mode,
-                                ci->branch1, ci->branch2);
+               if (merge_file_one(o, one->path,
+                                &one->oid, one->mode,
+                                &a->oid, a->mode,
+                                &b->oid, b->mode,
+                                ci->branch1, ci->branch2, &mfi))
+                       return -1;
+
                /*
                 * FIXME: For rename/add-source conflicts (if we could detect
                 * such), this is wrong.  We should instead find a unique
                 * pathname and then either rename the add-source file to that
                 * unique path, or use that unique path instead of src here.
                 */
-               update_file(o, 0, mfi.sha, mfi.mode, one->path);
+               if (update_file(o, 0, &mfi.oid, mfi.mode, one->path))
+                       return -1;
 
                /*
                 * Above, we put the merged content at the merge-base's
@@ -1201,22 +1264,26 @@ static void conflict_rename_rename_1to2(struct merge_options *o,
                 * resolving the conflict at that path in its favor.
                 */
                add = filespec_from_entry(&other, ci->dst_entry1, 2 ^ 1);
-               if (add)
-                       update_file(o, 0, add->sha1, add->mode, a->path);
+               if (add) {
+                       if (update_file(o, 0, &add->oid, add->mode, a->path))
+                               return -1;
+               }
                else
                        remove_file_from_cache(a->path);
                add = filespec_from_entry(&other, ci->dst_entry2, 3 ^ 1);
-               if (add)
-                       update_file(o, 0, add->sha1, add->mode, b->path);
+               if (add) {
+                       if (update_file(o, 0, &add->oid, add->mode, b->path))
+                               return -1;
+               }
                else
                        remove_file_from_cache(b->path);
-       } else {
-               handle_file(o, a, 2, ci);
-               handle_file(o, b, 3, ci);
-       }
+       } else if (handle_file(o, a, 2, ci) || handle_file(o, b, 3, ci))
+               return -1;
+
+       return 0;
 }
 
-static void conflict_rename_rename_2to1(struct merge_options *o,
+static int conflict_rename_rename_2to1(struct merge_options *o,
                                        struct rename_conflict_info *ci)
 {
        /* Two files, a & b, were renamed to the same thing, c. */
@@ -1227,6 +1294,7 @@ static void conflict_rename_rename_2to1(struct merge_options *o,
        char *path = c1->path; /* == c2->path */
        struct merge_file_info mfi_c1;
        struct merge_file_info mfi_c2;
+       int ret;
 
        output(o, 1, _("CONFLICT (rename/rename): "
               "Rename %s->%s in %s. "
@@ -1234,15 +1302,16 @@ static void conflict_rename_rename_2to1(struct merge_options *o,
               a->path, c1->path, ci->branch1,
               b->path, c2->path, ci->branch2);
 
-       remove_file(o, 1, a->path, would_lose_untracked(a->path));
-       remove_file(o, 1, b->path, would_lose_untracked(b->path));
+       remove_file(o, 1, a->path, o->call_depth || would_lose_untracked(a->path));
+       remove_file(o, 1, b->path, o->call_depth || would_lose_untracked(b->path));
 
-       mfi_c1 = merge_file_special_markers(o, a, c1, &ci->ren1_other,
-                                           o->branch1, c1->path,
-                                           o->branch2, ci->ren1_other.path);
-       mfi_c2 = merge_file_special_markers(o, b, &ci->ren2_other, c2,
-                                           o->branch1, ci->ren2_other.path,
-                                           o->branch2, c2->path);
+       if (merge_file_special_markers(o, a, c1, &ci->ren1_other,
+                                      o->branch1, c1->path,
+                                      o->branch2, ci->ren1_other.path, &mfi_c1) ||
+           merge_file_special_markers(o, b, &ci->ren2_other, c2,
+                                      o->branch1, ci->ren2_other.path,
+                                      o->branch2, c2->path, &mfi_c2))
+               return -1;
 
        if (o->call_depth) {
                /*
@@ -1253,19 +1322,25 @@ static void conflict_rename_rename_2to1(struct merge_options *o,
                 * again later for the non-recursive merge.
                 */
                remove_file(o, 0, path, 0);
-               update_file(o, 0, mfi_c1.sha, mfi_c1.mode, a->path);
-               update_file(o, 0, mfi_c2.sha, mfi_c2.mode, b->path);
+               ret = update_file(o, 0, &mfi_c1.oid, mfi_c1.mode, a->path);
+               if (!ret)
+                       ret = update_file(o, 0, &mfi_c2.oid, mfi_c2.mode,
+                                         b->path);
        } else {
                char *new_path1 = unique_path(o, path, ci->branch1);
                char *new_path2 = unique_path(o, path, ci->branch2);
                output(o, 1, _("Renaming %s to %s and %s to %s instead"),
                       a->path, new_path1, b->path, new_path2);
                remove_file(o, 0, path, 0);
-               update_file(o, 0, mfi_c1.sha, mfi_c1.mode, new_path1);
-               update_file(o, 0, mfi_c2.sha, mfi_c2.mode, new_path2);
+               ret = update_file(o, 0, &mfi_c1.oid, mfi_c1.mode, new_path1);
+               if (!ret)
+                       ret = update_file(o, 0, &mfi_c2.oid, mfi_c2.mode,
+                                         new_path2);
                free(new_path2);
                free(new_path1);
        }
+
+       return ret;
 }
 
 static int process_renames(struct merge_options *o,
@@ -1343,7 +1418,7 @@ static int process_renames(struct merge_options *o,
                        const char *ren2_dst = ren2->pair->two->path;
                        enum rename_type rename_type;
                        if (strcmp(ren1_src, ren2_src) != 0)
-                               die("ren1_src != ren2_src");
+                               die("BUG: ren1_src != ren2_src");
                        ren2->dst_entry->processed = 1;
                        ren2->processed = 1;
                        if (strcmp(ren1_dst, ren2_dst) != 0) {
@@ -1377,7 +1452,7 @@ static int process_renames(struct merge_options *o,
                        ren2 = lookup->util;
                        ren2_dst = ren2->pair->two->path;
                        if (strcmp(ren1_dst, ren2_dst) != 0)
-                               die("ren1_dst != ren2_dst");
+                               die("BUG: ren1_dst != ren2_dst");
 
                        clean_merge = 0;
                        ren2->processed = 1;
@@ -1421,13 +1496,15 @@ static int process_renames(struct merge_options *o,
                        remove_file(o, 1, ren1_src,
                                    renamed_stage == 2 || !was_tracked(ren1_src));
 
-                       hashcpy(src_other.sha1, ren1->src_entry->stages[other_stage].sha);
+                       oidcpy(&src_other.oid,
+                              &ren1->src_entry->stages[other_stage].oid);
                        src_other.mode = ren1->src_entry->stages[other_stage].mode;
-                       hashcpy(dst_other.sha1, ren1->dst_entry->stages[other_stage].sha);
+                       oidcpy(&dst_other.oid,
+                              &ren1->dst_entry->stages[other_stage].oid);
                        dst_other.mode = ren1->dst_entry->stages[other_stage].mode;
                        try_merge = 0;
 
-                       if (sha_eq(src_other.sha1, null_sha1)) {
+                       if (oid_eq(&src_other.oid, &null_oid)) {
                                setup_rename_conflict_info(RENAME_DELETE,
                                                           ren1->pair,
                                                           NULL,
@@ -1439,7 +1516,7 @@ static int process_renames(struct merge_options *o,
                                                           NULL,
                                                           NULL);
                        } else if ((dst_other.mode == ren1->pair->two->mode) &&
-                                  sha_eq(dst_other.sha1, ren1->pair->two->sha1)) {
+                                  oid_eq(&dst_other.oid, &ren1->pair->two->oid)) {
                                /*
                                 * Added file on the other side identical to
                                 * the file being renamed: clean merge.
@@ -1448,13 +1525,14 @@ static int process_renames(struct merge_options *o,
                                 * update_file_flags() instead of
                                 * update_file().
                                 */
-                               update_file_flags(o,
-                                                 ren1->pair->two->sha1,
-                                                 ren1->pair->two->mode,
-                                                 ren1_dst,
-                                                 1, /* update_cache */
-                                                 0  /* update_wd    */);
-                       } else if (!sha_eq(dst_other.sha1, null_sha1)) {
+                               if (update_file_flags(o,
+                                                     &ren1->pair->two->oid,
+                                                     ren1->pair->two->mode,
+                                                     ren1_dst,
+                                                     1, /* update_cache */
+                                                     0  /* update_wd    */))
+                                       clean_merge = -1;
+                       } else if (!oid_eq(&dst_other.oid, &null_oid)) {
                                clean_merge = 0;
                                try_merge = 1;
                                output(o, 1, _("CONFLICT (rename/add): Rename %s->%s in %s. "
@@ -1463,22 +1541,33 @@ static int process_renames(struct merge_options *o,
                                       ren1_dst, branch2);
                                if (o->call_depth) {
                                        struct merge_file_info mfi;
-                                       mfi = merge_file_one(o, ren1_dst, null_sha1, 0,
-                                                        ren1->pair->two->sha1, ren1->pair->two->mode,
-                                                        dst_other.sha1, dst_other.mode,
-                                                        branch1, branch2);
+                                       if (merge_file_one(o, ren1_dst, &null_oid, 0,
+                                                          &ren1->pair->two->oid,
+                                                          ren1->pair->two->mode,
+                                                          &dst_other.oid,
+                                                          dst_other.mode,
+                                                          branch1, branch2, &mfi)) {
+                                               clean_merge = -1;
+                                               goto cleanup_and_return;
+                                       }
                                        output(o, 1, _("Adding merged %s"), ren1_dst);
-                                       update_file(o, 0, mfi.sha, mfi.mode, ren1_dst);
+                                       if (update_file(o, 0, &mfi.oid,
+                                                       mfi.mode, ren1_dst))
+                                               clean_merge = -1;
                                        try_merge = 0;
                                } else {
                                        char *new_path = unique_path(o, ren1_dst, branch2);
                                        output(o, 1, _("Adding as %s instead"), new_path);
-                                       update_file(o, 0, dst_other.sha1, dst_other.mode, new_path);
+                                       if (update_file(o, 0, &dst_other.oid,
+                                                       dst_other.mode, new_path))
+                                               clean_merge = -1;
                                        free(new_path);
                                }
                        } else
                                try_merge = 1;
 
+                       if (clean_merge < 0)
+                               goto cleanup_and_return;
                        if (try_merge) {
                                struct diff_filespec *one, *a, *b;
                                src_other.path = (char *)ren1_src;
@@ -1505,36 +1594,39 @@ static int process_renames(struct merge_options *o,
                        }
                }
        }
+cleanup_and_return:
        string_list_clear(&a_by_dst, 0);
        string_list_clear(&b_by_dst, 0);
 
        return clean_merge;
 }
 
-static unsigned char *stage_sha(const unsigned char *sha, unsigned mode)
+static struct object_id *stage_oid(const struct object_id *oid, unsigned mode)
 {
-       return (is_null_sha1(sha) || mode == 0) ? NULL: (unsigned char *)sha;
+       return (is_null_oid(oid) || mode == 0) ? NULL: (struct object_id *)oid;
 }
 
-static int read_sha1_strbuf(const unsigned char *sha1, struct strbuf *dst)
+static int read_oid_strbuf(struct merge_options *o,
+       const struct object_id *oid, struct strbuf *dst)
 {
        void *buf;
        enum object_type type;
        unsigned long size;
-       buf = read_sha1_file(sha1, &type, &size);
+       buf = read_sha1_file(oid->hash, &type, &size);
        if (!buf)
-               return error(_("cannot read object %s"), sha1_to_hex(sha1));
+               return err(o, _("cannot read object %s"), oid_to_hex(oid));
        if (type != OBJ_BLOB) {
                free(buf);
-               return error(_("object %s is not a blob"), sha1_to_hex(sha1));
+               return err(o, _("object %s is not a blob"), oid_to_hex(oid));
        }
        strbuf_attach(dst, buf, size, size + 1);
        return 0;
 }
 
-static int blob_unchanged(const unsigned char *o_sha,
+static int blob_unchanged(struct merge_options *opt,
+                         const struct object_id *o_oid,
                          unsigned o_mode,
-                         const unsigned char *a_sha,
+                         const struct object_id *a_oid,
                          unsigned a_mode,
                          int renormalize, const char *path)
 {
@@ -1544,13 +1636,13 @@ static int blob_unchanged(const unsigned char *o_sha,
 
        if (a_mode != o_mode)
                return 0;
-       if (sha_eq(o_sha, a_sha))
+       if (oid_eq(o_oid, a_oid))
                return 1;
        if (!renormalize)
                return 0;
 
-       assert(o_sha && a_sha);
-       if (read_sha1_strbuf(o_sha, &o) || read_sha1_strbuf(a_sha, &a))
+       assert(o_oid && a_oid);
+       if (read_oid_strbuf(opt, o_oid, &o) || read_oid_strbuf(opt, a_oid, &a))
                goto error_return;
        /*
         * Note: binary | is used so that both renormalizations are
@@ -1567,25 +1659,25 @@ error_return:
        return ret;
 }
 
-static void handle_modify_delete(struct merge_options *o,
+static int handle_modify_delete(struct merge_options *o,
                                 const char *path,
-                                unsigned char *o_sha, int o_mode,
-                                unsigned char *a_sha, int a_mode,
-                                unsigned char *b_sha, int b_mode)
+                                struct object_id *o_oid, int o_mode,
+                                struct object_id *a_oid, int a_mode,
+                                struct object_id *b_oid, int b_mode)
 {
-       handle_change_delete(o,
-                            path,
-                            o_sha, o_mode,
-                            a_sha, a_mode,
-                            b_sha, b_mode,
-                            _("modify"), _("modified"));
+       return handle_change_delete(o,
+                                   path,
+                                   o_oid, o_mode,
+                                   a_oid, a_mode,
+                                   b_oid, b_mode,
+                                   _("modify"), _("modified"));
 }
 
 static int merge_content(struct merge_options *o,
                         const char *path,
-                        unsigned char *o_sha, int o_mode,
-                        unsigned char *a_sha, int a_mode,
-                        unsigned char *b_sha, int b_mode,
+                        struct object_id *o_oid, int o_mode,
+                        struct object_id *a_oid, int a_mode,
+                        struct object_id *b_oid, int b_mode,
                         struct rename_conflict_info *rename_conflict_info)
 {
        const char *reason = _("content");
@@ -1594,16 +1686,16 @@ static int merge_content(struct merge_options *o,
        struct diff_filespec one, a, b;
        unsigned df_conflict_remains = 0;
 
-       if (!o_sha) {
+       if (!o_oid) {
                reason = _("add/add");
-               o_sha = (unsigned char *)null_sha1;
+               o_oid = (struct object_id *)&null_oid;
        }
        one.path = a.path = b.path = (char *)path;
-       hashcpy(one.sha1, o_sha);
+       oidcpy(&one.oid, o_oid);
        one.mode = o_mode;
-       hashcpy(a.sha1, a_sha);
+       oidcpy(&a.oid, a_oid);
        a.mode = a_mode;
-       hashcpy(b.sha1, b_sha);
+       oidcpy(&b.oid, b_oid);
        b.mode = b_mode;
 
        if (rename_conflict_info) {
@@ -1619,15 +1711,17 @@ 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;
        }
-       mfi = merge_file_special_markers(o, &one, &a, &b,
-                                        o->branch1, path1,
-                                        o->branch2, path2);
+       if (merge_file_special_markers(o, &one, &a, &b,
+                                      o->branch1, path1,
+                                      o->branch2, path2, &mfi))
+               return -1;
 
        if (mfi.clean && !df_conflict_remains &&
-           sha_eq(mfi.sha, a_sha) && mfi.mode == a_mode) {
+           oid_eq(&mfi.oid, a_oid) && mfi.mode == a_mode) {
                int path_renamed_outside_HEAD;
                output(o, 3, _("Skipped %s (merged same as existing)"), path);
                /*
@@ -1638,7 +1732,7 @@ static int merge_content(struct merge_options *o,
                 */
                path_renamed_outside_HEAD = !path2 || !strcmp(path, path2);
                if (!path_renamed_outside_HEAD) {
-                       add_cacheinfo(mfi.mode, mfi.sha, path,
+                       add_cacheinfo(o, mfi.mode, &mfi.oid, path,
                                      0, (!o->call_depth), 0);
                        return mfi.clean;
                }
@@ -1651,7 +1745,8 @@ static int merge_content(struct merge_options *o,
                output(o, 1, _("CONFLICT (%s): Merge conflict in %s"),
                                reason, path);
                if (rename_conflict_info && !df_conflict_remains)
-                       update_stages(path, &one, &a, &b);
+                       if (update_stages(o, path, &one, &a, &b))
+                               return -1;
        }
 
        if (df_conflict_remains) {
@@ -1659,30 +1754,33 @@ static int merge_content(struct merge_options *o,
                if (o->call_depth) {
                        remove_file_from_cache(path);
                } else {
-                       if (!mfi.clean)
-                               update_stages(path, &one, &a, &b);
-                       else {
+                       if (!mfi.clean) {
+                               if (update_stages(o, path, &one, &a, &b))
+                                       return -1;
+                       } else {
                                int file_from_stage2 = was_tracked(path);
                                struct diff_filespec merged;
-                               hashcpy(merged.sha1, mfi.sha);
+                               oidcpy(&merged.oid, &mfi.oid);
                                merged.mode = mfi.mode;
 
-                               update_stages(path, NULL,
-                                             file_from_stage2 ? &merged : NULL,
-                                             file_from_stage2 ? NULL : &merged);
+                               if (update_stages(o, path, NULL,
+                                                 file_from_stage2 ? &merged : NULL,
+                                                 file_from_stage2 ? NULL : &merged))
+                                       return -1;
                        }
 
                }
                new_path = unique_path(o, path, rename_conflict_info->branch1);
                output(o, 1, _("Adding as %s instead"), new_path);
-               update_file(o, 0, mfi.sha, mfi.mode, new_path);
+               if (update_file(o, 0, &mfi.oid, mfi.mode, new_path)) {
+                       free(new_path);
+                       return -1;
+               }
                free(new_path);
                mfi.clean = 0;
-       } else {
-               update_file(o, mfi.clean, mfi.sha, mfi.mode, path);
-       }
+       } else if (update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))
+               return -1;
        return mfi.clean;
-
 }
 
 /* Per entry merge function */
@@ -1694,9 +1792,9 @@ static int process_entry(struct merge_options *o,
        unsigned o_mode = entry->stages[1].mode;
        unsigned a_mode = entry->stages[2].mode;
        unsigned b_mode = entry->stages[3].mode;
-       unsigned char *o_sha = stage_sha(entry->stages[1].sha, o_mode);
-       unsigned char *a_sha = stage_sha(entry->stages[2].sha, a_mode);
-       unsigned char *b_sha = stage_sha(entry->stages[3].sha, b_mode);
+       struct object_id *o_oid = stage_oid(&entry->stages[1].oid, o_mode);
+       struct object_id *a_oid = stage_oid(&entry->stages[2].oid, a_mode);
+       struct object_id *b_oid = stage_oid(&entry->stages[3].oid, b_mode);
 
        entry->processed = 1;
        if (entry->rename_conflict_info) {
@@ -1705,99 +1803,105 @@ static int process_entry(struct merge_options *o,
                case RENAME_NORMAL:
                case RENAME_ONE_FILE_TO_ONE:
                        clean_merge = merge_content(o, path,
-                                                   o_sha, o_mode, a_sha, a_mode, b_sha, b_mode,
+                                                   o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,
                                                    conflict_info);
                        break;
                case RENAME_DELETE:
                        clean_merge = 0;
-                       conflict_rename_delete(o, conflict_info->pair1,
-                                              conflict_info->branch1,
-                                              conflict_info->branch2);
+                       if (conflict_rename_delete(o,
+                                                  conflict_info->pair1,
+                                                  conflict_info->branch1,
+                                                  conflict_info->branch2))
+                               clean_merge = -1;
                        break;
                case RENAME_ONE_FILE_TO_TWO:
                        clean_merge = 0;
-                       conflict_rename_rename_1to2(o, conflict_info);
+                       if (conflict_rename_rename_1to2(o, conflict_info))
+                               clean_merge = -1;
                        break;
                case RENAME_TWO_FILES_TO_ONE:
                        clean_merge = 0;
-                       conflict_rename_rename_2to1(o, conflict_info);
+                       if (conflict_rename_rename_2to1(o, conflict_info))
+                               clean_merge = -1;
                        break;
                default:
                        entry->processed = 0;
                        break;
                }
-       } else if (o_sha && (!a_sha || !b_sha)) {
+       } else if (o_oid && (!a_oid || !b_oid)) {
                /* Case A: Deleted in one */
-               if ((!a_sha && !b_sha) ||
-                   (!b_sha && blob_unchanged(o_sha, o_mode, a_sha, a_mode, normalize, path)) ||
-                   (!a_sha && blob_unchanged(o_sha, o_mode, b_sha, b_mode, normalize, path))) {
+               if ((!a_oid && !b_oid) ||
+                   (!b_oid && blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||
+                   (!a_oid && blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {
                        /* Deleted in both or deleted in one and
                         * unchanged in the other */
-                       if (a_sha)
+                       if (a_oid)
                                output(o, 2, _("Removing %s"), path);
                        /* do not touch working file if it did not exist */
-                       remove_file(o, 1, path, !a_sha);
+                       remove_file(o, 1, path, !a_oid);
                } else {
                        /* Modify/delete; deleted side may have put a directory in the way */
                        clean_merge = 0;
-                       handle_modify_delete(o, path, o_sha, o_mode,
-                                            a_sha, a_mode, b_sha, b_mode);
+                       if (handle_modify_delete(o, path, o_oid, o_mode,
+                                                a_oid, a_mode, b_oid, b_mode))
+                               clean_merge = -1;
                }
-       } else if ((!o_sha && a_sha && !b_sha) ||
-                  (!o_sha && !a_sha && b_sha)) {
+       } else if ((!o_oid && a_oid && !b_oid) ||
+                  (!o_oid && !a_oid && b_oid)) {
                /* Case B: Added in one. */
                /* [nothing|directory] -> ([nothing|directory], file) */
 
                const char *add_branch;
                const char *other_branch;
                unsigned mode;
-               const unsigned char *sha;
+               const struct object_id *oid;
                const char *conf;
 
-               if (a_sha) {
+               if (a_oid) {
                        add_branch = o->branch1;
                        other_branch = o->branch2;
                        mode = a_mode;
-                       sha = a_sha;
+                       oid = a_oid;
                        conf = _("file/directory");
                } else {
                        add_branch = o->branch2;
                        other_branch = o->branch1;
                        mode = b_mode;
-                       sha = b_sha;
+                       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. "
                               "Adding %s as %s"),
                               conf, path, other_branch, path, new_path);
-                       if (o->call_depth)
-                               remove_file_from_cache(path);
-                       update_file(o, 0, sha, mode, new_path);
-                       if (o->call_depth)
+                       if (update_file(o, 0, oid, mode, new_path))
+                               clean_merge = -1;
+                       else if (o->call_depth)
                                remove_file_from_cache(path);
                        free(new_path);
                } else {
                        output(o, 2, _("Adding %s"), path);
                        /* do not overwrite file if already present */
-                       update_file_flags(o, sha, mode, path, 1, !a_sha);
+                       if (update_file_flags(o, oid, mode, path, 1, !a_oid))
+                               clean_merge = -1;
                }
-       } else if (a_sha && b_sha) {
+       } else if (a_oid && b_oid) {
                /* Case C: Added in both (check for same permissions) and */
                /* case D: Modified in both, but differently. */
                clean_merge = merge_content(o, path,
-                                           o_sha, o_mode, a_sha, a_mode, b_sha, b_mode,
+                                           o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,
                                            NULL);
-       } else if (!o_sha && !a_sha && !b_sha) {
+       } else if (!o_oid && !a_oid && !b_oid) {
                /*
                 * this entry was deleted altogether. a_mode == 0 means
                 * we had that path and want to actively remove it.
                 */
                remove_file(o, 1, path, !a_mode);
        } else
-               die(_("Fatal merge failure, shouldn't happen."));
+               die("BUG: fatal merge failure, shouldn't happen.");
 
        return clean_merge;
 }
@@ -1815,7 +1919,7 @@ int merge_trees(struct merge_options *o,
                common = shift_tree_object(head, common, o->subtree_shift);
        }
 
-       if (sha_eq(common->object.oid.hash, merge->object.oid.hash)) {
+       if (oid_eq(&common->object.oid, &merge->object.oid)) {
                output(o, 0, _("Already up-to-date!"));
                *result = head;
                return 1;
@@ -1825,11 +1929,10 @@ int merge_trees(struct merge_options *o,
 
        if (code != 0) {
                if (show(o, 4) || o->call_depth)
-                       die(_("merging of trees %s and %s failed"),
+                       err(o, _("merging of trees %s and %s failed"),
                            oid_to_hex(&head->object.oid),
                            oid_to_hex(&merge->object.oid));
-               else
-                       exit(128);
+               return -1;
        }
 
        if (unmerged_cache()) {
@@ -1845,17 +1948,23 @@ int merge_trees(struct merge_options *o,
                re_head  = get_renames(o, head, common, head, merge, entries);
                re_merge = get_renames(o, merge, common, head, merge, entries);
                clean = process_renames(o, re_head, re_merge);
+               if (clean < 0)
+                       return clean;
                for (i = entries->nr-1; 0 <= i; i--) {
                        const char *path = entries->items[i].string;
                        struct stage_data *e = entries->items[i].util;
-                       if (!e->processed
-                               && !process_entry(o, path, e))
-                               clean = 0;
+                       if (!e->processed) {
+                               int ret = process_entry(o, path, e);
+                               if (!ret)
+                                       clean = 0;
+                               else if (ret < 0)
+                                       return ret;
+                       }
                }
                for (i = 0; i < entries->nr; i++) {
                        struct stage_data *e = entries->items[i].util;
                        if (!e->processed)
-                               die(_("Unprocessed path??? %s"),
+                               die("BUG: unprocessed path??? %s",
                                    entries->items[i].string);
                }
 
@@ -1870,8 +1979,8 @@ int merge_trees(struct merge_options *o,
        else
                clean = 1;
 
-       if (o->call_depth)
-               *result = write_tree_from_memory(o);
+       if (o->call_depth && !(*result = write_tree_from_memory(o)))
+               return -1;
 
        return clean;
 }
@@ -1937,23 +2046,25 @@ int merge_recursive(struct merge_options *o,
                /*
                 * When the merge fails, the result contains files
                 * with conflict markers. The cleanness flag is
-                * ignored, it was never actually used, as result of
-                * merge_trees has always overwritten it: the committed
-                * "conflicts" were already resolved.
+                * ignored (unless indicating an error), it was never
+                * actually used, as result of merge_trees has always
+                * overwritten it: the committed "conflicts" were
+                * already resolved.
                 */
                discard_cache();
                saved_b1 = o->branch1;
                saved_b2 = o->branch2;
                o->branch1 = "Temporary merge branch 1";
                o->branch2 = "Temporary merge branch 2";
-               merge_recursive(o, merged_common_ancestors, iter->item,
-                               NULL, &merged_common_ancestors);
+               if (merge_recursive(o, merged_common_ancestors, iter->item,
+                                   NULL, &merged_common_ancestors) < 0)
+                       return -1;
                o->branch1 = saved_b1;
                o->branch2 = saved_b2;
                o->call_depth--;
 
                if (!merged_common_ancestors)
-                       die(_("merge returned no commit"));
+                       return err(o, _("merge returned no commit"));
        }
 
        discard_cache();
@@ -1963,6 +2074,10 @@ int merge_recursive(struct merge_options *o,
        o->ancestor = "merged common ancestors";
        clean = merge_trees(o, h1->tree, h2->tree, merged_common_ancestors->tree,
                            &mrtree);
+       if (clean < 0) {
+               flush_output(o);
+               return clean;
+       }
 
        if (o->call_depth) {
                *result = make_virtual_commit(mrtree, "merged tree");
@@ -1970,17 +2085,19 @@ int merge_recursive(struct merge_options *o,
                commit_list_insert(h2, &(*result)->parents->next);
        }
        flush_output(o);
+       if (!o->call_depth && o->buffer_output < 2)
+               strbuf_release(&o->obuf);
        if (show(o, 2))
                diff_warn_rename_limit("merge.renamelimit",
                                       o->needed_rename_limit, 0);
        return clean;
 }
 
-static struct commit *get_ref(const unsigned char *sha1, const char *name)
+static struct commit *get_ref(const struct object_id *oid, const char *name)
 {
        struct object *object;
 
-       object = deref_tag(parse_object(sha1), name, strlen(name));
+       object = deref_tag(parse_object(oid->hash), name, strlen(name));
        if (!object)
                return NULL;
        if (object->type == OBJ_TREE)
@@ -1993,10 +2110,10 @@ static struct commit *get_ref(const unsigned char *sha1, const char *name)
 }
 
 int merge_recursive_generic(struct merge_options *o,
-                           const unsigned char *head,
-                           const unsigned char *merge,
+                           const struct object_id *head,
+                           const struct object_id *merge,
                            int num_base_list,
-                           const unsigned char **base_list,
+                           const struct object_id **base_list,
                            struct commit **result)
 {
        int clean;
@@ -2009,9 +2126,9 @@ int merge_recursive_generic(struct merge_options *o,
                int i;
                for (i = 0; i < num_base_list; ++i) {
                        struct commit *base;
-                       if (!(base = get_ref(base_list[i], sha1_to_hex(base_list[i]))))
-                               return error(_("Could not parse object '%s'"),
-                                       sha1_to_hex(base_list[i]));
+                       if (!(base = get_ref(base_list[i], oid_to_hex(base_list[i]))))
+                               return err(o, _("Could not parse object '%s'"),
+                                       oid_to_hex(base_list[i]));
                        commit_list_insert(base, &ca);
                }
        }
@@ -2019,9 +2136,12 @@ int merge_recursive_generic(struct merge_options *o,
        hold_locked_index(lock, 1);
        clean = merge_recursive(o, head_commit, next_commit, ca,
                        result);
+       if (clean < 0)
+               return clean;
+
        if (active_cache_changed &&
            write_locked_index(&the_index, lock, COMMIT_LOCK))
-               return error(_("Unable to write index."));
+               return err(o, _("Unable to write index."));
 
        return clean ? 0 : 1;
 }
index 52f0201f68a30114345cbfcc8b3d6204174facfd..735343b4136d998ee3d2ac3672bdd7b5a5ba017e 100644 (file)
@@ -13,7 +13,7 @@ struct merge_options {
                MERGE_RECURSIVE_THEIRS
        } recursive_variant;
        const char *subtree_shift;
-       unsigned buffer_output : 1;
+       unsigned buffer_output; /* 1: output at end, 2: keep buffered */
        unsigned renormalize : 1;
        long xdl_opts;
        int verbosity;
@@ -49,10 +49,10 @@ int merge_trees(struct merge_options *o,
  * virtual commits and call merge_recursive() proper.
  */
 int merge_recursive_generic(struct merge_options *o,
-                           const unsigned char *head,
-                           const unsigned char *merge,
+                           const struct object_id *head,
+                           const struct object_id *merge,
                            int num_ca,
-                           const unsigned char **ca,
+                           const struct object_id **ca,
                            struct commit **result);
 
 void init_merge_options(struct merge_options *o);
diff --git a/merge.c b/merge.c
index 5db7d56b90c3413bbd831f90de73d3306e10ce2f..23866c91655638d9e1a7213478772b78aa9d7c69 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, 0) < 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
+}
diff --git a/mergetools/examdiff b/mergetools/examdiff
new file mode 100644 (file)
index 0000000..e72b06f
--- /dev/null
@@ -0,0 +1,16 @@
+diff_cmd () {
+       "$merge_tool_path" "$LOCAL" "$REMOTE" -nh
+}
+
+merge_cmd () {
+       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
+}
+
+translate_merge_tool_path() {
+       mergetool_find_win32_cmd "ExamDiff.com" "ExamDiff Pro"
+}
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..bc178e88827a1a0558e9fbee1a6f18f6ede83df1 100644 (file)
@@ -7,7 +7,7 @@ merge_cmd () {
        then
                check_meld_for_output_version
        fi
-       touch "$BACKUP"
+
        if test "$meld_has_output_option" = true
        then
                "$merge_tool_path" --output "$MERGED" \
@@ -15,7 +15,6 @@ merge_cmd () {
        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 74a66d4e8dae9529d14908aeb99e09d58f13724e..74d03259fdf157c9ee07eec7b2c40727f5ce49dc 100644 (file)
@@ -6,31 +6,10 @@ 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() {
-       # Use WinMergeU.exe if it exists in $PATH
-       if type -p WinMergeU.exe >/dev/null 2>&1
-       then
-               printf WinMergeU.exe
-               return
-       fi
-
-       # Look for WinMergeU.exe in the typical locations
-       winmerge_exe="WinMerge/WinMergeU.exe"
-       for directory in $(env | grep -Ei '^PROGRAM(FILES(\(X86\))?|W6432)=' |
-               cut -d '=' -f 2- | sort -u)
-       do
-               if test -n "$directory" && test -x "$directory/$winmerge_exe"
-               then
-                       printf '%s' "$directory/$winmerge_exe"
-                       return
-               fi
-       done
-
-       printf WinMergeU.exe
+       mergetool_find_win32_cmd "WinMergeU.exe" "WinMerge"
 }
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
 }
diff --git a/mru.c b/mru.c
new file mode 100644 (file)
index 0000000..9dedae0
--- /dev/null
+++ b/mru.c
@@ -0,0 +1,50 @@
+#include "cache.h"
+#include "mru.h"
+
+void mru_append(struct mru *mru, void *item)
+{
+       struct mru_entry *cur = xmalloc(sizeof(*cur));
+       cur->item = item;
+       cur->prev = mru->tail;
+       cur->next = NULL;
+
+       if (mru->tail)
+               mru->tail->next = cur;
+       else
+               mru->head = cur;
+       mru->tail = cur;
+}
+
+void mru_mark(struct mru *mru, struct mru_entry *entry)
+{
+       /* If we're already at the front of the list, nothing to do */
+       if (mru->head == entry)
+               return;
+
+       /* Otherwise, remove us from our current slot... */
+       if (entry->prev)
+               entry->prev->next = entry->next;
+       if (entry->next)
+               entry->next->prev = entry->prev;
+       else
+               mru->tail = entry->prev;
+
+       /* And insert us at the beginning. */
+       entry->prev = NULL;
+       entry->next = mru->head;
+       if (mru->head)
+               mru->head->prev = entry;
+       mru->head = entry;
+}
+
+void mru_clear(struct mru *mru)
+{
+       struct mru_entry *p = mru->head;
+
+       while (p) {
+               struct mru_entry *to_free = p;
+               p = p->next;
+               free(to_free);
+       }
+       mru->head = mru->tail = NULL;
+}
diff --git a/mru.h b/mru.h
new file mode 100644 (file)
index 0000000..42e4aea
--- /dev/null
+++ b/mru.h
@@ -0,0 +1,45 @@
+#ifndef MRU_H
+#define MRU_H
+
+/**
+ * A simple most-recently-used cache, backed by a doubly-linked list.
+ *
+ * Usage is roughly:
+ *
+ *   // Create a list.  Zero-initialization is required.
+ *   static struct mru cache;
+ *   mru_append(&cache, item);
+ *   ...
+ *
+ *   // Iterate in MRU order.
+ *   struct mru_entry *p;
+ *   for (p = cache.head; p; p = p->next) {
+ *     if (matches(p->item))
+ *             break;
+ *   }
+ *
+ *   // Mark an item as used, moving it to the front of the list.
+ *   mru_mark(&cache, p);
+ *
+ *   // Reset the list to empty, cleaning up all resources.
+ *   mru_clear(&cache);
+ *
+ * Note that you SHOULD NOT call mru_mark() and then continue traversing the
+ * list; it reorders the marked item to the front of the list, and therefore
+ * you will begin traversing the whole list again.
+ */
+
+struct mru_entry {
+       void *item;
+       struct mru_entry *prev, *next;
+};
+
+struct mru {
+       struct mru_entry *head, *tail;
+};
+
+void mru_append(struct mru *mru, void *item);
+void mru_mark(struct mru *mru, struct mru_entry *entry);
+void mru_clear(struct mru *mru);
+
+#endif /* MRU_H */
index 34bfac0c685f18c635b30dbf19d7b25250faa1c6..5998605acc64471193dc9d945610db8491f34bd8 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)
@@ -41,14 +41,14 @@ static int verify_notes_filepair(struct diff_filepair *p, unsigned char *sha1)
        switch (p->status) {
        case DIFF_STATUS_MODIFIED:
                assert(p->one->mode == p->two->mode);
-               assert(!is_null_sha1(p->one->sha1));
-               assert(!is_null_sha1(p->two->sha1));
+               assert(!is_null_oid(&p->one->oid));
+               assert(!is_null_oid(&p->two->oid));
                break;
        case DIFF_STATUS_ADDED:
-               assert(is_null_sha1(p->one->sha1));
+               assert(is_null_oid(&p->one->oid));
                break;
        case DIFF_STATUS_DELETED:
-               assert(is_null_sha1(p->two->sha1));
+               assert(is_null_oid(&p->two->oid));
                break;
        default:
                return -1;
@@ -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,
@@ -142,35 +143,35 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
                if (verify_notes_filepair(p, obj)) {
                        trace_printf("\t\tCannot merge entry '%s' (%c): "
                               "%.7s -> %.7s. Skipping!\n", p->one->path,
-                              p->status, sha1_to_hex(p->one->sha1),
-                              sha1_to_hex(p->two->sha1));
+                              p->status, oid_to_hex(&p->one->oid),
+                              oid_to_hex(&p->two->oid));
                        continue;
                }
                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));
-                       if (is_null_sha1(p->one->sha1)) { /* addition */
-                               assert(is_null_sha1(mp->remote));
-                               hashcpy(mp->remote, p->two->sha1);
-                       } else if (is_null_sha1(p->two->sha1)) { /* deletion */
-                               assert(is_null_sha1(mp->base));
-                               hashcpy(mp->base, p->one->sha1);
+                       assert(!hashcmp(mp->obj.hash, obj));
+                       if (is_null_oid(&p->one->oid)) { /* addition */
+                               assert(is_null_oid(&mp->remote));
+                               oidcpy(&mp->remote, &p->two->oid);
+                       } else if (is_null_oid(&p->two->oid)) { /* deletion */
+                               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->sha1);
-                       hashcpy(mp->local, uninitialized);
-                       hashcpy(mp->remote, p->two->sha1);
+                       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);
-       free_pathspec(&opt.pathspec);
+       clear_pathspec(&opt.pathspec);
 
        *num_changes = len;
        return changes;
@@ -203,21 +204,21 @@ static void diff_tree_local(struct notes_merge_options *o,
                if (verify_notes_filepair(p, obj)) {
                        trace_printf("\t\tCannot merge entry '%s' (%c): "
                               "%.7s -> %.7s. Skipping!\n", p->one->path,
-                              p->status, sha1_to_hex(p->one->sha1),
-                              sha1_to_hex(p->two->sha1));
+                              p->status, oid_to_hex(&p->one->oid),
+                              oid_to_hex(&p->two->oid));
                        continue;
                }
                mp = find_notes_merge_pair_pos(changes, len, obj, 0, &match);
                if (!match) {
                        trace_printf("\t\tIgnoring local-only change for %s: "
                               "%.7s -> %.7s\n", sha1_to_hex(obj),
-                              sha1_to_hex(p->one->sha1),
-                              sha1_to_hex(p->two->sha1));
+                              oid_to_hex(&p->one->oid),
+                              oid_to_hex(&p->two->oid));
                        continue;
                }
 
-               assert(!hashcmp(mp->obj, obj));
-               if (is_null_sha1(p->two->sha1)) { /* deletion */
+               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
                         * of an A/D pair (2), or D/A pair (3):
@@ -227,9 +228,9 @@ 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);
-               } else if (is_null_sha1(p->one->sha1)) { /* addition */
+                       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
                         * of an A/D pair (2), or D/A pair (3):
@@ -238,25 +239,25 @@ 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->sha1);
+                       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->sha1, mp->base));
-                       assert(!hashcmp(mp->local, uninitialized));
-                       hashcpy(mp->local, p->two->sha1);
+                       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);
-       free_pathspec(&opt.pathspec);
+       clear_pathspec(&opt.pathspec);
 }
 
 static void check_notes_merge_worktree(struct notes_merge_options *o)
@@ -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(
@@ -298,12 +299,8 @@ static void write_buf_to_worktree(const unsigned char *obj,
        char *path = git_pathdup(NOTES_MERGE_WORKTREE "/%s", sha1_to_hex(obj));
        if (safe_create_leading_directories_const(path))
                die_errno("unable to create directory for '%s'", path);
-       if (file_exists(path))
-               die("found existing file at '%s'", path);
 
-       fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666);
-       if (fd < 0)
-               die_errno("failed to open '%s'", path);
+       fd = xopen(path, O_WRONLY | O_EXCL | O_CREAT, 0666);
 
        while (size > 0) {
                long ret = write_in_full(fd, buf, size);
@@ -347,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);
@@ -361,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;
@@ -376,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;
 }
@@ -439,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;
@@ -479,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 {
diff --git a/notes.c b/notes.c
index 88cf4747c16724931682e606a2c1fba4c07b2f49..2bab961ac122e4da1f7b4a4c4398ac8c72fdfae5 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -70,7 +70,7 @@ struct non_note {
 
 struct notes_tree default_notes_tree;
 
-static struct string_list display_notes_refs;
+static struct string_list display_notes_refs = STRING_LIST_INIT_NODUP;
 static struct notes_tree **display_notes_trees;
 
 static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
@@ -446,7 +446,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                        l = (struct leaf_node *)
                                xcalloc(1, sizeof(struct leaf_node));
                        hashcpy(l->key_sha1, object_sha1);
-                       hashcpy(l->val_sha1, entry.sha1);
+                       hashcpy(l->val_sha1, entry.oid->hash);
                        if (len < 20) {
                                if (!S_ISDIR(entry.mode) || path_len != 2)
                                        goto handle_non_note; /* not subtree */
@@ -493,7 +493,7 @@ handle_non_note:
                        }
                        strbuf_addstr(&non_note_path, entry.path);
                        add_non_note(t, strbuf_detach(&non_note_path, NULL),
-                                    entry.mode, entry.sha1);
+                                    entry.mode, entry.oid->hash);
                }
        }
        free(buf);
@@ -993,7 +993,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 +1017,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 f8b644263ff7e3b244bc1804b8527f87f7dbcf84..614a0067566733dc91998423f6dc05634cbedc61 100644 (file)
--- a/object.h
+++ b/object.h
@@ -31,7 +31,7 @@ struct object_array {
  * revision.h:      0---------10                                26
  * fetch-pack.c:    0---4
  * 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
index c30bcd06cbd516eb04e9b55b27b5f091ede61439..9705596014c8fcf534fd0478606d478164382913 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);
index b949e517167dbac6c4c347e0a2cbdf8ca2dabbcf..39bcc168463fc7358ab7cb4e963e6ed8bde94804 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)
index 1da89a41cec9e605fc3fdfa8efaaf2489e501c88..27f70d345fbf1b339cb4bad1011253cece1bf619 100644 (file)
@@ -57,11 +57,8 @@ static int verify_packfile(struct packed_git *p,
        int err = 0;
        struct idx_entry *entries;
 
-       /* Note that the pack header checks are actually performed by
-        * use_pack when it first opens the pack file.  If anything
-        * goes wrong during those checks then the call will die out
-        * immediately.
-        */
+       if (!is_pack_valid(p))
+               return error("packfile %s cannot be accessed", p->pack_name);
 
        git_SHA1_Init(&ctx);
        do {
@@ -99,12 +96,14 @@ 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;
                enum object_type type;
                unsigned long size;
+               off_t curpos;
+               int data_valid;
 
                if (p->index_version > 1) {
                        off_t offset = entries[i].offset;
@@ -116,8 +115,25 @@ static int verify_packfile(struct packed_git *p,
                                            sha1_to_hex(entries[i].sha1),
                                            p->pack_name, (uintmax_t)offset);
                }
-               data = unpack_entry(p, entries[i].offset, &type, &size);
-               if (!data)
+
+               curpos = entries[i].offset;
+               type = unpack_object_header(p, w_curs, &curpos, &size);
+               unuse_pack(w_curs);
+
+               if (type == OBJ_BLOB && big_file_threshold <= size) {
+                       /*
+                        * Let check_sha1_signature() check it with
+                        * the streaming interface; no point slurping
+                        * the data in-core only to discard.
+                        */
+                       data = NULL;
+                       data_valid = 0;
+               } else {
+                       data = unpack_entry(p, entries[i].offset, &type, &size);
+                       data_valid = 1;
+               }
+
+               if (data_valid && !data)
                        err = error("cannot unpack %s from %s at offset %"PRIuMAX"",
                                    sha1_to_hex(entries[i].sha1), p->pack_name,
                                    (uintmax_t)entries[i].offset);
index d1b98b30ffc468421a4eb82661d037f90cf580f2..cc9b9a9b90ca62e7a6e638928511a465fbb9974b 100644 (file)
@@ -27,6 +27,15 @@ 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.
+        */
+       enum {
+               DFS_NONE = 0,
+               DFS_ACTIVE,
+               DFS_DONE
+       } dfs_state;
 };
 
 struct packing_data {
index 96d51c3467b9ef864f62962aa3567247338d2c3a..6bc7c940335cdf2d31cb38c2db6f8f6c985d3c3b 100644 (file)
@@ -107,7 +107,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
         * we have to move it back from the temporary storage.
         */
        if (from != entries)
-               memcpy(entries, tmp, n * sizeof(*entries));
+               COPY_ARRAY(entries, tmp, n);
        free(tmp);
        free(pos);
 
index 33293ce2a6b8ea51516e42d01001b15a3016ca27..88bc7f9f7d03557b040b7246cab7d10c66ec380d 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;
@@ -354,7 +353,6 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
                die_errno("unable to make temporary index file readable");
 
        strbuf_addf(name_buffer, "%s.pack", sha1_to_hex(sha1));
-       free_pack_by_name(name_buffer->buf);
 
        if (rename(pack_tmp_name, name_buffer->buf))
                die_errno("unable to rename temporary pack file");
diff --git a/pack.h b/pack.h
index 3223f5a0380f735509424bbdbad64097948ef85b..0e77429df5e53a753271843aa8abc16f38708ccc 100644 (file)
--- a/pack.h
+++ b/pack.h
@@ -74,6 +74,7 @@ struct pack_idx_entry {
 
 
 struct progress;
+/* Note, the data argument could be NULL if object type is blob */
 typedef int (*verify_fn)(const unsigned char*, enum object_type, unsigned long, void*, int*);
 
 extern const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, const unsigned char *sha1);
diff --git a/pager.c b/pager.c
index 4bc048148e043eabf1315bbcbae8ea4c6363b330..ae79643363091f4967097bdff6e009ea4c7df5e0 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,44 @@ 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;
+}
+
+static void read_early_config(config_fn_t cb, void *data)
+{
+       git_config_with_options(cb, data, NULL, 1);
+
+       /*
+        * Note that this is a really dirty hack that does the wrong thing in
+        * many cases. The crux of the problem is that we cannot run
+        * setup_git_directory() early on in git's setup, so we have no idea if
+        * we are in a repository or not, and therefore are not sure whether
+        * and how to read repository-local config.
+        *
+        * So if we _aren't_ in a repository (or we are but we would reject its
+        * core.repositoryformatversion), we'll read whatever is in .git/config
+        * blindly. Similarly, if we _are_ in a repository, but not at the
+        * root, we'll fail to find .git/config (because it's really
+        * ../.git/config, etc). See t7006 for a complete set of failures.
+        *
+        * However, we have historically provided this hack because it does
+        * work some of the time (namely when you are at the top-level of a
+        * valid repository), and would rarely make things worse (i.e., you do
+        * not generally have a .git/config file sitting around).
+        */
+       if (!startup_info->have_repository) {
+               struct git_config_source repo_config;
+
+               memset(&repo_config, 0, sizeof(repo_config));
+               repo_config.file = ".git/config";
+               git_config_with_options(cb, data, &repo_config, 1);
+       }
+}
+
 const char *git_pager(int stdout_is_tty)
 {
        const char *pager;
@@ -50,7 +84,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)
@@ -63,14 +97,38 @@ const char *git_pager(int stdout_is_tty)
        return pager;
 }
 
+static void setup_pager_env(struct argv_array *env)
+{
+       const char **argv;
+       int i;
+       char *pager_env = xstrdup(PAGER_ENV);
+       int n = split_cmdline(pager_env, &argv);
+
+       if (n < 0)
+               die("malformed build-time PAGER_ENV: %s",
+                       split_cmdline_strerror(n));
+
+       for (i = 0; i < n; i++) {
+               char *cp = strchr(argv[i], '=');
+
+               if (!cp)
+                       die("malformed build-time PAGER_ENV");
+
+               *cp = '\0';
+               if (!getenv(argv[i])) {
+                       *cp = '=';
+                       argv_array_push(env, argv[i]);
+               }
+       }
+       free(pager_env);
+       free(argv);
+}
+
 void prepare_pager_args(struct child_process *pager_process, const char *pager)
 {
        argv_array_push(&pager_process->args, pager);
        pager_process->use_shell = 1;
-       if (!getenv("LESS"))
-               argv_array_push(&pager_process->env_array, "LESS=FRX");
-       if (!getenv("LV"))
-               argv_array_push(&pager_process->env_array, "LV=-c");
+       setup_pager_env(&pager_process->env_array);
 }
 
 void setup_pager(void)
@@ -156,23 +214,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 239898d946f06d102030569fd45780f523fdcd5a..b7d8f7dcb2c3ae7568542832accadab84c7ae314 100644 (file)
@@ -117,19 +117,24 @@ int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
-int parse_options_concat(struct option *dst, size_t dst_size, struct option *src)
+struct option *parse_options_concat(struct option *a, struct option *b)
 {
-       int i, j;
-
-       for (i = 0; i < dst_size; i++)
-               if (dst[i].type == OPTION_END)
-                       break;
-       for (j = 0; i < dst_size; i++, j++) {
-               dst[i] = src[j];
-               if (src[j].type == OPTION_END)
-                       return 0;
-       }
-       return -1;
+       struct option *ret;
+       size_t i, a_len = 0, b_len = 0;
+
+       for (i = 0; a[i].type != OPTION_END; i++)
+               a_len++;
+       for (i = 0; b[i].type != OPTION_END; i++)
+               b_len++;
+
+       ALLOC_ARRAY(ret, st_add3(a_len, b_len, 1));
+       for (i = 0; i < a_len; i++)
+               ret[i] = a[i];
+       for (i = 0; i < b_len; i++)
+               ret[a_len + i] = b[i];
+       ret[a_len + b_len] = b[b_len]; /* final OPTION_END */
+
+       return ret;
 }
 
 int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
@@ -144,7 +149,7 @@ int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
        if (!arg)
                return -1;
 
-       string_list_append(v, xstrdup(arg));
+       string_list_append(v, arg);
        return 0;
 }
 
@@ -153,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.
  */
@@ -194,8 +211,7 @@ int parse_opt_passthru(const struct option *opt, const char *arg, int unset)
        if (recreate_opt(&sb, opt, arg, unset) < 0)
                return -1;
 
-       if (*opt_value)
-               free(*opt_value);
+       free(*opt_value);
 
        *opt_value = strbuf_detach(&sb, NULL);
 
index 47a91920601d74842a0947ce1431c00b3d723972..4fbe924a5de27d04b271a11a2ae040e817483951 100644 (file)
@@ -110,6 +110,8 @@ static int get_value(struct parse_opt_ctx_t *p,
                return 0;
 
        case OPTION_COUNTUP:
+               if (*(int *)opt->value < 0)
+                       *(int *)opt->value = 0;
                *(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
                return 0;
 
@@ -659,7 +661,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 ea4af92a5110554c450665e08fce3a97310e5640..dcd8a0926cc9c18fd49d800bc83064259eced279 100644 (file)
@@ -215,7 +215,7 @@ extern int parse_options_step(struct parse_opt_ctx_t *ctx,
 
 extern int parse_options_end(struct parse_opt_ctx_t *ctx);
 
-extern int parse_options_concat(struct option *dst, size_t, struct option *src);
+extern struct option *parse_options_concat(struct option *a, struct option *b);
 
 /*----- some often used options -----*/
 extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
@@ -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);
 
index b7b3e5a1a700d4d2e1656c605697c2cf6345b8a6..ce285c2e0c552ecf725c87052846d755507bd9db 100644 (file)
 #include "sha1-lookup.h"
 #include "patch-ids.h"
 
-static int commit_patch_id(struct commit *commit, struct diff_options *options,
-                   unsigned char *sha1)
+static int patch_id_defined(struct commit *commit)
 {
+       /* must be 0 or 1 parents */
+       return !commit->parents || !commit->parents->next;
+}
+
+int commit_patch_id(struct commit *commit, struct diff_options *options,
+                   unsigned char *sha1, int diff_header_only)
+{
+       if (!patch_id_defined(commit))
+               return -1;
+
        if (commit->parents)
                diff_tree_sha1(commit->parents->item->object.oid.hash,
                               commit->object.oid.hash, "", options);
        else
                diff_root_tree_sha1(commit->object.oid.hash, "", options);
        diffcore_std(options);
-       return diff_flush_patch_id(options, sha1);
-}
-
-static const unsigned char *patch_id_access(size_t index, void *table)
-{
-       struct patch_id **id_table = table;
-       return id_table[index]->patch_id;
+       return diff_flush_patch_id(options, sha1, diff_header_only);
 }
 
-static int patch_pos(struct patch_id **table, int nr, const unsigned char *id)
+/*
+ * When we cannot load the full patch-id for both commits for whatever
+ * reason, the function returns -1 (i.e. return error(...)). Despite
+ * the "cmp" in the name of this function, the caller only cares about
+ * the return value being zero (a and b are equivalent) or non-zero (a
+ * and b are different), and returning non-zero would keep both in the
+ * result, even if they actually were equivalent, in order to err on
+ * the side of safety.  The actual value being negative does not have
+ * any significance; only that it is non-zero matters.
+ */
+static int patch_id_cmp(struct patch_id *a,
+                       struct patch_id *b,
+                       struct diff_options *opt)
 {
-       return sha1_pos(id, table, nr, patch_id_access);
+       if (is_null_sha1(a->patch_id) &&
+           commit_patch_id(a->commit, opt, a->patch_id, 0))
+               return error("Could not get patch ID for %s",
+                       oid_to_hex(&a->commit->object.oid));
+       if (is_null_sha1(b->patch_id) &&
+           commit_patch_id(b->commit, opt, b->patch_id, 0))
+               return error("Could not get patch ID for %s",
+                       oid_to_hex(&b->commit->object.oid));
+       return hashcmp(a->patch_id, b->patch_id);
 }
 
-#define BUCKET_SIZE 190 /* 190 * 21 = 3990, with slop close enough to 4K */
-struct patch_id_bucket {
-       struct patch_id_bucket *next;
-       int nr;
-       struct patch_id bucket[BUCKET_SIZE];
-};
-
 int init_patch_ids(struct patch_ids *ids)
 {
        memset(ids, 0, sizeof(*ids));
        diff_setup(&ids->diffopts);
+       ids->diffopts.detect_rename = 0;
        DIFF_OPT_SET(&ids->diffopts, RECURSIVE);
        diff_setup_done(&ids->diffopts);
+       hashmap_init(&ids->patches, (hashmap_cmp_fn)patch_id_cmp, 256);
        return 0;
 }
 
 int free_patch_ids(struct patch_ids *ids)
 {
-       struct patch_id_bucket *next, *patches;
-
-       free(ids->table);
-       for (patches = ids->patches; patches; patches = next) {
-               next = patches->next;
-               free(patches);
-       }
+       hashmap_free(&ids->patches, 1);
        return 0;
 }
 
-static struct patch_id *add_commit(struct commit *commit,
-                                  struct patch_ids *ids,
-                                  int no_add)
+static int init_patch_id_entry(struct patch_id *patch,
+                              struct commit *commit,
+                              struct patch_ids *ids)
 {
-       struct patch_id_bucket *bucket;
-       struct patch_id *ent;
-       unsigned char sha1[20];
-       int pos;
-
-       if (commit_patch_id(commit, &ids->diffopts, sha1))
-               return NULL;
-       pos = patch_pos(ids->table, ids->nr, sha1);
-       if (0 <= pos)
-               return ids->table[pos];
-       if (no_add)
-               return NULL;
+       unsigned char header_only_patch_id[GIT_SHA1_RAWSZ];
 
-       pos = -1 - pos;
+       patch->commit = commit;
+       if (commit_patch_id(commit, &ids->diffopts, header_only_patch_id, 1))
+               return -1;
 
-       bucket = ids->patches;
-       if (!bucket || (BUCKET_SIZE <= bucket->nr)) {
-               bucket = xcalloc(1, sizeof(*bucket));
-               bucket->next = ids->patches;
-               ids->patches = bucket;
-       }
-       ent = &bucket->bucket[bucket->nr++];
-       hashcpy(ent->patch_id, sha1);
-
-       ALLOC_GROW(ids->table, ids->nr + 1, ids->alloc);
-       if (pos < ids->nr)
-               memmove(ids->table + pos + 1, ids->table + pos,
-                       sizeof(ent) * (ids->nr - pos));
-       ids->nr++;
-       ids->table[pos] = ent;
-       return ids->table[pos];
+       hashmap_entry_init(patch, sha1hash(header_only_patch_id));
+       return 0;
 }
 
 struct patch_id *has_commit_patch_id(struct commit *commit,
                                     struct patch_ids *ids)
 {
-       return add_commit(commit, ids, 1);
+       struct patch_id patch;
+
+       if (!patch_id_defined(commit))
+               return NULL;
+
+       memset(&patch, 0, sizeof(patch));
+       if (init_patch_id_entry(&patch, commit, ids))
+               return NULL;
+
+       return hashmap_get(&ids->patches, &patch, &ids->diffopts);
 }
 
 struct patch_id *add_commit_patch_id(struct commit *commit,
                                     struct patch_ids *ids)
 {
-       return add_commit(commit, ids, 0);
+       struct patch_id *key = xcalloc(1, sizeof(*key));
+
+       if (!patch_id_defined(commit))
+               return NULL;
+
+       if (init_patch_id_entry(key, commit, ids)) {
+               free(key);
+               return NULL;
+       }
+
+       hashmap_add(&ids->patches, key);
+       return key;
 }
index c8c7ca110ad34def12a3594a1560b3c3052eb701..0f34ea11eadffea14620ea2ad45d69894469aef7 100644 (file)
@@ -2,17 +2,18 @@
 #define PATCH_IDS_H
 
 struct patch_id {
-       unsigned char patch_id[20];
-       char seen;
+       struct hashmap_entry ent;
+       unsigned char patch_id[GIT_SHA1_RAWSZ];
+       struct commit *commit;
 };
 
 struct patch_ids {
+       struct hashmap patches;
        struct diff_options diffopts;
-       int nr, alloc;
-       struct patch_id **table;
-       struct patch_id_bucket *patches;
 };
 
+int commit_patch_id(struct commit *commit, struct diff_options *options,
+                   unsigned char *sha1, int);
 int init_patch_ids(struct patch_ids *);
 int free_patch_ids(struct patch_ids *);
 struct patch_id *add_commit_patch_id(struct commit *, struct patch_ids *);
diff --git a/path.c b/path.c
index 969b494d72dff1439150e7bb945339be07c4d475..efcedafba6f2c0cae218f2d32425c13272df8dea 100644 (file)
--- a/path.c
+++ b/path.c
@@ -5,6 +5,8 @@
 #include "strbuf.h"
 #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)
 {
@@ -23,7 +25,8 @@ static struct strbuf *get_pathname(void)
                STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT
        };
        static int index;
-       struct strbuf *sb = &pathname_array[3 & ++index];
+       struct strbuf *sb = &pathname_array[index];
+       index = (index + 1) % ARRAY_SIZE(pathname_array);
        strbuf_reset(sb);
        return sb;
 }
@@ -134,7 +137,7 @@ static struct common_dir common_list[] = {
  * definite
  * definition
  *
- * The trie would look look like:
+ * The trie would look like:
  * root: len = 0, children a and d non-NULL, value = NULL.
  *    a: len = 2, contents = bc, value = (data for "abc")
  *    d: len = 2, contents = ef, children i non-NULL, value = (data for "def")
@@ -379,14 +382,17 @@ static void adjust_git_path(struct strbuf *buf, int git_dir_len)
                              get_index_file(), strlen(get_index_file()));
        else if (git_db_env && dir_prefix(base, "objects"))
                replace_dir(buf, git_dir_len + 7, get_object_directory());
+       else if (git_hooks_path && dir_prefix(base, "hooks"))
+               replace_dir(buf, git_dir_len + 5, git_hooks_path);
        else if (git_common_dir_env)
                update_common_dir(buf, git_dir_len, NULL);
 }
 
-static void do_git_path(struct strbuf *buf, const char *fmt, va_list args)
+static void do_git_path(const struct worktree *wt, struct strbuf *buf,
+                       const char *fmt, va_list args)
 {
        int gitdir_len;
-       strbuf_addstr(buf, get_git_dir());
+       strbuf_addstr(buf, get_worktree_git_dir(wt));
        if (buf->len && !is_dir_sep(buf->buf[buf->len - 1]))
                strbuf_addch(buf, '/');
        gitdir_len = buf->len;
@@ -400,7 +406,7 @@ char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
        va_list args;
        strbuf_reset(buf);
        va_start(args, fmt);
-       do_git_path(buf, fmt, args);
+       do_git_path(NULL, buf, fmt, args);
        va_end(args);
        return buf->buf;
 }
@@ -409,7 +415,7 @@ void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
 {
        va_list args;
        va_start(args, fmt);
-       do_git_path(sb, fmt, args);
+       do_git_path(NULL, sb, fmt, args);
        va_end(args);
 }
 
@@ -418,7 +424,7 @@ const char *git_path(const char *fmt, ...)
        struct strbuf *pathname = get_pathname();
        va_list args;
        va_start(args, fmt);
-       do_git_path(pathname, fmt, args);
+       do_git_path(NULL, pathname, fmt, args);
        va_end(args);
        return pathname->buf;
 }
@@ -428,7 +434,7 @@ char *git_pathdup(const char *fmt, ...)
        struct strbuf path = STRBUF_INIT;
        va_list args;
        va_start(args, fmt);
-       do_git_path(&path, fmt, args);
+       do_git_path(NULL, &path, fmt, args);
        va_end(args);
        return strbuf_detach(&path, NULL);
 }
@@ -454,12 +460,26 @@ const char *mkpath(const char *fmt, ...)
        return cleanup_path(pathname->buf);
 }
 
-static void do_submodule_path(struct strbuf *buf, const char *path,
-                             const char *fmt, va_list args)
+const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...)
+{
+       struct strbuf *pathname = get_pathname();
+       va_list args;
+       va_start(args, fmt);
+       do_git_path(wt, pathname, fmt, args);
+       va_end(args);
+       return pathname->buf;
+}
+
+/* Returns 0 on success, negative on failure. */
+#define SUBMODULE_PATH_ERR_NOT_CONFIGURED -1
+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;
+       const struct submodule *sub;
+       int err = 0;
 
        strbuf_addstr(buf, path);
        strbuf_complete(buf, '/');
@@ -470,8 +490,19 @@ static void do_submodule_path(struct strbuf *buf, const char *path,
                strbuf_reset(buf);
                strbuf_addstr(buf, git_dir);
        }
+       if (!is_git_directory(buf->buf)) {
+               gitmodules_config();
+               sub = submodule_from_path(null_sha1, path);
+               if (!sub) {
+                       err = SUBMODULE_PATH_ERR_NOT_CONFIGURED;
+                       goto cleanup;
+               }
+               strbuf_reset(buf);
+               strbuf_git_path(buf, "%s/%s", "modules", sub->name);
+       }
+
        strbuf_addch(buf, '/');
-       strbuf_addstr(&git_submodule_dir, buf->buf);
+       strbuf_addbuf(&git_submodule_dir, buf);
 
        strbuf_vaddf(buf, fmt, args);
 
@@ -480,26 +511,66 @@ 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 err;
 }
 
 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);
+       err = do_submodule_path(buf, path, fmt, args);
+       va_end(args);
+
+       return err;
+}
+
+static void do_git_common_path(struct strbuf *buf,
+                              const char *fmt,
+                              va_list args)
 {
+       strbuf_addstr(buf, get_git_common_dir());
+       if (buf->len && !is_dir_sep(buf->buf[buf->len - 1]))
+               strbuf_addch(buf, '/');
+       strbuf_vaddf(buf, fmt, args);
+       strbuf_cleanup_path(buf);
+}
+
+const char *git_common_path(const char *fmt, ...)
+{
+       struct strbuf *pathname = get_pathname();
        va_list args;
        va_start(args, fmt);
-       do_submodule_path(buf, path, fmt, args);
+       do_git_common_path(pathname, fmt, args);
+       va_end(args);
+       return pathname->buf;
+}
+
+void strbuf_git_common_path(struct strbuf *sb, const char *fmt, ...)
+{
+       va_list args;
+       va_start(args, fmt);
+       do_git_common_path(sb, fmt, args);
        va_end(args);
 }
 
@@ -702,17 +773,17 @@ static int calc_shared_perm(int mode)
 {
        int tweak;
 
-       if (shared_repository < 0)
-               tweak = -shared_repository;
+       if (get_shared_repository() < 0)
+               tweak = -get_shared_repository();
        else
-               tweak = shared_repository;
+               tweak = get_shared_repository();
 
        if (!(mode & S_IWUSR))
                tweak &= ~0222;
        if (mode & S_IXUSR)
                /* Copy read bits to execute bits */
                tweak |= (tweak & 0444) >> 2;
-       if (shared_repository < 0)
+       if (get_shared_repository() < 0)
                mode = (mode & ~0777) | tweak;
        else
                mode |= tweak;
@@ -725,7 +796,7 @@ int adjust_shared_perm(const char *path)
 {
        int old_mode, new_mode;
 
-       if (!shared_repository)
+       if (!get_shared_repository())
                return 0;
        if (get_st_mode_bits(path, &old_mode) < 0)
                return -1;
@@ -920,7 +991,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
@@ -943,17 +1014,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;
index c9e9b6c0778c755fcade1430cf674dfd867050f1..22ca74a126e79995607e68a557ae8bd4c2ab02f7 100644 (file)
@@ -364,7 +364,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));
 
@@ -402,8 +402,15 @@ void parse_pathspec(struct pathspec *pathspec,
        }
 
        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);
@@ -446,8 +453,7 @@ void parse_pathspec(struct pathspec *pathspec,
        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);
        }
 }
 
@@ -485,11 +491,10 @@ void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
        *dst = *src;
        ALLOC_ARRAY(dst->items, dst->nr);
-       memcpy(dst->items, src->items,
-              sizeof(struct pathspec_item) * dst->nr);
+       COPY_ARRAY(dst->items, src->items, dst->nr);
 }
 
-void free_pathspec(struct pathspec *pathspec)
+void clear_pathspec(struct pathspec *pathspec)
 {
        free(pathspec->items);
        pathspec->items = NULL;
index 0c1126264a394e62cfbed47b2feae85e9b5d1410..59809e4793a20e3030462ec23bff2b5358283282 100644 (file)
@@ -19,7 +19,7 @@
 #define PATHSPEC_ONESTAR 1     /* the pathspec pattern satisfies GFNM_ONESTAR */
 
 struct pathspec {
-       const char **_raw; /* get_pathspec() result, not freed by free_pathspec() */
+       const char **_raw; /* get_pathspec() result, not freed by clear_pathspec() */
        int nr;
        unsigned int has_wildcard:1;
        unsigned int recursive:1;
@@ -74,7 +74,7 @@ extern void parse_pathspec(struct pathspec *pathspec,
                           const char *prefix,
                           const char **args);
 extern void copy_pathspec(struct pathspec *dst, const struct pathspec *src);
-extern void free_pathspec(struct pathspec *);
+extern void clear_pathspec(struct pathspec *);
 
 static inline int ps_strncmp(const struct pathspec_item *item,
                             const char *s1, const char *s2, size_t n)
@@ -96,7 +96,5 @@ static inline int ps_strcmp(const struct pathspec_item *item,
 
 extern char *find_pathspecs_matching_against_index(const struct pathspec *pathspec);
 extern void add_pathspec_matches_against_index(const struct pathspec *pathspec, char *seen);
-extern const char *check_path_for_gitlink(const char *path);
-extern void die_if_path_beyond_symlink(const char *path, const char *prefix);
 
 #endif /* PATHSPEC_H */
index 49eb88af8d052e2bd71b83576034f8d338290013..b2732822af0f34c6f7731df8a1a017d19f3e0508 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);
 
@@ -393,7 +393,7 @@ sub command_close_pipe {
 Execute the given C<COMMAND> in the same way as command_output_pipe()
 does but return both an input pipe filehandle and an output pipe filehandle.
 
-The function will return return C<($pid, $pipe_in, $pipe_out, $ctx)>.
+The function will return C<($pid, $pipe_in, $pipe_out, $ctx)>.
 See C<command_close_bidi_pipe()> for details.
 
 =cut
@@ -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  )
 
@@ -871,6 +885,8 @@ Return an array of mailboxes extracted from a string.
 
 =cut
 
+# Very close to Mail::Address's parser, but we still have minor
+# differences in some cases (see t9000 for examples).
 sub parse_mailboxes {
        my $re_comment = qr/\((?:[^)]*)\)/;
        my $re_quote = qr/"(?:[^\"\\]|\\.)*"/;
@@ -879,6 +895,7 @@ sub parse_mailboxes {
        # divide the string in tokens of the above form
        my $re_token = qr/(?:$re_quote|$re_word|$re_comment|\S)/;
        my @tokens = map { $_ =~ /\s*($re_token)\s*/g } @_;
+       my $end_of_addr_seen = 0;
 
        # add a delimiter to simplify treatment for the last mailbox
        push @tokens, ",";
@@ -888,10 +905,10 @@ sub parse_mailboxes {
                if ($token =~ /^[,;]$/) {
                        # if buffer still contains undeterminated strings
                        # append it at the end of @address or @phrase
-                       if (@address) {
-                               push @address, @buffer;
-                       } else {
+                       if ($end_of_addr_seen) {
                                push @phrase, @buffer;
+                       } else {
+                               push @address, @buffer;
                        }
 
                        my $str_phrase = join ' ', @phrase;
@@ -915,16 +932,16 @@ sub parse_mailboxes {
                        push @addr_list, $str_mailbox if ($str_mailbox);
 
                        @phrase = @address = @comment = @buffer = ();
+                       $end_of_addr_seen = 0;
                } elsif ($token =~ /^\(/) {
                        push @comment, $token;
                } elsif ($token eq "<") {
                        push @phrase, (splice @address), (splice @buffer);
                } elsif ($token eq ">") {
+                       $end_of_addr_seen = 1;
                        push @address, (splice @buffer);
-               } elsif ($token eq "@") {
+               } elsif ($token eq "@" && !$end_of_addr_seen) {
                        push @address, (splice @buffer), "@";
-               } elsif ($token eq ".") {
-                       push @address, (splice @buffer), ".";
                } else {
                        push @buffer, $token;
                }
index b2c14e2ff5485f49af83530ce1b1921c99641f5c..711d2687a3005091d80fc964e5fd92aba6167b38 100644 (file)
@@ -98,6 +98,11 @@ sub resolve_local_globs {
                                    " globbed: $refname\n";
                        }
                        my $u = (::cmt_metadata("$refname"))[0];
+                       if (!defined($u)) {
+                               warn
+"W: $refname: no associated commit metadata from SVN, skipping\n";
+                               next;
+                       }
                        $u =~ s!^\Q$url\E(/|$)!! or die
                          "$refname: '$url' not found in '$u'\n";
                        if ($pathname ne $u) {
@@ -802,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";
@@ -1653,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';
        }
 }
 
@@ -1666,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;
@@ -1707,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",
@@ -1904,15 +1924,22 @@ sub make_log_entry {
 
        my @parents = @$parents;
        my $props = $ed->{dir_prop}{$self->path};
-       if ( $props->{"svk:merge"} ) {
-               $self->find_extra_svk_parents($props->{"svk:merge"}, \@parents);
-       }
-       if ( $props->{"svn:mergeinfo"} ) {
-               my $mi_changes = $self->mergeinfo_changes
-                       ($parent_path, $parent_rev,
-                        $self->path, $rev,
-                        $props->{"svn:mergeinfo"});
-               $self->find_extra_svn_parents($mi_changes, \@parents);
+       if ($self->follow_parent) {
+               my $tickets = $props->{"svk:merge"};
+               if ($tickets) {
+                       $self->find_extra_svk_parents($tickets, \@parents);
+               }
+
+               my $mergeinfo_prop = $props->{"svn:mergeinfo"};
+               if ($mergeinfo_prop) {
+                       my $mi_changes = $self->mergeinfo_changes(
+                                               $parent_path,
+                                               $parent_rev,
+                                               $self->path,
+                                               $rev,
+                                               $mergeinfo_prop);
+                       $self->find_extra_svn_parents($mi_changes, \@parents);
+               }
        }
 
        open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
@@ -2434,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;
                }
@@ -2449,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 62fdb37079fa31698846044448b5cfb398e45528..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)
 {
@@ -172,27 +270,8 @@ static int get_packet_data(int fd, char **src_buf, size_t *src_size,
 
 static int packet_length(const char *linelen)
 {
-       int n;
-       int len = 0;
-
-       for (n = 0; n < 4; n++) {
-               unsigned char c = linelen[n];
-               len <<= 4;
-               if (c >= '0' && c <= '9') {
-                       len += c - '0';
-                       continue;
-               }
-               if (c >= 'a' && c <= 'f') {
-                       len += c - 'a' + 10;
-                       continue;
-               }
-               if (c >= 'A' && c <= 'F') {
-                       len += c - 'A' + 10;
-                       continue;
-               }
-               return -1;
-       }
-       return len;
+       int val = hex2chr(linelen);
+       return (val < 0) ? val : (val << 8) | hex2chr(linelen + 2);
 }
 
 int packet_read(int fd, char **src_buf, size_t *src_len,
@@ -248,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 56274ad4f35d8f3c9f288a2d0a3a6d0264db6d07..d3e63bc4806d1fa4547bbd743c6395ec8b9311cf 100644 (file)
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -37,8 +37,9 @@ Repository:   https://github.com/changwoo/git-l10n-ko/
 Leader:                Changwoo Ryu <cwryu@debian.org>
 
 Language:      pt_PT (Portuguese - Portugal)
-Repository:    https://github.com/marcomsousa/git-l10n-pt_PT/
-Leader:                Marco Sousa <marcomsousa AT gmail.com>
+Repository:    https://github.com/vascool/git-po-pt/
+Leader:                Vasco Almeida <vascomalmeida@sapo.pt>
+Members:       Marco Sousa <marcomsousa AT gmail.com>
 
 Language:      ru (Russian)
 Repository:    https://github.com/DJm00n/git-po-ru/
index ac6f103e4de50d82ceaf3dbcba5c1d0372e6cabf..ce75f39936a035deb5b7a8dcaedbb161df0531b9 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -65,6 +65,9 @@
 # term управляваща дума (за git-bisect)
 # mergetag етикет при сливане
 # delta - разлика, делта, обект-разлика
+# peeled tag - проследен етикет - когато етикет сочи към друг етикет, а не подаване и проследяваме подобно на символна връзка
+# strip - премахвам (за компонент при филтриране)
+# unrelated histories - независими истории
 # ----
 # „$var“ - може да не сработва за shell  има gettext и eval_gettext - проверка - намират се лесно по „$
 # ========================
@@ -109,8 +112,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git master\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2015-12-22 22:50+0800\n"
-"PO-Revision-Date: 2015-12-28 11:32+0200\n"
+"POT-Creation-Date: 2016-05-24 23:42+0800\n"
+"PO-Revision-Date: 2016-05-29 15:23+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
@@ -133,7 +136,7 @@ msgstr ""
 "Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n"
 "за да отбележите коригирането им. След това извършете подаването."
 
-#: advice.c:101 builtin/merge.c:1225
+#: advice.c:101 builtin/merge.c:1238
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
 
@@ -177,25 +180,25 @@ msgstr "ФОРМАТ"
 msgid "archive format"
 msgstr "ФОРМАТ на архива"
 
-#: archive.c:430 builtin/log.c:1229
+#: archive.c:430 builtin/log.c:1395
 msgid "prefix"
-msgstr "пÑ\80еÑ\84икÑ\81"
+msgstr "Ð\9fРÐ\95ФÐ\98Ð\9aС"
 
 #: archive.c:431
 msgid "prepend prefix to each pathname in the archive"
-msgstr "добавÑ\8fне Ð½Ð° Ñ\82ози Ð¿Ñ\80еÑ\84икÑ\81 към всеки път в архива"
+msgstr "добавÑ\8fне Ð½Ð° Ñ\82ози Ð\9fРÐ\95ФÐ\98Ð\9aС към всеки път в архива"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
-#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
-#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
+#: 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 "файл"
+msgstr "ФАЙЛ"
 
 #: archive.c:433 builtin/archive.c:89
 msgid "write the archive to this file"
-msgstr "запазване на архива в този файл"
+msgstr "запазване на архива в този ФАЙЛ"
 
 #: archive.c:435
 msgid "read .gitattributes in working directory"
@@ -221,7 +224,8 @@ msgstr "добро компресиране"
 msgid "list supported archive formats"
 msgstr "извеждане на списъка с поддържаните формати"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:82
+#: builtin/submodule--helper.c:776
 msgid "repo"
 msgstr "хранилище"
 
@@ -229,7 +233,7 @@ msgstr "хранилище"
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
 msgid "command"
 msgstr "команда"
 
@@ -237,7 +241,7 @@ msgstr "команда"
 msgid "path to the remote git-upload-archive command"
 msgstr "път към отдалечената команда „git-upload-archive“"
 
-#: attr.c:265
+#: attr.c:263
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
@@ -245,85 +249,102 @@ msgstr ""
 "Отрицателните шаблони се игнорират в атрибутите на git.\n"
 "Ако ви трябва начална удивителна, ползвайте „\\!“."
 
-#: branch.c:61
+#: 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"
+"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:84
+#: 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:85
+#: branch.c:94
 #, c-format
 msgid "Branch %s set up to track remote branch %s from %s."
 msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“."
 
-#: branch.c:89
+#: branch.c:98
 #, c-format
 msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 "Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
 
-#: branch.c:90
+#: branch.c:99
 #, c-format
 msgid "Branch %s set up to track local branch %s."
 msgstr "Клонът „%s“ ще следи клона „%s“ от локалното хранилище."
 
-#: branch.c:95
+#: branch.c:104
 #, c-format
 msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
 
-#: branch.c:96
+#: branch.c:105
 #, c-format
 msgid "Branch %s set up to track remote ref %s."
 msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
 
-#: branch.c:100
+#: branch.c:109
 #, c-format
 msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
 
-#: branch.c:101
+#: branch.c:110
 #, c-format
 msgid "Branch %s set up to track local ref %s."
 msgstr "Клонът „%s“ ще следи локалния указател „%s“."
 
-#: branch.c:134
+#: 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:163
+#: branch.c:185
 #, c-format
 msgid "'%s' is not a valid branch name."
 msgstr "„%s“ не е позволено име за клон."
 
-#: branch.c:168
+#: branch.c:190
 #, c-format
 msgid "A branch named '%s' already exists."
 msgstr "Вече съществува клон с име „%s“."
 
-#: branch.c:176
+#: branch.c:198
 msgid "Cannot force update the current branch."
 msgstr "Текущият клон не може да бъде принудително обновен."
 
-#: branch.c:196
+#: branch.c:218
 #, c-format
 msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
 
-#: branch.c:198
+#: branch.c:220
 #, c-format
 msgid "the requested upstream branch '%s' does not exist"
 msgstr "заявеният отдалечен клон „%s“ не съществува"
 
-#: branch.c:200
+#: branch.c:222
 msgid ""
 "\n"
 "If you are planning on basing your work on an upstream\n"
@@ -342,26 +363,31 @@ msgstr ""
 "може да използвате „git push -u“, за да настроите към кой клон да се "
 "изтласква."
 
-#: branch.c:244
+#: branch.c:266
 #, c-format
 msgid "Not a valid object name: '%s'."
 msgstr "Неправилно име на обект: „%s“"
 
-#: branch.c:264
+#: branch.c:286
 #, c-format
 msgid "Ambiguous object name: '%s'."
 msgstr "Двусмислено име на обект: „%s“"
 
-#: branch.c:269
+#: branch.c:291
 #, c-format
 msgid "Not a valid branch point: '%s'."
 msgstr "Неправилно място за начало на клон: „%s“"
 
-#: branch.c:322
+#: branch.c:345
 #, 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 "Указателят „HEAD“ на работното дърво „%s“ не е обновен"
+
 #: bundle.c:34
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
@@ -372,7 +398,7 @@ msgstr "Файлът „%s“ не изглежда да е пратка на gi
 msgid "unrecognized header: %s%s (%d)"
 msgstr "непозната заглавна част: %s%s (%d)"
 
-#: bundle.c:87 builtin/commit.c:766
+#: bundle.c:87 builtin/commit.c:777
 #, c-format
 msgid "could not open '%s'"
 msgstr "„%s“ не може да се отвори"
@@ -381,10 +407,10 @@ msgstr "„%s“ не може да се отвори"
 msgid "Repository lacks these prerequisite commits:"
 msgstr "В хранилището липсват следните необходими подавания:"
 
-#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
-#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
-#: builtin/shortlog.c:158
+#: 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 "неуспешно настройване на обхождането на версиите"
 
@@ -424,21 +450,21 @@ msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 "указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
+#: bundle.c:443 builtin/log.c:163 builtin/log.c:1538 builtin/shortlog.c:273
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "непознат аргумент: %s"
 
-#: bundle.c:449
+#: bundle.c:451
 msgid "Refusing to create empty bundle."
 msgstr "Създаването на празна пратка е невъзможно."
 
-#: bundle.c:459
+#: bundle.c:463
 #, c-format
 msgid "cannot create '%s'"
 msgstr "Файлът „%s“ не може да бъде създаден"
 
-#: bundle.c:480
+#: bundle.c:491
 msgid "index-pack died"
 msgstr "Командата „git index-pack“ не завърши успешно"
 
@@ -447,8 +473,8 @@ msgstr "Командата „git index-pack“ не завърши успешн
 msgid "invalid color value: %.*s"
 msgstr "неправилна стойност за цвят: %.*s"
 
-#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
-#: builtin/am.c:2149
+#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1504
+#: builtin/am.c:2134
 #, c-format
 msgid "could not parse %s"
 msgstr "„%s“ не може да се анализира"
@@ -462,28 +488,27 @@ msgstr "%s %s не е подаване!"
 msgid "memory exhausted"
 msgstr "паметта свърши"
 
-#: config.c:474 config.c:476
+#: config.c:475 config.c:477
 #, c-format
-msgid "bad config file line %d in %s"
-msgstr "неправилен ред %d в „%s“"
+msgid "bad config line %d in %s %s"
+msgstr "неправилен ред %d в настройката %s „%s“"
 
-#: config.c:592
+#: config.c:593
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-"неправилна числова стойност „%s“ за настройката „%s“ в раздела „%s“: %s"
+msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
+msgstr "неправилна числова стойност „%s“ за настройката „%s“ в %s „%s“: %s"
 
-#: config.c:594
+#: config.c:595
 #, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "неправилна числова стойност „%s“ за настройката „%s“: %s"
 
-#: config.c:679
+#: config.c:680
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "домашната папка на потребителя не може да бъде открита: „%s“"
 
-#: config.c:757 config.c:768
+#: config.c:761 config.c:772
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "неправилно ниво на компресиране: %d"
@@ -493,42 +518,50 @@ msgstr "неправилно ниво на компресиране: %d"
 msgid "invalid mode for object creation: %s"
 msgstr "неправилен режим за създаването на обекти: %s"
 
-#: config.c:1216
+#: config.c:1228
 msgid "unable to parse command-line config"
 msgstr "неправилни настройки от командния ред"
 
-#: config.c:1277
+#: config.c:1284
 msgid "unknown error occured while reading the configuration files"
 msgstr "неочаквана грешка при изчитането на конфигурационните файлове"
 
-#: config.c:1601
+#: config.c:1629
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr "неразпозната стойност „%s“ от командния ред"
 
-#: config.c:1603
+#: config.c:1631
 #, c-format
 msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr "неправилна настройка „%s“ във файла „%s“ на ред №%d"
 
-#: config.c:1662
+#: config.c:1690
 #, c-format
 msgid "%s has multiple values"
 msgstr "зададени са няколко стойности за „%s“"
 
+#: config.c:2224
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "„%s“ не може да се зададе да е „%s“"
+
+#: config.c:2226
+#, 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
-#, c-format
-msgid "failed write to rev-list: %s"
-msgstr "неуспешен запис на списъка с версиите: %s"
+msgid "failed write to rev-list"
+msgstr "неуспешен запис на списъка с версиите"
 
-#: connected.c:97
-#, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "стандартният вход на списъка с версиите не може да бъде затворен: %s"
+#: connected.c:96
+msgid "failed to close rev-list's stdin"
+msgstr "стандартният вход на списъка с версиите не може да бъде затворен"
 
 #: date.c:95
 msgid "in the future"
@@ -603,28 +636,28 @@ msgstr[1] "преди %lu години"
 msgid "failed to read orderfile '%s'"
 msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
 
-#: diffcore-rename.c:536
+#: diffcore-rename.c:538
 msgid "Performing inexact rename detection"
 msgstr "Търсене на преименувания на обекти съчетани с промени"
 
-#: diff.c:115
+#: diff.c:116
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
 "директории\n"
 
-#: diff.c:120
+#: diff.c:121
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Непознат параметър „%s“ за статистиката по директории'\n"
 
-#: diff.c:215
+#: diff.c:225
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
 
-#: diff.c:267
+#: diff.c:277
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -633,17 +666,17 @@ msgstr ""
 "Грешки в настройката „diff.dirstat“:\n"
 "%s"
 
-#: diff.c:3000
+#: diff.c:3007
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr ""
 "външната програма за разлики завърши неуспешно. Спиране на работата при „%s“"
 
-#: diff.c:3396
+#: diff.c:3405
 msgid "--follow requires exactly one pathspec"
 msgstr "Опцията „--follow“ изисква точно един път"
 
-#: diff.c:3559
+#: diff.c:3568
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -652,20 +685,21 @@ msgstr ""
 "Неразпознат параметър към опцията „--dirstat/-X“:\n"
 "%s"
 
-#: diff.c:3573
+#: diff.c:3582
 #, c-format
 msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
 
-#: dir.c:1915
+#: dir.c:1823
 msgid "failed to get kernel name and information"
 msgstr "името и версията на ядрото не бяха получени"
 
-#: dir.c:1998
-msgid "Untracked cache is disabled on this system."
-msgstr "Кеша за неследените файлове е изключен на тази система"
+#: dir.c:1942
+msgid "Untracked cache is disabled on this system or location."
+msgstr ""
+"Кеша за неследените файлове е изключен на тази система или местоположение."
 
-#: gpg-interface.c:166 gpg-interface.c:237
+#: gpg-interface.c:166 gpg-interface.c:235
 msgid "could not run gpg."
 msgstr "Програмата „gpg“ не може да бъде стартирана."
 
@@ -679,43 +713,43 @@ msgstr "Програмата „gpg“ не подписа данните."
 
 #: gpg-interface.c:222
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s"
+msgid "could not create temporary file '%s'"
+msgstr "Програмата не успя да създаде временния файл „%s“"
 
-#: gpg-interface.c:225
+#: gpg-interface.c:224
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "Програмата не успя да запише самостоятелния подпис в „%s“"
 
 #: grep.c:1718
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
 
-#: grep.c:1735
+#: grep.c:1735 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "'%s': %s"
-msgstr "„%s“: „%s“"
+msgid "failed to stat '%s'"
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
 #: grep.c:1746
 #, c-format
-msgid "'%s': short read %s"
-msgstr "â\80\9e%sâ\80\9c: Ð¸Ð·Ñ\87иÑ\82анеÑ\82о Ð½Ð° â\80\9e%sâ\80\9c Ð²Ñ\8aÑ\80на Ð¿Ð¾-малко Ð±Ð°Ð¹Ñ\82ове Ð¾Ñ\82 Ð·Ð°Ñ\8fвениÑ\82е"
+msgid "'%s': short read"
+msgstr "„%s“: изчитането върна по-малко байтове от заявените"
 
-#: help.c:207
+#: help.c:205
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "налични команди на git от „%s“"
 
-#: help.c:214
+#: help.c:212
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "команди на git от други директории от „$PATH“"
 
-#: help.c:246
+#: help.c:244
 msgid "These are common Git commands used in various situations:"
 msgstr "Това са най-често използваните команди на Git:"
 
-#: help.c:311
+#: help.c:309
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -724,11 +758,11 @@ msgstr ""
 "Изглежда, че „%s“ е команда на git, но тя не може да\n"
 "бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
 
-#: help.c:368
+#: help.c:366
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
 
-#: help.c:390
+#: help.c:388
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -739,17 +773,17 @@ msgstr ""
 "съществува. Изпълнението автоматично продължава, като се счита, че имате "
 "предвид „%s“"
 
-#: help.c:395
+#: help.c:393
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "след %0.1f секунди…"
 
-#: help.c:402
+#: help.c:400
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr "git: „%s“ не е команда на git. Погледнете изхода от „git --help“."
 
-#: help.c:406 help.c:466
+#: help.c:404 help.c:464
 msgid ""
 "\n"
 "Did you mean this?"
@@ -763,17 +797,41 @@ msgstr[1] ""
 "\n"
 "Команди с подобно име са:"
 
-#: help.c:462
+#: help.c:460
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s — %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 ""
+"Файлът-ключалка „%s.lock“ не може да бъде създаден: %s\n"
+"\n"
+"Изглежда, че и друг процес на git е пуснат в това хранилище, напр.\n"
+"редактор, стартиран с „git commit“. Уверете се, че всички подобни\n"
+"процеси са спрени и опитайте отново. Ако това не помогне, вероятната\n"
+"причина е, че някой процес на git в това хранилище е забил. За да\n"
+"продължите работа, ще трябва ръчно да изтриете файла:"
+
+#: lockfile.c:160
+#, 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:2022 builtin/am.c:2057 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:722
+#: 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 "неуспешно записване на новия индекс"
 
@@ -791,66 +849,66 @@ msgstr "неуспешно изпълнение на „addinfo_cache“ за п
 msgid "error building trees"
 msgstr "грешка при изграждане на дърветата"
 
-#: merge-recursive.c:686
+#: merge-recursive.c:689
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "грешка при създаването на пътя „%s“%s"
 
-#: merge-recursive.c:697
+#: merge-recursive.c:700
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n"
 
-#: merge-recursive.c:711 merge-recursive.c:732
+#: merge-recursive.c:714 merge-recursive.c:735
 msgid ": perhaps a D/F conflict?"
 msgstr ": възможно е да има конфликт директория/файл."
 
-#: merge-recursive.c:722
+#: merge-recursive.c:725
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 "преустановяване на действието, за да не се изтрие неследеният файл „%s“"
 
-#: merge-recursive.c:762
+#: merge-recursive.c:765
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "обектът „%s“ (%s) не може да бъде прочетен"
 
-#: merge-recursive.c:764
+#: merge-recursive.c:767
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е"
 
-#: merge-recursive.c:787 builtin/clone.c:369
+#: merge-recursive.c:790 builtin/clone.c:376
 #, c-format
 msgid "failed to open '%s'"
 msgstr "директорията „%s“ не може да бъде отворена"
 
-#: merge-recursive.c:795
+#: merge-recursive.c:798
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "неуспешно създаване на символната връзка „%s“"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:801
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 "не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“"
 
-#: merge-recursive.c:936
+#: merge-recursive.c:939
 msgid "Failed to execute internal merge"
 msgstr "Неуспешно вътрешно сливане"
 
-#: merge-recursive.c:940
+#: merge-recursive.c:943
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "„%s“ не може да се добави в базата с данни"
 
-#: merge-recursive.c:956
+#: merge-recursive.c:959
 msgid "unsupported object type in the tree"
 msgstr "в дървото има неподдържан вид обект"
 
-#: merge-recursive.c:1031 merge-recursive.c:1045
+#: 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 "
@@ -859,7 +917,7 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
 "е оставена в дървото."
 
-#: merge-recursive.c:1037 merge-recursive.c:1050
+#: 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 "
@@ -868,20 +926,20 @@ msgstr ""
 "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ "
 "е оставена в дървото: %s."
 
-#: merge-recursive.c:1091
+#: merge-recursive.c:1094
 msgid "rename"
 msgstr "преименуване"
 
-#: merge-recursive.c:1091
+#: merge-recursive.c:1094
 msgid "renamed"
 msgstr "преименуван"
 
-#: merge-recursive.c:1147
+#: merge-recursive.c:1150
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“"
 
-#: merge-recursive.c:1169
+#: merge-recursive.c:1172
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -890,150 +948,150 @@ msgstr ""
 "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон "
 "„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s."
 
-#: merge-recursive.c:1174
+#: merge-recursive.c:1177
 msgid " (left unresolved)"
 msgstr " (некоригиран конфликт)"
 
-#: merge-recursive.c:1228
+#: 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“"
 
-#: merge-recursive.c:1258
+#: merge-recursive.c:1261
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“"
 
-#: merge-recursive.c:1457
+#: 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“"
 
-#: merge-recursive.c:1467
+#: merge-recursive.c:1470
 #, c-format
 msgid "Adding merged %s"
 msgstr "Добавяне на слетия „%s“"
 
-#: merge-recursive.c:1472 merge-recursive.c:1674
+#: merge-recursive.c:1475 merge-recursive.c:1677
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавяне като „%s“"
 
-#: merge-recursive.c:1523
+#: merge-recursive.c:1526
 #, c-format
 msgid "cannot read object %s"
 msgstr "обектът „%s“ не може да се прочете"
 
-#: merge-recursive.c:1526
+#: merge-recursive.c:1529
 #, c-format
 msgid "object %s is not a blob"
 msgstr "обектът „%s“ не е BLOB"
 
-#: merge-recursive.c:1578
+#: merge-recursive.c:1581
 msgid "modify"
 msgstr "промяна"
 
-#: merge-recursive.c:1578
+#: merge-recursive.c:1581
 msgid "modified"
 msgstr "променен"
 
-#: merge-recursive.c:1588
+#: merge-recursive.c:1591
 msgid "content"
 msgstr "съдържание"
 
-#: merge-recursive.c:1595
+#: merge-recursive.c:1598
 msgid "add/add"
 msgstr "добавяне/добавяне"
 
-#: merge-recursive.c:1629
+#: merge-recursive.c:1632
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)"
 
-#: merge-recursive.c:1643
+#: merge-recursive.c:1646
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Автоматично сливане на „%s“"
 
-#: merge-recursive.c:1647 git-submodule.sh:1025
+#: merge-recursive.c:1650 git-submodule.sh:941
 msgid "submodule"
 msgstr "ПОДМОДУЛ"
 
-#: merge-recursive.c:1648
+#: merge-recursive.c:1651
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“"
 
-#: merge-recursive.c:1734
+#: merge-recursive.c:1737
 #, c-format
 msgid "Removing %s"
 msgstr "Изтриване на „%s“"
 
-#: merge-recursive.c:1759
+#: merge-recursive.c:1762
 msgid "file/directory"
 msgstr "файл/директория"
 
-#: merge-recursive.c:1765
+#: merge-recursive.c:1768
 msgid "directory/file"
 msgstr "директория/файл"
 
-#: merge-recursive.c:1770
+#: 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“"
 
-#: merge-recursive.c:1780
+#: merge-recursive.c:1781
 #, c-format
 msgid "Adding %s"
 msgstr "Добавяне на „%s“"
 
-#: merge-recursive.c:1797
+#: merge-recursive.c:1798
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Фатална грешка при сливане, а такава не трябва да възниква!"
 
-#: merge-recursive.c:1816
+#: merge-recursive.c:1817
 msgid "Already up-to-date!"
 msgstr "Вече е обновено!"
 
-#: merge-recursive.c:1825
+#: merge-recursive.c:1826
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "неуспешно сливане на дърветата „%s“ и „%s“"
 
-#: merge-recursive.c:1855
+#: merge-recursive.c:1856
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 "Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на "
 "разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“."
 
-#: merge-recursive.c:1903
+#: merge-recursive.c:1904
 msgid "Merging:"
 msgstr "Сливане:"
 
-#: merge-recursive.c:1916
+#: merge-recursive.c:1917
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "открит е %u общ предшественик:"
 msgstr[1] "открити са %u общи предшественици:"
 
-#: merge-recursive.c:1953
+#: merge-recursive.c:1954
 msgid "merge returned no commit"
 msgstr "сливането не върна подаване"
 
-#: merge-recursive.c:2010
+#: merge-recursive.c:2011
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Неуспешен анализ на обекта „%s“"
 
-#: merge-recursive.c:2021 builtin/merge.c:645
+#: merge-recursive.c:2022 builtin/merge.c:649 builtin/merge.c:831
 msgid "Unable to write index."
 msgstr "Индексът не може да бъде прочетен"
 
@@ -1065,28 +1123,28 @@ msgstr "Зададена е лоша стойност на променлива
 msgid "unable to parse object: %s"
 msgstr "обектът „%s“ не може да бъде анализиран"
 
-#: parse-options.c:570
+#: parse-options.c:572
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:588
+#: parse-options.c:590
 #, c-format
 msgid "usage: %s"
 msgstr "употреба: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:592
+#: parse-options.c:594
 #, c-format
 msgid "   or: %s"
 msgstr "     или: %s"
 
-#: parse-options.c:595
+#: parse-options.c:597
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:629
+#: parse-options.c:631
 msgid "-NUM"
 msgstr "-ЧИСЛО"
 
@@ -1095,7 +1153,7 @@ msgstr "-ЧИСЛО"
 msgid "malformed object name '%s'"
 msgstr "неправилно име на обект „%s“"
 
-#: path.c:752
+#: path.c:796
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата"
@@ -1151,12 +1209,12 @@ msgstr "Пътят „%s“ е в подмодула „%.*s“"
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: магическите пътища не се поддържат от командата „%s“"
 
-#: pathspec.c:432
+#: pathspec.c:433
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "пътят „%s“ е след символна връзка"
 
-#: pathspec.c:441
+#: pathspec.c:442
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -1164,7 +1222,7 @@ msgstr ""
 "Нищо не се изключва от шаблоните за изключване.\n"
 "Това често се случва, ако сте забравили да добавите „:/“ или „.“."
 
-#: pretty.c:969
+#: pretty.c:971
 msgid "unable to parse --pretty format"
 msgstr "аргументът към опцията „--pretty“ не може да се анализира"
 
@@ -1191,165 +1249,250 @@ msgstr ""
 "„GIT_INDEX_VERSION“.\n"
 "Ще се ползва версия %i"
 
-#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
-#: builtin/merge.c:983
+#: refs.c:543 builtin/merge.c:764 builtin/merge.c:883 builtin/merge.c:985
+#: builtin/merge.c:995
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
 
-#: refs/files-backend.c:2359
+#: refs/files-backend.c:2243
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "Указателят „%s“ не може да бъде изтрит: %s"
 
-#: refs/files-backend.c:2362
+#: refs/files-backend.c:2246
 #, c-format
 msgid "could not delete references: %s"
 msgstr "Указателите не може да бъдат изтрити: %s"
 
-#: refs/files-backend.c:2371
+#: refs/files-backend.c:2255
 #, c-format
 msgid "could not remove reference %s"
 msgstr "Указателят „%s“ не може да бъде изтрит"
 
-#: ref-filter.c:245
+#: ref-filter.c:55
 #, 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 "expected format: %%(color:<color>)"
+msgstr "оÑ\87акван Ñ\84оÑ\80маÑ\82: %%(color:ЦÐ\92ЯТ)"
 
-#: ref-filter.c:704
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "непознат цвят: %%(color:%s)"
+
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "непознат формат: %%(%s)"
+
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) не приема аргументи"
+
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) не приема аргументи"
+
+#: ref-filter.c:101
 #, c-format
 msgid "positive value expected contents:lines=%s"
 msgstr "очаква се положителна стойност за „contents:lines=%s“"
 
-#: ref-filter.c:833
+#: ref-filter.c:103
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "оÑ\87акван Ñ\84оÑ\80маÑ\82: %%(color:ЦÐ\92ЯТ)"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "непознаÑ\82 Ð°Ñ\80гÑ\83менÑ\82 Ð·Ð° %%(contents): %s"
 
-#: ref-filter.c:835
-msgid "unable to parse format"
-msgstr "форматът не може да бъде анализиран"
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "непознат аргумент за %%(objectname): %s"
 
-#: ref-filter.c:870
+#: ref-filter.c:135
 #, c-format
 msgid "expected format: %%(align:<width>,<position>)"
 msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)"
 
-#: ref-filter.c:893
+#: ref-filter.c:147
 #, c-format
-msgid "improper format entered align:%s"
-msgstr "вÑ\8aведен Ðµ Ð½ÐµÐ¿Ñ\80авилен Ñ\84оÑ\80маÑ\82 align:%s"
+msgid "unrecognized position:%s"
+msgstr "непознаÑ\82а Ð¿Ð¾Ð·Ð¸Ñ\86иÑ\8f%s"
 
-#: ref-filter.c:898
+#: ref-filter.c:151
+#, c-format
+msgid "unrecognized width:%s"
+msgstr "непозната широчина: %s"
+
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "непознат аргумент за %%(align): %s"
+
+#: ref-filter.c:161
 #, c-format
 msgid "positive width expected with the %%(align) atom"
 msgstr "очаква се положителна широчина с лексемата „%%(align)“"
 
-#: ref-filter.c:1219
+#: ref-filter.c:244
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "неправилно име на обект: „%.*s“"
+
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "непознато име на обект: „%.*s“"
+
+#: ref-filter.c:372
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "грешка във форма̀та: лексемата %%(end) е използвана без съответната ѝ"
+
+#: ref-filter.c:424
+#, 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:883
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "указателят „%s“ не разполага с %ld компоненти за премахване (:strip)"
+
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "непознато „%.*s“, формат „%s“"
+
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "обектът „%s“ липсва за „%s“"
+
+#: 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“"
+
+#: ref-filter.c:1311
 #, c-format
 msgid "malformed object at '%s'"
 msgstr "обект със сгрешен формат при „%s“"
 
-#: ref-filter.c:1561
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "игнориране на указателя с грешно име „%s“"
+
+#: ref-filter.c:1378
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "игнориране на повредения указател „%s“"
+
+#: ref-filter.c:1651
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "грешка във форма̀та: липсва лексемата %%(end)"
 
-#: ref-filter.c:1615
+#: ref-filter.c:1705
 #, c-format
 msgid "malformed object name %s"
 msgstr "неправилно име на обект „%s“"
 
-#: remote.c:756
+#: remote.c:746
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
 
-#: remote.c:760
+#: remote.c:750
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "„%s“ обикновено следи „%s“, а не „%s“"
 
-#: remote.c:764
+#: remote.c:754
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "„%s“ следи както „%s“, така и „%s“"
 
-#: remote.c:772
+#: remote.c:762
 msgid "Internal error"
 msgstr "Вътрешна грешка"
 
-#: remote.c:1687 remote.c:1730
+#: remote.c:1678 remote.c:1721
 msgid "HEAD does not point to a branch"
 msgstr "Указателят „HEAD“ не сочи към клон"
 
-#: remote.c:1696
+#: remote.c:1687
 #, c-format
 msgid "no such branch: '%s'"
 msgstr "няма клон на име „%s“"
 
-#: remote.c:1699
+#: remote.c:1690
 #, c-format
 msgid "no upstream configured for branch '%s'"
 msgstr "не е зададен клон-източник за клона „%s“"
 
-#: remote.c:1705
+#: remote.c:1696
 #, c-format
 msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "клонът-източник „%s“ не е съхранен като следящ клон"
 
-#: remote.c:1720
+#: remote.c:1711
 #, c-format
 msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 "липсва локален следящ клон за местоположението за изтласкване „%s“ в "
 "хранилището „%s“"
 
-#: remote.c:1735
+#: remote.c:1726
 #, c-format
 msgid "branch '%s' has no remote for pushing"
 msgstr "няма информация клонът „%s“ да следи някой друг"
 
-#: remote.c:1746
+#: remote.c:1737
 #, c-format
 msgid "push refspecs for '%s' do not include '%s'"
 msgstr "указателят за изтласкване на „%s“ не включва „%s“"
 
-#: remote.c:1759
+#: remote.c:1750
 msgid "push has no destination (push.default is 'nothing')"
 msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)"
 
-#: remote.c:1781
+#: remote.c:1772
 msgid "cannot resolve 'simple' push to a single destination"
 msgstr "простото (simple) изтласкване не съответства на една цел"
 
-#: remote.c:2083
+#: remote.c:2074
 #, c-format
 msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
 
-#: remote.c:2087
+#: remote.c:2078
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "  (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
 
-#: remote.c:2090
+#: remote.c:2081
 #, c-format
 msgid "Your branch is up-to-date with '%s'.\n"
 msgstr "Клонът е актуализиран към „%s“.\n"
 
-#: remote.c:2094
+#: remote.c:2085
 #, 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"
 
-#: remote.c:2100
+#: remote.c:2091
 msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr "  (публикувайте локалните си промени чрез „git push“)\n"
 
-#: remote.c:2103
+#: remote.c:2094
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
@@ -1359,11 +1502,11 @@ msgstr[0] ""
 msgstr[1] ""
 "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде тривиално слят.\n"
 
-#: remote.c:2111
+#: remote.c:2102
 msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr "  (обновете локалния си клон чрез „git pull“)\n"
 
-#: remote.c:2114
+#: remote.c:2105
 #, c-format
 msgid ""
 "Your branch and '%s' have diverged,\n"
@@ -1378,28 +1521,28 @@ msgstr[1] ""
 "Текущият клон се е отделил от „%s“,\n"
 "двата имат съответно по %d и %d несъвпадащи подавания.\n"
 
-#: remote.c:2124
+#: remote.c:2115
 msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr "  (слейте отдалечения клон в локалния чрез „git pull“)\n"
 
-#: revision.c:2193
+#: revision.c:2142
 msgid "your current branch appears to be broken"
 msgstr "Текущият клон е повреден"
 
-#: revision.c:2196
+#: revision.c:2145
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Текущият клон „%s“ е без подавания "
 
-#: revision.c:2390
+#: revision.c:2339
 msgid "--first-parent is incompatible with --bisect"
 msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими"
 
-#: run-command.c:90
+#: run-command.c:92
 msgid "open /dev/null failed"
 msgstr "неуспешно отваряне на „/dev/null“"
 
-#: run-command.c:92
+#: run-command.c:94
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "неуспешно изпълнение на dup2(%d,%d)"
@@ -1425,7 +1568,7 @@ msgid "the receiving end does not support --atomic push"
 msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“"
 
 # FIXME git add <path…> for consistence
-#: sequencer.c:183
+#: sequencer.c:174
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1433,7 +1576,7 @@ msgstr ""
 "след коригирането на конфликтите, отбележете съответните\n"
 "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“."
 
-#: sequencer.c:186
+#: sequencer.c:177
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1444,227 +1587,227 @@ msgstr ""
 "подайте резултата с командата „git commit'“."
 
 # FIXME - must be the same as Could not write to '%s' above
-#: sequencer.c:199 sequencer.c:842 sequencer.c:922
+#: sequencer.c:190 sequencer.c:833 sequencer.c:912
 #, c-format
 msgid "Could not write to %s"
 msgstr "„%s“ не може да бъде записан"
 
-#: sequencer.c:202
+#: sequencer.c:193
 #, c-format
 msgid "Error wrapping up %s"
 msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:217
+#: sequencer.c:208
 msgid "Your local changes would be overwritten by cherry-pick."
 msgstr "Локалните ви промени ще бъдат презаписани при отбирането на подавания."
 
-#: sequencer.c:219
+#: sequencer.c:210
 msgid "Your local changes would be overwritten by revert."
 msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания."
 
-#: sequencer.c:222
+#: sequencer.c:213
 msgid "Commit your changes or stash them to proceed."
 msgstr "Подайте или скатайте промените, за да продължите"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:309
+#: sequencer.c:300
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: новият индекс не може да бъде запазен"
 
-#: sequencer.c:327
+#: sequencer.c:318
 msgid "Could not resolve HEAD commit\n"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито\n"
 
-#: sequencer.c:347
+#: sequencer.c:338
 msgid "Unable to update cache tree\n"
 msgstr "Дървото на кеша не може да бъде обновено\n"
 
-#: sequencer.c:399
+#: sequencer.c:390
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Подаването „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:404
+#: sequencer.c:395
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Родителското подаване „%s“ не може да бъде анализирано\n"
 
-#: sequencer.c:469
+#: sequencer.c:460
 msgid "Your index file is unmerged."
 msgstr "Индексът не е слят."
 
-#: sequencer.c:488
+#: sequencer.c:479
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“"
 
-#: sequencer.c:496
+#: sequencer.c:487
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Подаването „%s“ няма родител %d"
 
-#: sequencer.c:500
+#: sequencer.c:491
 #, 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:513
+#: sequencer.c:504
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: неразпозната стойност за родителското подаване „%s“"
 
-#: sequencer.c:517
+#: sequencer.c:508
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Неуспешно извличане на съобщението за подаване на „%s“"
 
-#: sequencer.c:603
+#: sequencer.c:594
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "подаването „%s“… не може да бъде отменено: „%s“"
 
-#: sequencer.c:604
+#: sequencer.c:595
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "подаването „%s“… не може да бъде приложено: „%s“"
 
-#: sequencer.c:639
+#: sequencer.c:630
 msgid "empty commit set passed"
 msgstr "зададено е празно множество от подавания"
 
-#: sequencer.c:647
+#: sequencer.c:638
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: неуспешно изчитане на индекса"
 
-#: sequencer.c:651
+#: sequencer.c:642
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: неуспешно обновяване на индекса"
 
-#: sequencer.c:711
+#: sequencer.c:702
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "По време на „%1$s“ не може да се извърши „%2$s“"
 
-#: sequencer.c:733
+#: sequencer.c:724
 #, c-format
 msgid "Could not parse line %d."
 msgstr "%d-ят ред не може да се анализира."
 
-#: sequencer.c:738
+#: sequencer.c:729
 msgid "No commits parsed."
 msgstr "Никое от подаванията не може да се разпознае."
 
 # FIXME Could not open %s. - full stop for consistence with next message
-#: sequencer.c:750
+#: sequencer.c:741
 #, c-format
 msgid "Could not open %s"
 msgstr "„%s“ не може да се прочете."
 
-#: sequencer.c:754
+#: sequencer.c:745
 #, c-format
 msgid "Could not read %s."
 msgstr "„%s“ не може да се отвори."
 
-#: sequencer.c:761
+#: sequencer.c:752
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва"
 
-#: sequencer.c:791
+#: sequencer.c:782
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Неправилен ключ: „%s“"
 
-#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49
+#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Неправилна стойност за „%s“: „%s“"
 
-#: sequencer.c:804
+#: sequencer.c:795
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Неправилно съдържание на файла с опции: „%s“"
 
-#: sequencer.c:823
+#: sequencer.c:814
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 "в момента вече се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:824
+#: sequencer.c:815
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“"
 
-#: sequencer.c:828
+#: sequencer.c:819
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Директорията за секвенсора „%s“ не може да бъде създадена"
 
-#: sequencer.c:844 sequencer.c:926
+#: sequencer.c:835 sequencer.c:916
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Обработката на „%s“ не завърши успешно."
 
-#: sequencer.c:863 sequencer.c:996
+#: sequencer.c:854 sequencer.c:986
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 "в момента не се извършва отбиране на подавания или пребазиране на клона"
 
-#: sequencer.c:865
+#: sequencer.c:856
 msgid "cannot resolve HEAD"
 msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито"
 
-#: sequencer.c:867
+#: sequencer.c:858
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 "действието не може да бъде преустановено, когато сте на клон, който тепърва "
 "предстои да бъде създаден"
 
-#: sequencer.c:887 builtin/apply.c:4287
+#: sequencer.c:878 builtin/fetch.c:610 builtin/fetch.c:851
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "файлът „%s“ не може да бъде отворен: %s"
+msgid "cannot open %s"
+msgstr "„%s“ не може да бъде отворен"
 
-#: sequencer.c:890
+#: sequencer.c:880
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "файлът „%s“ не може да бъде прочетен: %s"
 
-#: sequencer.c:891
+#: sequencer.c:881
 msgid "unexpected end of file"
 msgstr "неочакван край на файл"
 
-#: sequencer.c:897
+#: sequencer.c:887
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 "запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е "
 "повреден"
 
-#: sequencer.c:919
+#: sequencer.c:909
 #, c-format
 msgid "Could not format %s."
 msgstr "Файлът „%s“ не може да се форматира по подходящия начин."
 
-#: sequencer.c:1064
+#: sequencer.c:1054
 #, c-format
 msgid "%s: can't cherry-pick a %s"
 msgstr "%s: не може да се отбере „%s“"
 
-#: sequencer.c:1067
+#: sequencer.c:1057
 #, c-format
 msgid "%s: bad revision"
 msgstr "%s: неправилна версия"
 
-#: sequencer.c:1101
+#: sequencer.c:1091
 msgid "Can't revert as initial commit"
 msgstr "Първоначалното подаване не може да бъде отменено"
 
-#: sequencer.c:1102
+#: sequencer.c:1092
 msgid "Can't cherry-pick into empty head"
 msgstr "При празен връх не могат да се отбират подавания"
 
@@ -1673,7 +1816,35 @@ msgstr "При празен връх не могат да се отбират п
 msgid "failed to read %s"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: sha1_name.c:463
+#: 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 "открити са непознати разширения в хранилището:"
+
+#: sha1_file.c:1080
+msgid "offset before end of packfile (broken .idx?)"
+msgstr ""
+"отместване преди края на пакетния файл (възможно е индексът да е повреден)"
+
+#: sha1_file.c:2458
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr ""
+"отместване преди началото на индекса на пакетния файл „%s“ (възможно е "
+"индексът да е повреден)"
+
+#: sha1_file.c:2462
+#, 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"
@@ -1697,67 +1868,315 @@ msgstr ""
 "спрете това съобщение като изпълните командата:\n"
 "„git config advice.objectNameWarning false“"
 
-#: submodule.c:61 submodule.c:95
+#: submodule.c:64 submodule.c:98
 msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
 "Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
 "коригирайте конфликтите"
 
-#: submodule.c:65 submodule.c:99
+#: submodule.c:68 submodule.c:102
 #, c-format
 msgid "Could not find section in .gitmodules where path=%s"
 msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
 
-#: submodule.c:73
+#: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
 
-#: submodule.c:106
+#: submodule.c:109
 #, c-format
 msgid "Could not remove .gitmodules entry for %s"
 msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
 
-#: submodule.c:117
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
 msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса"
 
-#: submodule.c:1040
+#: submodule.c:177
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "Настройката „submodule.fetchJobs“ не приема отрицателни стойности"
+
+#: submodule-config.c:355
 #, c-format
-msgid "Could not set core.worktree in %s"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80ойкаÑ\82а â\80\9ecore.worktreeâ\80\9c Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð·Ð°Ð´Ð°Ð´Ðµ Ð² „%s“"
+msgid "invalid value for %s"
+msgstr "Ð\9dепÑ\80авилна Ñ\81Ñ\82ойноÑ\81Ñ\82 Ð·Ð° „%s“"
 
-#: trailer.c:491 trailer.c:495 trailer.c:499 trailer.c:553 trailer.c:557
-#: trailer.c:561
+#: trailer.c:237
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "неуспешно изпълнение на завършващата команда „%s“"
+
+#: 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 "неправилна стойност „%s“ за настройката „%s“"
 
-#: trailer.c:543 trailer.c:548 builtin/remote.c:296
+#: trailer.c:544 trailer.c:549 builtin/remote.c:289
 #, c-format
 msgid "more than one %s"
 msgstr "стойността „%s“ се повтаря в настройките"
 
-#: trailer.c:581
+#: trailer.c:582
 #, c-format
 msgid "empty trailer token in trailer '%.*s'"
 msgstr "празна завършваща лексема в епилога „%.*s“"
 
-#: trailer.c:701
+#: trailer.c:702
 #, c-format
 msgid "could not read input file '%s'"
 msgstr "входният файл „%s“ не може да бъде прочетен"
 
-#: trailer.c:704
+#: trailer.c:705
 msgid "could not read from stdin"
 msgstr "от стандартния вход не може да се чете"
 
-#: transport-helper.c:1025
+#: trailer.c:857 builtin/am.c:42
+#, c-format
+msgid "could not stat %s"
+msgstr "Не може да се получи информация чрез „stat“ за „%s“"
+
+#: trailer.c:859
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "„%s“ не е обикновен файл"
+
+#: trailer.c:861
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "„%s“: няма права за записване на файла"
+
+#: trailer.c:873
+msgid "could not open temporary file"
+msgstr "временният файл не може да се отвори"
+
+#: trailer.c:912
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "временният файл не може да се преименува на „%s“"
+
+#: transport-helper.c:1041
 #, c-format
 msgid "Could not read ref %s"
 msgstr "Указателят „%s“ не може да се прочете."
 
-#: unpack-trees.c:203
+#: 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Подайте или скатайте промените, за да преминете към нов клон."
+
+#: unpack-trees.c:66
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"Изтеглянето ще презапише локалните промени на тези файлове:\n"
+"%%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 can merge."
+msgstr ""
+"Сливането ще презапише локалните промени на тези файлове:\n"
+"%%sПодайте или скатайте промените, за да слеете."
+
+#: unpack-trees.c:71
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Сливането ще презапише локалните промени на тези файлове:\n"
+"%%s"
+
+#: 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“."
+
+#: 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"
+
+#: unpack-trees.c:81
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"Обновяването на тези директории ще изтрие неследените файлове в тях:\n"
+"%s"
+
+#: 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Преместете ги или ги изтрийте, за да преминете на друг клон."
+
+#: unpack-trees.c:87
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"Изтеглянето ще изтрие тези неследени файлове в работното дърво:\n"
+"%%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 can merge."
+msgstr ""
+"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да слеете."
+
+#: unpack-trees.c:92
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"Сливането ще изтрие тези неследени файлове в работното дърво:\n"
+"%%s"
+
+#: 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 can %s."
+msgstr ""
+"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да извършите „%s“."
+
+#: unpack-trees.c:97
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"„%s“ ще изтрие тези неследени файлове в работното дърво:\n"
+"%%s"
+
+#: 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 can switch branches."
+msgstr ""
+"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да смените клон."
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"Изтеглянето ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
+
+#: 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 can merge."
+msgstr ""
+"Сливането ще презапише тези неследени файлове в работното дърво:\n"
+"%%sПреместете ги или ги изтрийте, за да слеете."
+
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Сливането ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
+
+#: unpack-trees.c:112
+#, 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“."
+
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"„%s“ ще презапише тези неследени файлове в работното дърво:\n"
+"%%s"
+
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Записът за „%s“ съвпада с този за „%s“. Не може да се присвои."
+
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"Частичното изтегляне не може да бъде обновено: следните записи не са "
+"актуални:\n"
+"%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"
+
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following Working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Обновяването на частичното изтегляне ще изтрие тези файлове в работното "
+"дърво:\n"
+"%s"
+
+#: unpack-trees.c:205
+#, c-format
+msgid "Aborting\n"
+msgstr "Преустановяване на действието\n"
+
+#: unpack-trees.c:237
 msgid "Checking out files"
 msgstr "Изтегляне на файлове"
 
@@ -1790,210 +2209,206 @@ msgstr "неправилен номер на порт"
 msgid "invalid '..' path segment"
 msgstr "неправилна част от пътя „..“"
 
-#: wrapper.c:219 wrapper.c:362
+#: wrapper.c:222 wrapper.c:381
 #, c-format
 msgid "could not open '%s' for reading and writing"
 msgstr "„%s“ не може да бъде отворен и за четене, и за запис"
 
-#: wrapper.c:221 wrapper.c:364
+#: wrapper.c:224 wrapper.c:383 builtin/am.c:779
 #, c-format
 msgid "could not open '%s' for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
 
-#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
-#: builtin/merge.c:1074 builtin/pull.c:380
+#: 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
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "файлът не може да бъде прочетен: „%s“"
 
-#: wrapper.c:579
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr "няма достъп до „%s“: %s"
-
-#: wrapper.c:600
+#: wrapper.c:594 wrapper.c:615
 #, c-format
 msgid "unable to access '%s'"
 msgstr "няма достъп до „%s“"
 
-#: wrapper.c:608
+#: wrapper.c:623
 msgid "unable to get current working directory"
 msgstr "текущата работна директория е недостъпна"
 
-#: wrapper.c:635
+#: wrapper.c:650
 #, c-format
 msgid "could not open %s for writing"
 msgstr "„%s“ не може да бъде отворен за запис"
 
 # FIXME - must be the same as Could not write to '%s' above
-#: wrapper.c:646 builtin/am.c:425
+#: wrapper.c:661 builtin/am.c:410
 #, c-format
 msgid "could not write to %s"
 msgstr "„%s“ не може да бъде записан"
 
-#: wrapper.c:652
+#: wrapper.c:667
 #, c-format
 msgid "could not close %s"
 msgstr "„%s“ не може да се затвори"
 
-#: wt-status.c:149
+#: wt-status.c:150
 msgid "Unmerged paths:"
 msgstr "Неслети пътища:"
 
-#: wt-status.c:176 wt-status.c:203
+#: wt-status.c:177 wt-status.c:204
 #, c-format
 msgid "  (use \"git reset %s <file>...\" to unstage)"
 msgstr "  (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:178 wt-status.c:205
+#: wt-status.c:179 wt-status.c:206
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
 "  (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
 
-#: wt-status.c:182
+#: wt-status.c:183
 msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:184 wt-status.c:188
+#: wt-status.c:185 wt-status.c:189
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
 "конфликта)"
 
-#: wt-status.c:186
+#: wt-status.c:187
 msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
 "  (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
 
-#: wt-status.c:197 wt-status.c:880
+#: wt-status.c:198 wt-status.c:881
 msgid "Changes to be committed:"
 msgstr "Промени, които ще бъдат подадени:"
 
-#: wt-status.c:215 wt-status.c:889
+#: wt-status.c:216 wt-status.c:890
 msgid "Changes not staged for commit:"
 msgstr "Промени, които не са в индекса за подаване:"
 
-#: wt-status.c:219
+#: wt-status.c:220
 msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:221
+#: wt-status.c:222
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
 "  (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
 
-#: wt-status.c:222
+#: wt-status.c:223
 msgid ""
 "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
 "  (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
 "работното дърво)"
 
-#: wt-status.c:224
+#: wt-status.c:225
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 "  (подайте или отхвърлете неследеното или промененото съдържание в "
 "подмодулите)"
 
-#: wt-status.c:236
+#: wt-status.c:237
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 "  (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
 
-#: wt-status.c:251
+#: wt-status.c:252
 msgid "both deleted:"
 msgstr "изтрити в двата случая:"
 
-#: wt-status.c:253
+#: wt-status.c:254
 msgid "added by us:"
 msgstr "добавени от вас:"
 
-#: wt-status.c:255
+#: wt-status.c:256
 msgid "deleted by them:"
 msgstr "изтрити от тях:"
 
-#: wt-status.c:257
+#: wt-status.c:258
 msgid "added by them:"
 msgstr "добавени от тях:"
 
-#: wt-status.c:259
+#: wt-status.c:260
 msgid "deleted by us:"
 msgstr "изтрити от вас:"
 
-#: wt-status.c:261
+#: wt-status.c:262
 msgid "both added:"
 msgstr "добавени и в двата случая:"
 
-#: wt-status.c:263
+#: wt-status.c:264
 msgid "both modified:"
 msgstr "променени и в двата случая:"
 
-#: wt-status.c:265
+#: wt-status.c:266
 #, c-format
 msgid "bug: unhandled unmerged status %x"
 msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
 
-#: wt-status.c:273
+#: wt-status.c:274
 msgid "new file:"
 msgstr "нов файл:"
 
-#: wt-status.c:275
+#: wt-status.c:276
 msgid "copied:"
 msgstr "копиран:"
 
-#: wt-status.c:277
+#: wt-status.c:278
 msgid "deleted:"
 msgstr "изтрит:"
 
-#: wt-status.c:279
+#: wt-status.c:280
 msgid "modified:"
 msgstr "променен:"
 
-#: wt-status.c:281
+#: wt-status.c:282
 msgid "renamed:"
 msgstr "преименуван:"
 
-#: wt-status.c:283
+#: wt-status.c:284
 msgid "typechange:"
 msgstr "смяна на вида:"
 
-#: wt-status.c:285
+#: wt-status.c:286
 msgid "unknown:"
 msgstr "непозната промяна:"
 
-#: wt-status.c:287
+#: wt-status.c:288
 msgid "unmerged:"
 msgstr "неслят:"
 
-#: wt-status.c:369
+#: wt-status.c:370
 msgid "new commits, "
 msgstr "нови подавания, "
 
-#: wt-status.c:371
+#: wt-status.c:372
 msgid "modified content, "
 msgstr "променено съдържание, "
 
-#: wt-status.c:373
+#: wt-status.c:374
 msgid "untracked content, "
 msgstr "неследено съдържание, "
 
-#: wt-status.c:390
+#: wt-status.c:391
 #, c-format
 msgid "bug: unhandled diff status %c"
 msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
 
-#: wt-status.c:754
+#: wt-status.c:755
 msgid "Submodules changed but not updated:"
 msgstr "Подмодулите са променени, но не са обновени:"
 
-#: wt-status.c:756
+#: wt-status.c:757
 msgid "Submodule changes to be committed:"
 msgstr "Промени в подмодулите за подаване:"
 
-#: wt-status.c:837
+#: wt-status.c:838
 msgid ""
 "Do not touch the line above.\n"
 "Everything below will be removed."
@@ -2001,39 +2416,39 @@ msgstr ""
 "Не променяйте горния ред.\n"
 "Всичко отдолу ще бъде изтрито."
 
-#: wt-status.c:948
+#: wt-status.c:949
 msgid "You have unmerged paths."
 msgstr "Някои пътища не са слети."
 
-#: wt-status.c:951
+#: wt-status.c:952
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git commit“)"
 
-#: wt-status.c:954
+#: wt-status.c:956
 msgid "All conflicts fixed but you are still merging."
 msgstr "Всички конфликти са решени, но продължавате сливането."
 
-#: wt-status.c:957
+#: wt-status.c:959
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (използвайте „git commit“, за да завършите сливането)"
 
-#: wt-status.c:967
+#: wt-status.c:969
 msgid "You are in the middle of an am session."
 msgstr "В момента прилагате поредица от кръпки чрез „git am“."
 
-#: wt-status.c:970
+#: wt-status.c:972
 msgid "The current patch is empty."
 msgstr "Текущата кръпка е празна."
 
-#: wt-status.c:974
+#: wt-status.c:976
 msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr "  (коригирайте конфликтите и изпълнете „git am --continue“)"
 
-#: wt-status.c:976
+#: wt-status.c:978
 msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr "  (използвайте „git am --skip“, за да пропуснете тази кръпка)"
 
-#: wt-status.c:978
+#: wt-status.c:980
 msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 "  (използвайте „git am --abort“, за да възстановите първоначалния клон)"
@@ -2187,43 +2602,43 @@ msgstr ""
 "  (използвайте „git bisect reset“, за да се върнете към първоначалното "
 "състояние и клон)"
 
-#: wt-status.c:1438
+#: wt-status.c:1460
 msgid "On branch "
 msgstr "На клон "
 
-#: wt-status.c:1444
+#: wt-status.c:1466
 msgid "interactive rebase in progress; onto "
 msgstr "извършвате интерактивно пребазиране върху "
 
-#: wt-status.c:1446
+#: wt-status.c:1468
 msgid "rebase in progress; onto "
 msgstr "извършвате пребазиране върху "
 
-#: wt-status.c:1451
+#: wt-status.c:1473
 msgid "HEAD detached at "
 msgstr "Указателят „HEAD“ не е свързан и е при "
 
-#: wt-status.c:1453
+#: wt-status.c:1475
 msgid "HEAD detached from "
 msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
 
-#: wt-status.c:1456
+#: wt-status.c:1478
 msgid "Not currently on any branch."
 msgstr "Извън всички клони."
 
-#: wt-status.c:1474
+#: wt-status.c:1496
 msgid "Initial commit"
 msgstr "Първоначално подаване"
 
-#: wt-status.c:1488
+#: wt-status.c:1510
 msgid "Untracked files"
 msgstr "Неследени файлове"
 
-#: wt-status.c:1490
+#: wt-status.c:1512
 msgid "Ignored files"
 msgstr "Игнорирани файлове"
 
-#: wt-status.c:1494
+#: wt-status.c:1516
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -2235,32 +2650,32 @@ msgstr ""
 "изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
 "За повече подробности погледнете „git status help“."
 
-#: wt-status.c:1500
+#: wt-status.c:1522
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Неследените файлове не са изведени%s"
 
-#: wt-status.c:1502
+#: wt-status.c:1524
 msgid " (use -u option to show untracked files)"
 msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
 
-#: wt-status.c:1508
+#: wt-status.c:1530
 msgid "No changes"
 msgstr "Няма промени"
 
-#: wt-status.c:1513
+#: wt-status.c:1535
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "към индекса за подаване не са добавени промени (използвайте „git add“ и/или "
 "„git commit -a“)\n"
 
-#: wt-status.c:1516
+#: wt-status.c:1538
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "към индекса за подаване не са добавени промени\n"
 
-#: wt-status.c:1519
+#: wt-status.c:1541
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -2269,52 +2684,56 @@ msgstr ""
 "към индекса за подаване не са добавени промени, но има нови файлове "
 "(използвайте „git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1522
+#: wt-status.c:1544
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
 
-#: wt-status.c:1525
+#: wt-status.c:1547
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
 "„git add“, за да започне тяхното следене)\n"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: wt-status.c:1550 wt-status.c:1555
 #, c-format
 msgid "nothing to commit\n"
 msgstr "липсват каквито и да е промени\n"
 
-#: wt-status.c:1531
+#: wt-status.c:1553
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
 "неследените файлове)\n"
 
-#: wt-status.c:1535
+#: wt-status.c:1557
 #, c-format
 msgid "nothing to commit, working directory clean\n"
 msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
 
-#: wt-status.c:1642
+#: wt-status.c:1664
 msgid "Initial commit on "
 msgstr "Първоначално подаване на клон"
 
-#: wt-status.c:1646
+#: wt-status.c:1668
 msgid "HEAD (no branch)"
 msgstr "HEAD (извън клон)"
 
-#: wt-status.c:1675
+#: wt-status.c:1697
 msgid "gone"
 msgstr "изтрит"
 
-#: wt-status.c:1677 wt-status.c:1685
+#: wt-status.c:1699 wt-status.c:1707
 msgid "behind "
 msgstr "назад с "
 
-#: compat/precompose_utf8.c:56 builtin/clone.c:408
+#: wt-status.c:1702 wt-status.c:1705
+msgid "ahead "
+msgstr "напред с "
+
+#: compat/precompose_utf8.c:57 builtin/clone.c:415
 #, c-format
 msgid "failed to unlink '%s'"
 msgstr "неуспешно изтриване на „%s“"
@@ -2328,7 +2747,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…"
 msgid "unexpected diff status %c"
 msgstr "неочакван изходен код при генериране на разлика: %c"
 
-#: builtin/add.c:70 builtin/commit.c:278
+#: builtin/add.c:70 builtin/commit.c:280
 msgid "updating files failed"
 msgstr "неуспешно обновяване на файловете"
 
@@ -2341,7 +2760,7 @@ msgstr "изтриване на „%s“\n"
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
 
-#: builtin/add.c:194 builtin/rev-parse.c:796
+#: builtin/add.c:194 builtin/rev-parse.c:811
 msgid "Could not read the index"
 msgstr "Индексът не може да бъде прочетен"
 
@@ -2377,15 +2796,15 @@ msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
 
-#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
-#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
-#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
+#: 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ние"
 
-#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
+#: 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 "повече подробности"
 
@@ -2393,7 +2812,7 @@ msgstr "повече подробности"
 msgid "interactive picking"
 msgstr "интерактивно отбиране на промени"
 
-#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
+#: builtin/add.c:253 builtin/checkout.c:1154 builtin/reset.c:286
 msgid "select hunks interactively"
 msgstr "интерактивен избор на парчета код"
 
@@ -2465,138 +2884,123 @@ msgstr "Нищо не е зададено и нищо не е добавено.\
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Вероятно искахте да използвате „git add .“?\n"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
-#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:40
+#: 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 "файлът с индекса е повреден"
 
-#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
+#: builtin/add.c:439 builtin/apply.c:4661 builtin/mv.c:283 builtin/rm.c:430
 msgid "Unable to write new index file"
 msgstr "Новият индекс не може да бъде записан"
 
-#: builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "Не може да се получи информация чрез „stat“ за „%s“"
-
-#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
+#: builtin/am.c:256 builtin/commit.c:749 builtin/merge.c:1089
 #, c-format
 msgid "could not read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/am.c:445
+#: builtin/am.c:430
 msgid "could not parse author script"
 msgstr "скриптът за автор не може да се анализира"
 
-#: builtin/am.c:522
+#: builtin/am.c:507
 #, c-format
 msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr "„%s“ бе изтрит от куката „applypatch-msg“"
 
-#: builtin/am.c:563 builtin/notes.c:300
+#: builtin/am.c:548 builtin/notes.c:300
 #, c-format
 msgid "Malformed input line: '%s'."
 msgstr "Даденият входен ред е с неправилен формат: „%s“."
 
-#: builtin/am.c:600 builtin/notes.c:315
+#: builtin/am.c:585 builtin/notes.c:315
 #, c-format
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Бележката не може да се копира от „%s“ към „%s“"
 
-#: builtin/am.c:626
+#: builtin/am.c:611
 msgid "fseek failed"
 msgstr "неуспешно изпълнение на „fseek“"
 
-#: builtin/am.c:787 builtin/am.c:875
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "„%s“ не може да бъде отворен за четене: %s"
-
-#: builtin/am.c:794
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "„%s“ не може да бъде отворен за запис: %s"
-
-#: builtin/am.c:803
+#: builtin/am.c:788
 #, c-format
 msgid "could not parse patch '%s'"
 msgstr "кръпката „%s“ не може да се анализира"
 
-#: builtin/am.c:868
+#: builtin/am.c:853
 msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 "Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент"
 
-#: builtin/am.c:916
+#: builtin/am.c:900
 msgid "invalid timestamp"
 msgstr "неправилна стойност за време"
 
-#: builtin/am.c:919 builtin/am.c:927
+#: builtin/am.c:903 builtin/am.c:911
 msgid "invalid Date line"
 msgstr "неправилен ред за дата „Date“"
 
-#: builtin/am.c:924
+#: builtin/am.c:908
 msgid "invalid timezone offset"
 msgstr "неправилно отместване на часовия пояс"
 
-#: builtin/am.c:1011
+#: builtin/am.c:995
 msgid "Patch format detection failed."
 msgstr "Форматът на кръпката не може да бъде определен."
 
-#: builtin/am.c:1016 builtin/clone.c:373
+#: builtin/am.c:1000 builtin/clone.c:380
 #, c-format
 msgid "failed to create directory '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/am.c:1020
+#: builtin/am.c:1004
 msgid "Failed to split patches."
 msgstr "Кръпките не могат да бъдат разделени."
 
-#: builtin/am.c:1152 builtin/commit.c:363
+#: builtin/am.c:1136 builtin/commit.c:365
 msgid "unable to write index file"
 msgstr "индексът не може да бъде записан"
 
-#: builtin/am.c:1203
+#: builtin/am.c:1187
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr "След коригирането на този проблем изпълнете „%s --continue“."
 
-#: builtin/am.c:1204
+#: builtin/am.c:1188
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“."
 
-#: builtin/am.c:1205
+#: builtin/am.c:1189
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“."
 
-#: builtin/am.c:1343
+#: builtin/am.c:1327
 msgid "Patch is empty. Was it split wrong?"
 msgstr "Празна кръпка. Дали не е разделена погрешно?"
 
-#: builtin/am.c:1417 builtin/log.c:1347
+#: builtin/am.c:1401 builtin/log.c:1516
 #, c-format
 msgid "invalid ident line: %s"
 msgstr "грешна идентичност: %s"
 
-#: builtin/am.c:1444
+#: builtin/am.c:1428
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "подаването не може да бъде анализирано: %s"
 
-#: builtin/am.c:1646
+#: builtin/am.c:1630
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 "В хранилището липсват необходимите обекти BLOB, за да се премине към тройно "
 "сливане."
 
-#: builtin/am.c:1648
+#: builtin/am.c:1632
 msgid "Using index info to reconstruct a base tree..."
 msgstr "Базовото дърво се реконструира от информацията в индекса…"
 
-#: builtin/am.c:1667
+#: builtin/am.c:1651
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
@@ -2604,39 +3008,39 @@ msgstr ""
 "Кръпката не може да се приложи към обектите BLOB в индекса.\n"
 "Да не би да сте я редактирали на ръка?"
 
-#: builtin/am.c:1673
+#: builtin/am.c:1657
 msgid "Falling back to patching base and 3-way merge..."
 msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…"
 
-#: builtin/am.c:1688
+#: builtin/am.c:1672
 msgid "Failed to merge in the changes."
 msgstr "Неуспешно сливане на промените."
 
-#: builtin/am.c:1712 builtin/merge.c:632
+#: builtin/am.c:1696 builtin/merge.c:636
 msgid "git write-tree failed to write a tree"
 msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
 
-#: builtin/am.c:1719
+#: builtin/am.c:1703
 msgid "applying to an empty history"
 msgstr "прилагане върху празна история"
 
-#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
-#: builtin/merge.c:854
+#: builtin/am.c:1716 builtin/commit.c:1775 builtin/merge.c:841
+#: builtin/merge.c:866
 msgid "failed to write commit object"
 msgstr "обектът за подаването не може да бъде записан"
 
-#: builtin/am.c:1764 builtin/am.c:1768
+#: builtin/am.c:1748 builtin/am.c:1752
 #, c-format
 msgid "cannot resume: %s does not exist."
 msgstr "не може да се продължи — „%s“ не съществува."
 
-#: builtin/am.c:1784
+#: builtin/am.c:1768
 msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 "За интерактивно изпълнение е необходимо стандартният\n"
 "изход да е свързан с терминал, а в момента не е."
 
-#: builtin/am.c:1789
+#: builtin/am.c:1773
 msgid "Commit Body is:"
 msgstr "Тялото на кръпката за прилагане е:"
 
@@ -2644,38 +3048,38 @@ msgstr "Тялото на кръпката за прилагане е:"
 #. in your translation. The program will only accept English
 #. input at this point.
 #.
-#: builtin/am.c:1799
+#: builtin/am.c:1783
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 msgstr ""
 "Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане "
 "на всичко:"
 
-#: builtin/am.c:1849
+#: builtin/am.c:1833
 #, c-format
 msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr ""
 "Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)"
 
-#: builtin/am.c:1884 builtin/am.c:1955
+#: builtin/am.c:1868 builtin/am.c:1940
 #, c-format
 msgid "Applying: %.*s"
 msgstr "Прилагане: %.*s"
 
-#: builtin/am.c:1900
+#: builtin/am.c:1884
 msgid "No changes -- Patch already applied."
 msgstr "Без промени — кръпката вече е приложена."
 
-#: builtin/am.c:1908
+#: builtin/am.c:1892
 #, c-format
 msgid "Patch failed at %s %.*s"
 msgstr "Неуспешно прилагане на кръпка при %s %.*s“"
 
-#: builtin/am.c:1914
+#: builtin/am.c:1898
 #, c-format
 msgid "The copy of the patch that failed is found in: %s"
 msgstr "Дубликат на проблемната кръпка се намира в: %s"
 
-#: builtin/am.c:1958
+#: 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"
@@ -2685,7 +3089,7 @@ msgstr ""
 "Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n"
 "кръпка е довела до същите промени и в такъв случай просто пропуснете тази."
 
-#: builtin/am.c:1965
+#: builtin/am.c:1950
 msgid ""
 "You still have unmerged paths in your index.\n"
 "Did you forget to use 'git add'?"
@@ -2693,17 +3097,17 @@ msgstr ""
 "Индексът все още съдържа неслети промени.\n"
 "Възможно е да не сте изпълнили „git add“."
 
-#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
+#: builtin/am.c:2058 builtin/am.c:2062 builtin/am.c:2074 builtin/reset.c:308
 #: builtin/reset.c:316
 #, c-format
 msgid "Could not parse object '%s'."
 msgstr "„%s“ не е разпознат като обект."
 
-#: builtin/am.c:2125
+#: builtin/am.c:2110
 msgid "failed to clean index"
 msgstr "индексът не може да бъде изчистен"
 
-#: builtin/am.c:2159
+#: builtin/am.c:2144
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
@@ -2714,157 +3118,159 @@ msgstr ""
 "към\n"
 "„ORIG_HEAD“"
 
-#: builtin/am.c:2220
+#: builtin/am.c:2205
 #, c-format
 msgid "Invalid value for --patch-format: %s"
 msgstr "Неправилна стойност за „--patch-format“: „%s“"
 
-#: builtin/am.c:2253
+#: builtin/am.c:2238
 msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
 msgstr "git am [ОПЦИЯ…] [ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА]…"
 
-#: builtin/am.c:2254
+#: builtin/am.c:2239
 msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)"
 
-#: builtin/am.c:2260
+#: builtin/am.c:2245
 msgid "run interactively"
 msgstr "интерактивна работа"
 
-#: builtin/am.c:2262
+#: builtin/am.c:2247
 msgid "historical option -- no-op"
 msgstr "изоставена опция, съществува по исторически причини, нищо не прави"
 
-#: builtin/am.c:2264
+#: builtin/am.c:2249
 msgid "allow fall back on 3way merging if needed"
 msgstr "да се преминава към тройно сливане при нужда."
 
-#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
+#: builtin/am.c:2250 builtin/init-db.c:478 builtin/prune-packed.c:57
 #: builtin/repack.c:171
 msgid "be quiet"
 msgstr "без извеждане на информация"
 
-#: builtin/am.c:2267
+#: builtin/am.c:2252
 msgid "add a Signed-off-by line to the commit message"
 msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване"
 
-#: builtin/am.c:2270
+#: builtin/am.c:2255
 msgid "recode into utf8 (default)"
 msgstr "прекодиране в UTF-8 (стандартно)"
 
-#: builtin/am.c:2272
+#: builtin/am.c:2257
 msgid "pass -k flag to git-mailinfo"
 msgstr "подаване на опцията „-k“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2274
+#: builtin/am.c:2259
 msgid "pass -b flag to git-mailinfo"
 msgstr "подаване на опцията „-b“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2276
+#: builtin/am.c:2261
 msgid "pass -m flag to git-mailinfo"
 msgstr "подаване на опцията „-m“ на командата „git-mailinfo“"
 
-#: builtin/am.c:2278
+#: builtin/am.c:2263
 msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
 "подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“"
 
-#: builtin/am.c:2281
+#: 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“"
 
-#: builtin/am.c:2284
+#: builtin/am.c:2269
 msgid "strip everything before a scissors line"
 msgstr "пропускане на всичко преди реда за отрязване"
 
-#: builtin/am.c:2285 builtin/apply.c:4554
+#: builtin/am.c:2270 builtin/apply.c:4546
 msgid "action"
 msgstr "действие"
 
-#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
-#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
-#: builtin/am.c:2313
+#: 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“"
 
-#: builtin/am.c:2294 builtin/apply.c:4578
+#: builtin/am.c:2279 builtin/apply.c:4570
 msgid "root"
 msgstr "НАЧАЛНА_ДИРЕКТОРИЯ"
 
-#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
-#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
-#: builtin/pull.c:167 builtin/submodule--helper.c:78
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
+#: 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 "път"
 
-#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: 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 "БРОЙ"
 
-#: builtin/am.c:2306 builtin/apply.c:4522
+#: builtin/am.c:2291 builtin/apply.c:4514
 msgid "num"
 msgstr "БРОЙ"
 
-#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/am.c:2294 builtin/for-each-ref.c:37 builtin/replace.c:438
 #: builtin/tag.c:372
 msgid "format"
 msgstr "ФОРМАТ"
 
-#: builtin/am.c:2310
+#: builtin/am.c:2295
 msgid "format the patch(es) are in"
 msgstr "формат на кръпките"
 
-#: builtin/am.c:2316
+#: builtin/am.c:2301
 msgid "override error message when patch failure occurs"
 msgstr "избрано от вас съобщение за грешка при прилагане на кръпки"
 
-#: builtin/am.c:2318
+#: builtin/am.c:2303
 msgid "continue applying patches after resolving a conflict"
 msgstr "продължаване на прилагането на кръпки след коригирането на конфликт"
 
-#: builtin/am.c:2321
+#: builtin/am.c:2306
 msgid "synonyms for --continue"
 msgstr "синоними на „--continue“"
 
-#: builtin/am.c:2324
+#: builtin/am.c:2309
 msgid "skip the current patch"
 msgstr "прескачане на текущата кръпка"
 
-#: builtin/am.c:2327
+#: builtin/am.c:2312
 msgid "restore the original branch and abort the patching operation."
 msgstr ""
 "възстановяване на първоначалното състояние на клона и преустановяване на "
 "прилагането на кръпката."
 
-#: builtin/am.c:2331
+#: builtin/am.c:2316
 msgid "lie about committer date"
-msgstr "даÑ\82а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ñ\80азлиÑ\87на Ð¾Ñ\82 Ð¿Ñ\8aÑ\80вонаÑ\87алнота"
+msgstr "даÑ\82а Ð·Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ Ñ\80азлиÑ\87на Ð¾Ñ\82 Ð¿Ñ\8aÑ\80вонаÑ\87алната"
 
-#: builtin/am.c:2333
+#: builtin/am.c:2318
 msgid "use current timestamp for author date"
 msgstr "използване на текущото време като това за автор"
 
-#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
+#: 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 "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
 
-#: builtin/am.c:2336
+#: builtin/am.c:2321
 msgid "GPG-sign commits"
 msgstr "подписване на подаванията с GPG"
 
-#: builtin/am.c:2339
+#: builtin/am.c:2324
 msgid "(internal use for git-rebase)"
 msgstr "(ползва се вътрешно за „git-rebase“)"
 
-#: builtin/am.c:2354
+#: 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."
@@ -2872,18 +3278,18 @@ msgstr ""
 "Опциите „-b“/„--binary“ отдавна не правят нищо и\n"
 "ще бъдат премахнати в бъдеще. Не ги ползвайте."
 
-#: builtin/am.c:2361
+#: builtin/am.c:2346
 msgid "failed to read the index"
 msgstr "неуспешно изчитане на индекса"
 
-#: builtin/am.c:2376
+#: builtin/am.c:2361
 #, c-format
 msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 "предишната директория за пребазиране „%s“ все още съществува, а е зададен "
 "файл „mbox“."
 
-#: builtin/am.c:2400
+#: builtin/am.c:2385
 #, c-format
 msgid ""
 "Stray %s directory found.\n"
@@ -2892,7 +3298,7 @@ msgstr ""
 "Открита е излишна директория „%s“.\n"
 "Можете да я изтриете с командата „git am --abort“."
 
-#: builtin/am.c:2406
+#: builtin/am.c:2391
 msgid "Resolve operation not in progress, we are not resuming."
 msgstr "В момента не тече операция по коригиране и няма как да се продължи."
 
@@ -2925,45 +3331,45 @@ msgstr "Регулярният израз върна %d при подадена
 msgid "unable to find filename in patch at line %d"
 msgstr "Липсва име на файл на ред %d от кръпката"
 
-#: builtin/apply.c:940
+#: 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“ — на ред %2$d се очакваше „/dev/"
 "null“, а бе получен „%1$s“"
 
-#: builtin/apply.c:944
+#: 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/apply.c:945
+#: 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/apply.c:952
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 "git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/"
 "null“"
 
-#: builtin/apply.c:1415
+#: builtin/apply.c:1406
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“"
 
-#: builtin/apply.c:1472
+#: builtin/apply.c:1463
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "част от кръпка без заглавна част на ред %d: %.*s"
 
-#: builtin/apply.c:1489
+#: builtin/apply.c:1480
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -2978,65 +3384,65 @@ msgstr[1] ""
 "След съкращаването на първите %d части от компонентите на пътя, в заглавната "
 "част на „git diff“ липсва информация за име на файл (ред: %d)"
 
-#: builtin/apply.c:1655
+#: builtin/apply.c:1646
 msgid "new file depends on old contents"
 msgstr "новият файл зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1657
+#: builtin/apply.c:1648
 msgid "deleted file still has contents"
 msgstr "изтритият файл не е празен"
 
-#: builtin/apply.c:1683
+#: builtin/apply.c:1674
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "грешка в кръпката на ред %d"
 
-#: builtin/apply.c:1719
+#: builtin/apply.c:1710
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "новият файл „%s“ зависи от старото съдържание на файла"
 
-#: builtin/apply.c:1721
+#: builtin/apply.c:1712
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "изтритият файл „%s“ не е празен"
 
-#: builtin/apply.c:1724
+#: builtin/apply.c:1715
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
 
-#: builtin/apply.c:1870
+#: builtin/apply.c:1861
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "грешка в двоичната кръпка на ред %d: %.*s"
 
-#: builtin/apply.c:1899
+#: builtin/apply.c:1895
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "неразпозната двоичната кръпка на ред %d"
 
-#: builtin/apply.c:2050
+#: builtin/apply.c:2048
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "кръпката е с изцяло повредени данни на ред %d"
 
-#: builtin/apply.c:2140
+#: builtin/apply.c:2138
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "символната връзка „%s“ не може да бъде прочетена"
 
-#: builtin/apply.c:2144
+#: builtin/apply.c:2142
 #, c-format
 msgid "unable to open or read %s"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/apply.c:2777
+#: builtin/apply.c:2775
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "неправилно начало на ред: „%c“"
 
-#: builtin/apply.c:2896
+#: builtin/apply.c:2894
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -3045,13 +3451,13 @@ msgstr[0] ""
 msgstr[1] ""
 "%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)."
 
-#: builtin/apply.c:2908
+#: builtin/apply.c:2906
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 "Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d"
 
-#: builtin/apply.c:2914
+#: builtin/apply.c:2912
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -3060,328 +3466,338 @@ msgstr ""
 "при търсене за:\n"
 "%.*s"
 
-#: builtin/apply.c:2934
+#: builtin/apply.c:2932
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "липсват данните за двоичната кръпка за „%s“"
 
-#: builtin/apply.c:3035
+#: builtin/apply.c:3033
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "двоичната кръпка не може да бъде приложена върху „%s“"
 
-#: builtin/apply.c:3041
+#: builtin/apply.c:3039
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: "
 "„%s“, а бе получено: „%s“)"
 
-#: builtin/apply.c:3062
+#: builtin/apply.c:3060
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "неуспешно прилагане на кръпка: „%s:%ld“"
 
-#: builtin/apply.c:3186
+#: builtin/apply.c:3184
 #, c-format
 msgid "cannot checkout %s"
 msgstr "„%s“ не може да се изтегли"
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/apply.c:3229 builtin/apply.c:3240 builtin/apply.c:3285
 #, c-format
 msgid "read of %s failed"
 msgstr "неуспешно прочитане на „%s“"
 
-#: builtin/apply.c:3239
+#: builtin/apply.c:3237
 #, c-format
 msgid "reading from '%s' beyond a symbolic link"
 msgstr "изчитане на „%s“ след проследяване на символна връзка"
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
+#: builtin/apply.c:3265 builtin/apply.c:3487
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "обектът с път „%s“ е преименуван или изтрит"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: builtin/apply.c:3346 builtin/apply.c:3501
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "„%s“ не съществува в индекса"
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: builtin/apply.c:3350 builtin/apply.c:3493 builtin/apply.c:3515
 #, c-format
 msgid "%s: %s"
 msgstr "„%s“: %s"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/apply.c:3355 builtin/apply.c:3509
 #, c-format
 msgid "%s: does not match index"
 msgstr "„%s“ не съответства на индекса"
 
-#: builtin/apply.c:3459
+#: builtin/apply.c:3457
 msgid "removal patch leaves file contents"
 msgstr "изтриващата кръпка оставя файла непразен"
 
-#: builtin/apply.c:3528
+#: builtin/apply.c:3526
 #, c-format
 msgid "%s: wrong type"
 msgstr "„%s“: неправилен вид"
 
-#: builtin/apply.c:3530
+#: builtin/apply.c:3528
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "„%s“ е от вид „%o“, а се очакваше „%o“"
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
+#: builtin/apply.c:3687 builtin/apply.c:3689
 #, c-format
 msgid "invalid path '%s'"
 msgstr "неправилен път: „%s“"
 
-#: builtin/apply.c:3746
+#: builtin/apply.c:3744
 #, c-format
 msgid "%s: already exists in index"
 msgstr "„%s“: вече съществува в индекса"
 
-#: builtin/apply.c:3749
+#: builtin/apply.c:3747
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "„%s“: вече съществува в работното дърво"
 
-#: builtin/apply.c:3769
+#: builtin/apply.c:3767
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)"
 
-#: builtin/apply.c:3774
+#: builtin/apply.c:3772
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“"
 
-#: builtin/apply.c:3794
+#: builtin/apply.c:3792
 #, c-format
 msgid "affected file '%s' is beyond a symbolic link"
 msgstr "засегнатият файл „%s“ е след символна връзка"
 
-#: builtin/apply.c:3798
+#: builtin/apply.c:3796
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "Кръпката „%s“ не може да бъде приложена"
 
-#: builtin/apply.c:3812
+#: builtin/apply.c:3810
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Проверяване на кръпката „%s“…"
 
-#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#: 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/apply.c:4048
+#: builtin/apply.c:4046
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "„%s“ не може да се извади от индекса"
 
-#: builtin/apply.c:4077
+#: builtin/apply.c:4075
 #, c-format
 msgid "corrupt patch for submodule %s"
 msgstr "повредена кръпка за модула „%s“"
 
-#: builtin/apply.c:4081
+#: builtin/apply.c:4079
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 "не може да се получи информация чрез „stat“ за новосъздадения файл „%s“"
 
-#: builtin/apply.c:4086
+#: builtin/apply.c:4084
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 "не може да се за създаде мястото за съхранение на новосъздадения файл „%s“"
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
+#: builtin/apply.c:4087 builtin/apply.c:4195
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "не може да се добави запис в кеша за „%s“"
 
-#: builtin/apply.c:4122
+#: builtin/apply.c:4120
 #, c-format
 msgid "closing file '%s'"
 msgstr "затваряне на файла „%s“"
 
-#: builtin/apply.c:4171
+#: builtin/apply.c:4169
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“"
 
-#: builtin/apply.c:4258
+#: builtin/apply.c:4256
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Кръпката „%s“ бе приложена чисто."
 
-#: builtin/apply.c:4266
+#: builtin/apply.c:4264
 msgid "internal error"
 msgstr "вътрешна грешка"
 
-#: builtin/apply.c:4269
+#: builtin/apply.c:4267
 #, 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 отхвърлени парчета…"
 
-#: builtin/apply.c:4279
+#: builtin/apply.c:4277
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“"
 
-#: builtin/apply.c:4300
+#: builtin/apply.c:4285
+#, c-format
+msgid "cannot open %s: %s"
+msgstr "файлът „%s“ не може да бъде отворен: %s"
+
+#: builtin/apply.c:4298
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "%d-то парче бе успешно приложено."
 
-#: builtin/apply.c:4303
+#: builtin/apply.c:4301
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "%d-то парче бе отхвърлено."
 
-#: builtin/apply.c:4393
+#: builtin/apply.c:4387
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "Пропусната кръпка: „%s“"
+
+#: builtin/apply.c:4395
 msgid "unrecognized input"
 msgstr "непознат вход"
 
-#: builtin/apply.c:4404
+#: builtin/apply.c:4406
 msgid "unable to read index file"
 msgstr "индексът не може да бъде записан"
 
-#: builtin/apply.c:4517
+#: builtin/apply.c:4509
 msgid "don't apply changes matching the given path"
 msgstr "без прилагане на промените напасващи на дадения път"
 
-#: builtin/apply.c:4520
+#: builtin/apply.c:4512
 msgid "apply changes matching the given path"
 msgstr "прилагане на промените напасващи на дадения път"
 
-#: builtin/apply.c:4523
+#: builtin/apply.c:4515
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата"
 
-#: builtin/apply.c:4526
+#: builtin/apply.c:4518
 msgid "ignore additions made by the patch"
 msgstr "игнориране на редовете добавени от тази кръпка"
 
-#: builtin/apply.c:4528
+#: builtin/apply.c:4520
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "извеждане на статистика на промените без прилагане на кръпката"
 
-#: builtin/apply.c:4532
+#: builtin/apply.c:4524
 msgid "show number of added and deleted lines in decimal notation"
 msgstr "извеждане на броя на добавените и изтритите редове"
 
-#: builtin/apply.c:4534
+#: builtin/apply.c:4526
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "извеждане на статистика на входните данни без прилагане на кръпката"
 
-#: builtin/apply.c:4536
+#: builtin/apply.c:4528
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "проверка дали кръпката може да се приложи, без действително прилагане"
 
-#: builtin/apply.c:4538
+#: builtin/apply.c:4530
 msgid "make sure the patch is applicable to the current index"
 msgstr "проверка дали кръпката може да бъде приложена към текущия индекс"
 
-#: builtin/apply.c:4540
+#: builtin/apply.c:4532
 msgid "apply a patch without touching the working tree"
 msgstr "прилагане на кръпката без промяна на работното дърво"
 
-#: builtin/apply.c:4542
+#: builtin/apply.c:4534
 msgid "accept a patch that touches outside the working area"
 msgstr "прилагане на кръпка, която променя и файлове извън работното дърво"
 
-#: builtin/apply.c:4544
+#: builtin/apply.c:4536
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 "кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--"
 "summary“"
 
-#: builtin/apply.c:4546
+#: builtin/apply.c:4538
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно"
 
-#: builtin/apply.c:4548
+#: builtin/apply.c:4540
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "създаване на временен индекс на база на включената информация за индекса"
 
-#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
+#: builtin/apply.c:4543 builtin/checkout-index.c:169 builtin/ls-files.c:425
 msgid "paths are separated with NUL character"
 msgstr "разделяне на пътищата с нулевия знак „NUL“"
 
-#: builtin/apply.c:4553
+#: builtin/apply.c:4545
 msgid "ensure at least <n> lines of context match"
 msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
 
-#: builtin/apply.c:4555
+#: builtin/apply.c:4547
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "засичане на нови или променени редове с грешки в знаците за интервали"
 
-#: builtin/apply.c:4558 builtin/apply.c:4561
+#: builtin/apply.c:4550 builtin/apply.c:4553
 msgid "ignore changes in whitespace when finding context"
 msgstr ""
 "игнориране на промените в знаците за интервали при откриване на контекста"
 
-#: builtin/apply.c:4564
+#: builtin/apply.c:4556
 msgid "apply the patch in reverse"
 msgstr "прилагане на кръпката в обратна посока"
 
-#: builtin/apply.c:4566
+#: builtin/apply.c:4558
 msgid "don't expect at least one line of context"
 msgstr "без изискване на дори и един ред контекст"
 
-#: builtin/apply.c:4568
+#: builtin/apply.c:4560
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“"
 
-#: builtin/apply.c:4570
+#: builtin/apply.c:4562
 msgid "allow overlapping hunks"
 msgstr "позволяване на застъпващи се парчета"
 
-#: builtin/apply.c:4573
+#: builtin/apply.c:4565
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл"
 
-#: builtin/apply.c:4576
+#: builtin/apply.c:4568
 msgid "do not trust the line counts in the hunk headers"
 msgstr "без доверяване на номерата на редовете в заглавните части на парчетата"
 
-#: builtin/apply.c:4579
+#: builtin/apply.c:4571
 msgid "prepend <root> to all filenames"
 msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове"
 
-#: builtin/apply.c:4601
+#: builtin/apply.c:4593
 msgid "--3way outside a repository"
 msgstr "като „--3way“, но извън хранилище"
 
-#: builtin/apply.c:4609
+#: builtin/apply.c:4601
 msgid "--index outside a repository"
 msgstr "като „--index“, но извън хранилище"
 
-#: builtin/apply.c:4612
+#: builtin/apply.c:4604
 msgid "--cached outside a repository"
 msgstr "като „--cached“, но извън хранилище"
 
-#: builtin/apply.c:4631
+#: builtin/apply.c:4623
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "кръпката „%s“ не може да бъде отворена"
 
-#: builtin/apply.c:4645
+#: builtin/apply.c:4637
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "пренебрегната е %d грешка в знаците за интервали"
 msgstr[1] "пренебрегнати са %d грешки в знаците за интервали"
 
-#: builtin/apply.c:4651 builtin/apply.c:4661
+#: builtin/apply.c:4643 builtin/apply.c:4653
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -3436,120 +3852,128 @@ msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr ""
 "обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
 
-#: builtin/blame.c:32
+#: builtin/blame.c:33
 msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
 msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ"
 
-#: builtin/blame.c:37
+#: builtin/blame.c:38
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
 
-#: builtin/blame.c:2519
+#: builtin/blame.c:1782
+msgid "Blaming lines"
+msgstr "Анотирани редове"
+
+#: builtin/blame.c:2531
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Извеждане на анотациите с намирането им, последователно"
 
 # FIXME SHA-1 -> SHA1
-#: builtin/blame.c:2520
+#: builtin/blame.c:2532
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 "Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
 "е изключена)"
 
-#: builtin/blame.c:2521
+#: builtin/blame.c:2533
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 "Началните подавания да не се считат за гранични (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2522
+#: builtin/blame.c:2534
 msgid "Show work cost statistics"
 msgstr "Извеждане на статистика за извършените действия"
 
-#: builtin/blame.c:2523
+#: builtin/blame.c:2535
+msgid "Force progress reporting"
+msgstr "Принудително извеждане на напредъка"
+
+#: builtin/blame.c:2536
 msgid "Show output score for blame entries"
 msgstr "Извеждане на допълнителна информация за определянето на анотациите"
 
-#: builtin/blame.c:2524
+#: builtin/blame.c:2537
 msgid "Show original filename (Default: auto)"
 msgstr ""
 "Извеждане на първоначалното име на файл (стандартно това е автоматично)"
 
-#: builtin/blame.c:2525
+#: builtin/blame.c:2538
 msgid "Show original linenumber (Default: off)"
 msgstr ""
 "Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2526
+#: builtin/blame.c:2539
 msgid "Show in a format designed for machine consumption"
 msgstr "Извеждане във формат за по-нататъшна обработка"
 
-#: builtin/blame.c:2527
+#: builtin/blame.c:2540
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Извеждане във формат за команди от потребителско ниво с информация на всеки "
 "ред"
 
-#: builtin/blame.c:2528
+#: builtin/blame.c:2541
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Използване на същия формат като „git-annotate“ (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2529
+#: builtin/blame.c:2542
 msgid "Show raw timestamp (Default: off)"
 msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2543
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2544
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2545
 msgid "Show author email instead of name (Default: off)"
 msgstr ""
 "Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
 "изключена)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2546
 msgid "Ignore whitespace differences"
 msgstr "Без разлики в знаците за интервали"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2547
 msgid "Spend extra cycles to find better match"
 msgstr "Допълнителни изчисления за по-добри резултати"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2548
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2549
 msgid "Use <file>'s contents as the final image"
 msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
 
-#: builtin/blame.c:2537 builtin/blame.c:2538
+#: builtin/blame.c:2550 builtin/blame.c:2551
 msgid "score"
 msgstr "напасване на редовете"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2550
 msgid "Find line copies within and across files"
 msgstr ""
 "Търсене на копирани редове както в рамките на един файл, така и от един файл "
 "към друг"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2551
 msgid "Find line movements within and across files"
 msgstr ""
 "Търсене на преместени редове както в рамките на един файл, така и от един "
 "файл към друг"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2552
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2552
 msgid "Process only line range n,m, counting from 1"
 msgstr ""
 "Информация само за редовете в интервала от n до m включително. Броенето "
@@ -3561,31 +3985,31 @@ msgstr ""
 #. 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:2620
+#: builtin/blame.c:2641
 msgid "4 years, 11 months ago"
 msgstr "преди 4 години и 11 месеца"
 
-#: builtin/branch.c:25
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3594,7 +4018,7 @@ msgstr ""
 "изтриване на клона „%s“, който е слят към „%s“,\n"
 "         но още не е слят към върха „HEAD“."
 
-#: builtin/branch.c:146
+#: builtin/branch.c:147
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3603,12 +4027,12 @@ msgstr ""
 "отказване на изтриване на клона „%s“, който не е слят към\n"
 "         „%s“, но е слят към върха „HEAD“."
 
-#: builtin/branch.c:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Обектът-подаване за „%s“ не може да бъде открит"
 
-#: builtin/branch.c:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3617,301 +4041,322 @@ msgstr ""
 "Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
 "да го изтриете, изпълнете „git branch -D %s“."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "Неуспешно обновяване на конфигурационния файл"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Не можете да изтриете текущия клон „%s“"
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Не можете да изтриете клона „%s“, който е изтеглен в пътя „%s“"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "следящият клон „%s“ не може да бъде открит."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "клонът „%s“ не може да бъде открит."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Грешка при изтриването на следящия клон „%s“"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Грешка при изтриването на клона „%s“"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:309
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: изтрит]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:314
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:319
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: назад с %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:321
 #, c-format
 msgid "[behind %d]"
 msgstr "[назад с %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:325
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: напред с %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:327
 #, c-format
 msgid "[ahead %d]"
 msgstr "[напред с %d]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:330
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: напред с %d, назад с %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:333
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[напред с %d, назад с %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:346
 msgid " **** invalid ref ****"
 msgstr " ●●● неправилен указател ●●●"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:372
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(извън клон, пребазиране на „%s“)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(извън клон, двоично търсене от „%s“)"
 
-#: builtin/branch.c:375
+#. 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“)"
 
-#: builtin/branch.c:378
+#. 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“"
 
-#: builtin/branch.c:382
+#: builtin/branch.c:390
 msgid "(no branch)"
 msgstr "(извън клон)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:541
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "Клонът „%s“ се пребазира върху „%s“"
+
+#: builtin/branch.c:545
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "Търси се двоично в клона „%s“ при „%s“"
+
+#: builtin/branch.c:560
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "не можете да преименувате текущия клон, защото сте извън който и да е клон"
 
-#: builtin/branch.c:534
+#: builtin/branch.c:570
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Неправилно име на клон: „%s“"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:587
 msgid "Branch rename failed"
 msgstr "Неуспешно преименуване на клон"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:591
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "На клона с неправилно име „%s“ е дадено служебно име"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:594
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен"
 
-#: builtin/branch.c:564
+#: builtin/branch.c:601
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Клонът е преименуван, но конфигурационният файл не е обновен"
 
-#: builtin/branch.c:587
-#, c-format
-msgid "could not write branch description template: %s"
-msgstr "шаблонът за описание на клон не бе записан: „%s“"
+#: builtin/branch.c:623
+msgid "could not write branch description template"
+msgstr "шаблонът за описание на клон не бе записан"
 
-#: builtin/branch.c:616
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Общи настройки"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 "извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "без информационни съобщения"
 
-#: builtin/branch.c:620
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "задаване на режима на следене (виж git-pull(1))"
 
-#: builtin/branch.c:622
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "смяна на следения клон"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "клон-източник"
+
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "смяна на клона-източник"
+
+#: builtin/branch.c:661
 msgid "use colored output"
 msgstr "цветен изход"
 
-#: builtin/branch.c:627
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "действие върху следящите клони"
 
-#: builtin/branch.c:629 builtin/branch.c:630
+#: 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ова Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+msgstr "извеждане Ñ\81амо Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ñ\82ова Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "Специални действия на „git-branch“:"
 
-#: builtin/branch.c:634
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "извеждане както на следящите, така и на локалните клони"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "изтриване на клони, които са напълно слети"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "изтриване и на клони, които не са напълно слети"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr ""
 "преместване/преименуване на клон и принадлежащият му журнал на указателите"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "извеждане на имената на клоните"
 
-#: builtin/branch.c:641
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "създаване на журнала на указателите на клона"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "редактиране на описанието на клона"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "принудително създаване, преместване, преименуване, изтриване"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "извеждане само на слетите клони"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "извеждане само на неслетите клони"
 
-#: builtin/branch.c:647
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "извеждане по колони"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
-msgstr "клÑ\8eÑ\87"
+msgstr "Ð\9aÐ\9bЮЧ"
 
-#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "име на полето, по което да е подредбата"
 
-#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
-#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: 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 "обекÑ\82"
+msgstr "Ð\9eÐ\91Ð\95Ð\9aТ"
 
-#: builtin/branch.c:652
+#: builtin/branch.c:687
 msgid "print only branches of the object"
-msgstr "извеждане Ñ\81амо Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82а"
+msgstr "извеждане Ñ\81амо Ð½Ð° ÐºÐ»Ð¾Ð½Ð¸Ñ\82е Ð½Ð° Ð\9eÐ\91Ð\95Ð\9aТÐ\90"
 
-#: builtin/branch.c:670
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не може да се открие към какво сочи указателят „HEAD“"
 
-#: builtin/branch.c:674 builtin/clone.c:697
+#: builtin/branch.c:709 builtin/clone.c:707
 msgid "HEAD not found below refs/heads!"
 msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
 
-#: builtin/branch.c:694
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
 
-#: builtin/branch.c:705 builtin/branch.c:747
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "Необходимо е име на клон"
 
-#: builtin/branch.c:723
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "Не може да зададете описание на „HEAD“ извън клон"
 
-#: builtin/branch.c:728
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "Не може да редактирате описанието на повече от един клон едновременно"
 
-#: builtin/branch.c:735
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "В клона „%s“ все още няма подавания."
 
-#: builtin/branch.c:738
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Липсва клон на име „%s“."
 
-#: builtin/branch.c:753
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "Прекалено много клони за преименуване"
 
-#: builtin/branch.c:758
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "Зададени са прекалено много клони за следене"
 
-#: builtin/branch.c:762
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3919,39 +4364,39 @@ msgstr ""
 "Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
 "никой клон."
 
-#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Няма клон на име „%s“."
 
-#: builtin/branch.c:769
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Не съществува клон на име „%s“."
 
-#: builtin/branch.c:781
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "Прекалено много клони за махане на следене"
 
-#: builtin/branch.c:785
+#: builtin/branch.c:820
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
 
-#: builtin/branch.c:791
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Няма информация клонът „%s“ да следи някой друг"
 
-#: builtin/branch.c:805
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
 
-#: builtin/branch.c:811
+#: 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“ са несъвместими с име на клон"
 
-#: builtin/branch.c:814
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3960,7 +4405,7 @@ msgstr ""
 "Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
 "Използвайте „--track“ или „--set-upstream-to“\n"
 
-#: builtin/branch.c:831
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -3971,16 +4416,6 @@ msgstr ""
 "За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
 "\n"
 
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:833
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -4077,7 +4512,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:96
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
 msgid "read file names from stdin"
 msgstr "изчитане на имената на файловете от стандартния вход"
 
@@ -4085,7 +4520,7 @@ msgstr "изчитане на имената на файловете от ста
 msgid "terminate input and output records by a NUL character"
 msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1135 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "без показване на напредъка"
 
@@ -4138,49 +4573,54 @@ msgstr "контактът не може да бъде анализиран: %s"
 msgid "no contacts specified"
 msgstr "не са указани контакти"
 
-#: builtin/checkout-index.c:126
+#: builtin/checkout-index.c:127
 msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr "git checkout-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
-#: builtin/checkout-index.c:188
+#: builtin/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
+msgstr "етапът трябва да е „1“, „2“, „3“ или „all“ (всички)"
+
+#: builtin/checkout-index.c:160
 msgid "check out all files in the index"
 msgstr "изтегляне на всички файлове в индекса"
 
-#: builtin/checkout-index.c:189
+#: builtin/checkout-index.c:161
 msgid "force overwrite of existing files"
 msgstr "презаписване на файловете, дори и да съществуват"
 
-#: builtin/checkout-index.c:191
+#: builtin/checkout-index.c:163
 msgid "no warning for existing files and files not in index"
 msgstr "без предупреждения при липсващи файлове и файлове не в индекса"
 
-#: builtin/checkout-index.c:193
+#: builtin/checkout-index.c:165
 msgid "don't checkout new files"
 msgstr "без изтегляне на нови файлове"
 
-#: builtin/checkout-index.c:195
+#: builtin/checkout-index.c:167
 msgid "update stat information in the index file"
 msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
 
-#: builtin/checkout-index.c:201
+#: builtin/checkout-index.c:171
 msgid "read list of paths from the standard input"
 msgstr "изчитане на пътищата от стандартния вход"
 
-#: builtin/checkout-index.c:203
+#: builtin/checkout-index.c:173
 msgid "write the content to temporary files"
 msgstr "записване на съдържанието във временни файлове"
 
-#: builtin/checkout-index.c:204 builtin/column.c:30
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
-#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
+#: 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/checkout-index.c:205
+#: builtin/checkout-index.c:175
 msgid "when creating files, prepend <string>"
 msgstr "при създаването на нови файлове да се добавя префикса НИЗ"
 
-#: builtin/checkout-index.c:208
+#: builtin/checkout-index.c:177
 msgid "copy out the files from named stage"
 msgstr "копиране на файловете от това състояние на сливане"
 
@@ -4222,45 +4662,49 @@ msgstr "пътят „%s“ не може да бъде слян"
 msgid "Unable to add merge result for '%s'"
 msgstr "Резултатът за „%s“ не може да бъде слян"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "Опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 "Невъзможно е едновременно да обновявате пътища и да преминете към клона „%s“."
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
+#: builtin/checkout.c:279 builtin/checkout.c:473
 msgid "corrupt index file"
 msgstr "повреден файл на индекса"
 
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "пътят „%s“ не е слят"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:495
 msgid "you need to resolve your current index first"
 msgstr "първо трябва да коригирате индекса си"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:622
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n"
 
-#: builtin/checkout.c:661
+#: builtin/checkout.c:660
 msgid "HEAD is now at"
 msgstr "Указателят „HEAD“ в момента сочи към"
 
+#: builtin/checkout.c:664 builtin/clone.c:661
+msgid "unable to update HEAD"
+msgstr "Указателят „HEAD“ не може да бъде обновен"
+
 #: builtin/checkout.c:668
 #, c-format
 msgid "Reset branch '%s'\n"
@@ -4276,7 +4720,7 @@ msgstr "Вече сте на „%s“\n"
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
 
-#: builtin/checkout.c:677 builtin/checkout.c:1066
+#: builtin/checkout.c:677 builtin/checkout.c:1067
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Преминахте към новия клон „%s“\n"
@@ -4348,7 +4792,7 @@ msgstr "вътрешна грешка при обхождането на вер
 msgid "Previous HEAD position was"
 msgstr "Преди това „HEAD“ сочеше към"
 
-#: builtin/checkout.c:823 builtin/checkout.c:1061
+#: builtin/checkout.c:823 builtin/checkout.c:1062
 msgid "You are on a branch yet to be born"
 msgstr "В момента сте на клон, който предстои да бъде създаден"
 
@@ -4357,137 +4801,137 @@ msgstr "В момента сте на клон, който предстои да
 msgid "only one reference expected, %d given."
 msgstr "очакваше се един указател, а сте подали %d."
 
-#: builtin/checkout.c:1007 builtin/worktree.c:213
+#: builtin/checkout.c:1008 builtin/worktree.c:212
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправилен указател: %s"
 
-#: builtin/checkout.c:1036
+#: builtin/checkout.c:1037
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "указателят не сочи към обект-дърво: %s"
 
-#: builtin/checkout.c:1075
+#: builtin/checkout.c:1076
 msgid "paths cannot be used with switching branches"
 msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1078 builtin/checkout.c:1082
+#: builtin/checkout.c:1079 builtin/checkout.c:1083
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
 
-#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1087 builtin/checkout.c:1090 builtin/checkout.c:1095
+#: builtin/checkout.c:1098
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "опцията „%s“ е несъвместима с „%s“"
 
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1103
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 "За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
 "е такъв"
 
-#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
-#: builtin/worktree.c:322
+#: 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/checkout.c:1136
+#: builtin/checkout.c:1137
 msgid "create and checkout a new branch"
 msgstr "създаване и преминаване към нов клон"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create/reset and checkout a branch"
 msgstr "създаване/зануляване на клон и преминаване към него"
 
-#: builtin/checkout.c:1139
+#: builtin/checkout.c:1140
 msgid "create reflog for new branch"
 msgstr "създаване на журнал на указателите за нов клон"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "detach the HEAD at named commit"
 msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "set upstream info for new branch"
 msgstr "задаване на кой клон бива следен при създаването на новия клон"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "new-branch"
 msgstr "НОВ_КЛОН"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "new unparented branch"
 msgstr "нов клон без родител"
 
-#: builtin/checkout.c:1144
+#: builtin/checkout.c:1145
 msgid "checkout our version for unmerged files"
 msgstr "изтегляне на вашата версия на неслетите файлове"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout their version for unmerged files"
 msgstr "изтегляне на чуждата версия на неслетите файлове"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "force checkout (throw away local modifications)"
 msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
 
-#: builtin/checkout.c:1149
+#: builtin/checkout.c:1150
 msgid "perform a 3-way merge with the new branch"
 msgstr "извършване на тройно сливане с новия клон"
 
-#: builtin/checkout.c:1150 builtin/merge.c:227
+#: builtin/checkout.c:1151 builtin/merge.c:230
 msgid "update ignored files (default)"
 msgstr "обновяване на игнорираните файлове (стандартно)"
 
-#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
+#: builtin/checkout.c:1152 builtin/log.c:1432 parse-options.h:250
 msgid "style"
-msgstr "стил"
+msgstr "СТИЛ"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1153
 msgid "conflict style (merge or diff3)"
 msgstr "действие при конфликт (сливане или тройна разлика)"
 
-#: builtin/checkout.c:1155
+#: builtin/checkout.c:1156
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "без ограничаване на изброените пътища само до частично изтеглените"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
 "опит за отгатване на име на клон след неуспешен опит с „git checkout "
 "НЕСЪЩЕСТВУВАЩ_КЛОН“"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "do not check if another worktree is holding the given ref"
 msgstr "без проверка дали друго работно дърво държи указателя"
 
-#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
-#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: 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/checkout.c:1191
+#: builtin/checkout.c:1192
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
 
-#: builtin/checkout.c:1208
+#: builtin/checkout.c:1209
 msgid "--track needs a branch name"
 msgstr "опцията „--track“ изисква име на клон"
 
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1214
 msgid "Missing branch name; try -b"
 msgstr "Липсва име на клон, използвайте опцията „-b“"
 
-#: builtin/checkout.c:1249
+#: builtin/checkout.c:1250
 msgid "invalid path specification"
 msgstr "указан е неправилен път"
 
-#: builtin/checkout.c:1256
+#: builtin/checkout.c:1257
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4496,12 +4940,12 @@ msgstr ""
 "Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
 "Дали не искате да изтеглите „%s“, който не сочи към подаване?"
 
-#: builtin/checkout.c:1261
+#: builtin/checkout.c:1262
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
 
-#: builtin/checkout.c:1265
+#: builtin/checkout.c:1266
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4539,7 +4983,7 @@ msgstr "Хранилището „%s“ ще бъде прескочено\n"
 msgid "failed to remove %s"
 msgstr "файлът „%s“ не може да бъде изтрит"
 
-#: builtin/clean.c:315
+#: builtin/clean.c:291
 msgid ""
 "Prompt help:\n"
 "1          - select a numbered item\n"
@@ -4551,7 +4995,7 @@ msgstr ""
 "ПРЕФИКС    — избор на единствен обект по този уникален префикс\n"
 "           — (празно) нищо да не се избира"
 
-#: builtin/clean.c:319
+#: builtin/clean.c:295
 msgid ""
 "Prompt help:\n"
 "1          - select a single item\n"
@@ -4571,38 +5015,38 @@ msgstr ""
 "*          — избиране на всички обекти\n"
 "           — (празно) завършване на избирането"
 
-#: builtin/clean.c:535
+#: builtin/clean.c:511
 #, c-format
 msgid "Huh (%s)?"
 msgstr "Неправилен избор (%s). Изберете отново."
 
 # FIXME - should we use >> or sth else
-#: builtin/clean.c:677
+#: builtin/clean.c:653
 #, c-format
 msgid "Input ignore patterns>> "
 msgstr "Шаблони за игнорирани елементи≫ "
 
-#: builtin/clean.c:714
+#: builtin/clean.c:690
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
 msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“"
 
-#: builtin/clean.c:735
+#: builtin/clean.c:711
 msgid "Select items to delete"
 msgstr "Избиране на обекти за изтриване"
 
 #. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:776
+#: builtin/clean.c:752
 #, c-format
 msgid "Remove %s [y/N]? "
 msgstr "Да се изтрие ли „%s“? „y“ —  да, „N“ — НЕ"
 
 # FIXME improve message
-#: builtin/clean.c:801
+#: builtin/clean.c:777
 msgid "Bye."
 msgstr "Изход."
 
-#: builtin/clean.c:809
+#: builtin/clean.c:785
 msgid ""
 "clean               - start cleaning\n"
 "filter by pattern   - exclude items from deletion\n"
@@ -4620,63 +5064,63 @@ msgstr ""
 "help                — този край\n"
 "?                   — подсказка за шаблоните"
 
-#: builtin/clean.c:836
+#: builtin/clean.c:812
 msgid "*** Commands ***"
 msgstr "●●● Команди ●●●"
 
 # FIXME improve message
-#: builtin/clean.c:837
+#: builtin/clean.c:813
 msgid "What now"
 msgstr "Избор на следващо действие"
 
-#: builtin/clean.c:845
+#: builtin/clean.c:821
 msgid "Would remove the following item:"
 msgid_plural "Would remove the following items:"
 msgstr[0] "Следният обект ще бъде изтрит:"
 msgstr[1] "Следните обекти ще бъдат изтрити:"
 
-#: builtin/clean.c:862
+#: builtin/clean.c:838
 msgid "No more files to clean, exiting."
 msgstr "Файловете за изчистване свършиха. Изход от програмата."
 
-#: builtin/clean.c:893
+#: builtin/clean.c:869
 msgid "do not print names of files removed"
 msgstr "без извеждане на имената на файловете, които ще бъдат изтрити"
 
-#: builtin/clean.c:895
+#: builtin/clean.c:871
 msgid "force"
 msgstr "принудително изтриване"
 
-#: builtin/clean.c:896
+#: builtin/clean.c:872
 msgid "interactive cleaning"
 msgstr "интерактивно изтриване"
 
-#: builtin/clean.c:898
+#: builtin/clean.c:874
 msgid "remove whole directories"
 msgstr "изтриване на цели директории"
 
-#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
-#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
+#: 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 "шаблон"
+msgstr "ШАБЛОН"
 
-#: builtin/clean.c:900
+#: builtin/clean.c:876
 msgid "add <pattern> to ignore rules"
 msgstr "добавяне на ШАБЛОН от файлове, които да не се трият"
 
-#: builtin/clean.c:901
+#: builtin/clean.c:877
 msgid "remove ignored files, too"
 msgstr "изтриване и на игнорираните файлове"
 
-#: builtin/clean.c:903
+#: builtin/clean.c:879
 msgid "remove only ignored files"
 msgstr "изтриване само на игнорирани файлове"
 
-#: builtin/clean.c:921
+#: builtin/clean.c:897
 msgid "-x and -X cannot be used together"
 msgstr "опциите „-x“ и „-X“ са несъвместими"
 
-#: builtin/clean.c:925
+#: builtin/clean.c:901
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -4684,7 +5128,7 @@ msgstr ""
 "Настройката „clean.requireForce“ е зададена като истина, което изисква някоя "
 "от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване"
 
-#: builtin/clean.c:928
+#: builtin/clean.c:904
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -4697,148 +5141,168 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
 
-#: builtin/clone.c:59
+#: builtin/clone.c:62
 msgid "don't create a checkout"
 msgstr "без създаване на работно дърво"
 
-#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
+#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:473
 msgid "create a bare repository"
 msgstr "създаване на голо хранилище"
 
-#: builtin/clone.c:64
+#: builtin/clone.c:67
 msgid "create a mirror repository (implies bare)"
 msgstr ""
 "създаване на хранилище-огледало (включва опцията „--bare“ за голо хранилище)"
 
-#: builtin/clone.c:66
+#: builtin/clone.c:69
 msgid "to clone from a local repository"
 msgstr "клониране от локално хранилище"
 
-#: builtin/clone.c:68
+#: builtin/clone.c:71
 msgid "don't use local hardlinks, always copy"
 msgstr "без твърди връзки, файловете винаги да се копират"
 
-#: builtin/clone.c:70
+#: builtin/clone.c:73
 msgid "setup as shared repository"
 msgstr "настройване за споделено хранилище"
 
-#: builtin/clone.c:72 builtin/clone.c:74
+#: builtin/clone.c:75 builtin/clone.c:77
 msgid "initialize submodules in the clone"
 msgstr "инициализиране на подмодулите при това клониране"
 
-#: builtin/clone.c:75 builtin/init-db.c:466
+#: builtin/clone.c:79
+msgid "number of submodules cloned in parallel"
+msgstr "брой подмодули, клонирани паралелно"
+
+#: builtin/clone.c:80 builtin/init-db.c:470
 msgid "template-directory"
 msgstr "директория с шаблони"
 
-#: builtin/clone.c:76 builtin/init-db.c:467
+#: builtin/clone.c:81 builtin/init-db.c:471
 msgid "directory from which templates will be used"
 msgstr "директория, която съдържа шаблоните, които да се ползват"
 
-#: builtin/clone.c:78 builtin/submodule--helper.c:179
+#: builtin/clone.c:83 builtin/submodule--helper.c:498
+#: builtin/submodule--helper.c:777
 msgid "reference repository"
 msgstr "еталонно хранилище"
 
-#: builtin/clone.c:80
+#: builtin/clone.c:85
 msgid "use --reference only while cloning"
 msgstr "опцията „--reference“ може да се използва само при клониране"
 
-#: builtin/clone.c:81 builtin/column.c:26 builtin/merge-file.c:44
+#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
 msgid "name"
 msgstr "ИМЕ"
 
-#: builtin/clone.c:82
+#: builtin/clone.c:87
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
 
-#: builtin/clone.c:84
+#: builtin/clone.c:89
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
 
-#: builtin/clone.c:86
+#: builtin/clone.c:91
 msgid "path to git-upload-pack on the remote"
 msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
 
-#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
+#: builtin/clone.c:92 builtin/fetch.c:117 builtin/grep.c:667 builtin/pull.c:201
 msgid "depth"
 msgstr "ДЪЛБОЧИНА"
 
-#: builtin/clone.c:88
+#: builtin/clone.c:93
 msgid "create a shallow clone of that depth"
 msgstr "плитко клониране до тази ДЪЛБОЧИНА"
 
-#: builtin/clone.c:90
+#: builtin/clone.c:95
 msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 "клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
 "зададения с „--branch“"
 
-#: builtin/clone.c:91 builtin/init-db.c:475
+#: builtin/clone.c:97
+msgid "any cloned submodules will be shallow"
+msgstr "всички клонирани подмодули ще са плитки"
+
+#: builtin/clone.c:98 builtin/init-db.c:479
 msgid "gitdir"
 msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
 
-#: builtin/clone.c:92 builtin/init-db.c:476
+#: builtin/clone.c:99 builtin/init-db.c:480
 msgid "separate git dir from working tree"
 msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
 
-#: builtin/clone.c:93
+#: builtin/clone.c:100
 msgid "key=value"
 msgstr "КЛЮЧ=СТОЙНОСТ"
 
-#: builtin/clone.c:94
+#: builtin/clone.c:101
 msgid "set config inside the new repository"
 msgstr "задаване на настройките на новото хранилище"
 
-#: builtin/clone.c:300
+#: builtin/clone.c:102 builtin/fetch.c:131 builtin/push.c:536
+msgid "use IPv4 addresses only"
+msgstr "само адреси IPv4"
+
+#: builtin/clone.c:104 builtin/fetch.c:133 builtin/push.c:538
+msgid "use IPv6 addresses only"
+msgstr "само адреси IPv6"
+
+#: builtin/clone.c:241
+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:302
+#: builtin/clone.c:309
 #, c-format
 msgid "reference repository '%s' is not a local repository."
 msgstr "еталонното хранилище „%s“ не е локално"
 
-#: builtin/clone.c:307
+#: builtin/clone.c:314
 #, c-format
 msgid "reference repository '%s' is shallow"
 msgstr "еталонното хранилище „%s“ е плитко"
 
-#: builtin/clone.c:310
+#: builtin/clone.c:317
 #, c-format
 msgid "reference repository '%s' is grafted"
 msgstr "еталонното хранилище „%s“ е с присаждане"
 
-#: builtin/clone.c:375 builtin/diff.c:84
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
-
-#: builtin/clone.c:377
+#: builtin/clone.c:384
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "„%s“ съществува и не е директория"
 
-#: builtin/clone.c:391
+#: builtin/clone.c:398
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
 
-#: builtin/clone.c:413
+#: builtin/clone.c:420
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "връзката „%s“ не може да бъде създадена"
 
-#: builtin/clone.c:417
+#: builtin/clone.c:424
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "файлът не може да бъде копиран като „%s“"
 
-#: builtin/clone.c:442 builtin/clone.c:626
+#: builtin/clone.c:449 builtin/clone.c:633
 #, c-format
 msgid "done.\n"
 msgstr "действието завърши.\n"
 
-#: builtin/clone.c:454
+#: builtin/clone.c:461
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4849,7 +5313,7 @@ msgstr ""
 "клон в момента са изтеглени с командата „git status“. Можете да\n"
 "завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
 
-#: builtin/clone.c:531
+#: builtin/clone.c:538
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr ""
@@ -4857,116 +5321,126 @@ msgstr ""
 "и който следва да бъде изтеглен, не съществува."
 
 # FIXME translator note that the space at end is necesssary
-#: builtin/clone.c:621
+#: builtin/clone.c:628
 #, c-format
 msgid "Checking connectivity... "
 msgstr "Проверка на връзката… "
 
-#: builtin/clone.c:624
+#: builtin/clone.c:631
 msgid "remote did not send all necessary objects"
 msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
 
-#: builtin/clone.c:688
+# FIXME merge with next?
+#: builtin/clone.c:649
+#, c-format
+msgid "unable to update %s"
+msgstr "обектът „%s“ не може да бъде обновен"
+
+#: builtin/clone.c:698
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 "указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
 "което не съществува. Не може да се изтегли определен клон.\n"
 
-#: builtin/clone.c:719
+#: builtin/clone.c:729
 msgid "unable to checkout working tree"
 msgstr "работното дърво не може да бъде подготвено"
 
-#: builtin/clone.c:808
+#: builtin/clone.c:767
+msgid "unable to write parameters to config file"
+msgstr "настройките не могат да бъдат записани в конфигурационния файл"
+
+#: builtin/clone.c:830
 msgid "cannot repack to clean up"
 msgstr "не може да се извърши пакетиране за изчистване на файловете"
 
-#: builtin/clone.c:810
+#: builtin/clone.c:832
 msgid "cannot unlink temporary alternates file"
 msgstr "временният файл за алтернативни обекти не може да бъде изтрит"
 
-#: builtin/clone.c:842
+#: builtin/clone.c:864 builtin/receive-pack.c:1731
 msgid "Too many arguments."
 msgstr "Прекалено много аргументи."
 
-#: builtin/clone.c:846
+#: builtin/clone.c:868
 msgid "You must specify a repository to clone."
 msgstr "Трябва да укажете кое хранилище искате да клонирате."
 
-#: builtin/clone.c:857
+#: builtin/clone.c:879
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
 
-#: builtin/clone.c:860
+#: builtin/clone.c:882
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
 
-#: builtin/clone.c:873
+#: builtin/clone.c:895
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "не съществува хранилище „%s“"
 
-#: builtin/clone.c:879 builtin/fetch.c:1166
+#: builtin/clone.c:901 builtin/fetch.c:1174
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
 
-#: builtin/clone.c:889
+#: builtin/clone.c:911
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевият път „%s“ съществува и не е празна директория."
 
-#: builtin/clone.c:899
+#: builtin/clone.c:921
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "в „%s“ вече съществува работно дърво."
 
-#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
-#: builtin/worktree.c:221 builtin/worktree.c:248
+#: builtin/clone.c:936 builtin/clone.c:947 builtin/submodule--helper.c:547
+#: builtin/worktree.c:220 builtin/worktree.c:247
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "родителските директории на „%s“ не могат да бъдат създадени"
 
-#: builtin/clone.c:917
+#: builtin/clone.c:939
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "работното дърво в „%s“ не може да бъде създадено."
 
-#: builtin/clone.c:935
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
 
-#: builtin/clone.c:937
+#: builtin/clone.c:959
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клониране и създаване на хранилище в „%s“…\n"
 
-#: builtin/clone.c:975
+#: builtin/clone.c:998
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
 "„file://“."
 
-#: builtin/clone.c:978
+#: builtin/clone.c:1001
 msgid "source repository is shallow, ignoring --local"
 msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
 
-#: builtin/clone.c:983
+#: builtin/clone.c:1006
 msgid "--local is ignored"
 msgstr "опцията „--local“ се игнорира"
 
-#: builtin/clone.c:987
+#: builtin/clone.c:1010
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не се поддържа клониране на връзки от вида „%s“ "
 
-#: builtin/clone.c:1036 builtin/clone.c:1044
+#: builtin/clone.c:1059 builtin/clone.c:1067
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
 
-#: builtin/clone.c:1047
+#: builtin/clone.c:1070
 msgid "You appear to have cloned an empty repository."
 msgstr "Изглежда клонирахте празно хранилище."
 
@@ -5110,66 +5584,66 @@ msgstr ""
 "Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
 "останалите подавания.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:307
 msgid "failed to unpack HEAD tree object"
 msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:348
 msgid "unable to create temporary index"
 msgstr "временният индекс не може да бъде създаден"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:354
 msgid "interactive add failed"
 msgstr "неуспешно интерактивно добавяне"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:367
 msgid "unable to update temporary index"
 msgstr "временният индекс не може да бъде обновен"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:369
 msgid "Failed to update main cache tree"
 msgstr "Дървото на основния кеш не може да бъде обновено"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:465
 msgid "unable to write new_index file"
 msgstr "новият индекс не може да бъде записан"
 
-#: builtin/commit.c:445
+#: builtin/commit.c:447
 msgid "cannot do a partial commit during a merge."
 msgstr "по време на сливане не може да се извърши частично подаване."
 
-#: builtin/commit.c:447
+#: builtin/commit.c:449
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "по време на отбиране не може да се извърши частично подаване."
 
-#: builtin/commit.c:456
+#: builtin/commit.c:458
 msgid "cannot read the index"
 msgstr "индексът не може да бъде прочетен"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:477
 msgid "unable to write temporary index file"
 msgstr "временният индекс не може да бъде записан"
 
-#: builtin/commit.c:580
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "заглавната част за автор в подаването „%s“ липсва"
 
-#: builtin/commit.c:582
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "заглавната част за автор в подаването „%s“ е неправилна"
 
-#: builtin/commit.c:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "неправилен параметър към опцията „--author“"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "неправилен формат на дата: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5177,39 +5651,39 @@ msgstr ""
 "не може да се избере знак за коментар — в текущото съобщение за подаване са "
 "използвани всички подобни знаци"
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1091
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "следното подаване не може да бъде открито: %s"
 
-#: builtin/commit.c:702 builtin/shortlog.c:273
+#: builtin/commit.c:704 builtin/shortlog.c:285
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
 
-#: builtin/commit.c:704
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "съобщението за подаване не бе прочетено стандартния вход"
 
-#: builtin/commit.c:708
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "шаблонът за подаване не може да бъде запазен"
 
 # FIXME
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5225,7 +5699,7 @@ msgstr ""
 "и опитайте отново.\n"
 
 # FIXME
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5241,7 +5715,7 @@ msgstr ""
 "  %s\n"
 "и опитайте отново.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5250,7 +5724,7 @@ msgstr ""
 "Въведете съобщението за подаване на промените. Редовете, които започват\n"
 "с „%c“, ще бъдат пропуснати, а празно съобщение преустановява подаването.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5261,96 +5735,96 @@ msgstr ""
 "с „%c“, също ще бъдат включени — може да ги изтриете вие. Празно \n"
 "съобщение преустановява подаването.\n"
 
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sАвтор:   %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sДата:    %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sПодаващ: %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Индексът не може да бъде прочетен"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:949
 msgid "Error building trees"
 msgstr "Грешка при изграждане на дърветата"
 
-#: builtin/commit.c:953 builtin/tag.c:266
+#: builtin/commit.c:964 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:1055
+#: builtin/commit.c:1066
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "Опцията „--author '%s'“ не отговаря на форма̀та „Име <е-поща>“ и не съвпада с "
 "никой автор"
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
+#: builtin/commit.c:1081 builtin/commit.c:1321
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправилна стойност за неследените файлове: „%s“"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1118
 msgid "--long and -z are incompatible"
 msgstr "Опциите „--long“ и „-z“ са несъвместими."
 
-#: builtin/commit.c:1137
+#: builtin/commit.c:1148
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
 
-#: builtin/commit.c:1146
+#: builtin/commit.c:1157
 msgid "You have nothing to amend."
 msgstr "Няма какво да бъде поправено."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1160
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "В момента се извършва сливане, не можете да поправяте."
 
-#: builtin/commit.c:1151
+#: builtin/commit.c:1162
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
 
-#: builtin/commit.c:1154
+#: builtin/commit.c:1165
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
 
-#: builtin/commit.c:1164
+#: builtin/commit.c:1175
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Опциите „-c“, „-C“, „-F“ и „--fixup““ са несъвместими."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1177
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“, „-F“ и „--fixup“."
 
-#: builtin/commit.c:1174
+#: builtin/commit.c:1185
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 "Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
 "„--amend“."
 
-#: builtin/commit.c:1191
+#: builtin/commit.c:1202
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
 "несъвместими."
 
-#: builtin/commit.c:1193
+#: builtin/commit.c:1204
 msgid "No paths with --include/--only does not make sense."
 msgstr "Опциите „--include“ и „--only“ изискват аргументи."
 
 # FIXME bad message
-#: builtin/commit.c:1195
+#: builtin/commit.c:1206
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 "Чудесно сте се сетили как да поправите съобщението на последното подаване "
@@ -5358,271 +5832,269 @@ msgstr ""
 "променен индекс. Споделете и с друг потребител трика с „git commit --amend -"
 "o“."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1208
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
 "сте\n"
 "ползвали опцията „--only“ с ПЪТища…"
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/commit.c:1220 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Несъществуващ режим на изчистване „%s“"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1225
 msgid "Paths with -a does not make sense."
 msgstr "Опцията „-a“ е несъвместима със задаването на пътища."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1335 builtin/commit.c:1621
 msgid "show status concisely"
 msgstr "кратка информация за състоянието"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1337 builtin/commit.c:1623
 msgid "show branch information"
 msgstr "информация за клоните"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
-#: builtin/worktree.c:423
+#: builtin/commit.c:1339 builtin/commit.c:1625 builtin/push.c:512
+#: builtin/worktree.c:437
 msgid "machine-readable output"
 msgstr "формат на изхода за четене от програма"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
+#: builtin/commit.c:1342 builtin/commit.c:1627
 msgid "show status in long format (default)"
 msgstr "подробна информация за състоянието (стандартно)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1345 builtin/commit.c:1630
 msgid "terminate entries with NUL"
 msgstr "разделяне на елементите с нулевия знак „NUL“"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: 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 "режим"
+msgstr "РЕЖИМ"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
+#: builtin/commit.c:1348 builtin/commit.c:1633
 msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
-"извеждане на неследените файлове. Възможните режими са „all“ (подробна\n"
-"информация), „normal“ (кратка информация), „no“ (без неследените файлове).\n"
-"Стандартният режим е: „all“."
+"извеждане на неследените файлове. Възможните РЕЖИМи са „all“ (подробна "
+"информация), „normal“ (кратка информация), „no“ (без неследените файлове). "
+"Стандартният РЕЖИМ е: „all“."
 
-#: builtin/commit.c:1340
+#: builtin/commit.c:1351
 msgid "show ignored files"
 msgstr "извеждане на игнорираните файлове"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1352 parse-options.h:155
 msgid "when"
-msgstr "кога"
+msgstr "Ð\9aÐ\9eÐ\93Ð\90"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1353
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "игнориране на промените в подмодулите. Опция с незадължителна стойност — "
-"една от\n"
-"„all“ (всички), „dirty“ (тези с неподадени промени), „untracked“ (неследени)"
+"една от „all“ (всички), „dirty“ (тези с неподадени промени), "
+"„untracked“ (неследени)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1355
 msgid "list untracked files in columns"
 msgstr "извеждане на неследените файлове в колони"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1441
 msgid "couldn't look up newly created commit"
 msgstr "току що създаденото подаване не може да бъде открито"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1443
 msgid "could not parse newly created commit"
 msgstr "току що създаденото подаване не може да бъде анализирано"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1488
 msgid "detached HEAD"
 msgstr "несвързан връх „HEAD“"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1491
 msgid " (root-commit)"
 msgstr " (начално подаване)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1591
 msgid "suppress summary after successful commit"
 msgstr "без информация след успешно подаване"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1592
 msgid "show diff in commit message template"
 msgstr "добавяне на разликата към шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1594
 msgid "Commit message options"
 msgstr "Опции за съобщението при подаване"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1595 builtin/tag.c:351
 msgid "read message from file"
-msgstr "взимане на съобщението от файл"
+msgstr "взимане на съобщението от ФАЙЛ"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1596
 msgid "author"
-msgstr "авÑ\82оÑ\80"
+msgstr "Ð\90Ð\92ТÐ\9eР"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1596
 msgid "override author for commit"
-msgstr "задаване Ð½Ð° Ð°Ð²Ñ\82оÑ\80 за подаването"
+msgstr "задаване Ð½Ð° Ð\90Ð\92ТÐ\9eР за подаването"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1597 builtin/gc.c:326
 msgid "date"
-msgstr "даÑ\82а"
+msgstr "Ð\94Ð\90ТÐ\90"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1597
 msgid "override date for commit"
-msgstr "задаване Ð½Ð° Ð´Ð°Ñ\82а за подаването"
+msgstr "задаване Ð½Ð° Ð\94Ð\90ТÐ\90 за подаването"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
-#: builtin/notes.c:555 builtin/tag.c:349
+#: builtin/commit.c:1598 builtin/merge.c:219 builtin/notes.c:395
+#: builtin/notes.c:558 builtin/tag.c:349
 msgid "message"
-msgstr "съобщение"
+msgstr "СЪОБЩЕНИЕ"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1598
 msgid "commit message"
-msgstr "съобщение при подаване"
+msgstr "СЪОБЩЕНИЕ при подаване"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+#: 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 "подаване"
+msgstr "Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1599
 msgid "reuse and edit message from specified commit"
-msgstr "пÑ\80еизползване Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+msgstr "пÑ\80еизползване Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1600
 msgid "reuse message from specified commit"
-msgstr "пÑ\80еизползване Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+msgstr "пÑ\80еизползване Ð½Ð° Ñ\81Ñ\8aобÑ\89ениеÑ\82о Ð¾Ñ\82 Ñ\83казаноÑ\82о Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1601
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
-"използване на автоматичното съобщение при смачкване за вкарване на "
-"указаното\n"
-"подаване в предното без следа"
+"използване на автоматичното съобщение при смачкване за вкарване на указаното "
+"ПОДАВАНЕ в предното без следа"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1602
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "използване на автоматичното съобщение при смачкване за смачкване на "
-"указаното\n"
-"подаване в предното"
+"указаното ПОДАВАНЕ в предното"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1603
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 "смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
 
-#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
+#: builtin/commit.c:1604 builtin/log.c:1382 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "добавяне на поле за подпис — „Signed-off-by:“"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1605
 msgid "use specified template file"
-msgstr "използване на указания шаблонен файл"
+msgstr "използване на указания шаблонен ФАЙЛ"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1606
 msgid "force edit of commit"
 msgstr "редактиране на подаване"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1607
 msgid "default"
 msgstr "стандартно"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
+#: builtin/commit.c:1607 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "кои празни знаци и #коментари да се махат от съобщенията"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1608
 msgid "include status in commit message template"
 msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/commit.c:1610 builtin/merge.c:229 builtin/pull.c:165
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "подписване на подаването с GPG"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1613
 msgid "Commit contents options"
 msgstr "Опции за избор на файлове при подаване"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1614
 msgid "commit all changed files"
 msgstr "подаване на всички променени файлове"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1615
 msgid "add specified files to index for commit"
 msgstr "добавяне на указаните файлове към индекса за подаване"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1616
 msgid "interactively add files"
 msgstr "интерактивно добавяне на файлове"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1617
 msgid "interactively add changes"
 msgstr "интерактивно добавяне на промени"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1618
 msgid "commit only specified files"
 msgstr "подаване само на указаните файлове"
 
-#: builtin/commit.c:1603
+#: builtin/commit.c:1619
 msgid "bypass pre-commit hook"
 msgstr "без изпълнение на куката преди подаване (pre-commit)"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1620
 msgid "show what would be committed"
 msgstr "отпечатване на това, което би било подадено"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1631
 msgid "amend previous commit"
 msgstr "поправяне на предишното подаване"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1632
 msgid "bypass post-rewrite hook"
 msgstr "без изпълнение на куката след презаписване (post-rewrite)"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1637
 msgid "ok to record an empty change"
 msgstr "позволяване на празни подавания"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1639
 msgid "ok to record a change with an empty message"
 msgstr "позволяване на подавания с празни съобщения"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1668
 msgid "could not parse HEAD commit"
 msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1718
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1725
 msgid "could not read MERGE_MODE"
 msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1744
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "съобщението за подаване не може да бъде прочетено: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1755
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
 
-#: builtin/commit.c:1740
+#: builtin/commit.c:1760
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Неизвършване на подаване поради празно съобщение.\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5632,145 +6104,151 @@ msgstr ""
 "не е записан. Проверете дали дискът не е препълнен или не сте\n"
 "превишили дисковата си квота. След това изпълнете „git reset HEAD“."
 
-#: builtin/config.c:8
+#: builtin/config.c:9
 msgid "git config [<options>]"
 msgstr "git config [ОПЦИЯ…]"
 
-#: builtin/config.c:54
+#: builtin/config.c:56
 msgid "Config file location"
 msgstr "Местоположение на конфигурационния файл"
 
-#: builtin/config.c:55
+#: builtin/config.c:57
 msgid "use global config file"
 msgstr "използване на глобалния конфигурационен файл"
 
-#: builtin/config.c:56
+#: builtin/config.c:58
 msgid "use system config file"
 msgstr "използване на системния конфигурационен файл"
 
-#: builtin/config.c:57
+#: builtin/config.c:59
 msgid "use repository config file"
 msgstr "използване на конфигурационния файл на хранилището"
 
-#: builtin/config.c:58
+#: builtin/config.c:60
 msgid "use given config file"
-msgstr "използване на зададения конфигурационен файл"
+msgstr "използване на зададения конфигурационен ФАЙЛ"
 
-#: builtin/config.c:59
+#: builtin/config.c:61
 msgid "blob-id"
-msgstr "иденÑ\82иÑ\84икаÑ\82оÑ\80 Ð½Ð° BLOB"
+msgstr "Ð\98Ð\94Ð\95Ð\9dТÐ\98ФÐ\98Ð\9aÐ\90ТÐ\9eР"
 
-#: builtin/config.c:59
+#: builtin/config.c:61
 msgid "read config from given blob object"
 msgstr ""
-"изÑ\87иÑ\82ане Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86иÑ\8fÑ\82а Ð¾Ñ\82 BLOB Ñ\81 Ñ\82ози Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 на съдържанието"
+"изÑ\87иÑ\82ане Ð½Ð° ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86иÑ\8fÑ\82а Ð¾Ñ\82 BLOB Ñ\81 Ñ\82ози Ð\98Ð\94Ð\95Ð\9dТÐ\98ФÐ\98Ð\9aÐ\90ТÐ\9eР на съдържанието"
 
-#: builtin/config.c:60
+#: builtin/config.c:62
 msgid "Action"
 msgstr "Действие"
 
-#: builtin/config.c:61
+#: builtin/config.c:63
 msgid "get value: name [value-regex]"
 msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:62
+#: builtin/config.c:64
 msgid "get all values: key [value-regex]"
 msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:63
+#: builtin/config.c:65
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
 "извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
 "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:64
+#: builtin/config.c:66
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
 
-#: builtin/config.c:65
+#: builtin/config.c:67
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
 "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:66
+#: builtin/config.c:68
 msgid "add a new variable: name value"
 msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
 
-#: builtin/config.c:67
+#: builtin/config.c:69
 msgid "remove a variable: name [value-regex]"
 msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:68
+#: builtin/config.c:70
 msgid "remove all matches: name [value-regex]"
 msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
 
-#: builtin/config.c:69
+#: builtin/config.c:71
 msgid "rename section: old-name new-name"
 msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
 
-#: builtin/config.c:70
+#: builtin/config.c:72
 msgid "remove a section: name"
 msgstr "изтриване на раздел: ИМЕ"
 
-#: builtin/config.c:71
+#: builtin/config.c:73
 msgid "list all"
 msgstr "изброяване на всички"
 
-#: builtin/config.c:72
+#: builtin/config.c:74
 msgid "open an editor"
 msgstr "отваряне на редактор"
 
-#: builtin/config.c:73
+#: builtin/config.c:75
 msgid "find the color configured: slot [default]"
 msgstr "извеждане на зададения цвят: номер [стандартно]"
 
-#: builtin/config.c:74
+#: builtin/config.c:76
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "извеждане на зададения цвят: номер [стандартният изход е терминал]"
 
-#: builtin/config.c:75
+#: builtin/config.c:77
 msgid "Type"
 msgstr "Вид"
 
-#: builtin/config.c:76
+#: builtin/config.c:78
 msgid "value is \"true\" or \"false\""
 msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
 
-#: builtin/config.c:77
+#: builtin/config.c:79
 msgid "value is decimal number"
 msgstr "СТОЙНОСТТА е цяло, десетично число"
 
-#: builtin/config.c:78
+#: builtin/config.c:80
 msgid "value is --bool or --int"
 msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
 
-#: builtin/config.c:79
+#: builtin/config.c:81
 msgid "value is a path (file or directory name)"
 msgstr "СТОЙНОСТТА е път (до файл или директория)"
 
-#: builtin/config.c:80
+#: builtin/config.c:82
 msgid "Other"
 msgstr "Други"
 
 # FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
-#: builtin/config.c:81
+#: builtin/config.c:83
 msgid "terminate values with NUL byte"
 msgstr "разделяне на стойностите с нулевия знак „NUL“"
 
-#: builtin/config.c:82
+#: builtin/config.c:84
 msgid "show variable names only"
 msgstr "извеждане на имената на променливите"
 
-#: builtin/config.c:83
+#: builtin/config.c:85
 msgid "respect include directives on lookup"
 msgstr "при търсене да се уважат и директивите за включване"
 
-#: builtin/config.c:303
+#: builtin/config.c:86
+msgid "show origin of config (file, standard input, blob, command line)"
+msgstr ""
+"извеждане на мястото на задаване на настройката (файл, стандартен вход, "
+"обект BLOB, команден ред)"
+
+#: builtin/config.c:328
 msgid "unable to parse default color value"
 msgstr "неразпозната стойност на стандартния цвят"
 
-#: builtin/config.c:441
+#: builtin/config.c:472
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5785,7 +6263,7 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:575
+#: builtin/config.c:614
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "конфигурационният файл „%s“ не може да бъде създаден"
@@ -5822,7 +6300,7 @@ msgstr "в анотирания етикет „%s“ липсва вграде
 msgid "tag '%s' is really '%s' here"
 msgstr "етикетът „%s“ тук е всъщност „%s“"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:465
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "Неправилно име на обект „%s“"
@@ -5918,7 +6396,7 @@ msgstr "да се търси само в този БРОЙ последни ет
 msgid "only consider tags matching <pattern>"
 msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:321
 msgid "show abbreviated commit object as fallback"
 msgstr "извеждане на съкратено име на обект като резервен вариант"
 
@@ -5952,21 +6430,21 @@ msgstr "„%s“: не е нито обикновен файл, нито сим
 msgid "invalid option: %s"
 msgstr "неправилна опция: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:360
 msgid "Not a git repository"
 msgstr "Не е хранилище на Git"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:403
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "зададен е неправилен обект „%s“."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:412
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "зададени са повече от 2 обекта BLOB: „%s“"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:419
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "зададен е неподдържан обект „%s“."
@@ -5989,11 +6467,11 @@ msgstr "Как да се обработват етикетите на филтр
 
 #: builtin/fast-export.c:988
 msgid "Dump marks to this file"
-msgstr "Запазване на маркерите в този файл"
+msgstr "Запазване на маркерите в този ФАЙЛ"
 
 #: builtin/fast-export.c:990
 msgid "Import marks from this file"
-msgstr "Внасяне на маркерите от този файл"
+msgstr "Внасяне на маркерите от този ФАЙЛ"
 
 #: builtin/fast-export.c:992
 msgid "Fake a tagger when tags lack one"
@@ -6013,11 +6491,11 @@ msgstr "Без извеждане на съдържанието на обект
 
 #: builtin/fast-export.c:998
 msgid "refspec"
-msgstr "указател на версия"
+msgstr "УКАЗАТЕЛ_НА_ВЕРСИЯ"
 
 #: builtin/fast-export.c:999
 msgid "Apply refspec to exported refs"
-msgstr "Прилагане на указателя на версия към изнесените указатели"
+msgstr "Прилагане на УКАЗАТЕЛя_НА_ВЕРСИЯ към изнесените указатели"
 
 #: builtin/fast-export.c:1000
 msgid "anonymize output"
@@ -6039,164 +6517,163 @@ msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [ОПЦИЯ…]"
 
-#: builtin/fetch.c:90 builtin/pull.c:162
+#: builtin/fetch.c:92 builtin/pull.c:174
 msgid "fetch from all remotes"
 msgstr "доставяне от всички отдалечени хранилища"
 
-#: builtin/fetch.c:92 builtin/pull.c:165
+#: builtin/fetch.c:94 builtin/pull.c:177
 msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна"
 
-#: builtin/fetch.c:94 builtin/pull.c:168
+#: builtin/fetch.c:96 builtin/pull.c:180
 msgid "path to upload pack on remote end"
 msgstr "отдалечен път, където да се качи пакетът"
 
-#: builtin/fetch.c:95 builtin/pull.c:170
+#: builtin/fetch.c:97 builtin/pull.c:182
 msgid "force overwrite of local branch"
 msgstr "принудително презаписване на локалния клон"
 
-#: builtin/fetch.c:97
+#: builtin/fetch.c:99
 msgid "fetch from multiple remotes"
 msgstr "доставяне от множество отдалечени хранилища"
 
-#: builtin/fetch.c:99 builtin/pull.c:172
+#: builtin/fetch.c:101 builtin/pull.c:184
 msgid "fetch all tags and associated objects"
 msgstr "доставяне на всички етикети и принадлежащи обекти"
 
-#: builtin/fetch.c:101
+#: builtin/fetch.c:103
 msgid "do not fetch all tags (--no-tags)"
 msgstr "без доставянето на всички етикети „--no-tags“"
 
-#: builtin/fetch.c:103 builtin/pull.c:175
+#: builtin/fetch.c:105
+msgid "number of submodules fetched in parallel"
+msgstr "брой подмодули доставени паралелно"
+
+#: builtin/fetch.c:107 builtin/pull.c:187
 msgid "prune remote-tracking branches no longer on remote"
 msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони"
 
-#: builtin/fetch.c:104 builtin/pull.c:178
+#: builtin/fetch.c:108 builtin/pull.c:190
 msgid "on-demand"
-msgstr "пÑ\80и Ð½Ñ\83жда"
+msgstr "Ð\9fРÐ\98 Ð\9dУÐ\96Ð\94Ð\90"
 
-#: builtin/fetch.c:105 builtin/pull.c:179
+#: builtin/fetch.c:109 builtin/pull.c:191
 msgid "control recursive fetching of submodules"
 msgstr "управление на рекурсивното доставяне на подмодулите"
 
-#: builtin/fetch.c:109 builtin/pull.c:184
+#: builtin/fetch.c:113 builtin/pull.c:199
 msgid "keep downloaded pack"
 msgstr "запазване на изтеглените пакети с обекти"
 
-#: builtin/fetch.c:111
+#: builtin/fetch.c:115
 msgid "allow updating of HEAD ref"
 msgstr "позволяване на обновяването на указателя „HEAD“"
 
-#: builtin/fetch.c:114 builtin/pull.c:187
+#: builtin/fetch.c:118 builtin/pull.c:202
 msgid "deepen history of shallow clone"
 msgstr "задълбочаване на историята на плитко хранилище"
 
-#: builtin/fetch.c:116 builtin/pull.c:190
+#: builtin/fetch.c:120 builtin/pull.c:205
 msgid "convert to a complete repository"
 msgstr "превръщане в пълно хранилище"
 
-#: builtin/fetch.c:118 builtin/log.c:1233
+#: builtin/fetch.c:122 builtin/log.c:1399
 msgid "dir"
 msgstr "директория"
 
-#: builtin/fetch.c:119
+#: builtin/fetch.c:123
 msgid "prepend this to submodule path output"
 msgstr "добавяне на това пред пътя на подмодула"
 
-#: builtin/fetch.c:122
+#: builtin/fetch.c:126
 msgid "default mode for recursion"
 msgstr "стандартен режим на рекурсия"
 
-#: builtin/fetch.c:124 builtin/pull.c:193
+#: builtin/fetch.c:128 builtin/pull.c:208
 msgid "accept refs that update .git/shallow"
 msgstr "приемане на указатели, които обновяват „.git/shallow“"
 
-#: builtin/fetch.c:125 builtin/pull.c:195
+#: builtin/fetch.c:129 builtin/pull.c:210
 msgid "refmap"
-msgstr "каÑ\80Ñ\82а Ñ\81 Ñ\83казаÑ\82ели"
+msgstr "Ð\9aÐ\90РТÐ\90_С_УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÐ\98"
 
-#: builtin/fetch.c:126 builtin/pull.c:196
+#: builtin/fetch.c:130 builtin/pull.c:211
 msgid "specify fetch refmap"
-msgstr "Ñ\83казване Ð½Ð° ÐºÐ°Ñ\80Ñ\82аÑ\82а Ñ\81 Ñ\83казаÑ\82ели за доставяне"
+msgstr "Ñ\83казване Ð½Ð° Ð\9aÐ\90РТÐ\90Ñ\82а_С_УÐ\9aÐ\90Ð\97Ð\90ТÐ\95Ð\9bÐ\98 за доставяне"
 
-#: builtin/fetch.c:378
+#: builtin/fetch.c:386
 msgid "Couldn't find remote ref HEAD"
 msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
 
-#: builtin/fetch.c:458
+#: builtin/fetch.c:466
 #, c-format
 msgid "object %s not found"
 msgstr "обектът „%s“ липсва"
 
-#: builtin/fetch.c:463
+#: builtin/fetch.c:471
 msgid "[up to date]"
 msgstr "[актуализиран]"
 
-#: builtin/fetch.c:477
+#: builtin/fetch.c:485
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s → %s  (в текущия клон не може да се доставя)"
 
-#: builtin/fetch.c:478 builtin/fetch.c:566
+#: builtin/fetch.c:486 builtin/fetch.c:574
 msgid "[rejected]"
 msgstr "[отхвърлен]"
 
-#: builtin/fetch.c:489
+#: builtin/fetch.c:497
 msgid "[tag update]"
 msgstr "[обновяване на етикетите]"
 
-#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544
+#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
 msgid "  (unable to update local ref)"
 msgstr "  (локалните указатели не могат да бъдат обновени)"
 
-#: builtin/fetch.c:509
+#: builtin/fetch.c:517
 msgid "[new tag]"
 msgstr "[нов етикет]"
 
-#: builtin/fetch.c:512
+#: builtin/fetch.c:520
 msgid "[new branch]"
 msgstr "[нов клон]"
 
-#: builtin/fetch.c:515
+#: builtin/fetch.c:523
 msgid "[new ref]"
 msgstr "[нов указател]"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:569
 msgid "unable to update local ref"
 msgstr "локален указател не може да бъде обновен"
 
-#: builtin/fetch.c:561
+#: builtin/fetch.c:569
 msgid "forced update"
 msgstr "принудително обновяване"
 
-#: builtin/fetch.c:568
+#: builtin/fetch.c:576
 msgid "(non-fast-forward)"
 msgstr "(сливането не е тривиално)"
 
-#: builtin/fetch.c:602 builtin/fetch.c:843
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "файлът „%s“ не може да бъде отворен: %s\n"
-
-#: builtin/fetch.c:611
+#: builtin/fetch.c:619
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
 
-#: builtin/fetch.c:629
+#: builtin/fetch.c:637
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
 "обновявани"
 
-#: builtin/fetch.c:716 builtin/fetch.c:808
+#: builtin/fetch.c:724 builtin/fetch.c:816
 #, c-format
 msgid "From %.*s\n"
 msgstr "От %.*s\n"
 
 # FIXME - is the space necessary
-#: builtin/fetch.c:727
+#: builtin/fetch.c:735
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6206,55 +6683,55 @@ msgstr ""
 "„git remote prune %s“, за да премахнете остарелите клони, които\n"
 "предизвикват конфликта"
 
-#: builtin/fetch.c:779
+#: builtin/fetch.c:787
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (обектът „%s“ ще се окаже извън клон)"
 
-#: builtin/fetch.c:780
+#: builtin/fetch.c:788
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (обектът „%s“ вече е извън клон)"
 
-#: builtin/fetch.c:812
+#: builtin/fetch.c:820
 msgid "[deleted]"
 msgstr "[изтрит]"
 
-#: builtin/fetch.c:813 builtin/remote.c:1040
+#: builtin/fetch.c:821 builtin/remote.c:1025
 msgid "(none)"
 msgstr "(нищо)"
 
-#: builtin/fetch.c:833
+#: builtin/fetch.c:841
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо"
 
-#: builtin/fetch.c:852
+#: builtin/fetch.c:860
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
 
-#: builtin/fetch.c:855
+#: builtin/fetch.c:863
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Опцията „%s“ се игнорира при „%s“\n"
 
-#: builtin/fetch.c:911
+#: builtin/fetch.c:920
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Не се поддържа доставяне от „%s“"
 
-#: builtin/fetch.c:1072
+#: builtin/fetch.c:1080
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Доставяне на „%s“\n"
 
-#: builtin/fetch.c:1074 builtin/remote.c:96
+#: builtin/fetch.c:1082 builtin/remote.c:96
 #, c-format
 msgid "Could not fetch %s"
 msgstr "„%s“ не може да се достави"
 
-#: builtin/fetch.c:1092
+#: builtin/fetch.c:1100
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -6262,33 +6739,33 @@ msgstr ""
 "Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
 "на отдалечено хранилище, откъдето да се доставят новите версии."
 
-#: builtin/fetch.c:1115
+#: builtin/fetch.c:1123
 msgid "You need to specify a tag name."
 msgstr "Трябва да укажете име на етикет."
 
-#: builtin/fetch.c:1157
+#: builtin/fetch.c:1165
 msgid "--depth and --unshallow cannot be used together"
 msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
 
-#: builtin/fetch.c:1159
+#: builtin/fetch.c:1167
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
 
-#: builtin/fetch.c:1179
+#: builtin/fetch.c:1187
 msgid "fetch --all does not take a repository argument"
 msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище"
 
-#: builtin/fetch.c:1181
+#: builtin/fetch.c:1189
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 "към „git fetch --all“ не можете да добавите аргумент — указател на версия"
 
-#: builtin/fetch.c:1192
+#: builtin/fetch.c:1200
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
 
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1208
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Указването на група и указването на версия са несъвместими"
 
@@ -6362,7 +6839,7 @@ msgstr "ФОРМАТ за изхода"
 
 #: builtin/for-each-ref.c:41
 msgid "print only refs which points at the given object"
-msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елиÑ\82е, Ñ\81оÑ\87еÑ\89и ÐºÑ\8aм Ð¾Ð±ÐµÐºÑ\82а"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елиÑ\82е, Ñ\81оÑ\87еÑ\89и ÐºÑ\8aм Ð\9eÐ\91Ð\95Ð\9aТÐ\90"
 
 #: builtin/for-each-ref.c:43
 msgid "print only refs that are merged"
@@ -6374,7 +6851,7 @@ msgstr "извеждане само на неслетите указатели"
 
 #: 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ова Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ðµ"
+msgstr "извеждане Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\82 Ñ\82ова Ð\9fÐ\9eÐ\94Ð\90Ð\92Ð\90Ð\9dÐ\95"
 
 #: builtin/fsck.c:156 builtin/prune.c:140
 msgid "Checking connectivity"
@@ -6384,56 +6861,56 @@ msgstr "Проверка на връзката"
 msgid "Checking object directories"
 msgstr "Проверка на директориите с обекти"
 
-#: builtin/fsck.c:553
+#: builtin/fsck.c:552
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:558
 msgid "show unreachable objects"
 msgstr "показване на недостижимите обекти"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:559
 msgid "show dangling objects"
 msgstr "показване на обектите извън клоните"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:560
 msgid "report tags"
 msgstr "показване на етикетите"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:561
 msgid "report root nodes"
 msgstr "показване на кореновите възли"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:562
 msgid "make index objects head nodes"
 msgstr "задаване на обекти от индекса да са коренови"
 
 # FIXME bad message
-#: builtin/fsck.c:564
+#: builtin/fsck.c:563
 msgid "make reflogs head nodes (default)"
 msgstr "проследяване на указателите от журнала като глави (стандартно)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:564
 msgid "also consider packs and alternate objects"
 msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:565
 msgid "check only connectivity"
 msgstr "проверка само на връзката"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:566
 msgid "enable more strict checking"
 msgstr "по-строги проверки"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:568
 msgid "write dangling objects in .git/lost-found"
 msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:569 builtin/prune.c:107
 msgid "show progress"
 msgstr "показване на напредъка"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:630
 msgid "Checking objects"
 msgstr "Проверка на обектите"
 
@@ -6527,239 +7004,253 @@ msgstr ""
 msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr "git grep [ОПЦИЯ…] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
 
-#: builtin/grep.c:218
+#: builtin/grep.c:219
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: неуспешно създаване на нишка: %s"
 
-#: builtin/grep.c:441 builtin/grep.c:476
+#: builtin/grep.c:277
+#, c-format
+msgid "invalid number of threads specified (%d) for %s"
+msgstr "зададен е неправилен брой нишки (%d) за %s"
+
+#: builtin/grep.c:452 builtin/grep.c:487
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "дървото не може да бъде прочетено (%s)"
 
-#: builtin/grep.c:491
+#: builtin/grep.c:502
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "не може да се изпълни „grep“ от обект от вида %s"
 
-#: builtin/grep.c:547
+#: builtin/grep.c:560
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "опцията „%c“ очаква число за аргумент"
 
-#: builtin/grep.c:564
+#: builtin/grep.c:577
 #, c-format
 msgid "cannot open '%s'"
 msgstr "„%s“ не може да бъде отворен"
 
-#: builtin/grep.c:633
+#: builtin/grep.c:646
 msgid "search in index instead of in the work tree"
 msgstr "търсене в индекса, а не в работното дърво"
 
-#: builtin/grep.c:635
+#: builtin/grep.c:648
 msgid "find in contents not managed by git"
 msgstr "търсене и във файловете, които не са под управлението на git"
 
-#: builtin/grep.c:637
+#: builtin/grep.c:650
 msgid "search in both tracked and untracked files"
 msgstr "търсене и в следените, и в неследените файлове"
 
-#: builtin/grep.c:639
+#: builtin/grep.c:652
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнориране на файловете указани в „.gitignore“"
 
-#: builtin/grep.c:642
+#: builtin/grep.c:655
 msgid "show non-matching lines"
 msgstr "извеждане на редовете, които не съвпадат"
 
-#: builtin/grep.c:644
+#: builtin/grep.c:657
 msgid "case insensitive matching"
 msgstr "без значение на регистъра на буквите (главни/малки)"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:659
 msgid "match patterns only at word boundaries"
 msgstr "напасване на шаблоните само по границите на думите"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:661
 msgid "process binary files as text"
 msgstr "обработване на двоичните файлове като текстови"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:663
 msgid "don't match patterns in binary files"
 msgstr "прескачане на двоичните файлове"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:666
 msgid "process binary files with textconv filters"
 msgstr ""
 "обработване на двоичните файлове чрез филтри за преобразуване към текст"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:668
 msgid "descend at most <depth> levels"
 msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:672
 msgid "use extended POSIX regular expressions"
 msgstr "разширени регулярни изрази по POSIX"
 
-#: builtin/grep.c:662
+#: builtin/grep.c:675
 msgid "use basic POSIX regular expressions (default)"
 msgstr "основни регулярни изрази по POSIX (стандартно)"
 
-#: builtin/grep.c:665
+#: builtin/grep.c:678
 msgid "interpret patterns as fixed strings"
 msgstr "шаблоните са дословни низове"
 
-#: builtin/grep.c:668
+#: builtin/grep.c:681
 msgid "use Perl-compatible regular expressions"
 msgstr "регулярни изрази на Perl"
 
-#: builtin/grep.c:671
+#: builtin/grep.c:684
 msgid "show line numbers"
 msgstr "извеждане на номерата на редовете"
 
-#: builtin/grep.c:672
+#: builtin/grep.c:685
 msgid "don't show filenames"
 msgstr "без извеждане на имената на файловете"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:686
 msgid "show filenames"
 msgstr "извеждане на имената на файловете"
 
-#: builtin/grep.c:675
+#: builtin/grep.c:688
 msgid "show filenames relative to top directory"
 msgstr ""
 "извеждане на относителните имена на файловете спрямо основната директория на "
 "хранилището"
 
-#: builtin/grep.c:677
+#: builtin/grep.c:690
 msgid "show only filenames instead of matching lines"
 msgstr "извеждане само на имената на файловете без напасващите редове"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:692
 msgid "synonym for --files-with-matches"
 msgstr "синоним на „--files-with-matches“"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:695
 msgid "show only the names of files without match"
 msgstr ""
 "извеждане само на имената на файловете, които не съдържат ред, напасващ на "
 "шаблона"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:697
 msgid "print NUL after filenames"
 msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:699
 msgid "show the number of matches instead of matching lines"
 msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
 
-#: builtin/grep.c:687
+#: builtin/grep.c:700
 msgid "highlight matches"
 msgstr "оцветяване на напасванията"
 
-#: builtin/grep.c:689
+#: builtin/grep.c:702
 msgid "print empty line between matches from different files"
 msgstr "извеждане на празен ред между напасванията от различни файлове"
 
-#: builtin/grep.c:691
+#: builtin/grep.c:704
 msgid "show filename only once above matches from same file"
 msgstr ""
 "извеждане на името на файла само веднъж за всички напасвания от този файл"
 
-#: builtin/grep.c:694
+#: builtin/grep.c:707
 msgid "show <n> context lines before and after matches"
 msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:710
 msgid "show <n> context lines before matches"
 msgstr "извеждане на такъв БРОЙ редове преди напасванията"
 
-#: builtin/grep.c:699
+#: builtin/grep.c:712
 msgid "show <n> context lines after matches"
 msgstr "извеждане на такъв БРОЙ редове след напасванията"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:714
+msgid "use <n> worker threads"
+msgstr "използване на такъв БРОЙ работещи нишки"
+
+#: builtin/grep.c:715
 msgid "shortcut for -C NUM"
 msgstr "синоним на „-C БРОЙ“"
 
-#: builtin/grep.c:703
+#: builtin/grep.c:718
 msgid "show a line with the function name before matches"
 msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:720
 msgid "show the surrounding function"
 msgstr "извеждане на обхващащата функция"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:723
 msgid "read patterns from file"
-msgstr "изчитане на шаблоните от файл"
+msgstr "изчитане на шаблоните от ФАЙЛ"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:725
 msgid "match <pattern>"
 msgstr "напасване на ШАБЛОН"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:727
 msgid "combine patterns specified with -e"
 msgstr "комбиниране на шаблоните указани с опцията „-e“"
 
-#: builtin/grep.c:724
+#: builtin/grep.c:739
 msgid "indicate hit with exit status without output"
 msgstr ""
 "без извеждане на стандартния изход. Изходният код указва наличието на "
 "напасване"
 
-#: builtin/grep.c:726
+#: builtin/grep.c:741
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "извеждане на редове само от файловете, които напасват на всички шаблони"
 
-#: builtin/grep.c:728
+#: builtin/grep.c:743
 msgid "show parse tree for grep expression"
 msgstr "извеждане на дървото за анализ на регулярния израз"
 
-#: builtin/grep.c:732
+#: builtin/grep.c:747
 msgid "pager"
 msgstr "програма за преглед по страници"
 
-#: builtin/grep.c:732
+#: builtin/grep.c:747
 msgid "show matching files in the pager"
 msgstr "извеждане на съвпадащите файлове в програма за преглед по страници"
 
-#: builtin/grep.c:735
+#: builtin/grep.c:750
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 "позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
 "опция)"
 
-#: builtin/grep.c:793
+#: builtin/grep.c:813
 msgid "no pattern given."
 msgstr "липсва шаблон."
 
-#: builtin/grep.c:851
+#: builtin/grep.c:845 builtin/index-pack.c:1477
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "зададен е неправилен брой нишки: %d"
+
+#: builtin/grep.c:875
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 "опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
 
-#: builtin/grep.c:877
+#: builtin/grep.c:901
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
 
-#: builtin/grep.c:882
+#: builtin/grep.c:906
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 "опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
 
-#: builtin/grep.c:885
+#: builtin/grep.c:909
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
 "файлове."
 
-#: builtin/grep.c:893
+#: builtin/grep.c:917
 msgid "both --cached and trees are given."
 msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
 
-#: builtin/hash-object.c:80
+#: builtin/hash-object.c:81
 msgid ""
 "git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
 "[--] <file>..."
@@ -6767,40 +7258,40 @@ msgstr ""
 "git hash-object [-t ВИД] [-w] [--path=ФАЙЛ | --no-filters] [--stdin] [--] "
 "ФАЙЛ…"
 
-#: builtin/hash-object.c:81
+#: builtin/hash-object.c:82
 msgid "git hash-object  --stdin-paths"
 msgstr "git hash-object --stdin-paths"
 
-#: builtin/hash-object.c:92
+#: builtin/hash-object.c:93
 msgid "type"
 msgstr "ВИД"
 
-#: builtin/hash-object.c:92
+#: builtin/hash-object.c:93
 msgid "object type"
-msgstr "вид на обекта"
+msgstr "Ð\92Ð\98Ð\94 на обекта"
 
-#: builtin/hash-object.c:93
+#: builtin/hash-object.c:94
 msgid "write the object into the object database"
 msgstr "записване на обекта в базата от данни за обектите"
 
-#: builtin/hash-object.c:95
+#: builtin/hash-object.c:96
 msgid "read the object from stdin"
 msgstr "изчитане на обекта от стандартния вход"
 
-#: builtin/hash-object.c:97
+#: builtin/hash-object.c:98
 msgid "store file as is without filters"
 msgstr "запазване на файла както е — без филтри"
 
-#: builtin/hash-object.c:98
+#: builtin/hash-object.c:99
 msgid ""
 "just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 "създаване и хеширане на произволни данни за повредени обекти за трасиране на "
 "Git"
 
-#: builtin/hash-object.c:99
+#: builtin/hash-object.c:100
 msgid "process file as it were from this path"
-msgstr "обработване на файла все едно е с този път"
+msgstr "обработване на ФАЙЛа все едно е с този път"
 
 #: builtin/help.c:41
 msgid "print all available commands"
@@ -6846,10 +7337,10 @@ msgstr "Прекалено стара версия на „emacsclient“ — %d
 
 #: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
 #, c-format
-msgid "failed to exec '%s': %s"
-msgstr "неуспешно изпълнение на „%s“: %s"
+msgid "failed to exec '%s'"
+msgstr "неуспешно изпълнение на „%s“"
 
-#: builtin/help.c:208
+#: builtin/help.c:205
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6858,7 +7349,7 @@ msgstr ""
 "„%s“: път към неподдържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
 
-#: builtin/help.c:220
+#: builtin/help.c:217
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6867,63 +7358,63 @@ msgstr ""
 "„%s“: команда за поддържана програма за преглед на\n"
 " ръководството. Вместо нея пробвайте „man.<tool>.path“."
 
-#: builtin/help.c:337
+#: builtin/help.c:334
 #, c-format
 msgid "'%s': unknown man viewer."
 msgstr "„%s“: непозната програма за преглед на ръководството."
 
-#: builtin/help.c:354
+#: builtin/help.c:351
 msgid "no man viewer handled the request"
 msgstr "никоя програма за преглед на ръководство не успя да обработи заявката"
 
-#: builtin/help.c:362
+#: builtin/help.c:359
 msgid "no info viewer handled the request"
 msgstr ""
 "никоя програма за преглед на информационните страници не успя да обработи "
 "заявката"
 
-#: builtin/help.c:411
+#: builtin/help.c:408
 msgid "Defining attributes per path"
 msgstr "Указване на атрибути към път"
 
-#: builtin/help.c:412
+#: builtin/help.c:409
 msgid "Everyday Git With 20 Commands Or So"
 msgstr "Ежедневието в Git в рамките на 20-ина команди"
 
-#: builtin/help.c:413
+#: builtin/help.c:410
 msgid "A Git glossary"
 msgstr "Речник с термините на Git"
 
-#: builtin/help.c:414
+#: builtin/help.c:411
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
 
-#: builtin/help.c:415
+#: builtin/help.c:412
 msgid "Defining submodule properties"
 msgstr "Дефиниране на свойствата на подмодулите"
 
-#: builtin/help.c:416
+#: builtin/help.c:413
 msgid "Specifying revisions and ranges for Git"
 msgstr "Указване на версии и интервали в Git"
 
-#: builtin/help.c:417
+#: builtin/help.c:414
 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr "Въвеждащ урок за Git (версии поне 1.5.1)"
 
-#: builtin/help.c:418
+#: builtin/help.c:415
 msgid "An overview of recommended workflows with Git"
 msgstr "Общ преглед на препоръчваните начини за работа с Git"
 
-#: builtin/help.c:430
+#: builtin/help.c:427
 msgid "The common Git guides are:\n"
 msgstr "Популярните пътеводители в Git са:\n"
 
-#: builtin/help.c:451 builtin/help.c:468
+#: builtin/help.c:448 builtin/help.c:465
 #, c-format
 msgid "usage: %s%s"
 msgstr "употреба: %s%s"
 
-#: builtin/help.c:484
+#: builtin/help.c:481
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "„git %s“ е синоним на „%s“"
@@ -7119,118 +7610,115 @@ msgstr ""
 
 #: builtin/index-pack.c:1253
 #, c-format
-msgid "completed with %d local objects"
-msgstr "действието завърши с %d локални обекта"
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] "действието завърши с %d локален обект"
+msgstr[1] "действието завърши с %d локални обекта"
 
-#: builtin/index-pack.c:1263
+#: builtin/index-pack.c:1265
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 "Неочаквана последваща сума за грешки за „%s“ (причината може да е грешка в "
 "диска)"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1269
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "в пакета има %d ненапасваща разлика"
 msgstr[1] "в пакета има %d ненапасващи разлики"
 
-#: builtin/index-pack.c:1291
+#: builtin/index-pack.c:1293
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "добавеният обект не може да се компресира с „deflate“: %d"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1369
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "локалният обект „%s“ е повреден"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1393
 msgid "error while closing pack file"
 msgstr "грешка при затварянето на пакетния файл"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1406
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr ""
 "грешка при записването на файла „%s“, осигуряващ запазване на директория"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1414
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr ""
 "грешка при затварянето на записания файл „%s“, осигуряващ запазване на "
 "директория"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1427
 msgid "cannot store pack file"
 msgstr "пакетният файл не може да бъде запазен"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1438
 msgid "cannot store index file"
 msgstr "файлът за индекса не може да бъде съхранен"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1471
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "зададена е неправилна версия пакетиране: „pack.indexversion=%<PRIu32>“"
 
-#: builtin/index-pack.c:1475
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr "зададен е неправилен брой нишки: %d"
-
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1663
+#: builtin/index-pack.c:1481 builtin/index-pack.c:1678
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне"
 
-#: builtin/index-pack.c:1537
+#: builtin/index-pack.c:1540
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Съществуващият пакетен файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1539
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Съществуващият индекс за пакетния файл „%s“ не може да бъде отворен"
 
-#: builtin/index-pack.c:1586
+#: 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/index-pack.c:1593
+#: 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/index-pack.c:1609
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
+
 # FIXME it is not the cwd it is the previous cwd
-#: builtin/index-pack.c:1623
+#: builtin/index-pack.c:1638
 msgid "Cannot come back to cwd"
 msgstr "Процесът не може да се върне към предишната работна директория"
 
-#: builtin/index-pack.c:1675 builtin/index-pack.c:1678
-#: builtin/index-pack.c:1690 builtin/index-pack.c:1694
+#: 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/index-pack.c:1708
+#: builtin/index-pack.c:1723
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "опцията „--fix-thin“ изисква „--stdin“"
 
-#: builtin/index-pack.c:1712 builtin/index-pack.c:1721
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "името на пакетния файл „%s“ не завършва на „.pack“"
-
-#: builtin/index-pack.c:1729
+#: builtin/index-pack.c:1731
 msgid "--verify with no packfile name given"
 msgstr "опцията „--verify“ изисква име на пакетен файл"
 
@@ -7269,28 +7757,27 @@ msgstr "„%s“ не може да се копира в „%s“"
 msgid "ignoring template %s"
 msgstr "игнориране на шаблона „%s“"
 
-#: builtin/init-db.c:118
+#: builtin/init-db.c:120
 #, c-format
 msgid "templates not found %s"
 msgstr "директорията с шаблоните не е открита: „%s“"
 
-#: builtin/init-db.c:131
+#: builtin/init-db.c:135
 #, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr ""
-"шаблоните с неправилен номер на форма̀та %d няма да бъдат копирани от „%s“"
+msgid "not copying templates from '%s': %s"
+msgstr "шаблоните няма да бъдат копирани от „%s“: „%s“"
 
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:312 builtin/init-db.c:315
 #, c-format
 msgid "%s already exists"
 msgstr "Директорията „%s“ вече съществува"
 
-#: builtin/init-db.c:340
+#: builtin/init-db.c:344
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "файлове от вид %d не се поддържат"
 
-#: builtin/init-db.c:343
+#: builtin/init-db.c:347
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "„%s“ не може да се премести в „%s“"
@@ -7298,24 +7785,24 @@ 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:399
+#: builtin/init-db.c:403
 #, c-format
 msgid "%s%s Git repository in %s%s\n"
 msgstr "%s%s хранилище на Git в „%s%s“\n"
 
-#: builtin/init-db.c:400
+#: builtin/init-db.c:404
 msgid "Reinitialized existing"
 msgstr "Наново инициализирано, съществуващо"
 
-#: builtin/init-db.c:400
+#: builtin/init-db.c:404
 msgid "Initialized empty"
 msgstr "Инициализирано празно"
 
-#: builtin/init-db.c:401
+#: builtin/init-db.c:405
 msgid " shared"
 msgstr ", споделено"
 
-#: builtin/init-db.c:448
+#: builtin/init-db.c:452
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7323,27 +7810,27 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--"
 "shared[=ПРАВА]] [ДИРЕКТОРИЯ]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:475
 msgid "permissions"
 msgstr "права"
 
-#: builtin/init-db.c:472
+#: builtin/init-db.c:476
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 "указване, че хранилището на Git ще бъде споделено от повече от един "
 "потребител"
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/init-db.c:510 builtin/init-db.c:515
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/init-db.c:515
+#: builtin/init-db.c:519
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не може да се влезе в директорията „%s“"
 
-#: builtin/init-db.c:536
+#: builtin/init-db.c:540
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7352,31 +7839,39 @@ msgstr ""
 "%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-"
 "dir=ДИРЕКТОРИЯ)"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:568
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Работното дърво в „%s“ е недостъпно"
 
 #: builtin/interpret-trailers.c:15
 msgid ""
-"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
-"[<file>...]"
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
 msgstr ""
-"git interpret-trailers [--trim-empty] [(--trailer ЛЕКСЕМА[(=|:)СТОЙНОСТ])…] "
-"[ФАЙЛ…]"
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"ЛЕКСЕМА[(=|:)СТОЙНОСТ])…] [ФАЙЛ…]"
+
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
+msgstr "директно редактиране на файловете"
 
-#: builtin/interpret-trailers.c:25
+#: builtin/interpret-trailers.c:27
 msgid "trim empty trailers"
 msgstr "изчистване на празните епилози"
 
-#: builtin/interpret-trailers.c:26
+#: builtin/interpret-trailers.c:28
 msgid "trailer"
 msgstr "епилог"
 
-#: builtin/interpret-trailers.c:27
+#: builtin/interpret-trailers.c:29
 msgid "trailer(s) to add"
 msgstr "епилог(зи) за добавяне"
 
+#: builtin/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
+msgstr "не е зададен входен файл за редактиране на място"
+
 #: builtin/log.c:43
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]"
@@ -7390,277 +7885,327 @@ msgstr "git show [ОПЦИЯ…] ОБЕКТ…"
 msgid "invalid --decorate option: %s"
 msgstr "неправилна опция „--decorate“: %s"
 
-#: builtin/log.c:131
+#: builtin/log.c:137
 msgid "suppress diff output"
 msgstr "без извеждане на разликите"
 
-#: builtin/log.c:132
+#: builtin/log.c:138
 msgid "show source"
 msgstr "извеждане на изходния код"
 
-#: builtin/log.c:133
+#: builtin/log.c:139
 msgid "Use mail map file"
 msgstr ""
 "Използване на файл за съответствията на имената и адресите на е-поща („."
 "mailmap“)"
 
-#: builtin/log.c:134
+#: builtin/log.c:140
 msgid "decorate options"
 msgstr "настройки на форма̀та на извежданата информация"
 
-#: builtin/log.c:137
+#: builtin/log.c:143
 msgid "Process line range n,m in file, counting from 1"
 msgstr ""
 "Обработване само на редовете във файла в интервала от n до m включително. "
 "Броенето започва от 1"
 
-#: builtin/log.c:233
+#: builtin/log.c:239
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Резултат: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:471
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: повреден файл"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:485 builtin/log.c:578
 #, c-format
 msgid "Could not read object %s"
 msgstr "Обектът не може да бъде прочетен: %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:602
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Неизвестен вид: %d"
 
-#: builtin/log.c:714
+#: builtin/log.c:722
 msgid "format.headers without value"
 msgstr "не е зададена стойност на „format.headers“"
 
-#: builtin/log.c:798
+#: builtin/log.c:812
 msgid "name of output directory is too long"
 msgstr "прекалено дълго име на директорията за изходната информация"
 
-#: builtin/log.c:813
+#: builtin/log.c:827
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
 
-#: builtin/log.c:827
+#: builtin/log.c:841
 msgid "Need exactly one range."
 msgstr "Трябва да зададете точно един диапазон."
 
-#: builtin/log.c:837
+#: builtin/log.c:851
 msgid "Not a range."
 msgstr "Не е диапазон."
 
-#: builtin/log.c:943
+#: builtin/log.c:957
 msgid "Cover letter needs email format"
 msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
 
 # FIXME bad wording insanely
-#: builtin/log.c:1022
+#: builtin/log.c:1036
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
 
-#: builtin/log.c:1050
+#: builtin/log.c:1064
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
 
-# FIXME message WTF why ask it
-#: builtin/log.c:1095
+#: builtin/log.c:1109
 msgid "Two output directories?"
 msgstr "Можете да укажете максимум една директория за изход."
 
-#: builtin/log.c:1211
+#: 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/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/log.c:1231
+msgid "Could not find exact merge base."
+msgstr "Точната база за сливане не може да се открие."
+
+#: 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/log.c:1255
+msgid "Failed to find exact merge base"
+msgstr "Точната база при сливане не може да бъде открита"
+
+#: builtin/log.c:1266
+msgid "base commit should be the ancestor of revision list"
+msgstr "базовото подаване трябва да е предшественикът на списъка с версиите"
+
+#: builtin/log.c:1270
+msgid "base commit shouldn't be in revision list"
+msgstr "базовото подаване не може да е в списъка с версиите"
+
+#: builtin/log.c:1319
+msgid "cannot get patch id"
+msgstr "идентификаторът на кръпката не може да бъде получен"
+
+#: builtin/log.c:1377
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1380
 msgid "use [PATCH] even with multiple patches"
 msgstr "номерация „[PATCH]“ дори и при множество кръпки"
 
-#: builtin/log.c:1218
+#: builtin/log.c:1384
 msgid "print patches to standard out"
 msgstr "извеждане на кръпките на стандартния изход"
 
-#: builtin/log.c:1220
+#: builtin/log.c:1386
 msgid "generate a cover letter"
 msgstr "създаване на придружаващо писмо"
 
-#: builtin/log.c:1222
+#: builtin/log.c:1388
 msgid "use simple number sequence for output file names"
 msgstr "проста числова последователност за имената на файловете-кръпки"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1389
 msgid "sfx"
 msgstr "ЗНАЦИ"
 
-#: builtin/log.c:1224
+#: builtin/log.c:1390
 msgid "use <sfx> instead of '.patch'"
 msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1392
 msgid "start numbering patches at <n> instead of 1"
 msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
 
-#: builtin/log.c:1228
+#: builtin/log.c:1394
 msgid "mark the series as Nth re-roll"
 msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
 
-#: builtin/log.c:1230
+#: builtin/log.c:1396
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1399
 msgid "store resulting files in <dir>"
 msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1402
 msgid "don't strip/add [PATCH]"
 msgstr "без добавяне/махане на префикса „[PATCH]“"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1405
 msgid "don't output binary diffs"
 msgstr "без извеждане на разлики между двоични файлове"
 
-#: builtin/log.c:1241
+#: builtin/log.c:1407
 msgid "output all-zero hash in From header"
 msgstr "в заглавната част „From:“ (от) хешът да е само от нули"
 
-#: builtin/log.c:1243
+#: builtin/log.c:1409
 msgid "don't include a patch matching a commit upstream"
 msgstr "да не се включват кръпки, които присъстват в следения клон"
 
-#: builtin/log.c:1245
+#: builtin/log.c:1411
 msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 "извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
 
-#: builtin/log.c:1247
+#: builtin/log.c:1413
 msgid "Messaging"
 msgstr "Опции при изпращане"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1414
 msgid "header"
 msgstr "ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1249
+#: builtin/log.c:1415
 msgid "add email header"
 msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
 
-#: builtin/log.c:1250 builtin/log.c:1252
+#: builtin/log.c:1416 builtin/log.c:1418
 msgid "email"
 msgstr "Е-ПОЩА"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1416
 msgid "add To: header"
 msgstr "добавяне на заглавна част „To:“ (до)"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1418
 msgid "add Cc: header"
 msgstr "добавяне на заглавна част „Cc:“ (и до)"
 
-#: builtin/log.c:1254
+#: builtin/log.c:1420
 msgid "ident"
 msgstr "ИДЕНТИЧНОСТ"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1421
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 "задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ. Ако "
 "не е зададена такава, се взима адреса на подаващия"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1423
 msgid "message-id"
 msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1424
 msgid "make first mail a reply to <message-id>"
 msgstr ""
 "първото съобщение да е в отговор на е-писмото с този "
 "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
 
-#: builtin/log.c:1259 builtin/log.c:1262
+#: builtin/log.c:1425 builtin/log.c:1428
 msgid "boundary"
 msgstr "граница"
 
-#: builtin/log.c:1260
+#: builtin/log.c:1426
 msgid "attach the patch"
 msgstr "прикрепяне на кръпката"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1429
 msgid "inline the patch"
 msgstr "включване на кръпката в текста на писмата"
 
-#: builtin/log.c:1267
+#: builtin/log.c:1433
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
-"използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или "
+"използване на нишки за съобщенията. СТИЛът е „shallow“ (плитък) или "
 "„deep“ (дълбок)"
 
-#: builtin/log.c:1269
+#: builtin/log.c:1435
 msgid "signature"
 msgstr "подпис"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1436
 msgid "add a signature"
 msgstr "добавяне на поле за подпис"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1437
+msgid "base-commit"
+msgstr "БАЗОВО_ПОДАВАНЕ"
+
+#: builtin/log.c:1438
+msgid "add prerequisite tree info to the patch series"
+msgstr "добавяне на необходимото БАЗово дърво към серията кръпки"
+
+#: builtin/log.c:1440
 msgid "add a signature from a file"
 msgstr "добавяне на подпис от файл"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1441
 msgid "don't print the patch filenames"
 msgstr "без извеждане на имената на кръпките"
 
-#: builtin/log.c:1362
+#: builtin/log.c:1531
 msgid "-n and -k are mutually exclusive."
 msgstr "опциите „-n“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1364
+#: builtin/log.c:1533
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
 
-#: builtin/log.c:1372
+#: builtin/log.c:1541
 msgid "--name-only does not make sense"
 msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1374
+#: builtin/log.c:1543
 msgid "--name-status does not make sense"
 msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1376
+#: builtin/log.c:1545
 msgid "--check does not make sense"
 msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
 
-#: builtin/log.c:1401
+#: builtin/log.c:1573
 msgid "standard output, or directory, which one?"
 msgstr ""
 "изходът може да или стандартният, или да е в директория, но не и двете."
 
-#: builtin/log.c:1403
+#: builtin/log.c:1575
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/log.c:1500
+#: builtin/log.c:1672
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "файлът „%s“ с подпис не може да бъде прочетен"
 
-#: builtin/log.c:1563
+#: builtin/log.c:1743
 msgid "Failed to create output files"
 msgstr "Изходните файлове не могат да бъдат създадени"
 
-#: builtin/log.c:1611
+#: builtin/log.c:1792
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
 
-#: builtin/log.c:1665
+#: builtin/log.c:1846
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7668,106 +8213,151 @@ msgstr ""
 "Следеният отдалечен клон не бе открит, затова изрично задайте "
 "ОТДАЛЕЧЕН_КЛОН.\n"
 
-#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Непознато подаване „%s“"
-
-#: builtin/ls-files.c:358
+#: builtin/ls-files.c:378
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [ОПЦИЯ…] [ФАЙЛ…]"
 
-#: builtin/ls-files.c:415
+#: builtin/ls-files.c:427
 msgid "identify the file status with tags"
 msgstr "извеждане на състоянието на файловете с еднобуквени флагове"
 
-#: builtin/ls-files.c:417
+#: builtin/ls-files.c:429
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "малки букви за файловете, които да се счетат за непроменени"
 
-#: builtin/ls-files.c:419
+#: builtin/ls-files.c:431
 msgid "show cached files in the output (default)"
 msgstr "извеждане на кешираните файлове (стандартно)"
 
-#: builtin/ls-files.c:421
+#: builtin/ls-files.c:433
 msgid "show deleted files in the output"
 msgstr "извеждане на изтритите файлове"
 
-#: builtin/ls-files.c:423
+#: builtin/ls-files.c:435
 msgid "show modified files in the output"
 msgstr "извеждане на променените файлове"
 
-#: builtin/ls-files.c:425
+#: builtin/ls-files.c:437
 msgid "show other files in the output"
 msgstr "извеждане на другите файлове"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:439
 msgid "show ignored files in the output"
 msgstr "извеждане на игнорираните файлове"
 
-#: builtin/ls-files.c:430
+#: builtin/ls-files.c:442
 msgid "show staged contents' object name in the output"
 msgstr "извеждане на името на обекта за съдържанието на индекса"
 
-#: builtin/ls-files.c:432
+#: builtin/ls-files.c:444
 msgid "show files on the filesystem that need to be removed"
 msgstr "извеждане на файловете, които трябва да бъдат изтрити"
 
-#: builtin/ls-files.c:434
+#: builtin/ls-files.c:446
 msgid "show 'other' directories' names only"
 msgstr "извеждане само на името на другите (неследените) директории"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:448
+msgid "show line endings of files"
+msgstr "извеждане на знаците за край на ред във файловете"
+
+#: builtin/ls-files.c:450
 msgid "don't show empty directories"
 msgstr "без извеждане на празните директории"
 
-#: builtin/ls-files.c:440
+#: builtin/ls-files.c:453
 msgid "show unmerged files in the output"
 msgstr "извеждане на неслетите файлове"
 
 # FIXME not clear about what this option does
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:455
 msgid "show resolve-undo information"
 msgstr "извеждане на информацията за отмяна на разрешените подавания"
 
-#: builtin/ls-files.c:444
+#: builtin/ls-files.c:457
 msgid "skip files matching pattern"
 msgstr "прескачане на файловете напасващи ШАБЛОНа"
 
-#: builtin/ls-files.c:447
+#: builtin/ls-files.c:460
 msgid "exclude patterns are read from <file>"
 msgstr "шаблоните за игнориране да се прочетат от този ФАЙЛ"
 
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:463
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 "изчитане на допълнителните шаблони за игнориране по директория от този ФАЙЛ"
 
-#: builtin/ls-files.c:452
+#: builtin/ls-files.c:465
 msgid "add the standard git exclusions"
 msgstr "добавяне на стандартно игнорираните от Git файлове"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:468
 msgid "make the output relative to the project top directory"
 msgstr "пътищата да са относителни спрямо основната директория на проекта"
 
-#: builtin/ls-files.c:458
+#: builtin/ls-files.c:471
 msgid "if any <file> is not in the index, treat this as an error"
 msgstr "грешка, ако някой от тези ФАЙЛове не е в индекса"
 
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:472
 msgid "tree-ish"
 msgstr "УКАЗАТЕЛ_КЪМ_ДЪРВО"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:473
 msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 "считане, че пътищата изтрити след УКАЗАТЕЛя_КЪМ_ДЪРВО все още съществуват"
 
-#: builtin/ls-files.c:462
+#: builtin/ls-files.c:475
 msgid "show debugging data"
 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>...]]"
+msgstr ""
+"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=КОМАНДА]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
+
+#: builtin/ls-remote.c:50
+msgid "do not print remote URL"
+msgstr "без извеждане на адресите на отдалечените хранилища"
+
+#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+msgid "exec"
+msgstr "КОМАНДА"
+
+#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+msgid "path of git-upload-pack on the remote host"
+msgstr "път към командата „git-upload-pack“ на отдалечената машина"
+
+#: builtin/ls-remote.c:56
+msgid "limit to tags"
+msgstr "само етикетите"
+
+#: builtin/ls-remote.c:57
+msgid "limit to heads"
+msgstr "само върховете"
+
+#: builtin/ls-remote.c:58
+msgid "do not show peeled tags"
+msgstr "без извеждане на проследените етикети"
+
+#: builtin/ls-remote.c:60
+msgid "take url.<base>.insteadOf into account"
+msgstr "взимане предвид на „url.БАЗА.insteadOf“"
+
+#: builtin/ls-remote.c:62
+msgid "exit with exit code 2 if no matching refs are found"
+msgstr "изход с код 2, ако не се открият съвпадащи указатели"
+
+#: builtin/ls-remote.c:64
+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 [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]"
@@ -7819,175 +8409,179 @@ msgid "git merge --abort"
 msgstr "git merge --abort"
 
 # FIXME -m rather than just m
-#: builtin/merge.c:100
+#: builtin/merge.c:101
 msgid "switch `m' requires a value"
 msgstr "опцията „-m“ изисква стойност"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:138
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Няма такава стратегия за сливане: „%s“.\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:139
 #, c-format
 msgid "Available strategies are:"
 msgstr "Наличните стратегии са:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:144
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Допълнителните стратегии са:"
 
-#: builtin/merge.c:193 builtin/pull.c:119
+#: builtin/merge.c:194 builtin/pull.c:126
 msgid "do not show a diffstat at the end of the merge"
 msgstr "без извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:196 builtin/pull.c:122
+#: builtin/merge.c:197 builtin/pull.c:129
 msgid "show a diffstat at the end of the merge"
 msgstr "извеждане на статистиката след завършване на сливане"
 
-#: builtin/merge.c:197 builtin/pull.c:125
+#: builtin/merge.c:198 builtin/pull.c:132
 msgid "(synonym to --stat)"
 msgstr "(синоним на „--stat“)"
 
-#: builtin/merge.c:199 builtin/pull.c:128
+#: builtin/merge.c:200 builtin/pull.c:135
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 "добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
 "за подаване"
 
-#: builtin/merge.c:202 builtin/pull.c:131
+#: builtin/merge.c:203 builtin/pull.c:138
 msgid "create a single commit instead of doing a merge"
 msgstr "създаване на едно подаване вместо извършване на сливане"
 
-#: builtin/merge.c:204 builtin/pull.c:134
+#: builtin/merge.c:205 builtin/pull.c:141
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "извършване на подаване при успешно сливане (стандартно действие)"
 
-#: builtin/merge.c:206 builtin/pull.c:137
+#: builtin/merge.c:207 builtin/pull.c:144
 msgid "edit message before committing"
 msgstr "редактиране на съобщението преди подаване"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:208
 msgid "allow fast-forward (default)"
 msgstr "позволяване на тривиално сливане (стандартно действие)"
 
-#: builtin/merge.c:209 builtin/pull.c:143
+#: builtin/merge.c:210 builtin/pull.c:150
 msgid "abort if fast-forward is not possible"
 msgstr "преустановяване, ако сливането не е тривиално"
 
-#: builtin/merge.c:213
+#: builtin/merge.c:214
 msgid "Verify that the named commit has a valid GPG signature"
 msgstr "Проверка, че именуваното подаване е с правилен подпис на GPG"
 
-#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148
+#: builtin/merge.c:215 builtin/notes.c:771 builtin/pull.c:157
 #: builtin/revert.c:89
 msgid "strategy"
-msgstr "стратегия"
+msgstr "СТРАТЕГИЯ"
 
-#: builtin/merge.c:215 builtin/pull.c:149
+#: builtin/merge.c:216 builtin/pull.c:158
 msgid "merge strategy to use"
-msgstr "стратегия за сливане, която да се ползва"
+msgstr "СТРАТЕГИЯ за сливане, която да се ползва"
 
-#: builtin/merge.c:216 builtin/pull.c:152
+#: builtin/merge.c:217 builtin/pull.c:161
 msgid "option=value"
-msgstr "опÑ\86иÑ\8f\81Ñ\82ойноÑ\81Ñ\82"
+msgstr "Ð\9eÐ\9fЦÐ\98Я=СТÐ\9eÐ\99Ð\9dÐ\9eСТ"
 
-#: builtin/merge.c:217 builtin/pull.c:153
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option for selected merge strategy"
-msgstr "опÑ\86иÑ\8f за избраната стратегия за сливане"
+msgstr "Ð\9eÐ\9fЦÐ\98Я за избраната стратегия за сливане"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:220
 msgid "merge commit message (for a non-fast-forward merge)"
-msgstr "съобщение при подаването със сливане (при нетривиални сливания)"
+msgstr "СЪОБЩЕНИЕ при подаването със сливане (при нетривиални сливания)"
 
-#: builtin/merge.c:223
+#: builtin/merge.c:224
 msgid "abort the current in-progress merge"
 msgstr "преустановяване на текущото сливане"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:226 builtin/pull.c:169
+msgid "allow merging unrelated histories"
+msgstr "позволяване на сливане на независими истории"
+
+#: builtin/merge.c:254
 msgid "could not run stash."
 msgstr "не може да се извърши скатаване"
 
-#: builtin/merge.c:256
+#: builtin/merge.c:259
 msgid "stash failed"
 msgstr "неуспешно скатаване"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:264
 #, c-format
 msgid "not a valid object: %s"
 msgstr "неправилен обект: „%s“"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:283 builtin/merge.c:300
 msgid "read-tree failed"
 msgstr "неуспешно прочитане на обект-дърво"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:330
 msgid " (nothing to squash)"
 msgstr " (няма какво да се смачка)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:343
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n"
 
-#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975
-#: builtin/merge.c:988
+#: 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:372
+#: builtin/merge.c:375
 msgid "Writing SQUASH_MSG"
 msgstr "Записване на съобщението за смачкване SQUASH_MSG"
 
-#: builtin/merge.c:374
+#: builtin/merge.c:377
 msgid "Finishing SQUASH_MSG"
 msgstr "Завършване на съобщението за смачкване SQUASH_MSG"
 
-#: builtin/merge.c:397
+#: builtin/merge.c:400
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr ""
 "Липсва съобщение при подаване — указателят „HEAD“ няма да бъде обновен\n"
 
-#: builtin/merge.c:447
+#: builtin/merge.c:451
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "„%s“ не сочи към подаване"
 
-#: builtin/merge.c:537
+#: builtin/merge.c:541
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“"
 
-#: builtin/merge.c:656
+#: builtin/merge.c:660
 msgid "Not handling anything other than two heads merge."
 msgstr "Поддържа се само сливане на точно две истории."
 
-#: builtin/merge.c:670
+#: builtin/merge.c:674
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Непозната опция за рекурсивното сливане „merge-recursive“: „-X%s“"
 
-#: builtin/merge.c:683
+#: builtin/merge.c:687
 #, c-format
 msgid "unable to write %s"
 msgstr "„%s“ не може да бъде записан"
 
-#: builtin/merge.c:772
+#: builtin/merge.c:776
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "От „%s“ не може да се чете"
 
-#: builtin/merge.c:781
+#: builtin/merge.c:785
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Сливането няма да бъде подадено. За завършването му и подаването му "
 "използвайте командата „git commit“.\n"
 
-#: builtin/merge.c:787
+#: builtin/merge.c:791
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8002,55 +8596,55 @@ msgstr ""
 "Редовете, които започват с „%c“ ще бъдат пропуснати, а празно съобщение\n"
 "преустановява подаването.\n"
 
-#: builtin/merge.c:811
+#: builtin/merge.c:815
 msgid "Empty commit message."
 msgstr "Празно съобщение при подаване."
 
 # FIXME - WTF is wonderful.
-#: builtin/merge.c:823
+#: builtin/merge.c:835
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Първият етап на тривиалното сливане завърши.\n"
 
-#: builtin/merge.c:878
+#: builtin/merge.c:890
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "Неуспешно сливане — коригирайте конфликтите и подайте резултата.\n"
 
-#: builtin/merge.c:894
+#: builtin/merge.c:906
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "„%s“ не е подаване"
 
-#: builtin/merge.c:935
+#: builtin/merge.c:947
 msgid "No current branch."
 msgstr "Няма текущ клон."
 
-#: builtin/merge.c:937
+#: builtin/merge.c:949
 msgid "No remote for the current branch."
 msgstr "Текущият клон не следи никой."
 
-#: builtin/merge.c:939
+#: builtin/merge.c:951
 msgid "No default upstream defined for the current branch."
 msgstr "Текущият клон не следи никой клон."
 
-#: builtin/merge.c:944
+#: builtin/merge.c:956
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Никой клон не следи клона „%s“ от хранилището „%s“"
 
-#: builtin/merge.c:1079
+#: builtin/merge.c:1091
 #, c-format
 msgid "could not close '%s'"
 msgstr "„%s“ не може да се затвори"
 
-#: builtin/merge.c:1206
+#: builtin/merge.c:1219
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 "Не може да преустановите сливане, защото в момента не се извършва такова "
 "(липсва указател „MERGE_HEAD“)."
 
-#: builtin/merge.c:1222
+#: builtin/merge.c:1235
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8058,7 +8652,7 @@ msgstr ""
 "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
 "Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1229
+#: builtin/merge.c:1242
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8066,111 +8660,115 @@ msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува). Подайте промените си, преди да започнете ново сливане."
 
-#: builtin/merge.c:1232
+#: builtin/merge.c:1245
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
 "съществува)."
 
-#: builtin/merge.c:1241
+#: builtin/merge.c:1254
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Опцията „--squash“ е несъвместима с „--no-ff“."
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1262
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 "Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена."
 
-#: builtin/merge.c:1266
+#: builtin/merge.c:1279
 msgid "Squash commit into empty head not supported yet"
 msgstr "Подаване със смачкване във връх без история все още не се поддържа"
 
-#: builtin/merge.c:1268
+#: builtin/merge.c:1281
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 "Понеже върхът е без история, всички сливания са тривиални, не може да се "
 "извърши нетривиално сливане изисквано от опцията „--no-ff“"
 
-#: builtin/merge.c:1274
+#: builtin/merge.c:1286
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "„%s“ — не е нещо, което може да се слее"
 
-#: builtin/merge.c:1276
+#: builtin/merge.c:1288
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можете да слеете точно едно подаване във връх без история"
 
-#: builtin/merge.c:1331
+#: builtin/merge.c:1344
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1334
+#: builtin/merge.c:1347
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 "Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“."
 
-#: builtin/merge.c:1337
+#: builtin/merge.c:1350
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Подаването „%s“ е без подпис от GPG."
 
-#: builtin/merge.c:1340
+#: builtin/merge.c:1353
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n"
 
-#: builtin/merge.c:1423
+#: builtin/merge.c:1415
+msgid "refusing to merge unrelated histories"
+msgstr "независими истории не може да се слеят"
+
+#: builtin/merge.c:1439
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Обновяване „%s..%s“\n"
 
-#: builtin/merge.c:1460
+#: builtin/merge.c:1476
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n"
 
 # FIXME WTF message
-#: builtin/merge.c:1467
+#: builtin/merge.c:1483
 #, c-format
 msgid "Nope.\n"
 msgstr "Неуспешно сливане.\n"
 
-#: builtin/merge.c:1499
+#: builtin/merge.c:1515
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 "Не може да се извърши тривиално сливане, преустановяване на действието."
 
-#: builtin/merge.c:1522 builtin/merge.c:1601
+#: builtin/merge.c:1538 builtin/merge.c:1617
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Привеждане на дървото към първоначалното…\n"
 
-#: builtin/merge.c:1526
+#: builtin/merge.c:1542
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Пробване със стратегията за сливане „%s“…\n"
 
-#: builtin/merge.c:1592
+#: builtin/merge.c:1608
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Никоя стратегия за сливане не може да извърши сливането.\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1610
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Неуспешно сливане със стратегия „%s“.\n"
 
-#: builtin/merge.c:1603
+#: builtin/merge.c:1619
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 "Ползва се стратегията „%s“, която ще подготви дървото за коригиране на "
 "ръка.\n"
 
-#: builtin/merge.c:1615
+#: builtin/merge.c:1631
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8258,19 +8856,19 @@ msgstr "без предупреждения при конфликти"
 msgid "set labels for file1/orig-file/file2"
 msgstr "задаване на етикети за ФАЙЛ_1/ОРИГИНАЛ/ФАЙЛ_2"
 
-#: builtin/mktree.c:64
+#: builtin/mktree.c:65
 msgid "git mktree [-z] [--missing] [--batch]"
 msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/mktree.c:150
+#: builtin/mktree.c:152
 msgid "input is NUL terminated"
 msgstr "входните записи са разделени с нулевия знак „NUL“"
 
-#: builtin/mktree.c:151 builtin/write-tree.c:24
+#: builtin/mktree.c:153 builtin/write-tree.c:24
 msgid "allow missing objects"
 msgstr "разрешаване на липсващи обекти"
 
-#: builtin/mktree.c:152
+#: builtin/mktree.c:154
 msgid "allow creation of more than one tree"
 msgstr "разрешаване на създаването на повече от едно дърво"
 
@@ -8278,138 +8876,136 @@ msgstr "разрешаване на създаването на повече о
 msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [ОПЦИЯ…] ОБЕКТ… ЦЕЛ"
 
-# FIXME message<
-#: builtin/mv.c:69
+#: builtin/mv.c:70
 #, c-format
 msgid "Directory %s is in index and no submodule?"
 msgstr "Директорията „%s“ е в индекса, но не е подмодул"
 
-#: builtin/mv.c:71
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "За да продължите, или вкарайте промените по файла „.gitmodules“ в индекса,\n"
 "или ги скатайте"
 
-# FIXME message
-#: builtin/mv.c:89
+#: builtin/mv.c:90
 #, c-format
 msgid "%.*s is in index"
 msgstr "„%.*s“ вече е в индекса"
 
-#: builtin/mv.c:111
+#: builtin/mv.c:112
 msgid "force move/rename even if target exists"
 msgstr "принудително преместване/преименуване дори целта да съществува"
 
-#: builtin/mv.c:112
+#: builtin/mv.c:113
 msgid "skip move/rename errors"
 msgstr "прескачане на грешките при преместване/преименуване"
 
-#: builtin/mv.c:151
+#: builtin/mv.c:152
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "целта „%s“ съществува и не е директория"
 
-#: builtin/mv.c:162
+#: builtin/mv.c:163
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
 
-#: builtin/mv.c:166
+#: builtin/mv.c:167
 msgid "bad source"
 msgstr "неправилен обект"
 
-#: builtin/mv.c:169
+#: builtin/mv.c:170
 msgid "can not move directory into itself"
 msgstr "директория не може да се премести в себе си"
 
-#: builtin/mv.c:172
+#: builtin/mv.c:173
 msgid "cannot move directory over file"
 msgstr "директория не може да се премести върху файл"
 
-#: builtin/mv.c:181
+#: builtin/mv.c:182
 msgid "source directory is empty"
 msgstr "първоначалната директория е празна"
 
-#: builtin/mv.c:206
+#: builtin/mv.c:207
 msgid "not under version control"
 msgstr "не е под контрола на Git"
 
-#: builtin/mv.c:209
+#: builtin/mv.c:210
 msgid "destination exists"
 msgstr "целта съществува"
 
-#: builtin/mv.c:217
+#: builtin/mv.c:218
 #, c-format
 msgid "overwriting '%s'"
 msgstr "презаписване на „%s“"
 
-#: builtin/mv.c:220
+#: builtin/mv.c:221
 msgid "Cannot overwrite"
 msgstr "Презаписването е невъзможно"
 
-#: builtin/mv.c:223
+#: builtin/mv.c:224
 msgid "multiple sources for the same target"
 msgstr "множество източници за една цел"
 
-#: builtin/mv.c:225
+#: builtin/mv.c:226
 msgid "destination directory does not exist"
 msgstr "целевата директория не съществува"
 
-#: builtin/mv.c:232
+#: builtin/mv.c:233
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, обект: „%s“, цел: „%s“"
 
-#: builtin/mv.c:253
+#: builtin/mv.c:254
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Преименуване на „%s“ на „%s“\n"
 
-#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
+#: builtin/mv.c:260 builtin/remote.c:714 builtin/repack.c:365
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "неуспешно преименуване на „%s“"
 
-#: builtin/name-rev.c:251
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…"
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [ОПЦИЯ…] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:260
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [ОПЦИЯ…] --stdin"
 
 # FIXME sha
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:312
 msgid "print only names (no SHA-1)"
 msgstr "извеждане само на имената (без сумите по SHA1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:313
 msgid "only use tags to name the commits"
 msgstr "използване само на етикетите за именуване на подаванията"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:315
 msgid "only use refs matching <pattern>"
-msgstr "използване Ñ\81амо Ð½Ð° Ñ\88аблоните напасващи на ШАБЛОНа"
+msgstr "използване Ñ\81амо Ð½Ð° Ñ\83казаÑ\82елите напасващи на ШАБЛОНа"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:317
 msgid "list all commits reachable from all refs"
 msgstr ""
 "извеждане на всички подавания, които могат да бъдат достигнати от всички "
 "указатели"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:318
 msgid "read from stdin"
 msgstr "четене от стандартния вход"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:319
 msgid "allow to print `undefined` names (default)"
 msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:325
 msgid "dereference tags in the input (internal use)"
 msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)"
 
@@ -8557,24 +9153,16 @@ msgstr "обектът-бележка не може да бъде записан
 msgid "The note contents have been left in %s"
 msgstr "Съдържанието на бележката е във файла „%s“"
 
-#: builtin/notes.c:232 builtin/tag.c:440
+#: builtin/notes.c:232 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "файлът „%s“ не може да бъде прочетен"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:234 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "файлът „%s“ не може да бъде отворен или прочетен"
 
-#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
-#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
-#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
-#: builtin/notes.c:877 builtin/tag.c:456
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr "Не може да се открие към какво сочи „%s“."
-
 #: builtin/notes.c:256
 #, c-format
 msgid "Failed to read object '%s'."
@@ -8586,42 +9174,42 @@ msgid "Cannot read note data from non-blob object '%s'."
 msgstr ""
 "Съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“."
 
-#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490
-#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646
-#: builtin/notes.c:942
+#: 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/notes.c:372 builtin/notes.c:659
+#: builtin/notes.c:375 builtin/notes.c:662
 #, c-format
 msgid "No note found for object %s."
 msgstr "Няма бележки за обекта „%s“."
 
-#: builtin/notes.c:393 builtin/notes.c:556
+#: builtin/notes.c:396 builtin/notes.c:559
 msgid "note contents as a string"
 msgstr "низ, който е съдържанието на бележката"
 
-#: builtin/notes.c:396 builtin/notes.c:559
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents in a file"
-msgstr "файл със съдържанието на бележката"
+msgstr "ФАЙЛ със съдържанието на бележката"
 
-#: builtin/notes.c:399 builtin/notes.c:562
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "reuse and edit specified note object"
-msgstr "пÑ\80еизползване Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\83казаниÑ\8f Ð¾Ð±ÐµÐºÑ\82-бележка"
+msgstr "пÑ\80еизползване Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ñ\83казаниÑ\8f Ð\9eÐ\91Ð\95Ð\9aТ-бележка"
 
-#: builtin/notes.c:402 builtin/notes.c:565
+#: builtin/notes.c:405 builtin/notes.c:568
 msgid "reuse specified note object"
-msgstr "пÑ\80еизползване Ð½Ð° Ñ\83казаниÑ\8f Ð¾Ð±ÐµÐºÑ\82-бележка"
+msgstr "пÑ\80еизползване Ð½Ð° Ñ\83казаниÑ\8f Ð\9eÐ\91Ð\95Ð\9aТ-бележка"
 
-#: builtin/notes.c:405 builtin/notes.c:568
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "allow storing empty note"
 msgstr "приемане и на празни бележки"
 
-#: builtin/notes.c:406 builtin/notes.c:477
+#: builtin/notes.c:409 builtin/notes.c:480
 msgid "replace existing notes"
 msgstr "замяна на съществуващите бележки"
 
-#: builtin/notes.c:431
+#: builtin/notes.c:434
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8630,32 +9218,32 @@ msgstr ""
 "Не може да се добави бележка, защото такава вече съществува за обекта „%s“. "
 "Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:446 builtin/notes.c:525
+#: builtin/notes.c:449 builtin/notes.c:528
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Презаписване на съществуващите бележки за обекта „%s“\n"
 
-#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882
+#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:886
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Изтриване на бележката за обекта „%s“\n"
 
-#: builtin/notes.c:478
+#: builtin/notes.c:481
 msgid "read objects from stdin"
 msgstr "изчитане на обектите от стандартния вход"
 
 # FIXME imporve message
-#: builtin/notes.c:480
+#: builtin/notes.c:483
 msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 "зареждане на настройките за КОМАНДАта, която презаписва подавания (включва "
 "опцията „--stdin“)"
 
-#: builtin/notes.c:498
+#: builtin/notes.c:501
 msgid "too few parameters"
 msgstr "прекалено малко параметри"
 
-#: builtin/notes.c:519
+#: builtin/notes.c:522
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8664,14 +9252,14 @@ msgstr ""
 "Не може да се копира бележка, защото такава вече съществува за обекта „%s“. "
 "Използвайте опцията „-f“, за да презапишете съществуващи бележки."
 
-#: builtin/notes.c:531
+#: builtin/notes.c:534
 #, c-format
 msgid "Missing notes on source object %s. Cannot copy."
 msgstr ""
 "Не може да се копира бележка, която не съществува — няма бележки за обекта-"
 "източник „%s“."
 
-#: builtin/notes.c:583
+#: builtin/notes.c:586
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8682,67 +9270,67 @@ msgstr ""
 "Вместо това ги използвайте с подкомандата „add“: „git notes add -f -m/-F/-c/-"
 "C“.\n"
 
-#: builtin/notes.c:764
+#: builtin/notes.c:768
 msgid "General options"
 msgstr "Общи опции"
 
-#: builtin/notes.c:766
+#: builtin/notes.c:770
 msgid "Merge options"
 msgstr "Опции при сливане"
 
-#: builtin/notes.c:768
+#: builtin/notes.c:772
 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:770
+#: builtin/notes.c:774
 msgid "Committing unmerged notes"
 msgstr "Подаване на неслети бележки"
 
-#: builtin/notes.c:772
+#: builtin/notes.c:776
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "завършване на сливането чрез подаване на неслети бележки"
 
-#: builtin/notes.c:774
+#: builtin/notes.c:778
 msgid "Aborting notes merge resolution"
 msgstr "Преустановяване на корекцията при сливането на бележки"
 
-#: builtin/notes.c:776
+#: builtin/notes.c:780
 msgid "abort notes merge"
 msgstr "преустановяване на сливането на бележки"
 
-#: builtin/notes.c:853
+#: builtin/notes.c:857
 #, c-format
 msgid "A notes merge into %s is already in-progress at %s"
 msgstr "В момента се извършва сливане на бележките в „%s“ при „%s“"
 
-#: builtin/notes.c:880
+#: builtin/notes.c:884
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Няма бележки за обекта „%s“\n"
 
-#: builtin/notes.c:892
+#: builtin/notes.c:896
 msgid "attempt to remove non-existent note is not an error"
 msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 msgid "read object names from the standard input"
 msgstr "изчитане на имената на обектите от стандартния вход"
 
-#: builtin/notes.c:976
+#: builtin/notes.c:980
 msgid "notes-ref"
 msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:977
+#: builtin/notes.c:981
 msgid "use notes from <notes-ref>"
 msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА"
 
-#: builtin/notes.c:1012 builtin/remote.c:1647
+#: builtin/notes.c:1016 builtin/remote.c:1628
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Непозната подкоманда: %s"
@@ -8766,181 +9354,187 @@ msgstr ""
 msgid "deflate error (%d)"
 msgstr "грешка при декомпресиране с „deflate“ (%d)"
 
-#: builtin/pack-objects.c:771
+#: builtin/pack-objects.c:763
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+msgstr ""
+"изключване на записването на битовата маска, пакетите са разделени поради "
+"стойността на „pack.packSizeLimit“"
+
+#: builtin/pack-objects.c:776
 msgid "Writing objects"
 msgstr "Записване на обектите"
 
-#: builtin/pack-objects.c:1011
+#: builtin/pack-objects.c:1017
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "изключване на записването на битовата маска, защото някои обекти няма да се "
 "пакетират"
 
-#: builtin/pack-objects.c:2171
+#: builtin/pack-objects.c:2177
 msgid "Compressing objects"
 msgstr "Компресиране на обектите"
 
-#: builtin/pack-objects.c:2568
+#: builtin/pack-objects.c:2563
 #, c-format
 msgid "unsupported index version %s"
 msgstr "неподдържана версия на индекса „%s“"
 
-#: builtin/pack-objects.c:2572
+#: builtin/pack-objects.c:2567
 #, c-format
 msgid "bad index version '%s'"
 msgstr "неправилна версия на индекса „%s“"
 
-#: builtin/pack-objects.c:2602
+#: builtin/pack-objects.c:2597
 msgid "do not show progress meter"
 msgstr "без извеждане на напредъка"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2599
 msgid "show progress meter"
 msgstr "извеждане на напредъка"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2601
 msgid "show progress meter during object writing phase"
 msgstr "извеждане на напредъка във фазата на запазване на обектите"
 
-#: builtin/pack-objects.c:2609
+#: builtin/pack-objects.c:2604
 msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 "същото действие като опцията „--all-progress“ при извеждането на напредъка"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2605
 msgid "version[,offset]"
 msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]"
 
-#: builtin/pack-objects.c:2611
+#: builtin/pack-objects.c:2606
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "запазване на индекса на пакетните файлове във форма̀та с указаната версия"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2609
 msgid "maximum size of each output pack file"
 msgstr "максимален размер на всеки пакетен файл"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2611
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнориране на обектите заети от други хранилища на обекти"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2613
 msgid "ignore packed objects"
 msgstr "игнориране на пакетираните обекти"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2615
 msgid "limit pack window by objects"
 msgstr "ограничаване на прозореца за пакетиране по брой обекти"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2617
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "ограничаване на прозореца за пакетиране и по памет освен по брой обекти"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2619
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "максимална дължина на веригата от разлики, която е позволена в пакетния файл"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2621
 msgid "reuse existing deltas"
 msgstr "преизползване на съществуващите разлики"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2623
 msgid "reuse existing objects"
 msgstr "преизползване на съществуващите обекти"
 
-#: builtin/pack-objects.c:2630
+#: builtin/pack-objects.c:2625
 msgid "use OFS_DELTA objects"
 msgstr "използване на обекти „OFS_DELTA“"
 
-#: builtin/pack-objects.c:2632
+#: builtin/pack-objects.c:2627
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "стартиране на нишки за претърсване на най-добрите съвпадения на разликите"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2629
 msgid "do not create an empty pack output"
 msgstr "без създаване на празен пакетен файл"
 
-#: builtin/pack-objects.c:2636
+#: builtin/pack-objects.c:2631
 msgid "read revision arguments from standard input"
 msgstr "изчитане на версиите от стандартния вход"
 
-#: builtin/pack-objects.c:2638
+#: builtin/pack-objects.c:2633
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничаване до все още непакетираните обекти"
 
-#: builtin/pack-objects.c:2641
+#: builtin/pack-objects.c:2636
 msgid "include objects reachable from any reference"
 msgstr ""
 "включване на всички обекти, които могат да се достигнат от произволен "
 "указател"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2639
 msgid "include objects referred by reflog entries"
 msgstr "включване и на обектите сочени от записите в журнала на указателите"
 
-#: builtin/pack-objects.c:2647
+#: builtin/pack-objects.c:2642
 msgid "include objects referred to by the index"
 msgstr "включване и на обектите сочени от индекса"
 
-#: builtin/pack-objects.c:2650
+#: builtin/pack-objects.c:2645
 msgid "output pack to stdout"
 msgstr "извеждане на пакета на стандартния изход"
 
-#: builtin/pack-objects.c:2652
+#: builtin/pack-objects.c:2647
 msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 "включване и на обектите-етикети, които сочат към обектите, които ще бъдат "
 "пакетирани"
 
-#: builtin/pack-objects.c:2654
+#: builtin/pack-objects.c:2649
 msgid "keep unreachable objects"
 msgstr "запазване на недостижимите обекти"
 
-#: builtin/pack-objects.c:2655 parse-options.h:142
+#: builtin/pack-objects.c:2650 parse-options.h:142
 msgid "time"
 msgstr "ВРЕМЕ"
 
-#: builtin/pack-objects.c:2656
+#: builtin/pack-objects.c:2651
 msgid "unpack unreachable objects newer than <time>"
 msgstr "разпакетиране на недостижимите обекти, които са по-нови от това ВРЕМЕ"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2654
 msgid "create thin packs"
 msgstr "създаване на съкратени пакети"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2656
 msgid "create packs suitable for shallow fetches"
 msgstr "пакетиране подходящо за плитко доставяне"
 
-#: builtin/pack-objects.c:2663
+#: builtin/pack-objects.c:2658
 msgid "ignore packs that have companion .keep file"
 msgstr "игнориране на пакетите, които са придружени от файл „.keep“"
 
-#: builtin/pack-objects.c:2665
+#: builtin/pack-objects.c:2660
 msgid "pack compression level"
 msgstr "ниво на компресиране при пакетиране"
 
-#: builtin/pack-objects.c:2667
+#: builtin/pack-objects.c:2662
 msgid "do not hide commits by grafts"
 msgstr ""
 "извеждане на всички родители — дори и тези, които нормално са скрити при "
 "присажданията"
 
-#: builtin/pack-objects.c:2669
+#: builtin/pack-objects.c:2664
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "използване на съществуващи индекси на база битови маски за ускоряване на "
 "преброяването на обектите"
 
-#: builtin/pack-objects.c:2671
+#: builtin/pack-objects.c:2666
 msgid "write a bitmap index together with the pack index"
 msgstr ""
 "запазване и на индекс на база побитова маска, заедно с индекса за пакета"
 
-#: builtin/pack-objects.c:2762
+#: builtin/pack-objects.c:2757
 msgid "Counting objects"
 msgstr "Преброяване на обектите"
 
@@ -8968,15 +9562,15 @@ msgstr "Изтриване на повтарящите се обекти"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
+#: builtin/prune.c:105 builtin/worktree.c:125
 msgid "do not remove, show only"
 msgstr "само извеждане без действително окастряне"
 
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:126
 msgid "report pruned objects"
 msgstr "информация за окастрените обекти"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:128
 msgid "expire objects older than <time>"
 msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
 
@@ -8984,52 +9578,60 @@ msgstr "окастряне на обектите по-стари от това 
 msgid "cannot prune in a precious-objects repo"
 msgstr "хранилище с важни обекти не може да се окастря"
 
-#: builtin/pull.c:69
+#: builtin/pull.c:72
 msgid "git pull [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
 
-#: builtin/pull.c:113
+#: builtin/pull.c:120
 msgid "Options related to merging"
 msgstr "Опции при сливане"
 
-#: builtin/pull.c:116
+#: builtin/pull.c:123
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "внасяне на промените чрез пребазиране, а не чрез сливане"
 
-#: builtin/pull.c:140 builtin/revert.c:105
+#: builtin/pull.c:147 builtin/revert.c:105
 msgid "allow fast-forward"
 msgstr "позволяване на тривиални сливания"
 
-#: builtin/pull.c:146
+#: builtin/pull.c:153
 msgid "verify that the named commit has a valid GPG signature"
 msgstr "Проверка, че указаното подаване е с правилен подпис на GPG"
 
-#: builtin/pull.c:160
+#: builtin/pull.c:156
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "автоматично скатаване/прилагане на скатаното преди и след пребазиране"
+
+#: builtin/pull.c:172
 msgid "Options related to fetching"
 msgstr "Опции при доставяне"
 
-#: builtin/pull.c:268
+#: builtin/pull.c:194
+msgid "number of submodules pulled in parallel"
+msgstr "брой подмодули издърпани паралелно"
+
+#: builtin/pull.c:283
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Неправилна стойност за „pull.ff“: „%s“"
 
-#: builtin/pull.c:352
+#: builtin/pull.c:379
 msgid "Cannot pull with rebase: You have unstaged changes."
 msgstr ""
 "Не можете да издърпвате при това пребазиране, защото има промени, които не "
 "са в индекса"
 
-#: builtin/pull.c:358
+#: builtin/pull.c:385
 msgid "Additionally, your index contains uncommitted changes."
 msgstr "Освен това в индекса има неподадени промени."
 
-#: builtin/pull.c:360
+#: builtin/pull.c:387
 msgid "Cannot pull with rebase: Your index contains uncommitted changes."
 msgstr ""
 "Не можете да издърпвате при това пребазиране, защото в индекса има "
 "неподадени промени."
 
-#: builtin/pull.c:436
+#: builtin/pull.c:463
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9037,14 +9639,14 @@ msgstr ""
 "Между указателите, които току що доставихте, няма подходящ кандидат, върху "
 "който да пребазирате."
 
-#: builtin/pull.c:438
+#: builtin/pull.c:465
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 "Между указателите, които току що доставихте, няма подходящ кандидат, който "
 "да слеете."
 
-#: builtin/pull.c:439
+#: builtin/pull.c:466
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9052,7 +9654,7 @@ msgstr ""
 "Най вероятно сте подали шаблон за указатели, който не е напаснал с нищо в "
 "отдалеченото хранилище."
 
-#: builtin/pull.c:442
+#: builtin/pull.c:469
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9063,40 +9665,44 @@ msgstr ""
 "Понеже това не е хранилището по подразбиране на текущия клон, трябва\n"
 "да укажете отдалечения клон на командния ред."
 
-#: builtin/pull.c:447
+#: builtin/pull.c:474 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Извън всички клони."
 
-#: builtin/pull.c:449 builtin/pull.c:464
+#: builtin/pull.c:476 builtin/pull.c:491 git-parse-remote.sh:79
 msgid "Please specify which branch you want to rebase against."
 msgstr "Укажете върху кой клон искате да пребазирате."
 
-#: builtin/pull.c:451 builtin/pull.c:466
+#: builtin/pull.c:478 builtin/pull.c:493 git-parse-remote.sh:82
 msgid "Please specify which branch you want to merge with."
 msgstr "Укажете кой клон искате да слеете."
 
-#: builtin/pull.c:452 builtin/pull.c:467
+#: builtin/pull.c:479 builtin/pull.c:494
 msgid "See git-pull(1) for details."
 msgstr "За повече информация погледнете ръководството „git-pull(1)“"
 
-#: builtin/pull.c:462
+#: builtin/pull.c:481 builtin/pull.c:487 builtin/pull.c:496
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ"
+
+#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "КЛОН"
+
+#: builtin/pull.c:489 git-parse-remote.sh:75
 msgid "There is no tracking information for the current branch."
 msgstr "Текущият клон не следи никой."
 
-#: builtin/pull.c:471
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
-"Ако все пак искате да зададете информация за следен клон,\n"
-"можете да направите това с командата:\n"
-"\n"
-" git branch --set-upstream-to=%s/СЛЕДЕН_КЛОН %s\n"
-"\n"
+"Ако искате да зададете информация за следен клон, можете да направите това с "
+"командата:"
 
-#: builtin/pull.c:476
+#: builtin/pull.c:503
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9105,11 +9711,15 @@ msgstr ""
 "За сливане е указан отдалеченият указател „%s“,\n"
 "но такъв не е доставен."
 
-#: builtin/pull.c:830
+#: builtin/pull.c:864
+msgid "--[no-]autostash option is only valid with --rebase."
+msgstr "опцията „--[no-]autostash“ изисква „--rebase“"
+
+#: builtin/pull.c:872
 msgid "Updating an unborn branch with changes added to the index."
 msgstr "Обновяване на все още несъздаден клон с промените от индекса"
 
-#: builtin/pull.c:859
+#: builtin/pull.c:900
 #, c-format
 msgid ""
 "fetch updated the current branch head.\n"
@@ -9119,7 +9729,7 @@ msgstr ""
 "доставянето обнови върха на текущия клон. Работното\n"
 "ви копие бе тривиално слято от подаване „%s“."
 
-#: builtin/pull.c:864
+#: builtin/pull.c:905
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9136,11 +9746,11 @@ msgstr ""
 "  $ git reset --hard\n"
 "за връщане към нормално състояние."
 
-#: builtin/pull.c:879
+#: builtin/pull.c:920
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Не може да сливате множество клони в празен върхов указател."
 
-#: builtin/pull.c:883
+#: builtin/pull.c:924
 msgid "Cannot rebase onto multiple branches."
 msgstr "Не може да пребазирате върху повече от един клон."
 
@@ -9148,15 +9758,15 @@ msgstr "Не може да пребазирате върху повече от 
 msgid "git push [<options>] [<repository> [<refspec>...]]"
 msgstr "git push [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
 
-#: builtin/push.c:88
+#: builtin/push.c:89
 msgid "tag shorthand without <tag>"
 msgstr "съкращение за етикет без ЕТИКЕТ"
 
-#: builtin/push.c:98
+#: builtin/push.c:99
 msgid "--delete only accepts plain target ref names"
 msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
 
-#: builtin/push.c:142
+#: builtin/push.c:143
 msgid ""
 "\n"
 "To choose either option permanently, see push.default in 'git help config'."
@@ -9165,7 +9775,7 @@ msgstr ""
 "За да включите тази опция за постоянно, погледнете документацията за "
 "настройката „push.default“ в „git help config“."
 
-#: builtin/push.c:145
+#: builtin/push.c:146
 #, c-format
 msgid ""
 "The upstream branch of your current branch does not match\n"
@@ -9190,7 +9800,7 @@ msgstr ""
 "    git push %s %s\n"
 "%s"
 
-#: builtin/push.c:160
+#: builtin/push.c:161
 #, c-format
 msgid ""
 "You are not currently on a branch.\n"
@@ -9204,7 +9814,7 @@ msgstr ""
 "\n"
 "    git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
 
-#: builtin/push.c:174
+#: builtin/push.c:175
 #, c-format
 msgid ""
 "The current branch %s has no upstream branch.\n"
@@ -9218,14 +9828,14 @@ msgstr ""
 "\n"
 "    git push --set-upstream %s %s\n"
 
-#: builtin/push.c:182
+#: builtin/push.c:183
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
 msgstr ""
 "Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
 "изтласкате."
 
-#: builtin/push.c:185
+#: builtin/push.c:186
 #, c-format
 msgid ""
 "You are pushing to remote '%s', which is not the upstream of\n"
@@ -9237,67 +9847,14 @@ msgstr ""
 "Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
 "клон."
 
-#: builtin/push.c:208
-msgid ""
-"push.default is unset; its implicit value has changed in\n"
-"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the traditional behavior, use:\n"
-"\n"
-"  git config --global push.default matching\n"
-"\n"
-"To squelch this message and adopt the new behavior now, use:\n"
-"\n"
-"  git config --global push.default simple\n"
-"\n"
-"When push.default is set to 'matching', git will push local branches\n"
-"to the remote branches that already exist with the same name.\n"
-"\n"
-"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
-"behavior, which only pushes the current branch to the corresponding\n"
-"remote branch that 'git pull' uses to update the current branch.\n"
-"\n"
-"See 'git help config' and search for 'push.default' for further "
-"information.\n"
-"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
-"'current' instead of 'simple' if you sometimes use older versions of Git)"
-msgstr ""
-"Настройката „push.default“ не е зададена. Стойността ѝ по подразбиране е "
-"сменена\n"
-"в Git 2.0 от „matching“ (всички съвпадащи клони) на „simple“ (само текущия\n"
-"клон). За да подтиснете това съобщение и да използвате традиционното "
-"поведение\n"
-"на Git 1.x, изпълнете командата:\n"
-"\n"
-"  git config --global push.default matching\n"
-"\n"
-"За да подтиснете това съобщение и да използвате новото поведение на Git 2."
-"x,\n"
-"изпълнете командата:\n"
-"\n"
-"  git config --global push.default simple\n"
-"\n"
-"Когато настройката „push.default“ е „matching“, git ще изтласка всички "
-"локални\n"
-"клони, които имат отдалечен аналог със същото име.\n"
-"\n"
-"От версия 2.0 Git стандартно започва да ползва по-консервативния вариант\n"
-"„simple“, при който „push“ изтласква само текущия клон към отдалечения, "
-"следен\n"
-"клон — същия, който „git pull“ използва, за да обнови текущия.\n"
-"\n"
-"За повече информация погледнете „git help config“ и потърсете „push."
-"default“.\n"
-"Новата стойност „simple“ бе въведена с версия 1.7.11 на Git. Ако понякога\n"
-"ползвате стари версии на Git, задайте стойност „current“ вместо „simple“."
-
-#: builtin/push.c:275
+#: builtin/push.c:242
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Не сте указали версия за подаване, а настройката „push.default“ е "
 "„nothing“ (нищо без изрично указана версия да не се изтласква)"
 
-#: builtin/push.c:282
+#: 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"
@@ -9311,7 +9868,7 @@ msgstr ""
 "преди отново да изтласкате промените. За повече информация вижте раздела\n"
 "„Note about fast-forwards“ в страницата от ръководството „git push --help“."
 
-#: builtin/push.c:288
+#: 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"
@@ -9324,7 +9881,7 @@ msgstr ""
 "информация погледнете раздела „Note about fast-forwards“ в страницата от\n"
 "ръководството „git push --help“."
 
-#: builtin/push.c:294
+#: 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"
@@ -9343,14 +9900,14 @@ msgstr ""
 "страницата\n"
 "от ръководството „git push --help“."
 
-#: builtin/push.c:301
+#: builtin/push.c:268
 msgid "Updates were rejected because the tag already exists in the remote."
 msgstr ""
 "Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
 "етикет,\n"
 "който ще припокриете с етикет от вашето хранилище."
 
-#: builtin/push.c:304
+#: 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"
@@ -9360,22 +9917,22 @@ msgstr ""
 "указател, който вече сочи към обект, който не е подаване, както и тепърва\n"
 "да го промените да сочи към подобен обект.\n"
 
-#: builtin/push.c:363
+#: builtin/push.c:331
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Изтласкване към „%s“\n"
 
-#: builtin/push.c:367
+#: builtin/push.c:335
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "част от указателите не бяха изтласкани към „%s“"
 
-#: builtin/push.c:397
+#: builtin/push.c:365
 #, c-format
 msgid "bad repository '%s'"
 msgstr "неправилно указано хранилище „%s“"
 
-#: builtin/push.c:398
+#: builtin/push.c:366
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -9397,108 +9954,104 @@ msgstr ""
 "\n"
 "    git push ИМЕ\n"
 
-#: builtin/push.c:413
+#: builtin/push.c:381
 msgid "--all and --tags are incompatible"
 msgstr "опциите „--all“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:414
+#: builtin/push.c:382
 msgid "--all can't be combined with refspecs"
 msgstr "опцията „--all“ е несъвместима с указването на версия"
 
-#: builtin/push.c:419
+#: builtin/push.c:387
 msgid "--mirror and --tags are incompatible"
 msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
 
-#: builtin/push.c:420
+#: builtin/push.c:388
 msgid "--mirror can't be combined with refspecs"
 msgstr "опцията „--mirror“ е несъвместима с указването на версия"
 
-#: builtin/push.c:425
+#: builtin/push.c:393
 msgid "--all and --mirror are incompatible"
 msgstr "опциите „--all“ и „--mirror“ са несъвместими"
 
-#: builtin/push.c:537
+#: builtin/push.c:505
 msgid "repository"
 msgstr "хранилище"
 
-#: builtin/push.c:538 builtin/send-pack.c:161
+#: builtin/push.c:506 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "изтласкване на всички указатели"
 
-#: builtin/push.c:539 builtin/send-pack.c:163
+#: builtin/push.c:507 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "огледално копие на всички указатели"
 
-#: builtin/push.c:541
+#: builtin/push.c:509
 msgid "delete refs"
 msgstr "изтриване на указателите"
 
-#: builtin/push.c:542
+#: builtin/push.c:510
 msgid "push tags (can't be used with --all or --mirror)"
 msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
 
-#: builtin/push.c:545 builtin/send-pack.c:164
+#: builtin/push.c:513 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "принудително обновяване"
 
 # FIXME double check this
-#: builtin/push.c:547 builtin/send-pack.c:175
+#: builtin/push.c:515 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:548 builtin/send-pack.c:176
+#: builtin/push.c:516 builtin/send-pack.c:176
 msgid "require old value of ref to be at this value"
 msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
 
-#: builtin/push.c:550
-msgid "check|on-demand|no"
-msgstr "„check“ (проверка), „on-demand“ (при нужда) или „no“ (без)"
-
-#: builtin/push.c:551
+#: builtin/push.c:519
 msgid "control recursive pushing of submodules"
 msgstr "управление на рекурсивното изтласкване на подмодулите"
 
-#: builtin/push.c:553 builtin/send-pack.c:169
+#: builtin/push.c:521 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "използване на съкратени пакети"
 
-#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
+#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
 #: builtin/send-pack.c:159
 msgid "receive pack program"
 msgstr "програма за получаването на пакети"
 
-#: builtin/push.c:556
+#: builtin/push.c:524
 msgid "set upstream for git pull/status"
 msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
 
-#: builtin/push.c:559
+#: builtin/push.c:527
 msgid "prune locally removed refs"
 msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
 
-#: builtin/push.c:561
+#: builtin/push.c:529
 msgid "bypass pre-push hook"
 msgstr "без изпълнение на куката преди изтласкване (pre-push)"
 
-#: builtin/push.c:562
+#: builtin/push.c:530
 msgid "push missing but relevant tags"
 msgstr ""
 "изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
 "изтласкване, етикети"
 
-#: builtin/push.c:565 builtin/send-pack.c:166
+#: builtin/push.c:533 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "подписване на изтласкването с GPG"
 
-#: builtin/push.c:567 builtin/send-pack.c:170
+#: builtin/push.c:535 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "изискване на атомарни операции от отсрещната страна"
 
-#: builtin/push.c:577
+#: builtin/push.c:549
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr ""
 "опцията „--delete“ е несъвместима с опциите  „--all“, „--mirror“ и „--tags“"
 
-#: builtin/push.c:579
+#: builtin/push.c:551
 msgid "--delete doesn't make sense without any refs"
 msgstr "опцията „--delete“ изисква поне един указател на версия"
 
@@ -9577,13 +10130,24 @@ msgstr "без прилагане на филтъра за частично из
 msgid "debug unpack-trees"
 msgstr "изчистване на грешки в командата „unpack-trees“"
 
-# FIXME
-#: builtin/reflog.c:428
+#: builtin/receive-pack.c:25
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack ДИРЕКТОРИЯ_НА_GIT"
+
+#: builtin/receive-pack.c:1719
+msgid "quiet"
+msgstr "без извеждане на информация"
+
+#: builtin/receive-pack.c:1733
+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:545 builtin/reflog.c:550
+#: builtin/reflog.c:540 builtin/reflog.c:545
 #, c-format
 msgid "'%s' is not a valid timestamp"
 msgstr "„%s“ не е правилна стойност за време"
@@ -9730,56 +10294,46 @@ msgstr ""
 "указването на следени клони е смислено само за отдалечени хранилища, от "
 "които се доставя"
 
-#: builtin/remote.c:193 builtin/remote.c:643
+#: builtin/remote.c:190 builtin/remote.c:633
 #, c-format
 msgid "remote %s already exists."
 msgstr "вече съществува отдалечено хранилище с име „%s“."
 
-#: builtin/remote.c:197 builtin/remote.c:647
+#: builtin/remote.c:194 builtin/remote.c:637
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "„%s“ е неправилно име за отдалечено хранилище"
 
-#: builtin/remote.c:241
+#: builtin/remote.c:234
 #, c-format
 msgid "Could not setup master '%s'"
 msgstr "Основният клон „%s“ не може да бъде настроен"
 
-#: builtin/remote.c:341
+#: builtin/remote.c:336
 #, c-format
 msgid "Could not get fetch map for refspec %s"
 msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
 
-#: builtin/remote.c:442 builtin/remote.c:450
+#: builtin/remote.c:437 builtin/remote.c:445
 msgid "(matching)"
 msgstr "(съвпадащи)"
 
-#: builtin/remote.c:454
+#: builtin/remote.c:449
 msgid "(delete)"
 msgstr "(за изтриване)"
 
-#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
-#, c-format
-msgid "Could not append '%s' to '%s'"
-msgstr "„%s“ не може да се добави към „%s“"
-
-#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
+#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
 #, c-format
 msgid "No such remote: %s"
 msgstr "Такова отдалечено хранилище няма: %s"
 
-#: builtin/remote.c:653
+#: builtin/remote.c:643
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
 
-#: builtin/remote.c:659 builtin/remote.c:827
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
-
 # FIXME tabulator
-#: builtin/remote.c:674
+#: builtin/remote.c:663
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9790,27 +10344,17 @@ msgstr ""
 "    %s\n"
 "  Променете настройките ръчно, ако е необходимо."
 
-#: builtin/remote.c:680
-#, c-format
-msgid "Could not append '%s'"
-msgstr "Разделът „%s“ не може да бъде добавен в настройките"
-
-#: builtin/remote.c:691
-#, c-format
-msgid "Could not set '%s'"
-msgstr "Разделът „%s“ не може да бъде зададен в настройките"
-
-#: builtin/remote.c:713
+#: builtin/remote.c:699
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "неуспешно изтриване на „%s“"
 
-#: builtin/remote.c:747
+#: builtin/remote.c:733
 #, c-format
 msgid "creating '%s' failed"
 msgstr "неуспешно създаване на „%s“"
 
-#: builtin/remote.c:813
+#: builtin/remote.c:796
 msgid ""
 "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
 "to delete it, use:"
@@ -9824,125 +10368,132 @@ msgstr[1] ""
 "Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
 "Изтрийте ги чрез командата:"
 
-#: builtin/remote.c:928
+#: builtin/remote.c:810
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
+
+#: builtin/remote.c:911
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
 
-#: builtin/remote.c:931
+#: builtin/remote.c:914
 msgid " tracked"
 msgstr " следен"
 
-#: builtin/remote.c:933
+#: builtin/remote.c:916
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " стар (изтрийте чрез „git remote prune“)"
 
 # FIXME
-#: builtin/remote.c:935
+#: builtin/remote.c:918
 msgid " ???"
 msgstr " неясно състояние"
 
 # CHECK
-#: builtin/remote.c:976
+#: builtin/remote.c:959
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr ""
 "неправилен клон за сливане „%s“. Невъзможно е да пребазирате върху повече от "
 "1 клон"
 
-#: builtin/remote.c:983
+#: builtin/remote.c:967
 #, c-format
-msgid "rebases onto remote %s"
-msgstr "пребазиране върху отдалечения клон „%s“"
+msgid "rebases interactively onto remote %s"
+msgstr "инÑ\82еÑ\80акÑ\82ивно Ð¿Ñ\80ебазиÑ\80ане Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ð¾Ñ\82далеÑ\87ениÑ\8f ÐºÐ»Ð¾Ð½ â\80\9e%sâ\80\9c"
 
-#: builtin/remote.c:986
+#: builtin/remote.c:971
 #, c-format
 msgid " merges with remote %s"
 msgstr " сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:987
+#: builtin/remote.c:972
 msgid "    and with remote"
 msgstr "    и с отдалечения клон"
 
-#: builtin/remote.c:989
+#: builtin/remote.c:974
 #, c-format
 msgid "merges with remote %s"
 msgstr "сливане с отдалечения клон „%s“"
 
-#: builtin/remote.c:990
+#: builtin/remote.c:975
 msgid "   and with remote"
 msgstr "   и с отдалечения клон"
 
-#: builtin/remote.c:1036
+#: builtin/remote.c:1021
 msgid "create"
 msgstr "създаден"
 
-#: builtin/remote.c:1039
+#: builtin/remote.c:1024
 msgid "delete"
 msgstr "изтрит"
 
-#: builtin/remote.c:1043
+#: builtin/remote.c:1028
 msgid "up to date"
 msgstr "актуален"
 
-#: builtin/remote.c:1046
+#: builtin/remote.c:1031
 msgid "fast-forwardable"
 msgstr "може да се слее тривиално"
 
-#: builtin/remote.c:1049
+#: builtin/remote.c:1034
 msgid "local out of date"
 msgstr "локалният е изостанал"
 
-#: builtin/remote.c:1056
+#: builtin/remote.c:1041
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s принудително изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1059
+#: builtin/remote.c:1044
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s изтласква към %-*s (%s)"
 
-#: builtin/remote.c:1063
+#: builtin/remote.c:1048
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s принудително изтласква към %s"
 
-#: builtin/remote.c:1066
+#: builtin/remote.c:1051
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s изтласква към %s"
 
-#: builtin/remote.c:1134
+#: builtin/remote.c:1119
 msgid "do not query remotes"
 msgstr "без заявки към отдалечените хранилища"
 
-#: builtin/remote.c:1161
+#: builtin/remote.c:1146
 #, c-format
 msgid "* remote %s"
 msgstr "● отдалечено хранилище „%s“"
 
-#: builtin/remote.c:1162
+#: builtin/remote.c:1147
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Адрес за доставяне: %s"
 
-#: builtin/remote.c:1163 builtin/remote.c:1314
+#: builtin/remote.c:1148 builtin/remote.c:1301
 msgid "(no URL)"
 msgstr "(без адрес)"
 
 # FIXME spaces betwen Push and URL
-#: builtin/remote.c:1172 builtin/remote.c:1174
+#. TRANSLATORS: the colon ':' should align with
+#. the one in "  Fetch URL: %s" translation
+#: builtin/remote.c:1159 builtin/remote.c:1161
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  Адрес за изтласкване: %s"
 
-#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
+#: builtin/remote.c:1163 builtin/remote.c:1165 builtin/remote.c:1167
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  клон сочен от HEAD: %s"
 
-#: builtin/remote.c:1182
+#: builtin/remote.c:1169
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9951,159 +10502,159 @@ msgstr ""
 "хранилище е\n"
 "  нееднозначен и е някой от следните):\n"
 
-#: builtin/remote.c:1194
+#: builtin/remote.c:1181
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Отдалечен клон:%s"
 msgstr[1] "  Отдалечени клони:%s"
 
-#: builtin/remote.c:1197 builtin/remote.c:1224
+#: builtin/remote.c:1184 builtin/remote.c:1211
 msgid " (status not queried)"
 msgstr " (състоянието не бе проверено)"
 
-#: builtin/remote.c:1206
+#: 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/remote.c:1214
+#: builtin/remote.c:1201
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Локалните указатели ще бъдат пренесени чрез „ push“"
 
-#: builtin/remote.c:1221
+#: 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/remote.c:1242
+#: builtin/remote.c:1229
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1231
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
 
-#: builtin/remote.c:1259
+#: builtin/remote.c:1246
 msgid "Cannot determine remote HEAD"
 msgstr "Не може да се установи отдалеченият връх"
 
-#: builtin/remote.c:1261
+#: builtin/remote.c:1248
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "Множество клони с върхове. Изберете изрично някой от тях чрез командата:"
 
-#: builtin/remote.c:1271
+#: builtin/remote.c:1258
 #, c-format
 msgid "Could not delete %s"
 msgstr "„%s“ не може да бъде изтрит"
 
-#: builtin/remote.c:1279
+#: builtin/remote.c:1266
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Неправилен указател: %s"
 
-#: builtin/remote.c:1281
+#: builtin/remote.c:1268
 #, c-format
 msgid "Could not setup %s"
 msgstr "„%s“ не може да се настрои"
 
-#: builtin/remote.c:1299
+#: builtin/remote.c:1286
 #, c-format
 msgid " %s will become dangling!"
 msgstr "„%s“ ще се превърне в обект извън клоните!"
 
-#: builtin/remote.c:1300
+#: builtin/remote.c:1287
 #, c-format
 msgid " %s has become dangling!"
 msgstr "„%s“ се превърна в обект извън клоните!"
 
-#: builtin/remote.c:1310
+#: builtin/remote.c:1297
 #, c-format
 msgid "Pruning %s"
 msgstr "Окастряне на „%s“"
 
-#: builtin/remote.c:1311
+#: builtin/remote.c:1298
 #, c-format
 msgid "URL: %s"
 msgstr "адрес: %s"
 
-#: builtin/remote.c:1327
+#: builtin/remote.c:1314
 #, c-format
 msgid " * [would prune] %s"
 msgstr " ● [ще бъде окастрено] %s"
 
-#: builtin/remote.c:1330
+#: builtin/remote.c:1317
 #, c-format
 msgid " * [pruned] %s"
 msgstr " ● [окастрено] %s"
 
-#: builtin/remote.c:1375
+#: builtin/remote.c:1362
 msgid "prune remotes after fetching"
 msgstr "окастряне на огледалата на отдалечените хранилища след доставяне"
 
-#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
+#: builtin/remote.c:1425 builtin/remote.c:1479 builtin/remote.c:1547
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Няма отдалечено хранилище на име „%s“"
 
-#: builtin/remote.c:1461
+#: builtin/remote.c:1441
 msgid "add branch"
 msgstr "добавяне на клон"
 
-#: builtin/remote.c:1468
+#: builtin/remote.c:1448
 msgid "no remote specified"
 msgstr "не е указано отдалечено хранилище"
 
-#: builtin/remote.c:1485
+#: builtin/remote.c:1465
 msgid "query push URLs rather than fetch URLs"
 msgstr "запитване към адресите за изтласкване, а не за доставяне"
 
-#: builtin/remote.c:1487
+#: builtin/remote.c:1467
 msgid "return all URLs"
 msgstr "извеждане на всички адреси"
 
-#: builtin/remote.c:1515
+#: builtin/remote.c:1495
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "не е зададен адрес за отдалеченото хранилище „%s“"
 
-#: builtin/remote.c:1541
+#: builtin/remote.c:1521
 msgid "manipulate push URLs"
 msgstr "промяна на адресите за изтласкване"
 
-#: builtin/remote.c:1543
+#: builtin/remote.c:1523
 msgid "add URL"
 msgstr "добавяне на адреси"
 
-#: builtin/remote.c:1545
+#: builtin/remote.c:1525
 msgid "delete URLs"
 msgstr "изтриване на адреси"
 
 # FIXME message - incompatible
-#: builtin/remote.c:1552
+#: builtin/remote.c:1532
 msgid "--add --delete doesn't make sense"
 msgstr "опциите „--add“ и „--delete“ са несъвместими"
 
-#: builtin/remote.c:1592
+#: builtin/remote.c:1573
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправилен (стар) формат за адрес: %s"
 
-#: builtin/remote.c:1600
+#: builtin/remote.c:1581
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Такъв адрес не е открит: %s"
 
 # FIXME CHECK MEANING
-#: builtin/remote.c:1602
+#: builtin/remote.c:1583
 msgid "Will not delete all non-push URLs"
 msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
 
-#: builtin/remote.c:1616
+#: builtin/remote.c:1597
 msgid "be verbose; must be placed before a subcommand"
 msgstr "повече подробности. Поставя се пред подкоманда"
 
@@ -10419,7 +10970,7 @@ msgstr "Индексът не може да бъде занулен към ве
 msgid "Could not write new index file."
 msgstr "Новият индекс не може да бъде записан."
 
-#: builtin/rev-list.c:354
+#: builtin/rev-list.c:350
 msgid "rev-list does not support display of notes"
 msgstr "командата „rev-list“ не поддържа извеждането на бележки"
 
@@ -10634,12 +11185,6 @@ msgstr ""
 "изходният код да е 0, дори ако никой файл нe e напаснал с шаблона за "
 "изтриване"
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"За да продължите, или вкарайте промените по файла „.gitmodules“ в индекса,\n"
-"или ги скатайте"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10681,29 +11226,24 @@ msgstr "извеждане на състоянието от отдалечена
 msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
 msgstr "git shortlog [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] [ПЪТ…]]"
 
-#: builtin/shortlog.c:131
-#, c-format
-msgid "Missing author: %s"
-msgstr "Авторът липсва: %s"
-
-#: builtin/shortlog.c:230
+#: builtin/shortlog.c:242
 msgid "sort output according to the number of commits per author"
 msgstr "подредба на подаванията по броя подавания от автор"
 
-#: builtin/shortlog.c:232
+#: builtin/shortlog.c:244
 msgid "Suppress commit descriptions, only provides commit count"
 msgstr "Без описания на подаванията — да се показва само броя подавания"
 
-#: builtin/shortlog.c:234
+#: builtin/shortlog.c:246
 msgid "Show the email address of each author"
 msgstr "Извеждане на адреса на е-поща за всеки автор"
 
 # FIXME why is this so short
-#: builtin/shortlog.c:235
+#: builtin/shortlog.c:247
 msgid "w[,i1[,i2]]"
 msgstr "ШИРОЧИНА[,ОТСТЪП_1[,ОТСТЪП_2]]"
 
-#: builtin/shortlog.c:236
+#: builtin/shortlog.c:248
 msgid "Linewrap output"
 msgstr ""
 "Пренасяне на редовете до тази обща ШИРОЧИНА (76), с ОТСТЪП_1 (6) за първия "
@@ -10853,84 +11393,186 @@ msgid "skip and remove all lines starting with comment character"
 msgstr "пропускане на всички редове, които започват с „#“"
 
 #: builtin/stripspace.c:38
-msgid "prepend comment character and blank to each line"
-msgstr "добавяне на „# “ на всеки ред"
+msgid "prepend comment character and space to each line"
+msgstr "добавяне на „# “ в началото на всеки ред"
+
+#: builtin/submodule--helper.c:24
+#, c-format
+msgid "No such ref: %s"
+msgstr "Такъв указател няма: %s"
+
+#: builtin/submodule--helper.c:31
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Очаква се пълно име на указател, а не „%s“"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "не може да се махне компонент от адреса „%s“"
 
-#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:405
+#: builtin/submodule--helper.c:486
 msgid "alternative anchor for relative paths"
 msgstr "директория за определянето на относителните пътища"
 
-#: builtin/submodule--helper.c:84
+#: builtin/submodule--helper.c:283
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=ПЪТ] [ПЪТ…]"
 
-#: builtin/submodule--helper.c:114
+#: 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/submodule--helper.c:366
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "Неуспешно регистриране на адрес за пътя към подмодул „%s“"
+
+#: builtin/submodule--helper.c:370
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr "Регистриран е подмодул „%s“ (%s) за пътя към подмодул „%s“\n"
+
+#: builtin/submodule--helper.c:380
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: препоръчва се режим на обновяване за подмодула „%s“\n"
+
+#: builtin/submodule--helper.c:387
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr ""
+"Неуспешно регистриране на режима на обновяване за пътя към подмодул „%s“"
+
+#: builtin/submodule--helper.c:406
+msgid "Suppress output for initializing a submodule"
+msgstr "Без извеждане на информация при инициализирането на подмодул"
+
+#: builtin/submodule--helper.c:411
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper name [ПЪТ]"
+
+#: builtin/submodule--helper.c:432
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name ПЪТ"
 
-#: builtin/submodule--helper.c:120
+#: builtin/submodule--helper.c:438
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "Във файла „.gitmodules“ липсва информация за пътя „%s“"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:489
 msgid "where the new submodule will be cloned to"
 msgstr "къде да се клонира новият подмодул"
 
-#: builtin/submodule--helper.c:173
+#: builtin/submodule--helper.c:492
 msgid "name of the new submodule"
 msgstr "име на новия подмодул"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:495
 msgid "url where to clone the submodule from"
 msgstr "адрес, от който да се клонира новият подмодул"
 
-#: builtin/submodule--helper.c:182
+#: builtin/submodule--helper.c:501
 msgid "depth for shallow clones"
 msgstr "дълбочина на плитките хранилища"
 
-#: builtin/submodule--helper.c:188
+#: builtin/submodule--helper.c:507
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=ПЪТ] [--quiet] [--reference ХРАНИЛИЩЕ] "
-"[--name ИМЕ] [--url АДРЕС][--depth ДЪЛБОЧИНА] [--] ПЪТ…]"
+"[--name ИМЕ] [--depth ДЪЛБОЧИНА] --url АДРЕС --path ПЪТ…"
 
-#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
-#: builtin/submodule--helper.c:216
+#: builtin/submodule--helper.c:532 builtin/submodule--helper.c:538
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Директорията „%s“ не може да бъде създадена"
 
-#: builtin/submodule--helper.c:204
+#: builtin/submodule--helper.c:534
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Неуспешно клониране на адреса „%s“ в пътя „%s“ като подмодул"
 
-#: builtin/submodule--helper.c:227
+#: builtin/submodule--helper.c:550
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "файлът „%s“ не може да бъде отворен"
 
-#: builtin/submodule--helper.c:232
+#: builtin/submodule--helper.c:555
 #, c-format
 msgid "could not close file %s"
 msgstr "файлът „%s“ не може да се затвори"
 
-#: builtin/submodule--helper.c:247
+#: builtin/submodule--helper.c:562
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "директорията на подмодула „%s“ не може да бъде получена"
 
-#: builtin/submodule--helper.c:273
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr "ФАТАЛНА ГРЕШКА: „submodule--helper“ трябва да се стартира с подкоманда"
+#: builtin/submodule--helper.c:609
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "Пътят на подмодула „%s“ не е инициализиран"
+
+#: builtin/submodule--helper.c:613
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Вероятно искахте да използвате „update --init“?"
+
+#: builtin/submodule--helper.c:639
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "Прескачане на неслетия подмодул „%s“"
+
+#: builtin/submodule--helper.c:660
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "Прескачане на подмодула „%s“"
+
+#: builtin/submodule--helper.c:768
+msgid "path into the working tree"
+msgstr "път към работното дърво"
+
+#: builtin/submodule--helper.c:771
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "път към работното дърво, през границите на вложените подмодули"
 
-#: builtin/submodule--helper.c:280
+#: builtin/submodule--helper.c:775
+msgid "rebase, merge, checkout or none"
+msgstr ""
+"„rebase“ (пребазиране), „merge“ (сливане), „checkout“ (изтегляне) или "
+"„none“ (нищо да не се прави)"
+
+#: builtin/submodule--helper.c:779
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "Плитко клониране, ограничено до указания брой версии"
+
+#: builtin/submodule--helper.c:782
+msgid "parallel jobs"
+msgstr "брой паралелни процеси"
+
+#: builtin/submodule--helper.c:783
+msgid "don't print cloning progress"
+msgstr "без извеждане на напредъка на клонирането"
+
+#: builtin/submodule--helper.c:788
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=ПЪТ] [ПЪТ…]"
+
+#: builtin/submodule--helper.c:798
+msgid "bad value for update parameter"
+msgstr "неправилен параметър към опцията „--update“"
+
+#: builtin/submodule--helper.c:855
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr "„submodule--helper“ трябва да се стартира с подкоманда"
+
+#: builtin/submodule--helper.c:862
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "ФАТАЛНА ГРЕШКА: „%s“ не е подкоманда на „submodule--helper“"
+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>]"
@@ -10985,27 +11627,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v ЕТИКЕТ…"
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "името на етикета е твърде дълго: „%.*s“…"
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "етикетът „%s“ не е открит."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Изтрит е етикетът „%s“ (бе „%s“)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "етикетът „%s“ не може да бъде проверен"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -11018,7 +11655,7 @@ msgstr ""
 "  %s\n"
 "Редовете, които започват с „%c“, ще бъдат пропуснати.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -11085,7 +11722,7 @@ msgstr "анотирането на етикети изисква съобщен
 
 #: builtin/tag.c:350
 msgid "tag message"
-msgstr "съобщение за етикет"
+msgstr "СЪОБЩЕНИЕ за етикет"
 
 #: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
@@ -11125,7 +11762,7 @@ msgstr "извеждане само на неслетите етикети"
 
 #: builtin/tag.c:370
 msgid "print only tags of the object"
-msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е Ð½Ð° Ð¾Ð±ÐµÐºÑ\82а"
+msgstr "извеждане Ñ\81амо Ð½Ð° ÐµÑ\82икеÑ\82иÑ\82е Ð½Ð° Ð\9eÐ\91Ð\95Ð\9aТÐ\90"
 
 #: builtin/tag.c:399
 msgid "--column and -n are incompatible"
@@ -11145,28 +11782,28 @@ msgstr "Опцията „-points-at“ изисква опцията „-l“."
 
 #: builtin/tag.c:425
 msgid "--merged and --no-merged option are only allowed with -l"
-msgstr "Опцииите „--merged“ и „--no-merged“ изискват опцията „-l“."
+msgstr "Опциите „--merged“ и „--no-merged“ изискват опцията „-l“."
 
 # FIXME message pattern
 #: builtin/tag.c:433
 msgid "only one -F or -m option is allowed."
 msgstr "Опциите „-F“ и „-m“ са несъвместими."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "Прекалено много аргументи"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "„%s“ е неправилно име за етикет."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "етикетът „%s“ вече съществува"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Обновен етикет „%s“ (бе „%s“)\n"
@@ -11175,210 +11812,223 @@ msgstr "Обновен етикет „%s“ (бе „%s“)\n"
 msgid "Unpacking objects"
 msgstr "Разпакетиране на обектите"
 
-#: builtin/update-index.c:70
+#: builtin/update-index.c:79
 #, c-format
 msgid "failed to create directory %s"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/update-index.c:76
+#: builtin/update-index.c:85
 #, c-format
 msgid "failed to stat %s"
 msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
 
-#: builtin/update-index.c:86
+#: builtin/update-index.c:95
 #, c-format
 msgid "failed to create file %s"
 msgstr "файлът „%s“ не може да бъде създаден"
 
-#: builtin/update-index.c:94
+#: builtin/update-index.c:103
 #, c-format
 msgid "failed to delete file %s"
 msgstr "файлът „%s“ не може да бъде изтрит"
 
-#: builtin/update-index.c:101 builtin/update-index.c:203
+#: builtin/update-index.c:110 builtin/update-index.c:212
 #, c-format
 msgid "failed to delete directory %s"
 msgstr "директорията „%s“ не може да бъде изтрита"
 
-#: builtin/update-index.c:124
+#: builtin/update-index.c:133
 #, c-format
-msgid "Testing "
-msgstr "Ð\9fÑ\80оба"
+msgid "Testing mtime in '%s' "
+msgstr "Ð\9fÑ\80овеÑ\80ка Ð½Ð° Ð²Ñ\80емеÑ\82о Ð½Ð° Ð¿Ñ\80омÑ\8fна (mtime) Ð½Ð° Ñ\84айла â\80\9e%sâ\80\9c"
 
-#: builtin/update-index.c:136
+#: builtin/update-index.c:145
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
 "информацията получена чрез „stat“ за директорията не се променя след "
 "добавянето на нов файл"
 
-#: builtin/update-index.c:149
+#: builtin/update-index.c:158
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 "информацията получена чрез „stat“ за директорията не се променя след "
 "добавянето на нова директория"
 
-#: builtin/update-index.c:162
+#: builtin/update-index.c:171
 msgid "directory stat info changes after updating a file"
 msgstr ""
 "информацията получена чрез „stat“ за директорията се променя след "
 "обновяването на нов файл"
 
-#: builtin/update-index.c:173
+#: builtin/update-index.c:182
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 "информацията получена чрез „stat“ за директорията се променя след добавянето "
 "на файл в поддиректория"
 
-#: builtin/update-index.c:184
+#: builtin/update-index.c:193
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
 "информацията получена чрез „stat“ за директорията не се променя след "
 "изтриването на файл"
 
-#: builtin/update-index.c:197
+#: builtin/update-index.c:206
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 "информацията получена чрез „stat“ за директорията не се променя след "
 "изтриването на директория"
 
-#: builtin/update-index.c:204
+#: builtin/update-index.c:213
 msgid " OK"
 msgstr " Добре"
 
-#: builtin/update-index.c:564
+#: builtin/update-index.c:575
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [ОПЦИЯ…] [--] [ФАЙЛ…]"
 
-#: builtin/update-index.c:918
+#: builtin/update-index.c:930
 msgid "continue refresh even when index needs update"
 msgstr ""
 "продължаване с обновяването, дори когато индексът трябва да бъде обновен"
 
-#: builtin/update-index.c:921
+#: builtin/update-index.c:933
 msgid "refresh: ignore submodules"
 msgstr "подмодулите да се игнорират при обновяването"
 
-#: builtin/update-index.c:924
+#: builtin/update-index.c:936
 msgid "do not ignore new files"
 msgstr "новите файлове да не се игнорират"
 
-#: builtin/update-index.c:926
+#: builtin/update-index.c:938
 msgid "let files replace directories and vice-versa"
 msgstr "файлове да могат да заменят директории и обратно"
 
-#: builtin/update-index.c:928
+#: builtin/update-index.c:940
 msgid "notice files missing from worktree"
 msgstr "предупреждаване при липсващи в работното дърво файлове"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:942
 msgid "refresh even if index contains unmerged entries"
 msgstr "обновяване дори и индексът да съдържа неслети обекти"
 
-#: builtin/update-index.c:933
+#: builtin/update-index.c:945
 msgid "refresh stat information"
 msgstr "обновяване на информацията от функцията „stat“"
 
-#: builtin/update-index.c:937
+#: builtin/update-index.c:949
 msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr ""
 "като опцията „--refresh“, но да се проверят и обектите, които са били приети "
 "за непроменени"
 
-#: builtin/update-index.c:941
+#: builtin/update-index.c:953
 msgid "<mode>,<object>,<path>"
 msgstr "РЕЖИМ,ОБЕКТ,ПЪТ"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:954
 msgid "add the specified entry to the index"
 msgstr "добавяне на изброените обекти към индекса"
 
-#: builtin/update-index.c:946
+#: builtin/update-index.c:958
 msgid "(+/-)x"
 msgstr "(+/-)x"
 
-#: builtin/update-index.c:947
+#: builtin/update-index.c:959
 msgid "override the executable bit of the listed files"
 msgstr "изрично задаване на стойността на флага дали файлът е изпълним"
 
-#: builtin/update-index.c:951
+#: builtin/update-index.c:963
 msgid "mark files as \"not changing\""
 msgstr "задаване на флаг, че файлът не се променя"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:966
 msgid "clear assumed-unchanged bit"
 msgstr "изчистване на флага, че файлът не се променя"
 
-#: builtin/update-index.c:957
+#: builtin/update-index.c:969
 msgid "mark files as \"index-only\""
 msgstr "задаване на флаг, че файловете са само за индекса"
 
-#: builtin/update-index.c:960
+#: builtin/update-index.c:972
 msgid "clear skip-worktree bit"
 msgstr "изчистване на флага,  че файловете са само за индекса"
 
-#: builtin/update-index.c:963
+#: builtin/update-index.c:975
 msgid "add to index only; do not add content to object database"
 msgstr "добавяне само към индекса без добавяне към базата от данни за обектите"
 
-#: builtin/update-index.c:965
+#: builtin/update-index.c:977
 msgid "remove named paths even if present in worktree"
 msgstr "изтриване на указаните пътища, дори и да съществуват в работното дърво"
 
-#: builtin/update-index.c:967
+#: builtin/update-index.c:979
 msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
 "при комбиниране с опцията „--stdin“ — входните редове са разделени с нулевия "
 "байт"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:981
 msgid "read list of paths to be updated from standard input"
 msgstr "изчитане на списъка с пътища за обновяване от стандартния вход"
 
-#: builtin/update-index.c:973
+#: builtin/update-index.c:985
 msgid "add entries from standard input to the index"
 msgstr "добавяне на елементите от стандартния вход към индекса"
 
-#: builtin/update-index.c:977
+#: builtin/update-index.c:989
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 "възстановяване на състоянието преди сливане или нужда от обновяване за "
 "изброените пътища"
 
-#: builtin/update-index.c:981
+#: builtin/update-index.c:993
 msgid "only update entries that differ from HEAD"
 msgstr "добавяне само на съдържанието, което се различава от това в „HEAD“"
 
-#: builtin/update-index.c:985
+#: builtin/update-index.c:997
 msgid "ignore files missing from worktree"
 msgstr "игнориране на файловете, които липсват в работното дърво"
 
-#: builtin/update-index.c:988
+#: builtin/update-index.c:1000
 msgid "report actions to standard output"
 msgstr "извеждане на действията на стандартния изход"
 
-#: builtin/update-index.c:990
+#: builtin/update-index.c:1002
 msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 "забравяне на записаната информация за неразрешени конфликти — за командите "
 "от потребителско ниво"
 
-#: builtin/update-index.c:994
+#: builtin/update-index.c:1006
 msgid "write index in this format"
 msgstr "записване на индекса в този формат"
 
-#: builtin/update-index.c:996
+#: builtin/update-index.c:1008
 msgid "enable or disable split index"
 msgstr "включване или изключване на разделянето на индекса"
 
-#: builtin/update-index.c:998
+#: builtin/update-index.c:1010
 msgid "enable/disable untracked cache"
 msgstr "включване/изключване на кеша за неследените файлове"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:1012
+msgid "test if the filesystem supports untracked cache"
+msgstr "проверка дали файловата система поддържа кеш за неследени файлове"
+
+#: builtin/update-index.c:1014
 msgid "enable untracked cache without testing the filesystem"
 msgstr ""
 "включване на кеша за неследените файлове без проверка на файловата система"
 
+#: builtin/update-index.c:1134
+msgid "Untracked cache disabled"
+msgstr "Кешът за неследените файлове е изключен"
+
+#: builtin/update-index.c:1146
+#, c-format
+msgid "Untracked cache enabled for '%s'"
+msgstr "Кешът за неследените файлове е изключен за „%s“"
+
 #: builtin/update-ref.c:9
 msgid "git update-ref [<options>] -d <refname> [<old-val>]"
 msgstr "git update-ref [ОПЦИЯ…] -d ИМЕ_НА_УКАЗАТЕЛ [СТАРА_СТОЙНОСТ]"
@@ -11426,7 +12076,7 @@ msgstr "git verify-tag [-v | --verbose] ПОДАВАНЕ…"
 msgid "print commit contents"
 msgstr "извеждане на съдържанието на подаването"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "извеждане на необработения изход от състоянието на „gpg“"
 
@@ -11446,7 +12096,7 @@ msgstr "извеждане само на статистиката"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] ЕТИКЕТ…"
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "извеждане на съдържанието на ЕТИКЕТи"
 
@@ -11462,71 +12112,75 @@ msgstr "git worktree prune [ОПЦИЯ…]"
 msgid "git worktree list [<options>]"
 msgstr "git worktree list [ОПЦИЯ…]"
 
-#: builtin/worktree.c:39
+#: builtin/worktree.c:40
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Изтриване на „worktrees/%s“: не е правилна поддиректория"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:46
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Изтриване на „worktrees/%s“: файлът „gitdir“ не съществува"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:51
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 "Изтриване на „worktrees/%s“: файлът „gitdir“ (%s) не може да бъде прочетен"
 
-#: builtin/worktree.c:61
+#: builtin/worktree.c:62
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Изтриване на „worktrees/%s“: неправилен файл „gitdir“"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:78
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "Изтриване на „worktrees/%s“: файлът „gitdir“ сочи несъществуващо "
 "местоположение"
 
-#: builtin/worktree.c:112
+#: builtin/worktree.c:113
 #, c-format
-msgid "failed to remove: %s"
-msgstr "„%s“ не може да се изтрие"
+msgid "failed to remove '%s'"
+msgstr "директорията „%s“ не може да бъде изтрита"
 
-#: builtin/worktree.c:201
+#: builtin/worktree.c:202
 #, c-format
 msgid "'%s' already exists"
 msgstr "„%s“ вече съществува"
 
-#: builtin/worktree.c:235
+#: builtin/worktree.c:234
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "директорията „%s“ не може да бъде създадена"
 
-#: builtin/worktree.c:271
+#: builtin/worktree.c:270
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Подготвяне на %s (идентификатор %s)"
 
-#: builtin/worktree.c:319
+#: builtin/worktree.c:322
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "Изтегляне КЛОНа, дори и да е изтеглен в друго работно дърво"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:324
 msgid "create a new branch"
 msgstr "създаване на нов клон"
 
-#: builtin/worktree.c:323
+#: builtin/worktree.c:326
 msgid "create or reset a branch"
 msgstr "създаване или зануляване на клони"
 
-#: builtin/worktree.c:324
+#: builtin/worktree.c:327
 msgid "detach HEAD at named commit"
 msgstr "отделяне на указателя „HEAD“ към указаното подаване"
 
-#: builtin/worktree.c:331
+#: builtin/worktree.c:328
+msgid "populate the new working tree"
+msgstr "подготвяне на новото работно дърво"
+
+#: builtin/worktree.c:336
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "Опциите „-b“, „-B“ и „--detach“ са несъвместими една с друга"
 
@@ -11546,7 +12200,7 @@ msgstr "запис на обект-дърво за поддиректорият
 msgid "only useful for debugging"
 msgstr "само за изчистване на грешки"
 
-#: credential-cache--daemon.c:255
+#: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "извеждане на съобщенията за трасиране на стандартната грешка"
 
@@ -11562,6 +12216,10 @@ msgstr ""
 "за\n"
 "някое определено ПОНЯТИЕ използвайте „git help ПОНЯТИЕ“."
 
+#: http.c:322
+msgid "Public key pinning not supported with cURL < 7.44.0"
+msgstr "Задаването на постоянен публичен ключ не се поддържа от cURL < 7.44.0"
+
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
 msgstr "създаване на работно дърво (погледнете: „git help tutorial“)"
@@ -11645,8 +12303,8 @@ msgid "Update remote refs along with associated objects"
 msgstr "Обновяване на отдалечените указатели и свързаните с тях обекти"
 
 #: common-cmds.h:32
-msgid "Forward-port local commits to the updated upstream head"
-msgstr "Ð\9fÑ\80ебазиÑ\80ане Ð½Ð° Ð¿Ñ\80омени ÐºÑ\8aм Ð½Ð¾Ð²Ð° Ð¾Ñ\81нова"
+msgid "Reapply commits on top of another base tip"
+msgstr "Ð\9fÑ\80илагане Ð½Ð° Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ\8fÑ\82а Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ð´Ñ\80Ñ\83г Ð²Ñ\80Ñ\8aÑ\85"
 
 #: common-cmds.h:33
 msgid "Reset current HEAD to the specified state"
@@ -11690,7 +12348,7 @@ msgstr "по-малко подробности"
 msgid "use <n> digits to display SHA-1s"
 msgstr "да се показват такъв БРОЙ цифри от сумите по SHA1"
 
-#: rerere.h:38
+#: rerere.h:40
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "при възможност преизползване на решението на конфликта за обновяване на "
@@ -11853,7 +12511,6 @@ msgstr ""
 msgid "bisect run cannot continue any more"
 msgstr "двоичното търсене не може да продължи"
 
-# FIXME initial space
 #: git-bisect.sh:531
 #, sh-format
 msgid ""
@@ -11919,16 +12576,16 @@ msgstr ""
 "За да откажете пребазирането и да се върнете към първоначалното състояние,\n"
 "изпълнете „git rebase --abort“."
 
-#: git-rebase.sh:165
+#: git-rebase.sh:168
 msgid "Applied autostash."
 msgstr "Автоматично скатаното е приложено."
 
-#: git-rebase.sh:168
+#: git-rebase.sh:171
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "„${stash_sha1}“ не може да бъде запазен"
 
-#: git-rebase.sh:169
+#: git-rebase.sh:172
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -11938,34 +12595,30 @@ msgstr ""
 "надеждно скатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
 "или да ги изхвърлите чрез „git stash drop“, когато поискате.\n"
 
-#: git-rebase.sh:208
+#: git-rebase.sh:211
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:216
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 "Изглежда, че сега се прилагат кръпки чрез командата „git-am“. Не може да "
 "пребазирате в момента."
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "Опцията „--exec“ задължително изисква опцията „--interactive“"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:357
 msgid "No rebase in progress?"
 msgstr "Изглежда в момента не тече пребазиране"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:368
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 "Опцията „--edit-todo“ е достъпна само по време на интерактивно пребазиране."
 
-#: git-rebase.sh:377
+#: git-rebase.sh:375
 msgid "Cannot read HEAD"
 msgstr "Указателят „HEAD“ не може да бъде прочетен"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:378
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11973,12 +12626,12 @@ msgstr ""
 "Трябва да редактирате всички конфликти при сливането. След това\n"
 "отбележете коригирането им чрез командата „git add“"
 
-#: git-rebase.sh:398
+#: git-rebase.sh:396
 #, sh-format
 msgid "Could not move back to $head_name"
 msgstr "Връщането към „${head_name}“ е невъзможно"
 
-#: git-rebase.sh:417
+#: git-rebase.sh:415
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11998,69 +12651,69 @@ msgstr ""
 "и отново започнете пребазирането. Текущото пребазиране се преустановява, за\n"
 "да не загубите случайно промени."
 
-#: git-rebase.sh:468
+#: git-rebase.sh:466
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "неправилна основа за сравнение „${upstream_name}“"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:490
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 "указателят „${onto_name}“ може да сочи към повече от една основа за "
 "пребазирането"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-rebase.sh:493 git-rebase.sh:497
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "указателят „${onto_name}“ не сочи към никаква основа за пребазирането"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:502
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Указателят „${onto_name}“ не сочи към подаване"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:525
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "ФАТАЛНА ГРЕШКА: не съществува клон „${branch_name}“"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:558
 msgid "Cannot autostash"
 msgstr "Не може да се скатае автоматично"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:563
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Автоматично скатано: „${stash_abbrev}“"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:567
 msgid "Please commit or stash them."
 msgstr "Промените трябва или да се подадат, или да се скатаят."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:587
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Текущият клон „${branch_name}“ е напълно актуален."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:591
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 "Текущият клон „${branch_name}“ е напълно актуален. Пребазирането е "
 "принудително."
 
-#: git-rebase.sh:604
+#: git-rebase.sh:602
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Промените от „${mb}“ към „${onto}“:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:611
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 "Първо, указателят „HEAD“ започва да сочи към базата, върху която пребазирате…"
 
-#: git-rebase.sh:623
+#: git-rebase.sh:621
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "Тривиално сливане на „${branch_name}“ върху „${onto_name}“."
@@ -12207,31 +12860,26 @@ msgstr "Не е указано име на клон"
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(За да ги възстановите, изпълнете командата „git stash apply“)"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "не може да се махне компонент от адреса „${remoteurl}“"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:219
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 "Относителен път може да се ползва само от основната директория на работното "
 "дърво"
 
 # FIXME - what is this regex?
-#: git-submodule.sh:291
+#: git-submodule.sh:229
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 "адрес на хранилище: „${repo}“ трябва или да е абсолютен, или да започва с "
 "„./“ или „../“"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:246
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "„${sm_path}“ вече съществува в индекса"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:250
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12242,24 +12890,24 @@ msgstr ""
 "${sm_path}\n"
 "Използвайте опцията „-f“, ако за да го добавите наистина."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:268
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Добавяне на съществуващото хранилище в „${sm_path}“ към индекса"
 
-#: git-submodule.sh:332
+#: git-submodule.sh:270
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "„${sm_path}“ съществува, а не е хранилище на Git"
 
-#: git-submodule.sh:340
+#: git-submodule.sh:278
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 "Открита е локална директория на Git — „${sm_name}“, която сочи към "
 "отдалечените хранилища:"
 
-#: git-submodule.sh:342
+#: git-submodule.sh:280
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
@@ -12267,7 +12915,7 @@ msgstr ""
 "Ако искате да преизползвате тази локална директория на Git вместо да отново "
 "да клонирате:"
 
-#: git-submodule.sh:344
+#: git-submodule.sh:282
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
@@ -12275,7 +12923,7 @@ msgstr ""
 "използвайте опцията „--force“. Ако локалната директория не сочи към "
 "правилното отдалечено хранилище"
 
-#: git-submodule.sh:345
+#: git-submodule.sh:283
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
@@ -12285,77 +12933,55 @@ msgstr ""
 "аргумент на опцията „--name“."
 
 # FIXME активиране - какво всъщност става
-#: git-submodule.sh:347
+#: git-submodule.sh:285
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Активиране на локалното хранилище за подмодула „${sm_name}“ наново."
 
-#: git-submodule.sh:359
+#: git-submodule.sh:297
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Подмодулът „${sm_path}“ не може да бъде изтеглен"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:302
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Неуспешно добавяне на подмодула „${sm_path}“"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:311
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Неуспешно регистриране на подмодула „${sm_path}“"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Влизане в „${prefix}${displaypath}“"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr ""
-"Спиране при „${prefix}${displaypath}“ — изходният код от скрипта бе различен "
-"от 0."
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr ""
-"Във файла „.gitmodules“ не е открит адрес за пътя към подмодул "
-"„${displaypath}“"
-
-#: git-submodule.sh:492
+#: git-submodule.sh:355
 #, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Ð\9dеÑ\83Ñ\81пеÑ\88но Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ане Ð½Ð° Ð°Ð´Ñ\80еÑ\81 Ð·Ð° Ð¿Ñ\8aÑ\82Ñ\8f ÐºÑ\8aм Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83л „${displaypath}“"
+msgid "Entering '$displaypath'"
+msgstr "Ð\92лизане Ð² „${displaypath}“"
 
-#: git-submodule.sh:494
+#: git-submodule.sh:375
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
+msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
-"Регистриран е подмодул „${name}“, сочещ към адрес „${url}“, за пътя към "
-"подмодул „${displaypath}“"
+"Спиране при „${displaypath}“ — изходният код от скрипта бе различен от 0."
 
-#: git-submodule.sh:511
+#: git-submodule.sh:448
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr ""
-"Неуспешно регистриране на режима на обновяване за пътя към подмодул "
-"„${displaypath}“"
+msgid "pathspec and --all are incompatible"
+msgstr "указването на път е несъвместимо с опцията „--all“"
 
-#: git-submodule.sh:549
+#: git-submodule.sh:453
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Използвайте „.“, за да премахнете всички подмодули"
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "Използвайте „--all“, за да премахнете всички подмодули"
 
-#: git-submodule.sh:566
+#: git-submodule.sh:470
 #, sh-format
 msgid "Submodule work tree '$displaypath' contains a .git directory"
 msgstr ""
 "Пътят към подмодул „${displaypath}“ в работното дърво съдържа директория „."
 "git“"
 
-#: git-submodule.sh:567
+#: git-submodule.sh:471
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -12363,7 +12989,7 @@ msgstr ""
 "(използвайте командата „rm -rf“, за да го изтриете заедно с цялата му "
 "история)"
 
-#: git-submodule.sh:573
+#: git-submodule.sh:477
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -12372,147 +12998,142 @@ msgstr ""
 "Пътят към подмодул „${displaypath}“ в работното дърво съдържа локални "
 "промени. Можете да ги пренебрегнете и отмените с опцията „-f“"
 
-#: git-submodule.sh:576
+#: git-submodule.sh:480
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Директорията „${displaypath}“ е изчистена"
 
-#: git-submodule.sh:577
+#: git-submodule.sh:481
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Директорията към работното дърво на подмодула „${displaypath}“ не може да "
 "бъде изтрита"
 
-#: git-submodule.sh:580
+#: git-submodule.sh:484
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Празната директория за подмодула „${displaypath}“ не може да бъде създадена"
 
-#: git-submodule.sh:589
+#: git-submodule.sh:493
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "Премахната е регистрацията на подмодул „${name}“, сочещ към адрес „${url}“, "
 "за пътя „${displaypath}“"
 
-#: git-submodule.sh:705
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"Пътят към подмодул „${displaypath}“ не е инициализиран.\n"
-"Пробвайте с командата „update --init“."
-
-#: git-submodule.sh:718
+#: git-submodule.sh:635
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Текущата версия за подмодула в „${displaypath}“ липсва"
 
-#: git-submodule.sh:727
+#: git-submodule.sh:644
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Неуспешно доставяне в пътя към подмодул „${sm_path}“"
 
-#: git-submodule.sh:751
+#: git-submodule.sh:667
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Неуспешно доставяне в пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:765
+#: git-submodule.sh:680
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Неуспешно изтегляне на версия „${sha1}“ в пътя към подмодул „${displaypath}“'"
 
-#: git-submodule.sh:766
+#: git-submodule.sh:681
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Път към подмодул „${displaypath}“: изтеглена е версия „${sha1}“"
 
-#: git-submodule.sh:770
+#: git-submodule.sh:685
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Неуспешно пребазиране на версия „${sha1}“ в пътя към подмодул "
 "„${displaypath}“"
 
-#: git-submodule.sh:771
+#: git-submodule.sh:686
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Път към подмодул „${displaypath}“: пребазиране върху версия „${sha1}“"
 
-#: git-submodule.sh:776
+#: git-submodule.sh:691
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 "Неуспешно сливане на версия „${sha1}“ в пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:777
+#: git-submodule.sh:692
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Път към подмодул „${displaypath}“: сливане с версия „${sha1}“"
 
-#: git-submodule.sh:782
+#: git-submodule.sh:697
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 "Неуспешно изпълнение на командата „${command} ${sha1}“ в пътя към подмодул "
-"„${prefix}${sm_path}“"
+"„${displaypath}“"
 
-#: git-submodule.sh:783
+#: git-submodule.sh:698
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Път към подмодул „${prefix}${sm_path}“: „${command} ${sha1}“"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Път към подмодул „${displaypath}“: „${command} ${sha1}“"
 
-#: git-submodule.sh:813
+#: git-submodule.sh:729
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 "Неуспешна обработка на поддиректориите в пътя към подмодул „${displaypath}“"
 
-#: git-submodule.sh:921
+#: git-submodule.sh:837
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опциите „--cached“ и „--files“ са несъвместими"
 
-#: git-submodule.sh:973
+#: git-submodule.sh:889
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "неочакван режим „${mod_dst}“"
 
-#: git-submodule.sh:993
+#: git-submodule.sh:909
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 "  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_src}“"
 
-#: git-submodule.sh:996
+#: git-submodule.sh:912
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr ""
 "  ПРЕДУПРЕЖДЕНИЕ: „${display_name}“ не съдържа подаването „${sha1_dst}“"
 
-#: git-submodule.sh:999
+#: git-submodule.sh:915
 #, 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:1024
+#: git-submodule.sh:940
 msgid "blob"
 msgstr "обект BLOB"
 
-#: git-submodule.sh:1142
+#: git-submodule.sh:1059
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 "Неуспешна обработка на поддиректориите в пътя към подмодул „${sm_path}“"
 
-#: git-submodule.sh:1206
+#: git-submodule.sh:1123
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Синхронизиране на адреса за пътя към подмодул „${displaypath}“"
+
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "За повече информация погледнете ръководството на „git-${cmd}(1)“"
index 46000d7d649f29d7667548ecb92679ad31619c7c..57d0e2faa8780b3434fd8f3656e206d4d4e7e75b 100644 (file)
--- a/po/ca.po
+++ b/po/ca.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-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-19 23:51-0600\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-28 20:03-0700\n"
 "Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
@@ -16,14 +16,39 @@ msgstr ""
 "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.7\n"
+"X-Generator: Poedit 1.8.11\n"
 
 #: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "pista: %.*s\n"
 
-#: advice.c:88
+#: 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."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Cometre no és possible perquè teniu fitxers no fusionats."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+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."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+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."
+
+#: 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."
@@ -32,615 +57,1734 @@ msgstr ""
 "'git add/rm <fitxer>' segons sigui apropiat per a marcar la\n"
 "resolució i feu una comissió."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+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
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "No heu conclòs la vostra fusió (MERGE_HEAD existeix)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
-msgstr "Sortint a causa d'una fusió no terminada."
-
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<opcions>] <arbre> [<camí>...]"
-
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+msgstr "S'està sortint a causa d'una fusió no terminada."
 
-#: 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 <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
-"[<camí>...]"
-
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <dipòsit> [--exec <ordre>] --list"
+"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"
+"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"
+"poder fer així (ara o més tard) usant -b de nou amb l'ordre checkout.\n"
+"Exemple:\n"
+"\n"
+"  git checkout -b <nom-de-branca-nova>\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 "L'especificació de camí '%s' no ha coincidit amb cap fitxer"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "format"
+msgid "unrecognized whitespace option '%s'"
+msgstr "opció d'espai en blanc '%s' no reconeguda"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "format d'arxiu"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
 
-#: archive.c:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "prefix"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject i --3way no es poden usar junts."
 
-#: 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:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached i --3way no es poden usar junts."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547 builtin/blame.c:2548
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:720 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 "fitxer"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way fora d'un dipòsit"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "escriu l'arxiu a aquest fitxer"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index fora d'un dipòsit"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "llegeix .gitattributes en el directori de treball"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached fora d'un dipòsit"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "informa de fitxers arxivats en stderr"
+#: 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:437
-msgid "store only"
-msgstr "només emmagatzema"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec ha retornat %d per l'entrada: %s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "comprimeix més ràpidament"
+#: 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:446
-msgid "compress better"
-msgstr "comprimeix millor"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "allista els formats d'arxiu admesos"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "dipòsit"
+#: 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: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: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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "ordre"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recompte: línia inesperada: %.*s"
 
-#: 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: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"
 
-#: attr.c:263
+#: apply.c:1577
+#, c-format
 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."
+"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)"
 
-#: branch.c:53
+#: apply.c:1589
 #, 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 "git diff header lacks filename information (line %d)"
 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\"."
+"a la capçalera de git diff li manca informació de nom de fitxer (línia %d)"
 
-#: branch.c:67
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "el fitxer nou depèn dels continguts antics"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "el fitxer suprimit encara té continguts"
+
+#: apply.c:1795
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "No establint la branca %s com a la seva pròpia font."
+msgid "corrupt patch at line %d"
+msgstr "pedaç malmès a la línia %d"
 
-#: branch.c:93
+#: apply.c:1832
 #, 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."
+msgid "new file %s depends on old contents"
+msgstr "el fitxer nou %s depèn dels continguts antics"
 
-#: branch.c:94
+#: apply.c:1834
 #, 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 "deleted file %s still has contents"
+msgstr "el fitxer suprimit %s encara té continguts"
 
-#: branch.c:98
+#: apply.c:1837
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
-msgstr ""
-"La branca %s està configurada per a seguir la branca local %s per rebasar."
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** advertència: el fitxer %s queda buit però no se suprimeix"
 
-#: branch.c:99
+#: apply.c:1984
 #, 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 "corrupt binary patch at line %d: %.*s"
+msgstr "pedaç binari malmès a la línia %d: %.*s"
 
-#: branch.c:104
+#: apply.c:2021
 #, 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 "unrecognized binary patch at line %d"
+msgstr "pedaç binari no reconegut a la línia %d"
 
-#: branch.c:105
+#: apply.c:2182
 #, 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 "patch with only garbage at line %d"
+msgstr "pedaç amb només escombraries a la línia %d"
 
-#: branch.c:109
+#: apply.c:2274
 #, 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 "unable to read symlink %s"
+msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
 
-#: branch.c:110
+#: apply.c:2278
 #, 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 "unable to open or read %s"
+msgstr "no s'ha pogut obrir o llegir %s"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "No es pot escriure la configuració de la branca font"
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "inici de línia no vàlid: '%c'"
 
-#: branch.c:156
+#: apply.c:3050
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "No seguint: informació ambigua per a la referència %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)."
 
-#: branch.c:185
+#: apply.c:3062
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' no és un nom de branca vàlid."
+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"
 
-#: branch.c:190
+#: apply.c:3068
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Una branca amb nom '%s' ja existeix."
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"tot cercant:\n"
+"%.*s"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "No es pot actualitzar la branca actual a la força."
+#: apply.c:3090
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "manquen les dades de pedaç binari de '%s'"
 
-#: branch.c:218
+#: apply.c:3098
 #, 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 "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'"
 
-#: branch.c:220
+#: apply.c:3144
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "la branca font demanada '%s' no existeix"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"no es pot aplicar un pedaç binari a '%s' sense la línia d'índex completa"
 
-#: branch.c:222
+#: apply.c:3154
+#, 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."
+"the patch applies to '%s' (%s), which does not match the current contents."
 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."
+"el pedaç s'aplica a '%s' (%s), el qual no coincideix amb els continguts "
+"actuals."
 
-#: branch.c:266
+#: apply.c:3162
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "No és un nom d'objecte vàlid: '%s'."
+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"
 
-#: branch.c:286
+#: apply.c:3180
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objecte ambigu: '%s'."
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "no es pot llegir la postimatge necessari %s per a '%s'"
 
-#: branch.c:291
+#: apply.c:3193
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "No és un punt de ramificació vàlid: '%s'."
+msgid "binary patch does not apply to '%s'"
+msgstr "el pedaç binari no s'aplica a '%s'"
 
-#: branch.c:344
+#: apply.c:3199
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ja s'ha agafat a '%s'"
+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)"
 
-#: bundle.c:34
+#: apply.c:3220
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' no sembla un fitxer de farcell v2"
+msgid "patch failed: %s:%ld"
+msgstr "el pedaç ha fallat: %s:%ld"
 
-#: bundle.c:61
+#: apply.c:3342
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "capçalera no reconeguda: %s%s (%d)"
+msgid "cannot checkout %s"
+msgstr "no es pot agafar %s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid "could not open '%s'"
-msgstr "no s'ha pogut obrir '%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:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "la configuració del passeig per revisions ha fallat"
+msgid "failed to read %s"
+msgstr "s'ha fallat en llegir %s"
 
-#: bundle.c:185
+#: apply.c:3398
 #, 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 "reading from '%s' beyond a symbolic link"
+msgstr "s'està llegint de '%s' més enllà d'un enllaç simbòlic"
 
-#: bundle.c:194
+#: apply.c:3427 apply.c:3667
 #, 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"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "El pack-objects s'ha mort"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "El rev-list s'ha mort"
+msgid "path %s has been renamed/deleted"
+msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, 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 "%s: does not exist in index"
+msgstr "%s: no existeix en l'índex"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "paràmetre no reconegut: %s"
+msgid "%s: does not match index"
+msgstr "%s: no coincideix amb l'índex"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Refusant crear un farcell buit."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"al dipòsit li manca el blob necessari per a retrocedir a una fusió de 3 vies."
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "no es pot crear '%s'"
+msgid "Falling back to three-way merge...\n"
+msgstr "S'està retrocedint a una fusió de 3 vies...\n"
 
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "L'index-pack s'ha mort"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "no es poden llegir els continguts actuals de '%s'"
 
-#: color.c:275
+#: apply.c:3589
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "valor de color no vàlid: %.*s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "S'ha fallat en retrocedir a una fusió de 3 vies...\n"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
-msgstr "no s'ha pogut analitzar %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "S'ha aplicat el pedaç a '%s' amb conflictes.\n"
 
-#: commit.c:42
+#: apply.c:3608
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s no és una comissió!"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "S'ha aplicat el pedaç a '%s' netament.\n"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "memòria esgotada"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
 
-#: config.c:475 config.c:477
+#: apply.c:3706
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "línia de fitxer de configuració dolenta %d en %s %s"
+msgid "%s: wrong type"
+msgstr "%s: tipus erroni"
 
-#: config.c:593
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "valor de configuració numèrica dolent '%s' per '%s' en %s %s: %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s és del tipus %o, s'esperava %o"
 
-#: config.c:595
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valor de configuració numèrica dolent '%s' per '%s': %s"
+msgid "invalid path '%s'"
+msgstr "camí no vàlid: %s"
 
-#: config.c:680
+#: apply.c:3917
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "s'ha fallat en expandir el directori d'usuari en '%s'"
+msgid "%s: already exists in index"
+msgstr "%s: ja existeix en l'índex"
 
-#: config.c:758 config.c:769
+#: apply.c:3920
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "nivell de compressió de zlib dolent %d"
+msgid "%s: already exists in working directory"
+msgstr "%s: ja existeix en el directori de treball"
 
-#: config.c:891
+#: apply.c:3940
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "mode de creació d'objecte no vàlid: %s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
-
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "ha ocorregut un error desconegut en llegir els fitxers de configuració"
+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)"
 
-#: config.c:1629
+#: apply.c:3945
 #, 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"
+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"
 
-#: config.c:1631
+#: apply.c:3965
 #, 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"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "el fitxer afectat '%s' és més enllà d'un enllaç simbòlic"
 
-#: config.c:1690
+#: apply.c:3969
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s té múltiples valors"
+msgid "%s: patch does not apply"
+msgstr "%s: el pedaç no s'aplica"
 
-#: config.c:2226
+#: apply.c:3984
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "No s'ha pogut establir '%s' com a '%s'"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "No s'ha pogut executar 'git rev-list'"
+msgid "Checking patch %s..."
+msgstr "S'està comprovant el pedaç %s..."
 
-#: connected.c:89
+#: apply.c:4075
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "escriptura fallada al rev-list: %s"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "falta la informació sha1 o és inútil per al submòdul %s"
 
-#: connected.c:97
+#: apply.c:4082
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "s'ha fallat en tancar l'stdin del rev-list: %s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "en el futur"
+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"
 
-#: date.c:101
+#: apply.c:4085
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "fa %lu segon"
-msgstr[1] "fa %lu segons"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "falta informació sha1 o és inútil (%s)."
 
-#: date.c:108
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "fa %lu minut"
-msgstr[1] "fa %lu minuts"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry ha fallat per al camí '%s'"
 
-#: date.c:115
+#: apply.c:4094
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "fa %lu hora"
-msgstr[1] "fa %lu hores"
+msgid "could not add %s to temporary index"
+msgstr "no s'ha pogut afegir %s a l'index temporal"
 
-#: date.c:122
+#: apply.c:4104
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "fa %lu dia"
-msgstr[1] "fa %lu dies"
+msgid "could not write temporary index to %s"
+msgstr "no s'ha pogut escriure l'índex temporal a %s"
 
-#: date.c:128
+#: apply.c:4242
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "fa %lu setmana"
-msgstr[1] "fa %lu setmanes"
+msgid "unable to remove %s from index"
+msgstr "no s'ha pogut eliminar %s de l'índex"
 
-#: date.c:135
+#: apply.c:4277
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "fa %lu mes"
-msgstr[1] "fa %lu mesos"
+msgid "corrupt patch for submodule %s"
+msgstr "pedaç malmès per al submòdul %s"
 
-#: date.c:146
+#: apply.c:4283
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu any"
-msgstr[1] "%lu anys"
+msgid "unable to stat newly created file '%s'"
+msgstr "no s'ha pogut fer stat al fitxer novament creat '%s'"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4291
 #, 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"
+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"
 
-#: date.c:154 date.c:159
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "fa %lu any"
-msgstr[1] "fa %lu anys"
+msgid "unable to add cache entry for %s"
+msgstr "no s'ha pogut afegir una entrada de cau per a %s"
 
-#: diffcore-order.c:24
+#: apply.c:4338
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "s'ha fallat en llegir el fitxer d'ordres '%s'"
+msgid "failed to write to '%s'"
+msgstr "s'ha fallat en escriure a '%s'"
 
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Realitzant detecció inexacta de canvis de nom"
-
-#: diff.c:115
+#: apply.c:4342
 #, 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"
+msgid "closing file '%s'"
+msgstr "s'està tancant el fitxer '%s'"
 
-#: diff.c:120
+#: apply.c:4412
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Paràmetre de dirstat desconegut '%s'\n"
+msgid "unable to write file '%s' mode %o"
+msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
 
-#: diff.c:215
+#: apply.c:4510
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
+msgid "Applied patch %s cleanly."
+msgstr "El pedaç %s s'ha aplicat netament."
 
-#: diff.c:267
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Errors trobats en la variable de configuració 'diff.dirstat':\n"
-"%s"
+#: apply.c:4518
+msgid "internal error"
+msgstr "error intern"
 
-#: diff.c:2997
+#: apply.c:4521
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "El diff external s'ha mort, aturant a %s"
-
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow requereix exactament una especificació de camí"
+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..."
 
-#: diff.c:3556
+#: apply.c:4532
 #, 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 "truncating .rej filename to %.*s.rej"
+msgstr "s'està truncant el nom del fitxer .rej a %.*s.rej"
 
-#: diff.c:3570
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: %s"
+msgid "cannot open %s"
+msgstr "no es pot obrir %s"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "El tros #%d s'ha aplicat netament."
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
-"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
+#: apply.c:4558
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "S'ha rebutjat el tros #%d."
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "no s'ha pogut executar el gpg."
+#: apply.c:4668
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "S'ha saltat el pedaç '%s'."
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "El gpg no ha acceptat les dades"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "entrada no reconeguda"
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg ha fallat en firmar les dades"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "no es pot llegir el fitxer d'índex"
 
-#: gpg-interface.c:222
+#: apply.c:4833
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "no s'ha pogut crear el fitxer temporal '%s': %s"
+msgid "can't open patch '%s': %s"
+msgstr "no es pot obrir el pedaç '%s': %s"
 
-#: gpg-interface.c:225
+#: apply.c:4858
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "s'ha fallat en escriure la firma separada a '%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"
 
-#: grep.c:1718
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': no s'ha pogut llegir %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."
 
-#: grep.c:1735
+#: apply.c:4872
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s': %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."
 
-#: grep.c:1746
+#: apply.c:4888 builtin/add.c:463 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"
+
+#: 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 "camí"
+
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "no apliquis els canvis que coincideixin amb el camí donat"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "aplica els canvis que coincideixin amb el camí donat"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "número"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"elimina <nombre> barres obliqües inicials dels camins de diferència "
+"tradicionals"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "ignora afegiments fets pel pedaç"
+
+#: apply.c:4931
+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"
+
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "mostra el nombre de línies afegides i suprimides en notació decimal"
+
+#: apply.c:4937
+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"
+
+#: apply.c:4939
+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"
+
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "assegura que el pedaç sigui aplicable a l'índex actual"
+
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "aplica un pedaç sense tocar l'arbre de treball"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "accepta un pedaç que toqui fora de l'àrea de treball"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
+
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "intenta una fusió de tres vies si el pedaç no s'aplica"
+
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "construeix un índex temporal basat en la informació d'índex incrustada"
+
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "els camins se separen amb el caràcter NUL"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "assegura't que almenys <n> línies de context coincideixin"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "acció"
+
+#: apply.c:4958
+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"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignora els canvis d'espai en blanc en cercar context"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "aplica el pedaç al revés"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "no esperis almenys una línia de context"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixa els trossos rebutjats en fitxers *.reg corresponents"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "permet trossos encavalcants"
+
+#: 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 "sigues detallat"
+
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "tolera una línia nova incorrectament detectada al final del fitxer"
+
+#: apply.c:4979
+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"
+
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "arrel"
+
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "anteposa <arrel> a tots els noms de fitxer"
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<opcions>] <arbre> [<camí>...]"
+
+#: 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 <dipòsit> [--exec <ordre>] [<opcions>] <arbre> "
+"[<camí>...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <dipòsit> [--exec <ordre>] --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 "l'especificació de camí '%s' no ha coincidit amb cap fitxer"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "format"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "format d'arxiu"
+
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "prefix"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "anteposa el prefix a cada nom de camí en l'arxiu"
+
+#: 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 "fitxer"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escriu l'arxiu a aquest fitxer"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "llegeix .gitattributes en el directori de treball"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "informa de fitxers arxivats en stderr"
+
+#: archive.c:437
+msgid "store only"
+msgstr "només emmagatzema"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "comprimeix més ràpidament"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "comprimeix millor"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "allista els formats d'arxiu admesos"
+
+#: 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 "dipòsit"
+
+#: 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>"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "ordre"
+
+#: 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"
+
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Opció inesperada --remote"
+
+#: 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"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Opció inesperada --output"
+
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Format d'arxiu desconegut '%s'"
+
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Paràmetre no admès per al format '%s': -%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."
+
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "No s'ha pogut obrir el fitxer '%s'"
+
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Comentari amb cometes dolentes en el fitxer '%s': %s"
+
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "No podem bisecar més!\n"
+
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "No és un nom de comissió vàlid %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 ""
+"La base de fusió %s és dolenta.\n"
+"Això vol dir que el defecte s'ha arreglat entre %s i [%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 ""
+"La base de fusió %s és nova.\n"
+"La propietat s'ha canviat entre %s i [%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 ""
+"La base de fusió %s és %s.\n"
+"Això vol dir que la primera comissió '%s' és entre %s i [%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 ""
+"Unes 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"
+
+#: 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'ha de saltar 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."
+
+#: bisect.c:798
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisecant: s'ha de provar una base de fusió\n"
+
+#: bisect.c:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "es necessita una revisió %s"
+
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "no s'ha pogut crear el fitxer '%s'"
+
+#: bisect.c:917
+#, 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"
+
+#: bisect.c:967
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s era ambdós %s i %s\n"
+
+#: bisect.c:975
+#, 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"
+
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(aproximadament %d pas)"
+msgstr[1] "(aproximadament %d passos)"
+
+#. 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] "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"
+
+#: 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"
+"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\"."
+
+#: 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."
+
+#: branch.c:93
+#, 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."
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"La branca %s està configurada per a seguir la branca local %s per rebasar."
+
+#: branch.c:99
+#, 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."
+
+#: branch.c:104
+#, 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."
+
+#: branch.c:105
+#, 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."
+
+#: branch.c:109
+#, 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."
+
+#: 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."
+
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "No es pot escriure la configuració de la branca font"
+
+#: branch.c:156
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "No seguint: informació ambigua per a la referència %s"
+
+#: branch.c:185
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' no és un nom de branca vàlid."
+
+#: branch.c:190
+#, 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."
+
+#: branch.c:218
+#, 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."
+
+#: branch.c:220
+#, 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."
+
+#: branch.c:265
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "No és un nom d'objecte vàlid: '%s'."
+
+#: branch.c:285
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objecte ambigu: '%s'."
+
+#: branch.c:290
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "No és un punt de ramificació vàlid: '%s'."
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' ja s'ha agafat a '%s'"
+
+#: branch.c:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "La HEAD de l'arbre de treball %s no està actualitzat"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' no sembla un fitxer de farcell v2"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "capçalera no reconeguda: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
+#, c-format
+msgid "could not open '%s'"
+msgstr "no s'ha pogut obrir '%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: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 "la configuració del passeig per revisions ha fallat"
+
+#: bundle.c:185
+#, 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."
+
+#: bundle.c:194
+#, 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"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "El pack-objects s'ha mort"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "El rev-list s'ha mort"
+
+#: bundle.c:353
+#, 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'"
+
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "paràmetre no reconegut: %s"
+
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "S'està refusant crear un farcell buit."
+
+#: bundle.c:463
+#, c-format
+msgid "cannot create '%s'"
+msgstr "no es pot crear '%s'"
+
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "L'index-pack s'ha mort"
+
+#: color.c:290
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "valor de color no vàlid: %.*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 "no s'ha pogut analitzar %s"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s no és una comissió!"
+
+#: commit.c:1514
+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 ""
+"Advertència: el missatge de comissió no conformava a UTF-8.\n"
+"Potser voleu esemenar-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"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memòria esgotada"
+
+#: config.c:516
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "línia de configuració dolenta %d en el blob %s"
+
+#: config.c:520
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "línia de configuració dolenta %d en el fitxer %s"
+
+#: config.c:524
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "línia de configuració dolenta %d en l'entrada estàndard"
+
+#: config.c:528
+#, 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"
+
+#: config.c:532
+#, 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"
+
+#: config.c:536
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "línia de configuració dolenta %d en %s"
+
+#: config.c:655
+msgid "out of range"
+msgstr "fora de rang"
+
+#: config.c:655
+msgid "invalid unit"
+msgstr "unitat no vàlida"
+
+#: config.c:661
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valor de configuració numèric dolent '%s' per '%s': %s"
+
+#: config.c:666
+#, 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"
+
+#: config.c:669
+#, 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"
+
+#: config.c:672
+#, 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"
+
+#: 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"
+
+#: 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"
+
+#: 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"
+
+#: 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'"
+
+#: config.c:852 config.c:863
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "nivell de compressió de zlib dolent %d"
+
+#: config.c:978
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "mode de creació d'objecte no vàlid: %s"
+
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "no s'ha pogut analitzar la configuració de la línia d'ordres"
+
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "un error desconegut ha ocorregut en llegir els fitxers de configuració"
+
+#: 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"
+
+#: 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"
+
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s té múltiples valors"
+
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "no s'ha pogut establir '%s' a '%s'"
+
+#: config.c:2313
+#, c-format
+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 drets\n"
+"d'accés correctes i que el dipòsit existeixi."
+
+#: connected.c:63 builtin/fsck.c:173 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 fallat en tancar l'stdin del 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 ""
+"LF reemplaçarà CRLF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "LF reemplaçaria CRLF en %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 ""
+"CRLF reemplaçarà LF en %s.\n"
+"El fitxer tindrà els seus terminadors de línia originals en el vostre "
+"directori de treball."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "CRLF reemplaçaria LF en %s"
+
+#: date.c:97
+msgid "in the future"
+msgstr "en el futur"
+
+#: date.c:103
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "fa %lu segon"
+msgstr[1] "fa %lu segons"
+
+#: date.c:110
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "fa %lu minut"
+msgstr[1] "fa %lu minuts"
+
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "fa %lu hora"
+msgstr[1] "fa %lu hores"
+
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "fa %lu dia"
+msgstr[1] "fa %lu dies"
+
+#: date.c:130
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "fa %lu setmana"
+msgstr[1] "fa %lu setmanes"
+
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "fa %lu mes"
+msgstr[1] "fa %lu mesos"
+
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu any"
+msgstr[1] "%lu anys"
+
+#. 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"
+
+#: 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"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "s'ha fallat 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"
+
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "l'opció '%s' requereix un valor"
+
+#: diff.c:124
+#, 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"
+
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paràmetre de dirstat desconegut '%s'\n"
+
+#: diff.c:283
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valor desconegut de la variable de configuració de 'diff.submodule': '%s'"
+
+#: diff.c:346
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
+"%s"
+
+#: diff.c:3087
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "el diff external s'ha mort, s'està aturant a %s"
+
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check i -s són mutualment exclusius"
+
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow requereix exactament una especificació de camí"
+
+#: diff.c:3665
+#, 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"
+
+#: diff.c:3679
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "S'ha fallat en analitzar el paràmetre d'opció de --submodule: '%s'"
+
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "s'ha saltat la detecció de canvi de nom a causa de massa fitxers."
+
+#: diff.c:4703
+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:4706
+#, c-format
+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:1866
+msgid "failed to get kernel name and information"
+msgstr "s'ha fallat en obtenir el nombre i la informació del nucli"
+
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr ""
+"La memòria cau no seguida està inhabilitada en aquest sistema o ubicació."
+
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: llista superficial esperada"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK esperat, EOF rebut"
+
+#: fetch-pack.c:243
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK esperat, '%s' rebut"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc requereix multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "'%s': short read %s"
-msgstr "'%s': lectura curta %s"
+msgid "invalid shallow line: %s"
+msgstr "línia de shallow no vàlida: %s"
 
-#: help.c:205
+#: fetch-pack.c:387
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "línia d'unshallow no vàlida: %s"
+
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "objecte no trobat: %s"
+
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "error en objecte: %s"
+
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "no s'ha trobat cap superficial: %s"
+
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "s'esperava shallow/unshallow, s'ha rebut %s"
+
+#: fetch-pack.c:436
+#, c-format
+msgid "got %s %d %s"
+msgstr "%s %d %s rebut"
+
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "comissió no vàlida %s"
+
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "s'està rendint"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "fet"
+
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "s'ha rebut %s (%d) %s"
+
+#: fetch-pack.c:551
+#, c-format
+msgid "Marking %s as complete"
+msgstr "S'està marcant %s com a complet"
+
+#: fetch-pack.c:697
+#, c-format
+msgid "already have %s (%s)"
+msgstr "ja es té %s (%s)"
+
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: no s'ha pogut bifurcar del demultiplexor de banda lateral"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "error de protocol: capçalera de paquet dolent"
+
+#: fetch-pack.c:799
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: no es pot bifurcar de %s"
+
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "%s ha fallat"
+
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "error en demultiplexor de banda lateral"
+
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "El servidor no permet clients superficials"
+
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "El servidor accepta multi_ack_detailed"
+
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "El servidor accepta no-done"
+
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "El servidor accepta multi_ack"
+
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "El servidor accepta side-band-64k"
+
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "El servidor accepta banda lateral"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "El servidor accepta allow-tip-sha1-in-want"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "El servidor accepta allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "El servidor accepta ofs-delta"
+
+#: fetch-pack.c:890
+#, c-format
+msgid "Server version is %.*s"
+msgstr "La versió del servidor és %.*s"
+
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "El servidor no admet --shallow-since"
+
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "El servidor no admet --shallow-exclude"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "El servidor no admet --deepen"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "cap comissió en comú"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: l'obtenció ha fallat."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "no hi ha cap cap remot coincident"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg ha fallat en signar les dades"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "no s'ha pogut crear el fitxer temporal"
+
+#: gpg-interface.c:217
+#, c-format
+msgid "failed writing detached signature to '%s'"
+msgstr "s'ha fallat en escriure la signatura separada a '%s'"
+
+#: grep.c:1782
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s': no s'ha pogut llegir %s"
+
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "s'ha fallat en fer stat a '%s'"
+
+#: grep.c:1810
+#, c-format
+msgid "'%s': short read"
+msgstr "'%s': lectura curta"
+
+#: help.c:203
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "ordres de git disponibles en '%s'"
 
-#: help.c:212
+#: help.c:210
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "ordres de git disponibles d'altres llocs en el vostre $PATH"
 
-#: help.c:244
+#: help.c:241
 msgid "These are common Git commands used in various situations:"
 msgstr "Aquestes són ordres del Git comunament usades en diverses situacions:"
 
-#: help.c:309
+#: help.c:306
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -649,30 +1793,31 @@ msgstr ""
 "'%s' sembla una ordre de git, però no hem pogut\n"
 "executar-la. Pot ser que git-%s estigui estropejat?"
 
-#: help.c:366
+#: help.c:361
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Ai. El vostre sistema no informa de cap ordre de Git."
 
-#: help.c:388
+#: help.c:383
 #, 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 ""
-"AVÍS: Heu invocat una ordre de Git amb nom '%s', la qual no existeix.\n"
-"Continuant sota l'assumpció que volíeu dir '%s'"
+"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'"
 
-#: help.c:393
+#: help.c:388
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "en %0.1f segons automàticament..."
 
-#: help.c:400
+#: help.c:395
 #, 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'."
 
-#: help.c:404 help.c:464
+#: help.c:399 help.c:465
 msgid ""
 "\n"
 "Did you mean this?"
@@ -686,92 +1831,137 @@ msgstr[1] ""
 "\n"
 "Volíeu dir un d'aquests?"
 
-#: help.c:460
+#: help.c:461
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %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"
+"*** Si us plau, digueu-me qui sou.\n"
+"\n"
+"Executeu\n"
+"\n"
+"  git config --global user.email \"vós@example.com\"\n"
+"  git config --global user.name \"El Vostre Nom\"\n"
+"\n"
+"per a establir la identitat predeterminat del vostre compte.\n"
+"Ometeu --global per a establir la identitat només en aquest dipòsit.\n"
+
+#: 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 ""
+"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."
+
+#: lockfile.c:160
+#, c-format
+msgid "Unable to create '%s.lock': %s"
+msgstr "No s'ha pogut 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:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
+#: 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 "no s'ha pogut escriure un fitxer d'índex nou"
 
-#: merge-recursive.c:189
-#, c-format
+#: merge-recursive.c:209
 msgid "(bad commit)\n"
 msgstr "(comissió dolenta)\n"
 
-#: merge-recursive.c:209
+#: merge-recursive.c:231
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache ha fallat per al camí '%s'"
 
-#: merge-recursive.c:270
+#: merge-recursive.c:301
 msgid "error building trees"
 msgstr "error en construir arbres"
 
-#: merge-recursive.c:689
+#: merge-recursive.c:720
 #, c-format
 msgid "failed to create path '%s'%s"
-msgstr "s'ha fallat en crear el camí '%s' %s"
+msgstr "s'ha fallat en crear el camí '%s'%s"
 
-#: merge-recursive.c:700
+#: merge-recursive.c:731
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
-msgstr "Eliminant %s per a fer espai per al subdirectori\n"
+msgstr "S'està eliminant %s per a fer espai per al subdirectori\n"
 
-#: merge-recursive.c:714 merge-recursive.c:735
+#: merge-recursive.c:745 merge-recursive.c:764
 msgid ": perhaps a D/F conflict?"
 msgstr ": potser un conflicte D/F?"
 
-#: merge-recursive.c:725
+#: merge-recursive.c:754
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
-msgstr "refusant perdre el fitxer no seguit a '%s'"
+msgstr "s'està refusant perdre el fitxer no seguit a '%s'"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "no es pot llegir l'objecte %s '%s'"
 
-#: merge-recursive.c:767
+#: merge-recursive.c:798
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob esperat per a %s '%s'"
 
-#: merge-recursive.c:790 builtin/clone.c:374
+#: merge-recursive.c:822
 #, c-format
-msgid "failed to open '%s'"
-msgstr "s'ha fallat en obrir '%s'"
+msgid "failed to open '%s': %s"
+msgstr "s'ha fallat en obrir '%s': %s"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:833
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "s'ha fallat en fer l'enllaç simbòlic '%s'"
+msgid "failed to symlink '%s': %s"
+msgstr "s'ha fallat en fer l'enllaç simbòlic '%s': %s"
 
-#: merge-recursive.c:801
+#: merge-recursive.c:838
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "no se sap què fer amb %06o %s '%s'"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:978
 msgid "Failed to execute internal merge"
 msgstr "S'ha fallat en executar la fusió interna"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:982
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "no s'ha pogut afegir %s a la base de dades"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "tipus d'objecte no compatible en l'arbre"
-
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -780,7 +1970,7 @@ msgstr ""
 "CONFLICTE: (%s/supressió): %s suprimit en %s i %s en %s. La versió %s de %s "
 "s'ha deixat en l'arbre."
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -789,20 +1979,20 @@ 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:1094
+#: merge-recursive.c:1143
 msgid "rename"
-msgstr "canvia de nom"
+msgstr "canvi de nom"
 
-#: merge-recursive.c:1094
+#: merge-recursive.c:1143
 msgid "renamed"
 msgstr "canviat de nom"
 
-#: merge-recursive.c:1150
+#: merge-recursive.c:1200
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s és un directori en %s; afegint com a %s en lloc"
+msgstr "%s és un directori en %s; s'està afegint com a %s en lloc d'això"
 
-#: merge-recursive.c:1172
+#: merge-recursive.c:1225
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -811,150 +2001,158 @@ 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"
 
-#: merge-recursive.c:1177
+#: merge-recursive.c:1230
 msgid " (left unresolved)"
 msgstr " (deixat sense resolució)"
 
-#: merge-recursive.c:1231
+#: merge-recursive.c:1292
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "CONFLICTE (canvi de nom/canvi de nom): Canvi de nom %s->%s en %s. Canvi de "
 "nom %s->%s en %s"
 
-#: merge-recursive.c:1261
+#: merge-recursive.c:1325
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Canviant el nom de %s a %s i %s a %s en lloc d'això"
+msgstr "S'està canviant el nom de %s a %s i %s a %s en lloc d'això"
 
-#: merge-recursive.c:1460
+#: merge-recursive.c:1531
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "CONFLICTE (canvi de nom/afegiment): Canvi de nom %s->%s en %s. %s afegit en "
 "%s"
 
-#: merge-recursive.c:1470
+#: merge-recursive.c:1546
 #, c-format
 msgid "Adding merged %s"
-msgstr "Afegint %s fusionat"
+msgstr "S'està afegint %s fusionat"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
 msgid "Adding as %s instead"
-msgstr "Afegint com a %s en lloc d'això"
+msgstr "S'està afegint com a %s en lloc d'això"
 
-#: merge-recursive.c:1526
+#: merge-recursive.c:1610
 #, c-format
 msgid "cannot read object %s"
 msgstr "no es pot llegir l'objecte %s"
 
-#: merge-recursive.c:1529
+#: merge-recursive.c:1613
 #, c-format
 msgid "object %s is not a blob"
-msgstr "L'objecte %s no és un blob"
+msgstr "l'objecte %s no és un blob"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modify"
-msgstr "modifica"
+msgstr "modificació"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modified"
 msgstr "modificat"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1676
 msgid "content"
 msgstr "contingut"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1683
 msgid "add/add"
 msgstr "afegiment/afegiment"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1718
 #, c-format
 msgid "Skipped %s (merged same as existing)"
-msgstr "%s saltat (el fusionat és igual a l'existent)"
+msgstr "S'ha saltat %s (el fusionat és igual a l'existent)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1732
 #, c-format
 msgid "Auto-merging %s"
-msgstr "Autofusionant %s"
+msgstr "S'està autofusionant %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
+#: merge-recursive.c:1736 git-submodule.sh:924
 msgid "submodule"
 msgstr "submòdul"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1737
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "CONFLICTE (%s): Conflicte de fusió en %s"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1831
 #, c-format
 msgid "Removing %s"
-msgstr "Eliminant %s"
+msgstr "S'està eliminant %s"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1857
 msgid "file/directory"
 msgstr "fitxer/directori"
 
-#: merge-recursive.c:1768
+#: merge-recursive.c:1863
 msgid "directory/file"
 msgstr "directori/fitxer"
 
-#: merge-recursive.c:1773
+#: merge-recursive.c:1868
 #, 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. Afegint %s com a %s"
+"CONFLICTE (%s): Hi ha un directori amb nom %s en %s. S'està afegint %s com a "
+"%s"
 
-#: merge-recursive.c:1783
+#: merge-recursive.c:1877
 #, c-format
 msgid "Adding %s"
-msgstr "Afegint %s"
+msgstr "S'està afegint %s"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Fallat de fusió fatal; això no ha de passar."
-
-#: merge-recursive.c:1819
+#: merge-recursive.c:1914
 msgid "Already up-to-date!"
-msgstr "Ja al dia!"
+msgstr "Ja està al dia!"
 
-#: merge-recursive.c:1828
+#: merge-recursive.c:1923
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "la fusió dels arbres %s i %s ha fallat"
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Camí no processat??? %s"
-
-#: merge-recursive.c:1906
+#: merge-recursive.c:2006
 msgid "Merging:"
 msgstr "Fusionant:"
 
-#: merge-recursive.c:1919
+#: merge-recursive.c:2019
 #, 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:"
+msgstr[0] "s'ha trobat %u avantpassat en comú:"
+msgstr[1] "s'han trobat %u avantpassats en comú:"
 
-#: merge-recursive.c:1956
+#: merge-recursive.c:2058
 msgid "merge returned no commit"
 msgstr "la fusió no ha retornat cap comissió"
 
-#: merge-recursive.c:2013
+#: merge-recursive.c:2121
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "No s'ha pogut analitzar l'objecte '%s'"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
+#: 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."
 
+#: 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 ""
+"No heu conclòs 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."
+
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "No heu conclòs la vostra fusió de notes (%s existeix)."
+
 #: notes-utils.c:41
 msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr "No es pot cometre un arbre de notes no inicialitzat / no referenciat"
@@ -967,7 +2165,7 @@ msgstr "Valor de notes.rewriteMode dolent: '%s'"
 #: notes-utils.c:110
 #, c-format
 msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Refusant reescriure les notes en %s (fora de refs/notes/)"
+msgstr "S'està refusant reescriure les notes en %s (fora de refs/notes/)"
 
 #. TRANSLATORS: The first %s is the name of the
 #. environment variable, the second %s is its value
@@ -981,37 +2179,37 @@ msgstr "Valor dolent de %s: '%s'"
 msgid "unable to parse object: %s"
 msgstr "no s'ha pogut analitzar l'objecte: %s"
 
-#: parse-options.c:570
+#: parse-options.c:572
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:588
+#: parse-options.c:590
 #, c-format
 msgid "usage: %s"
 msgstr "ús: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:592
+#: parse-options.c:594
 #, c-format
 msgid "   or: %s"
 msgstr " o: %s"
 
-#: parse-options.c:595
+#: parse-options.c:597
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:629
+#: parse-options.c:631
 msgid "-NUM"
 msgstr "-NUM"
 
 #: parse-options-cb.c:108
 #, c-format
 msgid "malformed object name '%s'"
-msgstr "nom de camp mal format '%s'"
+msgstr "nom d'objecte mal format '%s'"
 
-#: path.c:752
+#: path.c:826
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "No s'ha pogut fer %s escrivible pel grup"
@@ -1070,12 +2268,21 @@ 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"
 
-#: pathspec.c:433
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"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"
+
+#: pathspec.c:440
 #, 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"
 
-#: pathspec.c:442
+#: pathspec.c:449
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -1083,49 +2290,44 @@ msgstr ""
 "No hi ha res a excloure per patrons :(exclusió).\n"
 "Potser heu oblidat afegir o ':/' o '.' ?"
 
-#: pretty.c:969
+#: pretty.c:971
 msgid "unable to parse --pretty format"
 msgstr "no s'ha pogut analitzar el format --pretty"
 
-#: progress.c:235
-msgid "done"
-msgstr "fet"
-
-#: read-cache.c:1281
+#: read-cache.c:1315
 #, 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"
-"Usant la versió %i"
+"index.version està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1325
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
 "Using version %i"
 msgstr ""
-"GIT_INDEX_VERSION establert, però el valor no és vàlid.\n"
-"Usant la versió %i"
+"GIT_INDEX_VERSION està establerta, però el valor no és vàlid.\n"
+"S'està usant la versió %i"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: refs.c:576 builtin/merge.c:840
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "No s'ha pogut obrir '%s' per a escriptura"
 
-#: refs/files-backend.c:2374
+#: refs/files-backend.c:2481
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "no s'ha pogut suprimir la referència %s: %s"
 
-#: refs/files-backend.c:2377
+#: refs/files-backend.c:2484
 #, c-format
 msgid "could not delete references: %s"
 msgstr "no s'ha pogut suprimir les referències: %s"
 
-#: refs/files-backend.c:2386
+#: refs/files-backend.c:2493
 #, c-format
 msgid "could not remove reference %s"
 msgstr "no s'ha pogut eliminar la referència %s"
@@ -1198,7 +2400,7 @@ msgstr "amplada positiva esperada amb l'àtom %%(align)"
 #: ref-filter.c:244
 #, c-format
 msgid "malformed field name: %.*s"
-msgstr "nom d'objecte mal format: %.*s"
+msgstr "nom de camp mal format: %.*s"
 
 #: ref-filter.c:270
 #, c-format
@@ -1247,39 +2449,39 @@ msgstr "objecte mal format a '%s'"
 #: ref-filter.c:1373
 #, c-format
 msgid "ignoring ref with broken name %s"
-msgstr "ignorant la referència amb nom trencat %s"
+msgstr "s'està ignorant la referència amb nom trencat %s"
 
 #: ref-filter.c:1378
 #, c-format
 msgid "ignoring broken ref %s"
-msgstr "ignorant la referència trencada %s"
+msgstr "s'està ignorant la referència trencada %s"
 
-#: ref-filter.c:1651
+#: ref-filter.c:1633
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "format: manca l'àtom %%(end)"
 
-#: ref-filter.c:1705
+#: ref-filter.c:1687
 #, c-format
 msgid "malformed object name %s"
 msgstr "nom d'objecte %s mal format"
 
-#: remote.c:745
+#: remote.c:746
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "No es pot obtenir ambdós %s i %s a %s"
 
-#: remote.c:749
+#: remote.c:750
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s generalment segueix %s, no %s"
 
-#: remote.c:753
+#: remote.c:754
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s segueix ambdós %s i %s"
 
-#: remote.c:761
+#: remote.c:762
 msgid "Internal error"
 msgstr "Error intern"
 
@@ -1300,7 +2502,7 @@ msgstr "cap font configurada per a la branca '%s'"
 #: remote.c:1695
 #, 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"
+msgstr "la branca font '%s' no s'emmagatzema com a branca amb seguiment remot"
 
 #: remote.c:1710
 #, c-format
@@ -1386,49 +2588,61 @@ msgstr[1] ""
 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:2131
+#: revision.c:2158
 msgid "your current branch appears to be broken"
 msgstr "la vostra branca actual sembla trencada"
 
-#: revision.c:2134
+#: 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:2328
+#: revision.c:2355
 msgid "--first-parent is incompatible with --bisect"
 msgstr "--first-parent és incompatible amb --bisect"
 
-#: run-command.c:92
+#: run-command.c:106
 msgid "open /dev/null failed"
 msgstr "s'ha fallat en obrir /dev/null"
 
-#: run-command.c:94
+#: run-command.c:108
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) ha fallat"
 
-#: send-pack.c:295
+#: send-pack.c:297
 msgid "failed to sign the push certificate"
-msgstr "s'ha fallat en firmar el certificat de pujada"
+msgstr "s'ha fallat en signar el certificat de pujada"
 
-#: send-pack.c:404
+#: send-pack.c:410
 msgid "the receiving end does not support --signed push"
 msgstr "el destí receptor no admet pujar --signed"
 
-#: send-pack.c:406
+#: send-pack.c:412
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
 msgstr ""
-"no enviant una certificació de pujada perquè el destí receptor no admet "
-"pujar --signed"
+"no s'està enviant una certificació de pujada perquè el destí receptor no "
+"admet pujar --signed"
 
-#: send-pack.c:418
+#: send-pack.c:424
 msgid "the receiving end does not support --atomic push"
 msgstr "el destí receptor no admet pujar --atomic"
 
-#: sequencer.c:174
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "el destí receptor no admet opcions de pujada"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "revertir"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "recollir cireres"
+
+#: sequencer.c:228
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1436,7 +2650,7 @@ msgstr ""
 "després de resoldre els conflictes, marqueu els camins\n"
 "corregits amb 'git add <camins>' o 'git rm <camins>'"
 
-#: sequencer.c:177
+#: sequencer.c:231
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1446,246 +2660,390 @@ msgstr ""
 "corregits amb 'git add <camins>' o 'git rm <camins>'\n"
 "i cometeu el resultat amb 'git commit'"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: sequencer.c:244 sequencer.c:1209
+#, c-format
+msgid "could not lock '%s'"
+msgstr "no s'ha pogut bloquejar '%s'"
+
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "no s'ha pogut escriure a '%s'"
+
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "no s'ha pogut escriure el terminador de línia a '%s'"
+
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "Could not write to %s"
-msgstr "No s'ha pogut escriure a %s"
+msgid "failed to finalize '%s'."
+msgstr "s'ha fallat en finalitzar '%s'."
 
-#: sequencer.c:193
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "Error en finalitzar %s"
+msgid "could not read '%s'"
+msgstr "no s'ha pogut llegir '%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."
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "els vostres canvis locals se sobreescriurien per %s."
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Els vostres canvis locals se sobreescriurien per la reversió."
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "cometeu els vostres canvis o emmagatzemeu-los per a procedir."
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Cometeu els vostres canvis o emmagatzemeu-los per a procedir."
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: avanç ràpid"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: sequencer.c:399
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: No s'ha pogut escriure un fitxer d'índex nou"
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "No s'ha pogut resoldre la comissió HEAD\n"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "no s'ha pogut resoldre la comissió HEAD\n"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "No s'ha pogut actualitzar l'arbre cau\n"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "no s'ha pogut actualitzar l'arbre cau\n"
+
+#: sequencer.c:483
+#, 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 allistats en el vostre arbre de treball\n"
+"Si aquests canvis són per a aixafar-se 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 cassos, quan hàgiu terminat, continueu amb:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: sequencer.c:390
+#: sequencer.c:567
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió %s\n"
+msgid "could not parse commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió %s\n"
 
-#: sequencer.c:395
+#: sequencer.c:572
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "No s'ha pogut analitzar la comissió mare %s\n"
+msgid "could not parse parent commit %s\n"
+msgstr "no s'ha pogut analitzar la comissió mare %s\n"
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "El vostre fitxer d'índex està sense fusionar."
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "el vostre fitxer d'índex està sense fusionar."
 
-#: sequencer.c:479
+#: sequencer.c:675
 #, 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 "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:487
+#: sequencer.c:683
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "La comissió %s no té mare %d"
+msgid "commit %s does not have parent %d"
+msgstr "la comissió %s no té mare %d"
 
-#: sequencer.c:491
+#: sequencer.c:687
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
+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ó."
+"s'ha especificat la línia principal però la comissió %s no és una fusió."
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: no es pot analitzar la comissió mare %s"
 
-#: sequencer.c:508
+#: sequencer.c:705
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "No es pot obtenir el missatge de comissió de %s"
+msgid "cannot get commit message for %s"
+msgstr "no es pot obtenir el missatge de comissió de %s"
 
-#: sequencer.c:594
+#: sequencer.c:797
 #, c-format
 msgid "could not revert %s... %s"
-msgstr "no s'ha pogut revertir %s...%s"
+msgstr "no s'ha pogut revertir %s... %s"
 
-#: sequencer.c:595
+#: sequencer.c:798
 #, c-format
 msgid "could not apply %s... %s"
-msgstr "no s'ha pogut aplicar %s...%s"
+msgstr "no s'ha pogut aplicar %s... %s"
 
-#: sequencer.c:630
+#: sequencer.c:833
 msgid "empty commit set passed"
 msgstr "conjunt de comissions buit passat"
 
-#: sequencer.c:638
+#: sequencer.c:843
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: s'ha fallat en llegir l'índex"
 
-#: sequencer.c:642
+#: sequencer.c:850
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: s'ha fallat en actualitzar l'índex"
 
-#: sequencer.c:702
-#, c-format
-msgid "Cannot %s during a %s"
-msgstr "No es pot %s durant un %s"
-
-#: sequencer.c:724
+#: sequencer.c:944
 #, c-format
-msgid "Could not parse line %d."
-msgstr "No s'ha pogut analitzar la línia %d."
+msgid "invalid line %d: %.*s"
+msgstr "línia no vàlida %d: %.*s"
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Cap comissió analitzada."
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "no s'ha analitzat cap comissió."
 
-#: sequencer.c:741
+#: sequencer.c:966
 #, c-format
-msgid "Could not open %s"
-msgstr "No s'ha pogut obrir %s"
+msgid "could not read '%s'."
+msgstr "no s'ha pogut llegir '%s'."
 
-#: sequencer.c:745
+#: sequencer.c:972
 #, c-format
-msgid "Could not read %s."
-msgstr "No s'ha pogut llegir %s."
+msgid "unusable instruction sheet: '%s'"
+msgstr "full d'instruccions inusable: '%s'"
 
-#: sequencer.c:752
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Full d'instruccions inusable: %s"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "no es pot recollir cireres durant una reversió."
+
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "no es pot revertir durant un recull de cireres."
 
-#: sequencer.c:782
+#: sequencer.c:1028
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Clau no vàlida: %s"
+msgid "invalid key: %s"
+msgstr "clau no vàlida: %s"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: sequencer.c:1031
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valor no vàlid per a %s: %s"
+msgid "invalid value for %s: %s"
+msgstr "valor no vàlid per a %s: %s"
 
-#: sequencer.c:795
+#: sequencer.c:1063
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Full d'opcions mal format: %s"
+msgid "malformed options sheet: '%s'"
+msgstr "full d'opcions mal format: '%s'"
 
-#: sequencer.c:814
+#: sequencer.c:1101
 msgid "a cherry-pick or revert is already in progress"
 msgstr "un recull de cireres o una reversió ja està en curs"
 
-#: sequencer.c:815
+#: sequencer.c:1102
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "intenteu \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:819
+#: sequencer.c:1106
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "No s'ha pogut crear el directori de seqüenciador %s"
+msgid "could not create sequencer directory '%s'"
+msgstr "no s'ha pogut crear el directori de seqüenciador '%s'"
 
-#: sequencer.c:835 sequencer.c:917
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "Error en finalitzar %s."
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "no s'ha pogut bloquejar HEAD"
 
-#: sequencer.c:854 sequencer.c:987
+#: sequencer.c:1151 sequencer.c:1289
 msgid "no cherry-pick or revert in progress"
 msgstr "ni hi ha cap recull de cireres ni cap reversió en curs"
 
-#: sequencer.c:856
+#: sequencer.c:1153
 msgid "cannot resolve HEAD"
 msgstr "no es pot resoldre HEAD"
 
-#: sequencer.c:858
+#: sequencer.c:1155 sequencer.c:1189
 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:878 builtin/apply.c:4287
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "no es pot obrir %s: %s"
+msgid "cannot open '%s'"
+msgstr "no es pot obrir '%s'"
 
-#: sequencer.c:881
+#: sequencer.c:1177
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "no es pot llegir %s: %s"
+msgid "cannot read '%s': %s"
+msgstr "no es pot llegir '%s': %s"
 
-#: sequencer.c:882
+#: sequencer.c:1178
 msgid "unexpected end of file"
 msgstr "final de fitxer inesperat"
 
-#: sequencer.c:888
+#: sequencer.c:1184
 #, 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"
 
-#: sequencer.c:910
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: no es pot recollir com a cirera un %s"
+
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: revisió dolenta"
+
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "no es pot revertir com a comissió inicial"
+
+#: 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: 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:173
 #, c-format
-msgid "Could not format %s."
-msgstr "No s'ha pogut formatar %s."
+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: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 ""
+"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:468
+#, 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:476
+msgid "unknown repository extensions found:"
+msgstr "s'han trobat extensions de dipòsit desconegudes:"
+
+#: setup.c:762
+#, 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: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)."
+
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "No es pot canviar a '%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 ""
+"Hi ha un 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."
+
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "el camí '%s' no existeix"
+
+#: sha1_file.c:499
+#, 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."
 
-#: sequencer.c:1055
+#: sha1_file.c:505
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: no es pot recollir com a cirera un %s"
+msgid "reference repository '%s' is not a local repository."
+msgstr "el dipòsit de referència '%s' no és un dipòsit local."
 
-#: sequencer.c:1058
+#: sha1_file.c:511
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: revisió dolenta"
-
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "No es pot revertir com a comissió inicial"
-
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "No es pot recollir cireres en un cap buit"
+msgid "reference repository '%s' is shallow"
+msgstr "el dipòsit de referència '%s' és superficial"
 
-#: setup.c:246
+#: sha1_file.c:519
 #, c-format
-msgid "failed to read %s"
-msgstr "s'ha fallat en llegir %s"
+msgid "reference repository '%s' is grafted"
+msgstr "el dipòsit de referència '%s' és empeltat"
 
-#: sha1_file.c:1080
+#: sha1_file.c:1159
 msgid "offset before end of packfile (broken .idx?)"
 msgstr "desplaçament abans de la fi del fitxer de paquet (.idx trencat?)"
 
-#: sha1_file.c:2459
+#: sha1_file.c:2592
 #, 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:2463
+#: sha1_file.c:2596
 #, 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:462
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "l'SHA1 %s curt és ambigu"
+
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Els candidats són:"
+
+#: 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"
@@ -1704,1696 +3062,1501 @@ msgstr ""
 "\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"
+"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:62 submodule.c:96
+#: 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ó"
 
-#: submodule.c:66 submodule.c:100
+#: submodule.c:68 submodule.c:102
 #, 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:74
+#: submodule.c:76
 #, c-format
 msgid "Could not update .gitmodules entry %s"
 msgstr "No s'ha pogut actualitzar l'entrada de .gitmodules %s"
 
-#: submodule.c:107
+#: submodule.c:109
 #, 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:118
+#: submodule.c:120
 msgid "staging updated .gitmodules failed"
-msgstr "L'allistament del .gitmodules actualitzat ha fallat"
+msgstr "l'allistament del .gitmodules actualitzat ha fallat"
+
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "no es permeten els valors negatius a submodule.fetchJobs"
+
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "valor no vàlid per a %s"
 
-#: trailer.c:237
+#: trailer.c:238
 #, c-format
 msgid "running trailer command '%s' failed"
 msgstr "l'execució de l'ordre de remolc '%s' ha fallat"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: 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 "valor desconegut '%s' per a la clau '%s'"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, c-format
 msgid "more than one %s"
 msgstr "més d'un %s"
 
-#: trailer.c:582
+#: trailer.c:672
 #, c-format
 msgid "empty trailer token in trailer '%.*s'"
 msgstr "fitxa de remolc buida en el remolc '%.*s'"
 
-#: trailer.c:702
+#: trailer.c:695
 #, c-format
 msgid "could not read input file '%s'"
 msgstr "no s'ha pogut llegir el fitxer d'entrada '%s'"
 
-#: trailer.c:705
+#: trailer.c:698
 msgid "could not read from stdin"
-msgstr "No s'ha pogut llegir des d'stdin"
+msgstr "no s'ha pogut llegir des d'stdin"
 
-#: trailer.c:857 builtin/am.c:42
+#: trailer.c:929 builtin/am.c:44
 #, c-format
 msgid "could not stat %s"
 msgstr "no s'ha pogut fer stat a %s"
 
-#: trailer.c:859
+#: trailer.c:931
 #, c-format
 msgid "file %s is not a regular file"
 msgstr "el fitxer %s no és un fitxer regular"
 
-#: trailer.c:861
+#: trailer.c:933
 #, c-format
 msgid "file %s is not writable by user"
 msgstr "el fitxer %s no és gravable per l'usuari"
 
-#: trailer.c:873
+#: trailer.c:945
 msgid "could not open temporary file"
 msgstr "no s'ha pogut obrir el fitxer temporal"
 
-#: trailer.c:912
+#: trailer.c:983
 #, c-format
 msgid "could not rename temporary file to %s"
 msgstr "no s'ha pogut canviar el nom del fitxer temporal a %s"
 
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "No s'ha pogut llegir la referència %s"
-
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "Agafant fitxers"
-
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "l'esquema d'URL no és vàlida o li manca el sufix '://'"
-
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr "seqüència d'escapament %XX no vàlida"
-
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "manca la màquina i l'esquema no és 'file:'"
-
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "un URL 'file:' no pot tenir número de port"
-
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "hi ha caràcters no vàlids en el nom de màquina"
-
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "número de port no vàlid"
-
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segment de camí '..' no vàlid"
-
-#: wrapper.c:222 wrapper.c:381
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
-
-#: wrapper.c:224 wrapper.c:383
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "no s'ha pogut obrir '%s' per a escriptura"
-
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "no s'ha pogut obrir '%s' per a lectura"
-
-#: wrapper.c:611
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr "no s'ha pogut accedir a '%s': %s"
-
-#: wrapper.c:632
-#, c-format
-msgid "unable to access '%s'"
-msgstr "no s'ha pogut accedir a '%s'"
-
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "no s'ha pogut obtenir el directori de treball actual"
-
-#: wrapper.c:667
-#, c-format
-msgid "could not open %s for writing"
-msgstr "no s'ha pogut obrir '%s' per a escriptura"
-
-#: wrapper.c:678 builtin/am.c:410
-#, c-format
-msgid "could not write to %s"
-msgstr "no s'ha pogut escriure a %s"
-
-#: wrapper.c:684
-#, c-format
-msgid "could not close %s"
-msgstr "no s'ha pogut tancar %s"
-
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Camins sense fusionar:"
-
-#: wt-status.c:176 wt-status.c:203
-#, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (useu \"git reset %s <fitxer>...\" per a desallistar)"
-
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (useu \"git rm --cached <fitxer>...\" per a desallistar)"
-
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
-
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
-"resolució)"
-
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
-
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Canvis a cometre:"
-
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Canvis no allistats per a cometre:"
-
-#: wt-status.c:219
-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:221
-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:222
-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:224
-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:236
-#, 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à)"
-
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "suprimit per ambdós:"
-
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "afegit per nosaltres:"
-
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "suprimit per ells:"
-
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "afegit per ells:"
-
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "suprimit per nosaltres:"
-
-#: wt-status.c:261
-msgid "both added:"
-msgstr "afegit per ambdós:"
-
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "modificat per ambdós:"
-
-#: wt-status.c:265
-#, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "bug: estat no fusionat no gestionat %x"
-
-#: wt-status.c:273
-msgid "new file:"
-msgstr "fitxer nou:"
-
-#: wt-status.c:275
-msgid "copied:"
-msgstr "copiat:"
-
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "suprimit:"
-
-#: wt-status.c:279
-msgid "modified:"
-msgstr "modificat:"
-
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "canviat de nom:"
-
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "canviat de tipus:"
-
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "desconegut:"
-
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "sense fusionar:"
-
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "comissions noves, "
-
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "contingut modificat, "
-
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "contingut no seguit, "
-
-#: wt-status.c:390
-#, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "bug: estat de diferència no gestionat %c"
-
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Submòduls canviats però no actualitzats:"
-
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Canvis de submòdul a cometre:"
-
-#: wt-status.c:837
-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à."
-
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "Teniu camins sense fusionar."
-
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (arregleu els conflictes i executeu \"git commit\")"
-
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
-
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (useu \"git commit\" per a concloure la fusió)"
-
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Esteu enmig d'una sessió am."
-
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "El pedaç actual està buit."
-
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
-
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
-
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
-
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "No s'ha fet cap ordre."
-
-#: wt-status.c:1108
-#, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "Última ordre fet (%d ordre feta):"
-msgstr[1] "Últimes ordres fetes (%d ordres fetes):"
+#: 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"
 
-#: wt-status.c:1119
+#: transport.c:151
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (vegeu més en el fitxer %s)"
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: opció de profunditat no vàlida '%s'"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "No manca cap ordre."
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr ""
+"Els camins de submòdul següents contenen canvis que no\n"
+"es poden trobar en cap remot:\n"
 
-#: wt-status.c:1127
+#: transport.c:821
 #, 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 ""
+"\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"
 
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
+#: transport.c:829
+msgid "Aborting."
+msgstr "S'està avortant."
 
-#: wt-status.c:1148
+#: transport-helper.c:1075
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
-
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Actualment esteu rebasant."
+msgid "Could not read ref %s"
+msgstr "No s'ha pogut llegir la referència %s"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objecte d'arbre massa curt"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (useu \"git rebase --skip\" per a saltar aquest pedaç)"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "mode mal format en entrada d'arbre"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (useu \"git rebase --abort\" per a agafar la branca original)"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nom de fitxer buit en entrada de arbre"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (tots els conflictes arreglats: executeu \"git rebase --continue\")"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "fitxer d'arbre massa curt"
 
-#: wt-status.c:1181
+#: unpack-trees.c:64
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+"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 ""
-"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
-
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Actualment esteu dividint una comissió durant un rebasament."
+"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:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+#: unpack-trees.c:66
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
-"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
-"rebase --continue\")"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"agafar:\n"
+"%%s"
 
-#: wt-status.c:1193
+#: unpack-trees.c:69
 #, 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 ""
-"Actualment esteu editant una comissió mentre rebaseu la branca '%s' en '%s'."
+"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:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "Actualment esteu editant una comissió durant un rebasament."
-
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
-
-#: wt-status.c:1203
+#: unpack-trees.c:71
+#, 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 ""
-"  (useu \"git rebase --continue\" una vegada que esteu satisfet amb els "
-"vostres canvis)"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1213
+#: unpack-trees.c:74
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Actualment esteu recollint com a cirera la comissió %s."
-
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
-
-#: wt-status.c:1221
-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 ""
-"  (tots els conflictes arreglats: executeu \"git cherry-pick --continue\")"
+"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:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: unpack-trees.c:76
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de recull de "
-"cireres)"
+"Els vostres canvis locals als fitxers següents se sobreescriurien per %s:\n"
+"%%s"
 
-#: wt-status.c:1232
+#: unpack-trees.c:81
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Actualment esteu revertint la comissió %s."
-
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
-
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
 msgstr ""
-"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
+"Actualitzar els directoris següents perdria fitxers no seguits en el:\n"
+"%s"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: 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 ""
-"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
+"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:1253
+#: unpack-trees.c:87
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Actualment esteu bisecant, heu començat des de la branca '%s'."
-
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Actualment esteu bisecant."
-
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
-
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "En la branca "
-
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "rebasament interactiu en progrés; sobre "
-
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "rebasament en progrés; sobre "
-
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD separat a "
-
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD separat de "
-
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Actualment no en cap branca."
+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:1474
-msgid "Initial commit"
-msgstr "Comissió inicial"
+#: 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 ""
+"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:1488
-msgid "Untracked files"
-msgstr "Fitxers no seguits"
+#: unpack-trees.c:92
+#, 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:1490
-msgid "Ignored files"
-msgstr "Fitxers ignorats"
+#: 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 ""
+"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:1494
+#: 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')."
+"The following untracked working tree files would be removed by %s:\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 s'eliminarien per %s:\n"
+"%%s"
 
-#: wt-status.c:1500
+#: unpack-trees.c:102
 #, 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 "
+"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:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
+#: unpack-trees.c:104
+#, 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"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Sense canvis"
+#: 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 ""
+"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:1513
+#: unpack-trees.c:109
 #, 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 merge:\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 "
+"fusionar:\n"
+"%%s"
 
-#: wt-status.c:1516
+#: unpack-trees.c:112
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "no hi ha canvis afegits a cometre\n"
+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:1519
+#: unpack-trees.c:114
 #, 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 overwritten by %s:\n"
+"%%s"
 msgstr ""
-"no hi ha res afegit a cometre però fitxers no seguits estan presents (useu "
-"\"git add\" per a seguir-los)\n"
+"Els següents fitxers no seguits en l'arbre de treball se sobreescriurien per "
+"%s:\n"
+"%%s"
 
-#: wt-status.c:1522
+#: unpack-trees.c:121
 #, 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"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "L'entrada '%s' encavalca amb '%s'.  No es pot vincular."
 
-#: wt-status.c:1525
+#: unpack-trees.c:124
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
 msgstr ""
-"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
-"los)\n"
+"No es pot actualitzar l'agafament parcial: les entrades següents no estan al "
+"dia:\n"
+"%s"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: unpack-trees.c:126
 #, c-format
-msgid "nothing to commit\n"
-msgstr "no hi ha res a cometre\n"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"Els fitxers següents en l'arbre de treball se sobreescriurien per "
+"actualitzar l'agafament parcial:\n"
+"%s"
 
-#: wt-status.c:1531
+#: unpack-trees.c:128
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
+"Els fitxers següents en l'arbre de treball s'eliminarien per actualitzar "
+"l'agafament parcial:\n"
+"%s"
 
-#: wt-status.c:1535
+#: unpack-trees.c:205
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "no hi ha res a cometre, directori de treball net\n"
+msgid "Aborting\n"
+msgstr "S'està avortant\n"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Comissió inicial en "
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "S'està agafant fitxers"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (sense branca)"
+#: 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 '://'"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "no hi és"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "seqüència d'escapament %XX no vàlida"
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "darrere "
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "manca la màquina i l'esquema no és 'file:'"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "davant per "
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "un URL 'file:' no pot tenir número de port"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "s'ha fallat en desenllaçar '%s'"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "hi ha caràcters no vàlids en el nom de màquina"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "número de port no vàlid"
 
-#: builtin/add.c:65
-#, c-format
-msgid "unexpected diff status %c"
-msgstr "estat de diff inesperat %c"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "segment de camí '..' no vàlid"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "s'ha fallat en actualitzar els fitxers"
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "s'ha fallat en llegir '%s'"
 
-#: builtin/add.c:80
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "remove '%s'\n"
-msgstr "elimina '%s'\n"
+msgid "could not open '%s' for reading and writing"
+msgstr "no s'ha pogut obrir '%s' per a lectura i escriptura"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Canvis no allistats després d'actualitzar 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:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "No s'ha pogut llegir l'índex"
+#: 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 "no s'ha pogut obrir '%s' per a lectura"
 
-#: builtin/add.c:205
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "No s'ha pogut obrir '%s' per a escriptura."
+msgid "unable to access '%s'"
+msgstr "no s'ha pogut accedir a '%s'"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "No s'ha pogut escriure el pedaç"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "no s'ha pogut obtenir el directori de treball actual"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "l'edició del pedaç ha fallat"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "no s'ha pogut escriure a %s"
 
-#: builtin/add.c:215
+#: wrapper.c:660
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "No s'ha pogut fer stat a '%s'"
+msgid "could not close %s"
+msgstr "no s'ha pogut tancar %s"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "El pedaç és buit. Avortat."
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Camins sense fusionar:"
 
-#: builtin/add.c:222
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "No s'ha pogut aplicar '%s'"
-
-#: builtin/add.c:232
-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"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (useu \"git reset %s <fitxer>...\" per a desallistar)"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "marxa en sec"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (useu \"git rm --cached <fitxer>...\" per a desallistar)"
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "sigues detallat"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "recull interactiu"
+#: 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:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "selecciona els trossos interactivament"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "edita la diferència actual i aplica-la"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Canvis a cometre:"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "permet afegir fitxers que d'altra manera s'ignoren"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Canvis no allistats per a cometre:"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "actualitza els fitxers seguits"
+#: 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:257
-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: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:258
-msgid "add changes from all tracked and untracked files"
-msgstr "afegeix els canvis de tots els fitxers seguits i no seguits"
+#: wt-status.c:224
+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)"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
-"ignora els camins eliminats en l'arbre de treball (el mateix que --no-all)"
+"  (cometeu o descarteu el contingut modificat o no seguit en els submòduls)"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "no afegeixis, només actualitza l'índex"
+#: wt-status.c:238
+#, 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à)"
 
-#: builtin/add.c:264
-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"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "suprimit per ambdós:"
 
-#: builtin/add.c:265
-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"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "afegit per nosaltres:"
 
-#: builtin/add.c:287
-#, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Useu -f si realment els voleu afegir.\n"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "suprimit per ells:"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "l'afegiment de fitxers ha fallat"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "afegit per ells:"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A i -u són mutualment incompatibles"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "suprimit per nosaltres:"
 
-#: builtin/add.c:337
-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"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "afegit per ambdós:"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Res especificat, res afegit.\n"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modificat per ambdós:"
 
-#: builtin/add.c:353
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Potser volíeu dir 'git add .'?\n"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "fitxer nou:"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "fitxer d'índex malmès"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copiat:"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "no s'ha pogut escriure un fitxer d'índex nou"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "suprimit:"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
-#, c-format
-msgid "could not read '%s'"
-msgstr "no s'ha pogut llegir '%s'"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modificat:"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "no s'ha pogut analitzar l'script d'autor"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "canviat de nom:"
 
-#: builtin/am.c:507
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "s'ha suprimit '%s' per el ganxo applypatch-msg"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "canviat de tipus:"
 
-#: builtin/am.c:548 builtin/notes.c:300
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Línia d'entrada mal formada: '%s'."
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "desconegut:"
 
-#: builtin/am.c:585 builtin/notes.c:315
-#, 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:289
+msgid "unmerged:"
+msgstr "sense fusionar:"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "fseek ha fallat"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "comissions noves, "
 
-#: builtin/am.c:772 builtin/am.c:860
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "no s'ha pogut obrir '%s' per a lectura: %s"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "contingut modificat, "
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "no s'ha pogut obrir '%s' per a escriptura: %s"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "contingut no seguit, "
 
-#: builtin/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "no s'ha pogut analitzar el pedaç '%s'"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Submòduls canviats però no actualitzats:"
 
-#: builtin/am.c:853
-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:820
+msgid "Submodule changes to be committed:"
+msgstr "Canvis de submòdul a cometre:"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "marca de temps no vàlida"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"No toqueu la línia a dalt.\n"
+"Tot el que hi ha a sota s'eliminarà."
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "línia Date no vàlida"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Teniu camins sense fusionar."
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "desplaçament de zona de temps no vàlid"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (arregleu els conflictes i executeu \"git commit\")"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "La detecció de format de pedaç ha fallat."
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
 
-#: builtin/am.c:1001 builtin/clone.c:378
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "s'ha fallat en crear el directori '%s'"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Tots els conflictes estan arreglats però encara esteu fusionant."
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "S'ha fallat en dividir els pedaços."
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (useu \"git commit\" per a concloure la fusió)"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "no s'ha pogut escriure el fitxer d'índex"
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Esteu enmig d'una sessió am."
 
-#: 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:1039
+msgid "The current patch is empty."
+msgstr "El pedaç actual està buit."
 
-#: 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."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
 
-#: 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:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "El pedaç és buit. S'ha dividit malament?"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
+
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "No s'ha fet cap ordre."
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: wt-status.c:1175
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "línia d'identitat no vàlida: %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:1429
+#: wt-status.c:1186
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "no s'ha pogut analitzar la comissió %s"
+msgid "  (see more in file %s)"
+msgstr "  (vegeu més en el fitxer %s)"
 
-#: builtin/am.c:1631
-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:1191
+msgid "No commands remaining."
+msgstr "No manca cap ordre."
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Usant la informació d'índex per a reconstruir un arbre base..."
+#: wt-status.c:1194
+#, 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):"
 
-#: builtin/am.c:1652
-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."
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Retrocedint a apedaçar la base i fusionar de 3 vies..."
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Actualment esteu rebasant la branca '%s' en '%s'."
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "S'ha fallat en fusionar els canvis."
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Actualment esteu rebasant."
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree ha fallat en escriure un arbre"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr ""
+"  (arregleu els conflictes i després executeu \"git rebase --continue\")"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "aplicant a una història buida"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (useu \"git rebase --skip\" per a saltar aquest pedaç)"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "s'ha fallat en escriure l'objecte de comissió"
+#: wt-status.c:1238
+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:1749 builtin/am.c:1753
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "no es pot reprendre: %s no existeix."
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (tots els conflictes estan arreglats: executeu \"git rebase --continue\")"
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
-"no es pot ser interactiu sense que stdin sigui connectat a un terminal."
+"Actualment esteu dividint una comissió mentre rebaseu la branca '%s' en '%s'."
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "El cos de la comissió és:"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Actualment esteu dividint una comissió durant un rebasament."
 
-#. 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:1784
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
-"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
-"tots: "
+"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
+"rebase --continue\")"
 
-#: builtin/am.c:1834
+#: wt-status.c:1260
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
+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'."
 
-#: builtin/am.c:1869 builtin/am.c:1941
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Aplicant: %.*s"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Actualment esteu editant una comissió durant un rebasament."
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
 
-#: builtin/am.c:1893
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "El pedaç ha fallat a %s %.*s"
+#: wt-status.c:1270
+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:1899
+#: wt-status.c:1280
 #, 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"
+msgid "You are currently cherry-picking commit %s."
+msgstr "Actualment esteu recollint com a cirera la comissió %s."
 
-#: builtin/am.c:1944
-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."
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git cherry-pick --continue\")"
+
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 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ç."
+"  (tots els conflictes estan arreglats: executeu \"git cherry-pick --continue"
+"\")"
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
-"Encara teniu camins sense fusionar en el vostre índex.\n"
-"Heu oblidat d'usar 'git add'?"
+"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de recull de "
+"cireres)"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1299
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "No s'ha pogut analitzar l'objecte '%s'."
+msgid "You are currently reverting commit %s."
+msgstr "Actualment esteu revertint la comissió %s."
 
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "s'ha fallat en netejar l'índex"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
 
-#: builtin/am.c:2145
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
-"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
-"No rebobinant a ORIG_HEAD"
+"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
 
-#: builtin/am.c:2206
-#, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valor no vàlid per a --patch-format: %s"
+#: wt-status.c:1309
+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:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<opcions>] [(<bústia>|<directori-de-correu>)...]"
+#: wt-status.c:1320
+#, 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:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<opcions>] (--continue | --skip | --abort)"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Actualment esteu bisecant."
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "executa interactivament"
+#: wt-status.c:1327
+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:2248
-msgid "historical option -- no-op"
-msgstr "opció històrica -- no-op"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "En la branca "
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "rebasament interactiu en progrés; sobre "
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "calla"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "rebasament en progrés; sobre "
 
-#: builtin/am.c:2253
-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:1537
+msgid "HEAD detached at "
+msgstr "HEAD separat a "
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "recodifica en utf8 (per defecte)"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD separat de "
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "passa la bandera -k al git-mailinfo"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Actualment no s'és en cap branca."
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "passa la bandera -b al git-mailinfo"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Comissió inicial"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "passa la bandera -m al git-mailinfo"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Fitxers no seguits"
 
-#: builtin/am.c:2264
-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:1576
+msgid "Ignored files"
+msgstr "Fitxers ignorats"
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: 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 ""
-"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
+"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 per vós mateix (vegeu\n"
+"'git help status')."
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "despulla tot abans d'una línia de tissores"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Els fitxers no seguits no estan llistats%s"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "acció"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (useu l'opció -u per a mostrar els fitxers no seguits)"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "passa-ho a través del git-apply"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Sense canvis"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "arrel"
+#: wt-status.c:1599
+#, c-format
+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/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "camí"
+#: wt-status.c:1602
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "no hi ha canvis afegits a cometre\n"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131 builtin/pull.c:185
-#: 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:1605
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"no hi ha res afegit a cometre però fitxers no seguits estan presents (useu "
+"\"git add\" per a seguir-los)\n"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "número"
+#: wt-status.c:1608
+#, 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"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: wt-status.c:1611
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"no hi ha res a cometre (creeu/copieu fitxers i useu \"git add\" per a seguir-"
+"los)\n"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "el format en el qual estan els pedaços"
+#: wt-status.c:1614 wt-status.c:1619
+#, c-format
+msgid "nothing to commit\n"
+msgstr "no hi ha res a cometre\n"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
+#: wt-status.c:1617
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
-"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
+"no hi ha res a cometre (useu -u per a mostrar els fitxers no seguits)\n"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "segueix aplicant pedaços després de resoldre un conflicte"
+#: wt-status.c:1621
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "no hi ha res a cometre, l'arbre de treball està net\n"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "sinònims de --continue"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Comissió inicial en "
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "salta el pedaç actual"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (sense branca)"
 
-#: builtin/am.c:2313
-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:1761
+msgid "gone"
+msgstr "no hi és"
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "menteix sobre la data del comitent"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "darrere "
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "usa el marc de temps actual per la data d'autor"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "davant per "
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "ID de clau"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "no es pot %s: Teniu canvis no allistats."
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "firma les comissions amb GPG"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "addicionalment, el vostre índex conté canvis sense cometre."
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(ús intern per al git-rebase)"
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "no es pot %s: El vostre índex conté canvis sense cometre."
 
-#: builtin/am.c:2340
-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."
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "s'ha fallat en desenllaçar '%s'"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "s'ha fallat en llegir l'índex"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<opcions>] [--] <especificació-de-camí>..."
 
-#: builtin/am.c:2362
+#: builtin/add.c:80
 #, 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."
+msgid "unexpected diff status %c"
+msgstr "estat de diff inesperat %c"
 
-#: builtin/am.c:2386
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "s'ha fallat en actualitzar els fitxers"
+
+#: builtin/add.c:95
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr ""
-"Directori %s extraviat trobat.\n"
-"Useu \"git am --abort\" per a eliminar-lo."
+msgid "remove '%s'\n"
+msgstr "elimina '%s'\n"
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Operació de resolució no en curs; no reprenem."
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Canvis no allistats després d'actualitzar l'índex:"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<opcions>] [<pedaç>...]"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "No s'ha pogut llegir l'índex"
 
-#: builtin/apply.c:111
+#: builtin/add.c:220
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "opció d'espai en blanc '%s' no reconeguda"
+msgid "Could not open '%s' for writing."
+msgstr "No s'ha pogut obrir '%s' per a escriptura."
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "opció d'ignoral d'espai en blanc '%s' no reconeguda"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "No s'ha pogut escriure el pedaç"
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "No es pot preparar l'expressió regular de marca de temps %s"
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "l'edició del pedaç ha fallat"
 
-#: builtin/apply.c:827
+#: builtin/add.c:230
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec ha retornat %d per l'entrada: %s"
+msgid "Could not stat '%s'"
+msgstr "No s'ha pogut fer stat a '%s'"
 
-#: builtin/apply.c:908
-#, 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"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "El pedaç és buit. S'ha avortat."
 
-#: builtin/apply.c:940
+#: builtin/add.c:237
 #, 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"
+msgid "Could not apply '%s'"
+msgstr "No s'ha pogut aplicar '%s'"
 
-#: builtin/apply.c:944
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
-"git apply: git-diff dolent - nom de fitxer nou inconsistent en la línia %d"
+"Els camins següents s'ignoren per un dels vostres fitxers .gitignore:\n"
 
-#: builtin/apply.c:945
-#, 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"
+#: 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 "marxa en sec"
 
-#: builtin/apply.c:952
-#, 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"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "recull interactiu"
 
-#: builtin/apply.c:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recompte: línia inesperada: %.*s"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "selecciona els trossos interactivament"
 
-#: builtin/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de pedaç sense capçalera a la línia %d: %.*s"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "edita la diferència actual i aplica-la"
 
-#: builtin/apply.c:1489
-#, 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)"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permet afegir fitxers que d'altra manera s'ignoren"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "el fitxer nou depèn dels continguts antics"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "actualitza els fitxers seguits"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "el fitxer suprimit encara té continguts"
+#: 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/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "el pedaç és malmès a la línia %d"
+#: 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/apply.c:1719
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "el fitxer nou %s depèn dels continguts antics"
+#: 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/apply.c:1721
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr "el fitxer suprimit %s encara té continguts"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "no afegeixis, només actualitza l'índex"
 
-#: builtin/apply.c:1724
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** avís: el fitxer %s queda buit però no se suprimeix"
+#: 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/apply.c:1870
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "pedaç binari malmès a la línia %d: %.*s"
+#: 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:1899
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "pedaç binari no reconegut a la línia %d"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:2050
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "pedaç amb només escombraries a la línia %d"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "passa per alt el bit executable dels fitxers llistats"
 
-#: builtin/apply.c:2140
+#: builtin/add.c:305
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "no s'ha pogut llegir l'enllaç simbòlic %s"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Useu -f si realment els voleu afegir.\n"
 
-#: builtin/apply.c:2144
-#, c-format
-msgid "unable to open or read %s"
-msgstr "no s'ha pogut obrir o llegir %s"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "l'afegiment de fitxers ha fallat"
 
-#: builtin/apply.c:2777
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "inici de línia no vàlid: '%c'"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A i -u són mutualment incompatibles"
 
-#: builtin/apply.c:2896
-#, 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/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:2908
+#: builtin/add.c:359
 #, 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 "--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:2914
+#: builtin/add.c:374
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"tot cercant:\n"
-"%.*s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "No s'ha especificat res, no s'ha afegit res.\n"
 
-#: builtin/apply.c:2934
+#: builtin/add.c:375
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "manquen les dades de pedaç binari de '%s'"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Potser volíeu dir 'git add .'?\n"
 
-#: builtin/apply.c:3035
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "el pedaç binari no s'aplica a '%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:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "fitxer d'índex malmès"
 
-#: builtin/apply.c:3041
-#, 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)"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "no s'ha pogut analitzar l'script d'autor"
 
-#: builtin/apply.c:3062
+#: builtin/am.c:491
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "el pedaç ha fallat: %s:%ld"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "s'ha suprimit '%s' pel ganxo applypatch-msg"
 
-#: builtin/apply.c:3186
+#: builtin/am.c:532
 #, c-format
-msgid "cannot checkout %s"
-msgstr "no es pot agafar %s"
+msgid "Malformed input line: '%s'."
+msgstr "Línia d'entrada mal formada: '%s'."
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/am.c:569
 #, c-format
-msgid "read of %s failed"
-msgstr "la lectura de %s ha fallat"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "S'ha fallat en copiar les notes de '%s' a '%s'"
 
-#: builtin/apply.c:3239
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "llegint de '%s' més enllà d'un enllaç simbòlic"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek ha fallat"
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
+#: builtin/am.c:775
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "el camí %s s'ha canviat de nom / s'ha suprimit"
+msgid "could not parse patch '%s'"
+msgstr "no s'ha pogut analitzar el pedaç '%s'"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
-#, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: no existeix en l'índex"
+#: builtin/am.c:840
+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/am.c:887
+msgid "invalid timestamp"
+msgstr "marca de temps no vàlida"
+
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "línia Date no vàlida"
+
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "desplaçament de zona de temps no vàlid"
+
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "La detecció de format de pedaç ha fallat."
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "failed to create directory '%s'"
+msgstr "s'ha fallat en crear el directori '%s'"
+
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "S'ha fallat en dividir els pedaços."
+
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "no s'ha pogut escriure el fitxer d'índex"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/am.c:1176
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: no coincideix amb l'índex"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "el pedaç d'eliminació deixa els continguts dels fitxers"
+#: builtin/am.c:1177
+#, 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ò."
 
-#: builtin/apply.c:3528
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: tipus erroni"
+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:3530
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s és del tipus %o, s'esperava %o"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "El pedaç és buit. S'ha dividit malament?"
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "invalid path '%s'"
-msgstr "camí no vàlid: %s"
+msgid "invalid ident line: %s"
+msgstr "línia d'identitat no vàlida: %s"
 
-#: builtin/apply.c:3746
+#: builtin/am.c:1417
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: ja existeix en l'índex"
+msgid "unable to parse commit %s"
+msgstr "no s'ha pogut analitzar la comissió %s"
 
-#: builtin/apply.c:3749
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: ja existeix en el directori de treball"
+#: builtin/am.c:1610
+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:3769
-#, 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)"
+#: builtin/am.c:1612
+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:3774
-#, 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:1631
+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:3794
-#, 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:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "S'està retrocedint a apedaçar la base i fusionar de 3 vies..."
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: el pedaç no s'aplica"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "S'ha fallat en fusionar els canvis."
 
-#: builtin/apply.c:3812
-#, c-format
-msgid "Checking patch %s..."
-msgstr "Comprovant el pedaç %s..."
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree ha fallat en escriure un arbre"
 
-#: builtin/apply.c:3905 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:1693
+msgid "applying to an empty history"
+msgstr "s'està aplicant a una història buida"
 
-#: builtin/apply.c:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "no s'ha pogut eliminar %s de l'índex"
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "s'ha fallat en escriure l'objecte de comissió"
 
-#: builtin/apply.c:4077
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "pedaç malmès per al submòdul %s"
+msgid "cannot resume: %s does not exist."
+msgstr "no es pot reprendre: %s no existeix."
 
-#: builtin/apply.c:4081
-#, 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:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"no es pot ser interactiu sense que stdin estigui connectada a un terminal."
 
-#: builtin/apply.c:4086
-#, c-format
-msgid "unable to create backing store for newly created file %s"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "El cos de la comissió é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 ""
-"no s'ha pogut crear un magatzem de recolzament per al fitxer novament creat "
-"%s"
+"Voleu aplicar-lo? [y]es/[n]o/[e]dita/[v]isualitza el pedaç/[a]ccepta'ls "
+"tots: "
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "no s'ha pogut afegir una entrada de cau per a %s"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Índex brut: no es pot aplicar pedaços (bruts: %s)"
 
-#: builtin/apply.c:4122
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "closing file '%s'"
-msgstr "tancant el fitxer '%s'"
+msgid "Applying: %.*s"
+msgstr "S'està aplicant: %.*s"
+
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Sense canvis -- El pedaç ja s'ha aplicat."
 
-#: builtin/apply.c:4171
+#: builtin/am.c:1885
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "no s'ha pogut escriure el fitxer '%s' mode %o"
+msgid "Patch failed at %s %.*s"
+msgstr "El pedaç ha fallat a %s %.*s"
 
-#: builtin/apply.c:4258
+#: builtin/am.c:1891
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "El pedaç %s s'ha aplicat netament."
+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:4266
-msgid "internal error"
-msgstr "error intern"
+#: 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 ""
+"Cap canvi - heu oblidat d'usar 'git add'?\n"
+"Si no hi ha res a allistar, probablement alguna altra cosa ja ha\n"
+"introduït els mateixos canvis; potser voleu ometre aquest pedaç."
 
-#: builtin/apply.c:4269
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "Aplicant el pedaç %%s amb %d rebuig"
-msgstr[1] "Aplicant el pedaç %%s amb %d rebuitjos"
+#: builtin/am.c:1943
+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:4279
+#: 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 "truncant el nom del fitxer .rej a %.*s.rej"
+msgid "Could not parse object '%s'."
+msgstr "No s'ha pogut analitzar l'objecte '%s'."
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "El tros #%d s'ha aplicat netament."
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "s'ha fallat en netejar l'índex"
+
+#: builtin/am.c:2137
+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:4303
+#: builtin/am.c:2200
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "S'ha rebutjat el tros #%d."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valor no vàlid per a --patch-format: %s"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "entrada no reconeguda"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<opcions>] [(<bústia> | <directori-de-correu>)...]"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "no es pot llegir el fitxer d'índex"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opcions>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4507
-msgid "don't apply changes matching the given path"
-msgstr "no apliquis els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "executa interactivament"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "aplica els canvis que coincideixin amb el camí donat"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "opció històrica -- no-op"
 
-#: builtin/apply.c:4513
-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:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "permet retrocedir a una fusió de 3 vies si és necessari"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "ignora afegiments fets pel pedaç"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "calla"
 
-#: builtin/apply.c:4518
-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"
+#: builtin/am.c:2247
+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:4522
-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:2250
+msgid "recode into utf8 (default)"
+msgstr "recodifica en utf8 (per defecte)"
 
-#: builtin/apply.c:4524
-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:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "passa la bandera -k al git-mailinfo"
 
-#: builtin/apply.c:4526
-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:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "passa la bandera -b al git-mailinfo"
 
-#: builtin/apply.c:4528
-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:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "passa la bandera -m al git-mailinfo"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "aplica un pedaç sense tocar l'arbre de treball"
+#: builtin/am.c:2258
+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/apply.c:4532
-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:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"no passis la bandera --keep-cr al git-mailsplit independent de am.keepcr"
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "aplica el pedaç també (useu amb --stat/--summary/--check)"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "despulla tot abans d'una línia de tissores"
 
-#: builtin/apply.c:4536
-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: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 "passa-ho a través del git-apply"
 
-#: builtin/apply.c:4538
-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: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:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "els camins se separen amb el caràcter NUL"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "assegura't que almenys <n> línies de context coincideixin"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "el format en el qual estan els pedaços"
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
 msgstr ""
-"detecta les línies noves o modificades que tinguin errors d'espai en blanc"
-
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignora els canvis d'espai en blanc en cercar context"
+"passa per alt el missatge d'error quan s'ocorre una fallada en apedaçar"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "aplica el pedaç al revés"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "segueix aplicant pedaços després de resoldre un conflicte"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "no esperis almenys una línia de context"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "sinònims de --continue"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "deixa els trossos rebutjats en fitxers *.reg coresspondents"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "salta el pedaç actual"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "permet trossos encavalcants"
+#: builtin/am.c:2307
+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:4563
-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:2311
+msgid "lie about committer date"
+msgstr "menteix sobre la data del comitent"
 
-#: builtin/apply.c:4566
-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:2313
+msgid "use current timestamp for author date"
+msgstr "usa el marc de temps actual per la data d'autor"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "anteposa <arrel> a tots els noms de fitxer"
+#: 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 "ID de clau"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way fora d'un dipòsit"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "signa les comissions amb GPG"
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index fora d'un dipòsit"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(ús intern per al git-rebase)"
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached fora d'un dipòsit"
+#: 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 ""
+"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:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "no es pot obrir el pedaç '%s'"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "s'ha fallat en llegir l'índex"
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2356
 #, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "%d error d'espai en blanc omès"
-msgstr[1] "%d errors d'espai en blanc omesos"
+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:4641 builtin/apply.c:4651
+#: builtin/am.c:2380
 #, 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."
+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/am.c:2386
+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
 msgid "could not create archive file '%s'"
-msgstr "no es pot crear el fitxer d'arxiu '%s'"
+msgstr "no s'ha pogut crear el fitxer d'arxiu '%s'"
 
 #: builtin/archive.c:20
 msgid "could not redirect output"
@@ -3445,168 +4608,222 @@ 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:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
-msgstr "Culpant les línies"
+msgstr "S'estan culpant les línies"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Mostra les entrades de culpa mentre les trobem, incrementalment"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 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:2532
+#: builtin/blame.c:2579
 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:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Mostra les estadístiques de preu de treball"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Força l'informe de progrés"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Mostra la puntuació de sortida de les entrades de culpa"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Mostra el nom de fitxer original (Per defecte: automàtic)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostra el número de línia original (Per defecte: desactivat)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Presenta en un format dissenyat per consumpció per màquina"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 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:2540
+#: builtin/blame.c:2587
 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:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostra la marca de temps crua (Per defecte: desactivat)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostra l'SHA1 de comissió llarg (Per defecte: desactivat)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 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:2544
+#: builtin/blame.c:2591
 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:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Ignora les diferències d'espai en blanc"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"Usa un heurístic experimental basat en sagnat per a millorar les diferències"
+
+#: builtin/blame.c:2600
+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"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Gasta cicles extres per a trobar una coincidència millor"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2603
 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:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Usa els continguts de <fitxer> com a la imatge final"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "puntuació"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 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:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Troba moviments de línia dins i a través dels fitxers"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 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:2654
+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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "fa 4 anys i 11 mesos"
 
-#: builtin/branch.c:25
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents i --reverse no es jutgen bé."
+
+#: builtin/blame.c:2800
+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:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse i --first-parent-together requereixen una última comissió "
+"especificada"
+
+#: builtin/blame.c:2832
+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:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "no hi ha tal camí %s en %s"
+
+#: builtin/blame.c:2854
+#, 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:2873
+#, 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]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<opcions>] [-l] [-f] <nom-de-branca> [<punt-inicial>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<opcions>] [-r] (-d | -D) <nom-de-branca>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<opcions>] (-m | -M) [<branca-antiga>] <branca-nova>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<opcions>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr ""
-"suprimint la branca '%s' que s'ha fusionat a\n"
-"         '%s', però encara no s'ha fusionat\n"
-"         a HEAD."
+"s'està suprimint la branca '%s' que s'ha\n"
+"         fusionat a '%s', però encara no\n"
+"         s'ha fusionat a HEAD."
 
-#: builtin/branch.c:146
+#: 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 ""
-"no suprimint la branca '%s' que encara no s'ha\n"
-"         fusionat a '%s', encara que està\n"
+"no s'està suprimint la branca '%s' que encara no\n"
+"         s'ha fusionat a '%s', encara que està\n"
 "         fusionada a HEAD."
 
-#: builtin/branch.c:160
+#: builtin/branch.c:161
 #, 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:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3615,340 +4832,372 @@ msgstr ""
 "La branca '%s' no està totalment fusionada.\n"
 "Si esteu segur que la voleu suprimir, executeu 'git branch -D %s'."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "L'actualització del fitxer de configuració ha fallat"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "no es pot usar -a amb -d"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "No s'ha pogut trobar l'objecte de comissió de HEAD"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "No es pot suprimir la branca '%s', en la qual sou actualment."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "No es pot suprimir la branca '%s' agafada a '%s'"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "no s'ha trobat la branca amb seguiment remot '%s'."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "no s'ha trobat la branca '%s'."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Error en suprimir la branca amb seguiment remot '%s'"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Error en suprimir la branca '%s'"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, 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:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "S'ha suprimit la branca %s (era %s).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: no hi és]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: darrere per %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[darrere de %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: davant per %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[davant de %d]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: davant per %d, darrere per %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[davant %d, darrere %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** referència no vàlida ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
-msgstr "(cap branca, rebasant %s)"
+msgstr "(cap branca, s'està rebasant %s)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(cap branca, bisecció començada en %s)"
 
-#: builtin/branch.c:375
+#. 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)"
 
-#: builtin/branch.c:378
+#. 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:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(cap branca)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "La branca %s s'està rebasant a %s"
+
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "La branca %s s'està bisecant a %s"
+
+#: builtin/branch.c:563
 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:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branca no vàlid: '%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "El canvi de nom de branca ha fallat"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "S'ha canviat el nom de la branca malanomenada '%s'"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, 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:564
+#: builtin/branch.c:604
 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:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "no s'ha pogut escriure la plantilla de descripció de branca: %s"
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Si us plau, editeu la descripció de la branca\n"
+"  %s\n"
+"Es despullaran les línies que comencin amb '%c'.\n"
 
-#: builtin/branch.c:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Opcions genèriques"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 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:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "omet els missatges informatius"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configura el mode de seguiment (vegeu git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "canvia la informació de font"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "font"
+
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "canvia la informació de font"
+
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Desestableix la informació de font"
+
+#: builtin/branch.c:661
 msgid "use colored output"
 msgstr "usa sortida colorada"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "actua en branques amb seguiment remot"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "imprimeix només les branques que continguin la comissió"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "Accions de git-branch específiques:"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "llista les branques amb seguiment remot i les locals"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "suprimeix la branca si està completament fusionada"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "suprimeix la branca (encara que no estigui fusionada)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 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:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "mou/canvia de nom una branca, encara que el destí existeixi"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "llista els noms de branca"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "crea el registre de referència de la branca"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "edita la descripció de la branca"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "força creació, moviment/canvi de nom, supressió"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "imprimeix només les branques que s'han fusionat"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "imprimeix només les branques que no s'han fusionat"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "llista les branques en columnes"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "clau"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "nom del camp en el qual ordenar"
 
-#: builtin/branch.c:650 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 "objecte"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "imprimeix només les branques de l'objecte"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "S'ha fallat en resoldre HEAD com a referència vàlida."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD no trobat sota refs/heads!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column i --verbose són incompatibles"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "cal el nom de branca"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "No es pot donar descripció a un HEAD separat"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 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:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
-msgstr "Encara no hi ha comissió en la branca '%s'."
+msgstr "Encara no hi ha cap comissió en la branca '%s'."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "No hi ha branca amb nom '%s'."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "hi ha massa branques per a una operació de canvi de nom"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "hi ha massa branques per a establir una nova font"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, 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:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "no hi ha tal branca '%s'"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branca '%s' no existeix"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "hi ha massa branques per a desestablir la font"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 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:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branca '%s' no té informació de font"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "no té sentit crear 'HEAD' manualment"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 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:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3957,7 +5206,7 @@ msgstr ""
 "La bandera --set-upstream està desaprovada i s'eliminarà. Considereu usar --"
 "track o --set-upstream-to\n"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -3968,16 +5217,6 @@ msgstr ""
 "Si volíeu fer '%s' seguir '%s', feu això:\n"
 "\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -3991,65 +5230,82 @@ msgstr "Cal un dipòsit per a fer un farcell."
 msgid "Need a repository to unbundle."
 msgstr "Cal un dipòsit per a desfer un farcell."
 
-#: 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>"
+"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: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 "<tipus> pot ser un de: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "mostra el tipus de l'objecte"
 
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "mostra la mida de l'objecte"
 
-#: builtin/cat-file.c:470
+#: 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:471
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "imprimeix bellament el contingut de l'objecte"
 
-#: builtin/cat-file.c:473
+#: 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:475
+#: 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:923
+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:476
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "posa la sortida de --batch en memòria intermèdia"
 
-#: builtin/cat-file.c:478
+#: 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:481
+#: 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:484
+#: 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:486
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "mostra tots els objectes amb --batch o --batch-check"
 
@@ -4069,7 +5325,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"
 
@@ -4077,7 +5333,7 @@ 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:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "omet el reportatge de progrés"
 
@@ -4148,7 +5404,7 @@ 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 avís per a fitxers existents i fitxers no en l'índex"
+msgstr "cap advertència per a fitxers existents i fitxers no en l'índex"
 
 #: builtin/checkout-index.c:165
 msgid "don't checkout new files"
@@ -4167,8 +5423,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:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "cadena"
 
@@ -4216,82 +5473,78 @@ msgstr "camí '%s': no es pot fusionar"
 #: builtin/checkout.c:230
 #, 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:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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' no es pot usar amb actualització de camins"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' no es pot usar amb %s"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, 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."
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "fitxer d'índex malmès"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "el camí '%s' està sense fusionar"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
-msgstr "heu de resoldre el vostre índex actual primer"
+msgstr "heu de primer resoldre el vostre índex actual"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, 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:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD ara és a"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "no s'ha pogut actualitzar HEAD"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Restableix la branca '%s'\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Ja en '%s'\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "S'ha agafat i restablert la branca '%s'\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "S'ha agafat la branca nova '%s'\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "S'ha agafat la branca '%s'\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... i %d més.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4304,17 +5557,17 @@ msgid_plural ""
 "\n"
 "%s\n"
 msgstr[0] ""
-"Avís: esteu deixant enrere %d comissió, no connectada a\n"
-"cap de les vostres branques:\n"
+"Advertència: esteu deixant enrere %d comissió, no\n"
+"connectada a cap de les vostres branques:\n"
 "\n"
 "%s\n"
 msgstr[1] ""
-"Avís: esteu deixant enrere %d comissions, no connectades a\n"
-"cap de les vostres branques:\n"
+"Advertència: esteu deixant enrere %d comissions, no\n"
+"connectades a cap de les vostres branques:\n"
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4341,150 +5594,150 @@ msgstr[1] ""
 " git branch <nom-de-branca-nova> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "error intern en el passeig per revisions"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "La posició de HEAD anterior era"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Sou en una branca que encara ha de nàixer"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
-msgstr "només una referència esperada, %d donades."
+msgstr "s'esperava només una referència, s'han donat %d."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referència no vàlida: %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la referència no és un arbre: %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "els camins no es poden usar amb canvi de branca"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' no es pot usar amb canvi de branca"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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' no es pot usar amb '%s'"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1105
 #, 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:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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 "branca"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "crea i agafa una branca nova"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "crea/restableix i agafa una branca"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "crea un registre de referència per a la branca nova"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "separa el HEAD a la comissió anomenada"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "separa HEAD a la comissió anomenada"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "estableix la informació de font de la branca nova"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "branca-nova"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "branca òrfena nova"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "agafa la versió nostra dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "agafa la versió seva dels fitxers sense fusionar"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "agafa a la força (descarta qualsevulla modificació local)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "realitza una fusió de 3 vies amb la branca nova"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "actualitza els fitxers ignorats (per defecte)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "estil"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "estil de conflicte (fusió o diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "no limitis les especificacions de camí només a entrades disperses"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "dubta 'git checkout <cap-branca-així>'"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 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:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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 "força l'informe de progrés"
 
-#: builtin/checkout.c:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B i --orphan són mutualment exclusius"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track necessita un nom de branca"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Manca el nom de branca; proveu -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "especificació de camí no vàlida"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4493,12 +5746,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:1263
+#: builtin/checkout.c:1264
 #, 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4515,7 +5768,7 @@ msgstr ""
 #: builtin/clean.c:29
 #, c-format
 msgid "Removing %s\n"
-msgstr "Eliminant %s\n"
+msgstr "S'està eliminant %s\n"
 
 #: builtin/clean.c:30
 #, c-format
@@ -4525,7 +5778,7 @@ msgstr "Eliminaria %s\n"
 #: builtin/clean.c:31
 #, c-format
 msgid "Skipping repository %s\n"
-msgstr "Saltant el dipòsit %s\n"
+msgstr "S'està saltant el dipòsit %s\n"
 
 #: builtin/clean.c:32
 #, c-format
@@ -4582,7 +5835,7 @@ msgstr "Introduïu els patrons a ignorar>> "
 #: builtin/clean.c:690
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
-msgstr "AVÍS: No es pot trobar ítems que coincideixin amb: %s"
+msgstr "ADVERTÈNCIA: No es pot trobar ítems que coincideixin amb: %s"
 
 #: builtin/clean.c:711
 msgid "Select items to delete"
@@ -4632,7 +5885,7 @@ msgstr[1] "Eliminaria els ítems següents:"
 
 #: builtin/clean.c:838
 msgid "No more files to clean, exiting."
-msgstr "No hi ha més fitxers a netejar; sortint."
+msgstr "No hi ha més fitxers a netejar; s'està sortint."
 
 #: builtin/clean.c:869
 msgid "do not print names of files removed"
@@ -4650,8 +5903,8 @@ msgstr "neteja interactiva"
 msgid "remove whole directories"
 msgstr "elimina directoris sencers"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "patró"
 
@@ -4691,103 +5944,129 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opcions>] [--] <dipòsit> [<directori>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "no facis cap agafament"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "crea un dipòsit nu"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "crea un dipòsit reflectit (implica bare)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "per a clonar des d'un dipòsit local"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "no usis enllaços durs locals, sempre copia"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "configura com a dipòsit compartit"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "inicialitza els submòduls en el clon"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "nombre de submòduls clonats en paral·lel"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "directori-de-plantilla"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "directori del qual les plantilles s'usaran"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "dipòsit de referència"
 
-#: builtin/clone.c:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "usa --reference només en clonar"
 
-#: builtin/clone.c:82 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 "nom"
 
-#: builtin/clone.c:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "usa <nom> en lloc de 'origin' per a seguir la font"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "agafa <branca> en lloc del HEAD del remot"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "camí a git-upload-pack en el remot"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665 builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668 builtin/pull.c:202
 msgid "depth"
 msgstr "profunditat"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "crea un clon superficial de tal profunditat"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "hora"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "crea un clon superficial des d'una hora específica"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "revisió"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "aprofundeix la història d'un clon superficial excloent una revisió"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clona només una branca, HEAD o --branch"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "qualsevol submòdul clonat serà superficial"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "directori de git"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 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:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "clau=valor"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "estableix la configuració dins del dipòsit nou"
 
-#: builtin/clone.c:96 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 "usa només les adreces IPv4"
 
-#: builtin/clone.c:98 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 "usa només les adreces IPv6"
 
-#: builtin/clone.c:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4795,190 +6074,187 @@ 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:305
-#, 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:307
-#, 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:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "el dipòsit de referència '%s' és superficial"
-
-#: builtin/clone.c:315
+#: builtin/clone.c:303
 #, 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "s'ha fallat en fer stat a '%s'"
+msgid "failed to open '%s'"
+msgstr "s'ha fallat en obrir '%s'"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existeix i no és directori"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "s'ha fallat en fer stat a '%s'\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "s'ha fallat en crear l'enllaç '%s'"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "s'ha fallat en copiar el fitxer a '%s'"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "fet.\n"
 
-#: builtin/clone.c:459
+#: 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 ""
-"La clonació ha tingut èxit, però l'agafament ha\n"
+"El clonatge ha tingut èxit, però l'agafament ha\n"
 "fallat. Podeu inspeccionar què s'ha agafat amb\n"
 "'git status' i tornar a intentar l'agafament amb\n"
 "'git checkout -f HEAD'\n"
 
-#: builtin/clone.c:536
+#: builtin/clone.c:537
 #, 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:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Provant connectivitat... "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "el remot no ha enviat tots els objectes necessaris"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
-msgstr "no s'ha pogut actualizar %s"
+msgstr "no s'ha pogut actualitzar %s"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 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:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "no s'ha pogut agafar l'arbre de treball"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
-msgstr "no s'ha pogut escriure les paràmetres al fitxer de configuració"
+msgstr "no s'ha pogut escriure els paràmetres al fitxer de configuració"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "no es pot reempaquetar per a netejar"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "no es pot desenllaçar el fitxer d'alternatives temporal"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Hi ha massa paràmetres."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Heu d'especificar un dipòsit per a clonar."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les opcions --bare i --origin %s són incompatibles."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare i --separate-git-dir són incompatibles."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "el dipòsit '%s' no existeix"
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profunditat %s no és nombre positiu"
 
-#: builtin/clone.c:897
+#: builtin/clone.c:915
 #, 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:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "l'arbre de treball '%s' ja existeix."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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 "no s'ha pogut crear els directoris inicials de '%s'"
 
-#: builtin/clone.c:925
+#: builtin/clone.c:943
 #, 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:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
-msgstr "Clonant al dipòsit nu '%s'...\n"
+msgstr "S'està clonant al dipòsit nu '%s'...\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
-msgstr "Clonant a '%s'...\n"
+msgstr "S'està clonant a '%s'...\n"
+
+#: builtin/clone.c:963
+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:984
+#: builtin/clone.c:1019
 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:987
+#: builtin/clone.c:1021
+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:1023
+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:1026
 msgid "source repository is shallow, ignoring --local"
-msgstr "el dipòsit font és superficial, ignorant --local"
+msgstr "el dipòsit font és superficial, s'està ignorant --local"
 
-#: builtin/clone.c:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local s'ignora"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "No se sap com clonar %s"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Sembla que heu clonat un dipòsit buit."
 
@@ -5120,66 +6396,66 @@ msgstr ""
 "Llavors \"git cherry-pick --continue\" reprendrà recollint\n"
 "com a cireres les comissions restants.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "s'ha fallat en desempaquetar l'objecte d'arbre HEAD"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "no s'ha pogut crear un índex temporal"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "l'afegiment interactiu ha fallat"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "no s'ha pogut actualitzar l'índex temporal"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "S'ha fallat en actualitzar l'arbre principal de memòria cau"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: 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:447
+#: 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."
 
-#: builtin/commit.c:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "no es pot llegir l'índex"
 
-#: builtin/commit.c:475
+#: 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:580
+#: 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:582
+#: 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:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "paràmetre --author mal format"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "format de data no vàlid: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5187,38 +6463,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:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
-msgstr "(llegint el missatge de registre des de l'entrada estàndard)\n"
+msgstr "(s'està llegint el missatge de registre des de l'entrada estàndard)\n"
 
-#: builtin/commit.c:704
+#: 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:708
+#: 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:730
-msgid "could not read MERGE_MSG"
-msgstr "no s'ha pogut llegir MERGE_MSG"
-
-#: builtin/commit.c:734
+#: 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:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "no s'ha pogut llegir MERGE_MSG"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "no s'ha pogut escriure la plantilla de comissió"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5233,7 +6509,7 @@ msgstr ""
 "\t%s\n"
 "i intenteu-ho de nou.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5244,11 +6520,11 @@ msgid ""
 msgstr ""
 "\n"
 "Sembla que podeu estar cometent un recull de cireres.\n"
-"Si això no és correcte, si us plau elimineu el fitxer\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:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5258,7 +6534,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:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5269,149 +6545,154 @@ msgstr ""
 "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"
 
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sComitent: %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "No es pot llegir l'índex"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Error en construir arbres"
 
-#: builtin/commit.c:953 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 "Si us plau, proveïu el missatge per usar o l'opció -m o l'opció -F.\n"
 
-#: builtin/commit.c:1055
+#: 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:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fitxers no seguits no vàlid '%s'"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long i -z són incompatibles"
 
-#: builtin/commit.c:1137
+#: 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:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "No teniu res a esmenar."
 
-#: builtin/commit.c:1149
+#: 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:1151
+#: 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."
 
-#: builtin/commit.c:1154
+#: 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:1164
+#: 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:1166
+#: 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:1174
+#: 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:1191
+#: 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:1193
+#: 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:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
-msgstr "Intel·ligent... esmenant l'últim amb índex brut."
+msgstr "Intel·ligent... s'està esmenant l'últim amb índex brut."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
-"S'han especificat camins explícits sense -i o -o; presumint camins --only..."
+"S'han especificat camins explícits sense -i o -o; s'està presumint camins --"
+"only..."
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de neteja no vàlid %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "-a no té sentit amb camins."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "mostra l'estat concisament"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "mostra la informació de branca"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "versió"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "sortida llegible per màquina"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "mostra l'estat en format llarg (per defecte)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "acaba les entrades amb NUL"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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 "mode"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
+#: builtin/commit.c:1354 builtin/commit.c:1629
 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "mostra els fitxers ignorats"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "quan"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5419,202 +6700,202 @@ msgstr ""
 "ignora els canvis als submòduls, opcional quan: all, dirty, untracked. (Per "
 "defecte: all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "mostra els fitxers no seguits en columnes"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "no s'ha pogut trobar la comissió novament creada"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "no s'ha pogut analitzar la comissió novament creada"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "HEAD separat"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (comissió d'arrel)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "omet el resum després d'una comissió reeixida"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "mostra la diferència en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Opcions de missatge de comissió"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "llegiu el missatge des d'un fitxer"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "autor corregit de la comissió"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "data corregida de la comissió"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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 "missatge"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "missatge de comissió"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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 "comissió"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "reusa i edita el missatge de la comissió especificada"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "reusa el missatge de la comissió especificada"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a arreglar la comissió "
 "especificada"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usa el missatge formatat d'aixafada automàtica per a aixafar la comissió "
 "especificada"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 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:1588 builtin/log.c:1219 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "afegeix Signed-off-by:"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "usa el fitxer de plantilla especificat"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "força l'edició de la comissió"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "per defecte"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "com despullar els espais i #comentaris del missatge"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "inclou l'estat en la plantilla de missatge de comissió"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
-msgstr "firma la comissió amb GPG"
+msgstr "signa la comissió amb GPG"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Opcions dels continguts de les comissions"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "comet tots els fitxers canviats"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "afegeix els fitxers especificats a l'índex per a cometre"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "afegeix els fitxers interactivament"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "afegeix els canvis interactivament"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "comet només els fitxers especificats"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "evita el ganxo de precomissió"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "evita els ganxos de precomissió i missatge de comissió"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "mostra què es cometria"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "esmena la comissió anterior"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "evita el ganxo de postreescriure"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "està bé registrar un canvi buit"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "està bé registrar un canvi amb missatge buit"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "no s'ha pogut analitzar la comissió HEAD"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fitxer MERGE_HEAD malmès (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "no s'ha pogut llegir MERGE_MODE"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "no s'ha pogut llegir el missatge de comissió: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
-msgstr "Avortant la comissió; no heu editat el missatge.\n"
+msgstr "S'està avortant la comissió; no heu editat el missatge.\n"
 
-#: builtin/commit.c:1740
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
-msgstr "Avortant la comissió a causa d'un missatge de comissió buit.\n"
+msgstr "S'està avortant la comissió a causa d'un missatge de comissió buit.\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5629,142 +6910,142 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<opcions>]"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "Config file location"
 msgstr "Ubicació del fitxer de configuració"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use global config file"
 msgstr "usa el fitxer de configuració global"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use system config file"
 msgstr "usa el fitxer de configuració del sistema"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "use repository config file"
 msgstr "usa el fitxer de configuració del dipòsit"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "use given config file"
 msgstr "usa el fitxer de configuració donat"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "blob-id"
 msgstr "ID de blob"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "read config from given blob object"
 msgstr "llegeix la configuració de l'objecte de blob donat"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "Action"
 msgstr "Acció"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get value: name [value-regex]"
 msgstr "obtén valor: nom [regex-de-valors]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "obtén tots els valors: clau [regex-de-valors]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "obtén valors de regexp: regex-de-noms [regex-de-valors]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 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:67
+#: builtin/config.c:66
 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:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "afegeix una variable nova: nom valor"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "elimina una variable: nom [regex-de-valors]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "elimina totes les coincidències: nom [regex-de-valors]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "canvia el nom de secció: nom-antic nom-nou"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "elimina una secció: nom"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "list all"
 msgstr "llista tots"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "open an editor"
 msgstr "obre un editor"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "find the color configured: slot [default]"
 msgstr "troba el color configurat: ranura [per defecte]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "troba l'ajust de color: ranura [stdout-és-tty]"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "Type"
 msgstr "Tipus"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is \"true\" or \"false\""
 msgstr "el valor és \"true\" o \"false\""
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is decimal number"
 msgstr "el valor és un nombre decimal"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "value is --bool or --int"
 msgstr "el valor és --bool o --int"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "value is a path (file or directory name)"
 msgstr "el valor és un camí (nom de fitxer o directori)"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "Other"
 msgstr "Altre"
 
-#: builtin/config.c:83
+#: builtin/config.c:82
 msgid "terminate values with NUL byte"
 msgstr "acaba els valors amb un octet NUL"
 
-#: builtin/config.c:84
+#: builtin/config.c:83
 msgid "show variable names only"
 msgstr "mostra només els noms de variable"
 
-#: builtin/config.c:85
+#: builtin/config.c:84
 msgid "respect include directives on lookup"
 msgstr "respecta les directives d'inclusió en cercar"
 
-#: builtin/config.c:86
+#: builtin/config.c:85
 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 "
 "d'ordres)"
 
-#: builtin/config.c:328
+#: builtin/config.c:327
 msgid "unable to parse default color value"
 msgstr "no s'ha pogut analitzar el valor de color per defecte"
 
-#: builtin/config.c:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5779,22 +7060,31 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: builtin/config.c:613
 #, 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:625
+#, 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 expresió 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
 msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [opcions] [<comissió>...]"
+msgstr "git describe [<opcions>] [<comissió>...]"
 
 #: builtin/describe.c:18
 msgid "git describe [<options>] --dirty"
@@ -5815,7 +7105,7 @@ msgstr "l'etiqueta anotada %s no té nom incrustat"
 msgid "tag '%s' is really '%s' here"
 msgstr "l'etiqueta '%s' realment és '%s' aquí"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s no és un nom d'objecte vàlid"
@@ -5833,7 +7123,7 @@ msgstr "cap etiqueta coincideix exactament amb '%s'"
 #: builtin/describe.c:272
 #, c-format
 msgid "searching to describe %s\n"
-msgstr "cercant per a descriure %s\n"
+msgstr "s'està cercant per a descriure %s\n"
 
 #: builtin/describe.c:319
 #, c-format
@@ -5908,7 +7198,7 @@ msgstr "considera les <n> etiquetes més recents (per defecte: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "només considera les etiquetes que coincideixen amb <patró>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "mostra l'objecte de comissió abreviat com a retrocediment"
 
@@ -5926,7 +7216,7 @@ msgstr "--long és incompatible amb --abbrev=0"
 
 #: builtin/describe.c:456
 msgid "No names found, cannot describe anything."
-msgstr "Cap nom trobat, no es pot descriure res."
+msgstr "No s'ha trobat cap nom, no es pot descriure res."
 
 #: builtin/describe.c:476
 msgid "--dirty is incompatible with commit-ishes"
@@ -5942,21 +7232,21 @@ msgstr "'%s': no és ni fitxer regular ni enllaç simbòlic"
 msgid "invalid option: %s"
 msgstr "opció no vàlida: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "No és un dipòsit de git"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "s'ha donat un objecte no vàlid '%s'."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "s'ha donat més de dos blobs: '%s"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "s'ha donat l'objecte no gestionat '%s'."
@@ -5971,7 +7261,7 @@ msgstr "mostra el progrés després de <n> objectes"
 
 #: builtin/fast-export.c:982
 msgid "select handling of signed tags"
-msgstr "selecciona la gestió de les etiquetes firmades"
+msgstr "selecciona la gestió de les etiquetes signades"
 
 #: builtin/fast-export.c:985
 msgid "select handling of tags that tag filtered objects"
@@ -6013,182 +7303,182 @@ msgstr "Aplica l'especificació de referència a les referències exportades"
 msgid "anonymize output"
 msgstr "anonimitza la sortida"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<opcions>] [<dipòsit> [<especificació-de-referència>...]]"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [<opcions>] <grup>"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [<opcions>] [(<dipòsit> | <grup>)...]"
 
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opcions>]"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "obtén de tots els remots"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:96 builtin/pull.c:172
+#: 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:97 builtin/pull.c:174
+#: 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:99
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "obtén de múltiples remots"
 
-#: builtin/fetch.c:101 builtin/pull.c:176
+#: 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:103
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "no obtinguis les etiquetes (--no-tags)"
 
-#: builtin/fetch.c:105
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "nombre de submòduls obtinguts en paral·lel"
 
-#: builtin/fetch.c:107 builtin/pull.c:179
+#: 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:108 builtin/pull.c:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "sota demanda"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: 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:113 builtin/pull.c:191
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "retén el paquet baixat"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permet l'actualització de la referència HEAD"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
+#: 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:120 builtin/pull.c:197
+#: 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:122 builtin/log.c:1236
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "directori"
 
-#: builtin/fetch.c:123
+#: 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:126
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "mode de recursivitat per defecte"
 
-#: builtin/fetch.c:128 builtin/pull.c:200
+#: 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:129 builtin/pull.c:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "mapa de referències"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "mostra el mapa de referències d'obtenció"
 
-#: builtin/fetch.c:386
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "No s'ha pogut trobar la referència HEAD remota"
 
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, 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:607
 #, c-format
 msgid "object %s not found"
 msgstr "objecte %s no trobat"
 
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[al dia]"
 
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (no es pot obtenir en la branca actual)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[rebutjat]"
 
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "no es pot obtenir en la branca actual"
+
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[actualització d'etiqueta]"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (no s'ha pogut actualitzar la referència local)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "no s'ha pogut actualitzar la referència local"
 
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[etiqueta nova]"
 
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[branca nova]"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[referència nova]"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "no s'ha pogut actualitzar la referència local"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "actualització forçada"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(sense avanç ràpid)"
-
-#: builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "no es pot obrir %s: %s\n"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "sense avanç ràpid"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s no ha enviat tots els objectes necessaris\n"
 
-#: builtin/fetch.c:637
+#: builtin/fetch.c:769
 #, 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:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6198,55 +7488,55 @@ msgstr ""
 " intenteu executar 'git remote prune %s' per a eliminar\n"
 " qualsevulla branca antiga o conflictiva"
 
-#: builtin/fetch.c:787
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s es tornarà penjant)"
 
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s s'ha tornat penjant)"
 
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[suprimit]"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(cap)"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "Refusant obtenir en la branca actual %s d'un dipòsit no nu"
+msgstr "S'està refusant obtenir en la branca actual %s d'un dipòsit no nu"
 
-#: builtin/fetch.c:860
+#: builtin/fetch.c:998
 #, 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:863
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "S'ignora l'opció \"%s\" per a %s\n"
 
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "No se sap com obtenir de %s"
 
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
-msgstr "Obtenint %s\n"
+msgstr "S'està obtenint %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 "No s'ha pogut obtenir %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."
@@ -6254,32 +7544,40 @@ msgstr ""
 "Cap dipòsit remot especificat. Si us plau, especifiqueu o un URL o\n"
 "un nom remot del qual es deuen obtenir les revisions noves."
 
-#: builtin/fetch.c:1123
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Necessiteu especificar un nom d'etiqueta."
 
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "No s'admet una profunditat negativa en --deepen"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen i --depth són mutualment exclusius"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth i --unshallow no es poden usar junts"
 
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "--unshallow en un dipòsit complet no té sentit"
 
-#: builtin/fetch.c:1187
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all no accepta un paràmetre de dipòsit"
 
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all no té sentit amb especificacions de referència"
 
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "No hi ha tal remot ni tal grup remot: %s"
 
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Obtenir un grup i especificar referències no té sentit"
 
@@ -6289,23 +7587,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)"
 
-#: 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"
 
@@ -6367,65 +7665,65 @@ 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:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Comprovant connectivitat"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
 msgid "Checking object directories"
-msgstr "Comprovant els directoris d'objecte"
+msgstr "S'estan comprovant els directoris d'objecte"
 
-#: builtin/fsck.c:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opcions>] [<objecte>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "mostra els objectes inabastables"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "mostra els objectes penjants"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "informa de les etiquetes"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "informa dels nodes d'arrel"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "fes els objectes d'índex nodes de cap"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "fes que els registres de referències siguin nodes de cap (per defecte)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "també considera els paquets i els objectes alternatius"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "comprova només la connectivitat"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "habilita la comprovació més estricta"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "escriu objectes penjants a .git/lost-found"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "mostra el progrés"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "mostra els noms detallats dels objectes abastables"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
-msgstr "Comprovant els objectes"
+msgstr "S'estan comprovant els objectes"
 
 #: builtin/gc.c:25
 msgid "git gc [<options>]"
@@ -6476,12 +7774,13 @@ msgstr "força l'execució de gc encara que hi pugui haver un altre gc executant
 #, c-format
 msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
-"Empaquetant automàticament el dipòsit en el fons per rendiment òptim.\n"
+"S'està empaquetant el dipòsit automàticament en el fons per rendiment "
+"òptim.\n"
 
 #: builtin/gc.c:375
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
-msgstr "Empaquetant automàticament el dipòsit per rendiment òptim.\n"
+msgstr "S'està empaquetant automàticament el dipòsit per rendiment òptim.\n"
 
 #: builtin/gc.c:376
 #, c-format
@@ -6493,7 +7792,7 @@ msgstr "Vegeu \"git help gc\" per neteja manual.\n"
 msgid ""
 "gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
-"gc ja està executant en la màquina '%s' pid %<PRIuMAX> (useu --force si no)"
+"gc ja s'està executant en la màquina '%s' pid %<PRIuMAX> (useu --force si no)"
 
 #: builtin/gc.c:441
 msgid ""
@@ -6516,228 +7815,223 @@ msgstr "grep: s'ha fallat en crear fil: %s"
 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:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "no s'ha pogut llegir l'arbre (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, 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:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'opció `%c' espera un valor numèric"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "no es pot obrir '%s'"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 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:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "cerca en continguts no gestionats per git"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "cerca tant en fitxers seguits com en no seguits"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignora els fitxers especificats mitjançant '.gitignore'"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "mostra les línies no coincidents"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "coincidència insensible a majúscula i minúscula"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "coincideix amb els patrons només als límits de paraula"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "processa els fitxers binaris com a text"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "no coincideixis amb els patrons en els fitxers binaris"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "processa els fitxers binaris amb filtres de textconv"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "descendeix com a màxim <profunditat> nivells"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "usa les expressions regulars POSIX esteses"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usa les expressions regulars POSIX bàsiques (per defecte)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "interpreta els patrons com a cadenes fixes"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "usa les expressions regulars compatibles amb Perl"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "mostra els números de línia"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "no mostris els noms de fitxer"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "mostra els noms de fitxer"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "mostra els noms de fitxer relatius al directori superior"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 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:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "sinònim de --files-with-matches"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "mostra només els noms dels fitxers sense coincidència"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "imprimeix NUL després dels noms de fitxer"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 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:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "ressalta les coincidències"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "imprimeix una línia buida entre coincidències de fitxers distints"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 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:705
+#: builtin/grep.c:708
 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:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "mostra <n> línies de context abans d'una coincidència"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "mostra <n> línies de context després d'una coincidència"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "usa <n> fils obrers"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "drecera per -C NUM"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 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:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "mostra la funció circumdant"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "llegeix els patrons des d'un fitxer"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "coincideix amb <patró>"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "combina els patrons especificats amb -e"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "indica coincidència amb estat de sortida sense sortida textual"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 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:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "mostra l'arbre d'anàlisis de l'expressió de grep"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "mostra els fitxers coincidents en el paginador"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permet la invocació de grep(1) (ignorat per aquesta compilació)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "cap patró donat."
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "s'ha especificat un nombre de fils no vàlid (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 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:899
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached o --untracked no es pot usar amb --no-index."
 
-#: builtin/grep.c:904
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index o --untracked no es pot usar amb revisions."
 
-#: builtin/grep.c:907
+#: builtin/grep.c:910
 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:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "s'han donat ambdós --caches i arbres."
 
@@ -6753,85 +8047,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 "
 "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 guíes"
+
+#: 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."
 
-#: builtin/help.c:104
+#: builtin/help.c:106
 msgid "Failed to parse emacsclient version."
 msgstr "S'ha fallat 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': %s"
-msgstr "s'ha fallat en executar '%s': %s"
+msgid "failed to exec '%s'"
+msgstr "s'ha fallat en executar '%s'"
 
-#: builtin/help.c:205
+#: builtin/help.c:207
 #, c-format
 msgid ""
 "'%s': path for unsupported man viewer.\n"
@@ -6840,7 +8138,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"
@@ -6849,429 +8147,432 @@ 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"
+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:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "La definició d'atributs per camí"
 
-#: builtin/help.c:409
+#: 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:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Un glossari de Git"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Especifica els fitxers intencionalment no seguits a ignorar"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "La definició de les propietats de submòduls"
 
-#: builtin/help.c:413
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "L'especificació de revisions i rangs per al Git"
 
-#: builtin/help.c:414
+#: 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)"
 
-#: builtin/help.c:415
+#: 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:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Les guies de Git comunes són:\n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "ús: %s%s"
-
-#: builtin/help.c:481
+#: 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:152
+#: 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:202
+#: 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:222
+#: 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:225
+#: 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:267
+#: 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:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "EOF prematur"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "error de lectura d'entrada"
 
-#: builtin/index-pack.c:290
+#: 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:297
+#: 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:313
+#: 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:318
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "no es pot obrir el fitxer de paquet '%s'"
 
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
-msgstr "hi ha una discordança de firma de paquet"
+msgstr "hi ha una discordança de signatura de paquet"
 
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la versió de paquet %<PRIu32> no és compatible"
 
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "el paquet té un objecte dolent a la posició %lu: %s"
+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:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "la inflació ha retornat %d"
 
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "desbordament de valor de desplaçament per a l'objecte base de delta"
 
-#: builtin/index-pack.c:530
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "el desplaçament de base de delta està fora de límits"
 
-#: builtin/index-pack.c:538
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "tipus d'objecte desconegut %d"
 
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "no es pot fer pread en el fitxer de paquet"
 
-#: 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] "final prematur de fitxer de paquet, manca %lu octet"
-msgstr[1] "final prematur de fitxer de paquet, manquen %lu octets"
+msgid "premature end of pack file, %<PRIuMAX> byte missing"
+msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
+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:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "hi ha una inconsistència seriosa d'inflació"
 
-#: 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 "S'HA TROBAT UNA COL·LISIÓ SHA1 AMB %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 "no s'ha pogut llegir %s"
 
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "no es pot llegir l'objecte existent %s"
 
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objecte de blob no vàlid %s"
 
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "%s no vàlid"
 
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Error en objecte"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 #, 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:917 builtin/index-pack.c:948
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "s'ha fallat en aplicar la delta"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
-msgstr "Rebent objectes"
+msgstr "S'estan rebent objectes"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
-msgstr "Indexant objectes"
+msgstr "S'estan indexant objectes"
 
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "el paquet és malmès (discordança SHA1)"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "no es pot fer fstat en el fitxer de paquet"
 
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "el paquet té brossa al seu final"
 
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusió més enllà de la bogeria en parse_pack_objects()"
 
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
-msgstr "Resolent les deltes"
+msgstr "S'estan resolent les deltes"
 
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "no s'ha pogut crear fil: %s"
 
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "confusió més enllà de la bogeria"
 
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "completed with %d local objects"
-msgstr "s'ha completat amb %d objectes locals"
+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:1263
+#: builtin/index-pack.c:1268
 #, 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:1267
+#: builtin/index-pack.c:1272
 #, 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"
 
-#: builtin/index-pack.c:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "no s'ha pogut desinflar l'objecte annexat (%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objecte local %s és malmès"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "error en tancar el fitxer de paquet"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "no es pot escriure el fitxer a retenir '%s'"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "no es pot tancar el fitxer escrit a retenir '%s'"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "no es pot emmagatzemar el fitxer de paquet"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "no es pot emmagatzemar el fitxer d'índex"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "pack.indexversion=%<PRIu32> dolent"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
-msgstr "no hi ha suport de fils, ignorant %s"
+msgstr "no hi ha suport de fils, s'està ignorant %s"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "No es pot obrir el fitxer de paquet existent '%s'"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, 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:1587
+#: builtin/index-pack.c:1591
 #, 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"
 
-#: builtin/index-pack.c:1594
+#: builtin/index-pack.c:1598
 #, 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:1624
-msgid "Cannot come back to cwd"
-msgstr "No es pot tornar al directori de treball actual"
+#: builtin/index-pack.c:1611
+#, 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:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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 dolent"
 
-#: builtin/index-pack.c:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin no es pot usar sense --stdin"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "el nom de fitxer de paquet '%s' no acaba amb '.pack'"
-
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1740
 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 "ignorant la plantilla %s"
+msgstr "s'està ignorant la plantilla %s"
 
-#: builtin/init-db.c:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "no s'han trobat les plantilles %s"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "no copiant plantilles d'una versió de format errònia %d de '%s'"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s ja existeix"
+msgid "not copying templates from '%s': %s"
+msgstr "no s'està copiant plantilles de '%s': %s"
 
-#: builtin/init-db.c:340
+#: 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:343
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "no s'ha pogut moure %s a %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:399
+#: 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 "%s%s Git repository in %s%s\n"
-msgstr "%s dipòsit de Git%s a %s%s\n"
+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:400
-msgid "Reinitialized existing"
-msgstr "S'ha reinicialitzat un existent"
+#: 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:400
-msgid "Initialized empty"
-msgstr "S'ha inicialitzat un buit"
+#: 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:401
-msgid " shared"
-msgstr " compartit"
+#: 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:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7279,25 +8580,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<directori-de-plantilla>] [--"
 "shared[=<permisos>]] [<directori>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permisos"
 
-#: builtin/init-db.c:472
+#: 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:506 builtin/init-db.c:511
+#: 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:515
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
-msgstr "no es pot chdir a %s"
+msgstr "no es pot canviar de directori a %s"
 
-#: builtin/init-db.c:536
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7306,7 +8607,7 @@ msgstr ""
 "no es permet %s (o --work-tree=<directori>) sense especificar %s (o --git-"
 "dir=<directori>)"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "No es pot accedir a l'arbre de treball '%s'"
@@ -7339,278 +8640,331 @@ msgstr "remolcs a afegir"
 msgid "no input file given for in-place editing"
 msgstr "no s'ha donat cap fitxer d'entrada per a edició in situ"
 
-#: builtin/log.c:43
+#: builtin/log.c:44
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<opcions>] [<rang-de-revisions>] [[--] <camí>...]"
 
-#: builtin/log.c:44
+#: builtin/log.c:45
 msgid "git show [<options>] <object>..."
 msgstr "git show [<opcions>] <objecte>..."
 
-#: builtin/log.c:83
+#: builtin/log.c:84
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "opció --decorate no vàlida: %s"
 
-#: builtin/log.c:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "omet la sortida de diferències"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "mostra la font"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "Usa el fitxer de mapa de correu"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "opcions de decoració"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 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:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Sortida final: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: fitxer dolent"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "No es pot llegir l'objecte %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Tipus desconegut: %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers sense valor"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "el nom del directori de sortida és massa llarg"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "No es pot obrir el fitxer de pedaç %s"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "Cal exactament un rang."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "No és un rang."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "La carta de presentació necessita el format de correu electrònic"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to boig: %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opcions>] [<des-de> | <rang-de-revisions>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
-msgstr "Dos directoris de sortida?"
+msgstr "Hi ha dos directoris de sortida?"
+
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Comissió desconeguda %s"
+
+#: 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'ha fallat en resoldre '%s' com a referència vàlida."
 
-#: builtin/log.c:1214
+#: builtin/log.c:1263
+msgid "Could not find exact merge base."
+msgstr "No s'ha pogut trobar la base exacta de fusió."
+
+#: 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 ""
+"S'ha fallat 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:1287
+msgid "Failed to find exact merge base"
+msgstr "S'ha fallat en trobar la base exacta de fusió."
+
+#: builtin/log.c:1298
+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:1302
+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:1351
+msgid "cannot get patch id"
+msgstr "no es pot obtenir l'id del pedaç"
+
+#: builtin/log.c:1408
 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:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "usa [PATCH] fins i tot amb múltiples pedaços"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "imprimeix els pedaços a la sortida estàndard"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "genera una carta de presentació"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 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:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "sufix"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "usa <sufix> en lloc de '.patch'"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 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:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "marca la sèrie com a l'enèsima llançada"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Usa [RFC PATCH] en lloc de [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "Usa [<prefix>] en lloc de [PATCH]"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "emmagatzema els fitxers resultants a <directori>"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "no despullis/afegeixis [PATCH]"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "no emetis diferències binàries"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "emet un hash de tots zeros en la capçalera From"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 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:1248
+#: builtin/log.c:1445
 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:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Missatgeria"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "capçalera"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "afegeix una capçalera de correu electrònic"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "correu electrònic"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "afegeix la capçalera To:"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "afegeix la capçalera Cc:"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "identitat"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 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:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "ID de missatge"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
-msgstr "fes del primer missatge una resposta a <ID de missatge>"
+msgstr "fes que el primer missatge sigui una resposta a <ID de missatge>"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "límit"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "ajunta el pedaç"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "posa el pedaç en el cos"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "habilita l'enfilada de missatges, estils: shallow, deep"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
-msgstr "firma"
+msgstr "signatura"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
-msgstr "afegeix una firma"
+msgstr "afegeix una signatura"
+
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "comissió base"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1472
+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:1474
 msgid "add a signature from a file"
-msgstr "afegeix una firma des d'un fitxer"
+msgstr "afegeix una signatura des d'un fitxer"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "no imprimeixis els noms de fitxer del pedaç"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n i -k són mutualment exclusius."
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix i -k són mutualment exclusius."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc i -k són mutualment exclusius."
 
-#: builtin/log.c:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only no té sentit"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status no té sentit"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check no té sentit"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "sortida estàndard o directori, quin dels dos?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "No s'ha pogut crear el directori '%s'"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
-msgstr "no s'ha pogut llegir el fitxer de firma '%s'"
+msgstr "no s'ha pogut llegir el fitxer de signatura '%s'"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "S'ha fallat en crear els fitxers de sortida"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<font> [<cap> [<límit>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7618,106 +8972,105 @@ msgstr ""
 "No s'ha pogut trobar una branca remota seguida. Si us plau, especifiqueu "
 "<font> manualment.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Comissió desconeguda %s"
-
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opcions>] [<fitxer>...]"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "identifica l'estat de fitxer amb etiquetes"
 
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "usa lletres minúscules per als fitxers 'assume unchanged'"
 
-#: builtin/ls-files.c:431
+#: builtin/ls-files.c:511
 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:433
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "mostra en la sortida els fitxers suprimits"
 
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "mostra en la sortida els fitxers modificats"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "mostra en la sortida els altres fitxers"
 
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "mostra en la sortida els fitxers ignorats"
 
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr "mostra en la sortida el nom d'objecte dels continguts allistats"
 
-#: builtin/ls-files.c:444
+#: builtin/ls-files.c:524
 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:446
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "mostra només els noms dels directoris 'other'"
 
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
 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:450
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "no mostris els directoris buits"
 
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "mostra en la sortida els fitxers sense fusionar"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "mostra la informació de resolució de desfet"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "salta els fitxers coincidents amb el patró"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "els patrons d'exclusió es llegeixen de <fitxer>"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "llegeix els patrons addicionals d'exclusió per directori en <fitxer>"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "afegeix les exclusions estàndards de git"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 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:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "recursa als submòduls"
+
+#: builtin/ls-files.c:553
 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"
 
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "arbre"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
 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:475
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "mostra les dades de depuració"
 
@@ -7766,7 +9119,7 @@ msgstr "surt amb codi de sortida 2 si no es troba cap referència coincident"
 
 #: builtin/ls-remote.c:64
 msgid "show underlying ref in addition to the object pointed by it"
-msgstr "mostra la referència subjacent en adició a l'objecte que senyali"
+msgstr "mostra la referència subjacent a més de l'objecte que senyali"
 
 #: builtin/ls-tree.c:28
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
@@ -7805,184 +9158,175 @@ 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)"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<opcions>] [<comissió>...]"
 
-#: builtin/merge.c:46
+#: builtin/merge.c:47
 msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr "git merge [<opcions>] <missatge> HEAD <comissió>"
 
-#: builtin/merge.c:47
+#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "l'opció `m' requereix un valor"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, 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:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Les estratègies disponibles són:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Les estratègies personalitzades disponibles són:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 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:196 builtin/pull.c:126
+#: builtin/merge.c:198 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:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(sinònim de --stat)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 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:202 builtin/pull.c:135
+#: builtin/merge.c:204 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:204 builtin/pull.c:138
+#: builtin/merge.c:206 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:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "edita el missatge abans de cometre"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "permet l'avanç ràpid (per defecte)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 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:213
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Verifica que la comissió anomenada tingui una firma GPG vàlida"
+#: builtin/merge.c:215 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:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "estratègia"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "estratègia de fusió a usar"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "opció=valor"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "opció per a l'estratègia de fusió seleccionada"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 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:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "avorta la fusió en curs actual"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "permet fusionar històries no relacionades"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "no s'ha pogut executar stash."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "l'emmagatzemament ha fallat"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "no és un objecte vàlid: %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "read-tree ha fallat"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (res a aixafar)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
-msgstr "Comissió d'aixafada -- no actualitzant HEAD\n"
+msgstr "Comissió d'aixafada -- no s'està actualitzant HEAD\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "No s'ha pogut escriure al '%s'"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Escrivint SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Finalitzant SQUASH_MSG"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
-msgstr "Cap missatge de fusió -- no actualitzant HEAD\n"
+msgstr "Cap missatge de fusió -- no s'està actualitzant HEAD\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' no assenyala una comissió"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Cadena branch.%s.mergeoptions dolenta: %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
-msgstr "No gestionant res a part de la fusió de dos caps."
+msgstr "No s'està gestionant res a part de la fusió de dos caps."
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Opció desconeguda de merge-recursive: -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "no s'ha pogut escriure %s"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "No s'ha pogut llegir de '%s'"
 
-#: builtin/merge.c:782
+#: builtin/merge.c:742
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr "No cometent la fusió; useu 'git commit' per a completar la fusió.\n"
+msgstr ""
+"No s'està cometent la fusió; useu 'git commit' per a completar la fusió.\n"
 
-#: builtin/merge.c:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7998,54 +9342,68 @@ msgstr ""
 "S'ignoraran les línies que comencin amb '%c', i un missatge buit\n"
 "avorta la comissió.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
-msgstr "Missatge de comissió buit."
+msgstr "El missatge de comissió és buit."
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Meravellós.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, 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:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' no és una comissió"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
-msgstr "Cap branca actual."
+msgstr "No hi ha cap branca actual."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "No hi ha cap remot per a la branca actual."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 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:945
+#: builtin/merge.c:913
 #, 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:1080
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Valor dolent '%s' en l'entorn '%s'"
+
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "no s'ha pogut tancar '%s'"
 
-#: builtin/merge.c:1207
+#: builtin/merge.c:1061
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "no és cosa que puguem fusionar en %s: %s"
+
+#: builtin/merge.c:1095
+msgid "not something we can merge"
+msgstr "no és cosa que puguem fusionar"
+
+#: builtin/merge.c:1162
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "No hi ha fusió a avortar (manca MERGE_HEAD)."
 
-#: builtin/merge.c:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8053,7 +9411,7 @@ 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:1230
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8061,108 +9419,120 @@ msgstr ""
 "No heu conclòs el vostre recull de cireres (CHERRY_PICK_HEAD existeix).\n"
 "Si us plau, cometeu els vostres canvis abans de fusionar."
 
-#: builtin/merge.c:1233
+#: builtin/merge.c:1188
 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)."
 
-#: builtin/merge.c:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "No podeu combinar --squash amb --no-ff."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 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:1267
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "Aixafar una comissió a un cap buit encara no es permet"
 
-#: builtin/merge.c:1269
+#: builtin/merge.c:1224
 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"
 
-#: builtin/merge.c:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - no és una cosa que puguem fusionar"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 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"
 
-#: builtin/merge.c:1332
+#: builtin/merge.c:1287
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr "La comissió %s té una firma GPG no fiable, suposadament de %s."
+msgstr "La comissió %s té una signatura GPG no fiable, suposadament de %s."
 
-#: builtin/merge.c:1335
+#: builtin/merge.c:1290
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr "La comissió %s té una firma GPG dolenta suposadament de %s."
+msgstr "La comissió %s té una signatura GPG dolenta suposadament de %s."
 
-#: builtin/merge.c:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
-msgstr "La comissió %s no té firma GPG."
+msgstr "La comissió %s no té signatura GPG."
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
-msgstr "La comissió %s té una firma GPG bona de %s\n"
+msgstr "La comissió %s té una signatura GPG bona de %s\n"
+
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "s'està refusant fusionar històries no relacionades"
+
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Ja està al dia."
 
-#: builtin/merge.c:1424
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
-msgstr "Actualitzant %s..%s\n"
+msgstr "S'estan actualitzant %s..%s\n"
 
-#: builtin/merge.c:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
-msgstr "Intentant una fusió molt trivial en l'índex...\n"
+msgstr "S'està intentant una fusió molt trivial en l'índex...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "No.\n"
 
-#: builtin/merge.c:1500
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Ja està al dia. Estupend!"
+
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
-msgstr "No és possible avançar ràpidament, avortant."
+msgstr "No és possible avançar ràpidament, s'està avortant."
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
-msgstr "Rebobinant l'arbre a la pristina...\n"
+msgstr "S'està rebobinant l'arbre a la pristina...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
-msgstr "Intentant l'estratègia de fusió %s...\n"
+msgstr "S'està intentant l'estratègia de fusió %s...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Cap estratègia de fusió ha gestionat la fusió.\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "L'estratègia de fusió %s ha fallat.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
-msgstr "Usant el %s per a preparar la resolució a mà.\n"
+msgstr "S'està usant el %s per a preparar la resolució a mà.\n"
 
-#: builtin/merge.c:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
-"La fusió automàtica ha sortit bé; s'ha aturat abans de cometre tal i com "
-"s'havia demanat\n"
+"La fusió automàtica ha sortit bé; s'ha aturat abans de cometre com s'havia "
+"demanat\n"
 
 #: builtin/merge-base.c:29
 msgid "git merge-base [-a | --all] <commit> <commit>..."
@@ -8184,23 +9554,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>"
@@ -8245,6 +9615,37 @@ msgstr "no avisis de conflictes"
 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]"
@@ -8270,7 +9671,7 @@ msgstr "git mv [<opcions>] <font>... <destí>"
 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/mv.c:72 builtin/rm.c:317
 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 "
@@ -8289,109 +9690,109 @@ msgstr "força el moviment / canvi de nom encara que el destí existeixi"
 msgid "skip move/rename errors"
 msgstr "omet els errors de moviment / canvi de nom"
 
-#: builtin/mv.c:152
+#: builtin/mv.c:155
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "el destí '%s' no és un directori"
 
-#: builtin/mv.c:163
+#: builtin/mv.c:166
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
-msgstr "Comprovant el canvi de nom de '%s' a '%s'\n"
+msgstr "S'està comprovant el canvi de nom de '%s' a '%s'\n"
 
-#: builtin/mv.c:167
+#: builtin/mv.c:170
 msgid "bad source"
 msgstr "font dolenta"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:173
 msgid "can not move directory into itself"
 msgstr "no es pot moure un directori a dins d'ell mateix"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:176
 msgid "cannot move directory over file"
 msgstr "no es pot moure un directori sobre un fitxer"
 
-#: builtin/mv.c:182
+#: builtin/mv.c:185
 msgid "source directory is empty"
 msgstr "el directori font està buit"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:210
 msgid "not under version control"
 msgstr "no està sota control de versions"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:213
 msgid "destination exists"
 msgstr "el destí existeix"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:221
 #, c-format
 msgid "overwriting '%s'"
-msgstr "sobreescrivint '%s'"
+msgstr "s'està sobreescrivint '%s'"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:224
 msgid "Cannot overwrite"
 msgstr "No es pot sobreescriure"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:227
 msgid "multiple sources for the same target"
 msgstr "múltiples fonts per al mateix destí"
 
-#: builtin/mv.c:226
+#: builtin/mv.c:229
 msgid "destination directory does not exist"
 msgstr "el directori destí no existeix"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:236
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, origen=%s, destí=%s"
 
-#: builtin/mv.c:254
+#: builtin/mv.c:257
 #, c-format
 msgid "Renaming %s to %s\n"
-msgstr "Canviant el nom de %s a %s\n"
+msgstr "S'està canviant el nom de %s a %s\n"
 
-#: builtin/mv.c:257 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 "el canvi del nom de '%s' ha fallat"
 
-#: builtin/name-rev.c:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opcions>] <comissió>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opcions>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opcions>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "imprimeix només els noms (sense SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "només usa les etiquetes per a anomenar les comissions"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "només usa les referències que coincideixin amb <patró>"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "llista totes les comissions abastables de totes les referències"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "llegeix d'stdin"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "permet imprimir els noms `undefined` (per defecte)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "dereferencia les etiquetes en l'entrada (ús intern)"
 
@@ -8508,6 +9909,10 @@ msgstr "git notes prune [<opcions>]"
 msgid "git notes get-ref"
 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:"
+
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -8522,90 +9927,101 @@ msgstr "no s'ha pogut llegir la sortida de 'show'"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "s'ha fallat en finalitzar 'show' per a l'objecte '%s'"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "no s'ha pogut crear el fitxer '%s'"
-
-#: builtin/notes.c:193
-msgid "Please supply the note contents using either -m or -F option"
+#: builtin/notes.c:194
+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:202
+#: builtin/notes.c:203
 msgid "unable to write note object"
 msgstr "no s'ha pogut escriure l'objecte de nota"
 
-#: builtin/notes.c:204
+#: 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:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "no es pot llegir '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "no s'ha pogut obrir o llegir '%s'"
 
-#: 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:880 builtin/tag.c:456
+#: 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'ha fallat en resoldre '%s' com a referència vàlida."
+msgid "failed to resolve '%s' as a valid ref."
+msgstr "s'ha fallat 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'."
+
+#: 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'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "línia d'entrada mal formada: '%s'."
 
-#: builtin/notes.c:256
+#: builtin/notes.c:316
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "S'ha fallat en llegir l'objecte '%s'."
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "s'ha fallat en copiar les notes de '%s' a '%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 "No es pot llegir les dades de node de l'objecte no de blob '%s'."
+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:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:945
+#: 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 "massa paràmetres"
 
-#: 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 "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:396 builtin/notes.c:559
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "anota els continguts com a cadena"
 
-#: builtin/notes.c:399 builtin/notes.c:562
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "anota els continguts en un fitxer"
 
-#: builtin/notes.c:402 builtin/notes.c:565
+#: 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:405 builtin/notes.c:568
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "reusa l'objecte de nota especificat"
 
-#: builtin/notes.c:408 builtin/notes.c:571
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permet l'emmagatzematge d'una nota buida"
 
-#: builtin/notes.c:409 builtin/notes.c:480
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "reemplaça les notes existents"
 
-#: builtin/notes.c:434
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8614,30 +10030,30 @@ msgstr ""
 "No es pot afegir les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: 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 "Sobreescrivint les notes existents de l'objecte %s\n"
+msgstr "S'estan sobreescrivint les notes existents de l'objecte %s\n"
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:885
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
-msgstr "Eliminant la nota de l'objecte %s\n"
+msgstr "S'està eliminant la nota de l'objecte %s\n"
 
-#: builtin/notes.c:481
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "llegeix els objectes des d'stdin"
 
-#: builtin/notes.c:483
+#: 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:501
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "hi ha massa pocs paràmetres"
 
-#: builtin/notes.c:522
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8646,12 +10062,12 @@ msgstr ""
 "No es pot copiar les notes. S'han trobat notes existents de l'objecte %s. "
 "Useu '-f' per a sobreescriure les notes existents."
 
-#: builtin/notes.c:534
+#: 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:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8660,15 +10076,52 @@ msgstr ""
 "S'han desaprovat 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:767
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha fallat en suprimir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "s'ha fallat en suprimir la referència NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "s'ha fallat en eliminar l'arbre de treball de 'git notes merge'"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "s'ha fallat en llegir la referència NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut trobar cap comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "no s'ha pogut analitzar la comissió de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "s'ha fallat en resoldre NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "s'ha fallat en finalitzar la fusió de notes"
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "estratègia de fusió de notes desconeguda %s"
+
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Opcions generals"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Opcions de fusió"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8676,244 +10129,288 @@ msgstr ""
 "resol els conflictes de nota usant l'estratègia donada (manual/ours/theirs/"
 "union/cat_sort_uniq)"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
-msgstr "Cometent les notes sense fusionar"
+msgstr "S'estan cometent les notes sense fusionar"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finalitza la fusió de notes cometent les notes sense fusionar"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
-msgstr "Avortant la resolució de fusió de notes"
+msgstr "S'està avortant la resolució de fusió de notes"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "avorta la fusió de notes"
 
-#: builtin/notes.c:856
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "no es pot combinar --commit, --abort i -s/--strategy"
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "cal especificar una referència de notes a fusionar"
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "-s/--strategy desconeguda: %s"
+
+#: builtin/notes.c:860
+#, 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"
+
+#: builtin/notes.c:863
+#, c-format
+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)"
+
+#: builtin/notes.c:865
 #, 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 ""
+"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 ""
+"La fusió de notes automàtica ha fallat. Arregleu els conflictes en %s i "
+"cometeu el resultat amb 'git notes merge --commit', o avorteu la fusió amb "
+"'git notes merge --abort'.\n"
 
-#: builtin/notes.c:883
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objecte %s no té cap nota\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 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:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "llegeix els noms d'objecte des de l'entrada estàndard"
 
-#: builtin/notes.c:979
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "no eliminis, només mostra"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "informa de notes podades"
+
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "referència de notes"
 
-#: builtin/notes.c:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "usa les notes de <referència-de-notes>"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: builtin/notes.c:1019
 #, 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 ""
 "git pack-objects [<opcions>...] <nom-base> [< <llista-de-referències> | < "
 "<llista-de-objectes>]"
 
-#: 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 "error de deflació (%d)"
 
-#: builtin/pack-objects.c:772
+#: builtin/pack-objects.c:768
+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:781
 msgid "Writing objects"
-msgstr "Escrivint els objectes"
+msgstr "S'estan escrivint els objectes"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
-"inhabilitant l'escriptura de mapes de bits, perquè alguns objectes no "
-"s'estan empaquetant"
+"s'està inhabilitant l'escriptura de mapes de bits, perquè alguns objectes no "
+"s'empaqueten"
 
-#: builtin/pack-objects.c:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
-msgstr "Comprimint objectes"
+msgstr "S'estan comprimint objectes"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versió d'índex no compatible %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "versió d'índex dolenta '%s'"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "no mostris l'indicador de progrés"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "mostra l'indicador de progrés"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 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:2599
+#: builtin/pack-objects.c:2800
 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:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "versió[,desplaçament]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 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:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "mida màxima de cada fitxer de paquet de sortida"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 "ignora els objectes prestats d'un emmagatzemament d'objectes alternatiu"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "ignora els objectes empaquetats"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "limita la finestra d'empaquetament per objectes"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 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:2614
+#: builtin/pack-objects.c:2815
 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"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "reusa les deltes existents"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "reusa els objectes existents"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "usa objectes OFS_DELTA"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "usa fils en cercar les millores coincidències de delta"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "no creïs una emissió de paquet buida"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "llegeix els paràmetres de revisió des de l'entrada estàndard"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 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:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "inclou els objectes abastables de qualsevulla referència"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 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:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "inclou els objectes als quals faci referència l'índex"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "emet el paquet a stdout"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 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:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "retén els objectes inabastables"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "hora"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "empaqueta els objectes inabastables solts"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "desempaqueta els objectes inabastables més nous que <hora>"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "crea paquets prims"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "crea paquets adequats per a les obtencions superficials"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "ignora els paquets que tinguin un fitxer .keep corresponent"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "nivell de compressió de paquet"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "no amaguis les comissions per empelt"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 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:2661
+#: builtin/pack-objects.c:2864
 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:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
-msgstr "Comptant els objectes"
+msgstr "S'estan comptant els objectes"
 
 #: builtin/pack-refs.c:6
 msgid "git pack-refs [<options>]"
@@ -8933,75 +10430,63 @@ msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
 
 #: builtin/prune-packed.c:40
 msgid "Removing duplicate objects"
-msgstr "Eliminant objectes duplicats"
+msgstr "S'estan eliminant objectes duplicats"
 
 #: builtin/prune.c:11
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<cap>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "no eliminis, només mostra"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "informa d'objectes podats"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "fes caducar els objectes més vells que <hora>"
 
 #: builtin/prune.c:123
 msgid "cannot prune in a precious-objects repo"
-msgstr "no es pot podar en un dipòsit d'objectes precioses"
+msgstr "no es pot podar en un dipòsit d'objectes preciosos"
+
+#: 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:72
+#: 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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Opcions relacionades amb fusionar"
 
-#: builtin/pull.c:120
+#: 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:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "permet l'avanç ràpid"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "verifica que la comissió anomenada tingui una firma GPG vàlida"
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "automàticament emmagatzema/desempila abans i després de rebasament"
 
-#: builtin/pull.c:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Opcions relacionades amb obtenir"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "nombre de submòduls baixats en paral·lel"
 
-#: builtin/pull.c:275
+#: 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:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "No es pot baixar amb rebasament: Teniu canvis no allistats."
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Addicionalment, el vostre índex conté canvis sense cometre."
-
-#: builtin/pull.c:367
-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:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9009,13 +10494,13 @@ msgstr ""
 "No hi ha cap candidat sobre el qual rebasar entre les referències que acabeu "
 "d'obtenir."
 
-#: builtin/pull.c:445
+#: 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:446
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9023,7 +10508,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:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9034,39 +10519,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:454
+#: 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:456 builtin/pull.c:471
+#: 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."
 
-#: builtin/pull.c:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: 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:469
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "<remot>"
+
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<branca>"
+
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branca> %s\n"
+"amb:"
 
-#: builtin/pull.c:483
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9075,11 +10565,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:841
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "s'està ignorant --verify-signatures per a rebasar"
+
+#: 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:809
 msgid "Updating an unborn branch with changes added to the index."
-msgstr "Actualitzant una branca no nascuda amb canvis afegits a l'índex."
+msgstr ""
+"S'està actualitzant una branca no nascuda amb canvis afegits a l'índex."
+
+#: builtin/pull.c:812
+msgid "pull with rebase"
+msgstr "baixar amb rebasament"
 
-#: builtin/pull.c:870
+#: 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"
@@ -9087,10 +10594,10 @@ msgid ""
 "commit %s."
 msgstr ""
 "l'obtenció ha actualitzat el cap de la branca actual.\n"
-"avançant ràpidament el vostre arbre de treball des de\n"
+"s'està avançant ràpidament el vostre arbre de treball des de\n"
 "la comissió %s."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9101,18 +10608,18 @@ 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 cossa preciosa de la sortida "
+"Després d'assegurar que hàgiu desat qualsevulla cosa preciosa de la sortida "
 "de\n"
 "$ git diff %s\n"
 "executeu\n"
 "$ git reset --hard\n"
 "per a recuperar."
 
-#: builtin/pull.c:890
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "No es pot fusionar múltiples branques a un cap buit."
 
-#: builtin/pull.c:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "No es pot rebasar sobre múltiples branques."
 
@@ -9193,7 +10700,8 @@ msgstr ""
 #: builtin/push.c:183
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr "La branca actual %s té múltiples branques fonts, refusant pujar."
+msgstr ""
+"La branca actual %s té múltiples branques fonts, s'està refusant pujar."
 
 #: builtin/push.c:186
 #, c-format
@@ -9272,19 +10780,19 @@ msgstr ""
 #: builtin/push.c:331
 #, c-format
 msgid "Pushing to %s\n"
-msgstr "Pujant a %s\n"
+msgstr "S'està pujant a %s\n"
 
 #: builtin/push.c:335
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "s'ha fallat en pujar algunes referències a '%s'"
 
-#: builtin/push.c:365
+#: builtin/push.c:366
 #, c-format
 msgid "bad repository '%s'"
 msgstr "dipòsit dolent '%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 "
@@ -9296,7 +10804,7 @@ msgid ""
 "\n"
 "    git push <name>\n"
 msgstr ""
-"Cap destí de pujada configurada.\n"
+"No hi ha cap destí de pujada configurat.\n"
 "Especifiqueu l'URL des de la línia d'ordres o bé configureu un dipòsit remot "
 "fent servir\n"
 "\n"
@@ -9306,103 +10814,115 @@ msgstr ""
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:381
+#: builtin/push.c:385
 msgid "--all and --tags are incompatible"
 msgstr "--all i --tags són incompatibles"
 
-#: builtin/push.c:382
+#: builtin/push.c:386
 msgid "--all can't be combined with refspecs"
 msgstr "--all no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:387
+#: builtin/push.c:391
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror i --tags són incompatibles"
 
-#: builtin/push.c:388
+#: builtin/push.c:392
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror no es pot combinar amb especificacions de referència"
 
-#: builtin/push.c:393
+#: builtin/push.c:397
 msgid "--all and --mirror are incompatible"
 msgstr "--all i --mirror són incompatibles"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "repository"
 msgstr "dipòsit"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
+#: builtin/push.c:516 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "puja totes les referències"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
+#: builtin/push.c:517 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "reflecteix totes les referències"
 
-#: builtin/push.c:509
+#: builtin/push.c:519
 msgid "delete refs"
 msgstr "suprimeix les referències"
 
-#: builtin/push.c:510
+#: builtin/push.c:520
 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:513 builtin/send-pack.c:164
+#: builtin/push.c:523 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "força les actualitzacions"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
+#: builtin/push.c:525 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "nom-de-referència>:<esperat"
 
-#: 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 "requereix que el valor antic de la referència sigui d'aquest valor"
 
-#: builtin/push.c:519
+#: builtin/push.c:529
 msgid "control recursive pushing of submodules"
 msgstr "controla la pujada recursiva dels submòduls"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
+#: builtin/push.c:531 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "usa el paquet prim"
 
-#: 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 "programa que rep els paquets"
 
-#: builtin/push.c:524
+#: builtin/push.c:534
 msgid "set upstream for git pull/status"
 msgstr "estableix la font per a git pull/status"
 
-#: builtin/push.c:527
+#: builtin/push.c:537
 msgid "prune locally removed refs"
 msgstr "poda les referències eliminades localment"
 
-#: builtin/push.c:529
+#: builtin/push.c:539
 msgid "bypass pre-push hook"
 msgstr "evita el ganxo de prepujada"
 
-#: builtin/push.c:530
+#: builtin/push.c:540
 msgid "push missing but relevant tags"
 msgstr "puja les etiquetes absents però rellevants"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
+#: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
-msgstr "firma la pujada amb GPG"
+msgstr "signa la pujada amb 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 "demana una transacció atòmica al costat remot"
 
-#: builtin/push.c:549
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "específic al servidor"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "opció a transmetre"
+
+#: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete és incompatible amb --all, --mirror i --tags"
 
-#: builtin/push.c:551
+#: builtin/push.c:562
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete no té sentit sense referències"
 
+#: builtin/push.c:579
+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
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
@@ -9423,7 +10943,7 @@ msgstr "només buida l'índex"
 
 #: builtin/read-tree.c:115
 msgid "Merging"
-msgstr "Fusionant"
+msgstr "Fusión"
 
 #: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
@@ -9471,12 +10991,77 @@ msgstr "no actualitzis l'índex ni l'arbre de treball"
 
 #: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
-msgstr "salta l'aplicació del filtre d'agafament dispers"
+msgstr "salta l'aplicació del filtre d'agafament parcial"
 
 #: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "depura unpack-trees"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <git-dir>"
+
+#: 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 ""
+"Per defecte, es denega actualizar la branca actual en un dipòsit no\n"
+"nu, perquè feria l'índex i l'arbre de treball inconsistents amb el\n"
+"que hàgiu pujat, i requerria '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 coincidar 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: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 ""
+"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 o sense un missatge\n"
+"d'advertència.\n"
+"\n"
+"Per a silenciar aquest missatge, podeu establir-la a 'refuse'."
+
+#: builtin/receive-pack.c:1883
+msgid "quiet"
+msgstr "callat"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Heu d'especificar un directori."
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9572,7 +11157,7 @@ msgstr "git remote update [<opcions>] [<grup> | <remot>]..."
 #: builtin/remote.c:94
 #, c-format
 msgid "Updating %s"
-msgstr "Actualitzant %s"
+msgstr "S'està actualitzant %s"
 
 #: builtin/remote.c:126
 msgid ""
@@ -9625,12 +11210,12 @@ msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr ""
 "especificar les branques a seguir té sentit només amb miralls d'obtenció"
 
-#: builtin/remote.c:190 builtin/remote.c:633
+#: builtin/remote.c:190 builtin/remote.c:629
 #, c-format
 msgid "remote %s already exists."
 msgstr "el remot %s ja existeix."
 
-#: 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' no és un nom de remot vàlid"
@@ -9654,38 +11239,39 @@ msgstr "(coincident)"
 msgid "(delete)"
 msgstr "(suprimir)"
 
-#: 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 "No hi ha tal remot: %s"
 
-#: builtin/remote.c:643
+#: builtin/remote.c:639
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "No s'ha pogut canviar el nom de la secció de configuració '%s' a '%s'"
 
-#: builtin/remote.c:663
+#: 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 ""
-"No actualitzant l'especificació de referències d'obtenció no per defecte\n"
+"No s'està actualitzant l'especificació de referències d'obtenció no per "
+"defecte\n"
 "\t%s\n"
 "\tSi us plau, actualitzeu la configuració manualment si és necessari."
 
-#: builtin/remote.c:699
+#: builtin/remote.c:695
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "la supressió de '%s' ha fallat"
 
-#: builtin/remote.c:733
+#: builtin/remote.c:729
 #, c-format
 msgid "creating '%s' failed"
 msgstr "la creació de '%s' ha fallat"
 
-#: 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:"
@@ -9700,364 +11286,389 @@ msgstr[1] ""
 "eliminat;\n"
 "per a suprimir-les, useu:"
 
-#: builtin/remote.c:810
+#: builtin/remote.c:806
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "No s'ha pogut eliminar la secció de configuració '%s'"
 
-#: builtin/remote.c:911
+#: builtin/remote.c:907
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nou (la pròxima obtenció emmagatzemarà a remotes/%s)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:910
 msgid " tracked"
 msgstr " seguit"
 
-#: builtin/remote.c:916
+#: builtin/remote.c:912
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " estancat (useu 'git remote prune' per a eliminar)"
 
-#: 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 no vàlid; no es pot rebasar sobre > 1 branca"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "es rebasa interactivament sobre el remot %s"
 
-#: builtin/remote.c:971
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "es rebasa sobre el remot %s"
+
+#: builtin/remote.c:967
 #, c-format
 msgid " merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    i amb el remot"
-
-#: builtin/remote.c:974
+#: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
 msgstr "es fusiona amb el remot %s"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   i amb el remot"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    i amb el remot %s\n"
 
-#: builtin/remote.c:1021
+#: builtin/remote.c:1016
 msgid "create"
 msgstr "crea"
 
-#: builtin/remote.c:1024
+#: builtin/remote.c:1019
 msgid "delete"
 msgstr "suprimeix"
 
-#: builtin/remote.c:1028
+#: builtin/remote.c:1023
 msgid "up to date"
 msgstr "al dia"
 
-#: builtin/remote.c:1031
+#: builtin/remote.c:1026
 msgid "fast-forwardable"
 msgstr "avanç ràpid possible"
 
-#: builtin/remote.c:1034
+#: builtin/remote.c:1029
 msgid "local out of date"
 msgstr "local no actualitzat"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1036
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s força a %-*s (%s)"
 
-#: builtin/remote.c:1044
+#: builtin/remote.c:1039
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s puja a %-*s (%s)"
 
-#: builtin/remote.c:1048
+#: builtin/remote.c:1043
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s força a %s"
 
-#: builtin/remote.c:1051
+#: builtin/remote.c:1046
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s puja a %s"
 
-#: builtin/remote.c:1119
+#: builtin/remote.c:1114
 msgid "do not query remotes"
 msgstr "no consultis els remots"
 
-#: builtin/remote.c:1146
+#: builtin/remote.c:1141
 #, c-format
 msgid "* remote %s"
 msgstr "* remot %s"
 
-#: builtin/remote.c:1147
+#: builtin/remote.c:1142
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL d'obtenció: %s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(sense URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  URL de pujada: %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branca de HEAD: %s"
 
-#: builtin/remote.c:1167
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(no consultat)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(desconegut)"
+
+#: builtin/remote.c:1164
 #, 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:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branca remota:%s"
 msgstr[1] "  Branques remotes:%s"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (estat no consultat)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 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:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  'git push' reflectirà les referències locals"
 
-#: builtin/remote.c:1206
+#: 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] "  Referència local configurada per a 'git push'%s:"
 msgstr[1] "  Referències locals configurades per a 'git push'%s:"
 
-#: builtin/remote.c:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "suprimeix refs/remotes/<name>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "No es pot determinar el HEAD remot"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 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:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "No s'ha pogut suprimir %s"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "No és una referència vàlida: %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "No s'ha pogut configurar %s"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s es tornarà penjant!"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s s'ha tornat penjant!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
-msgstr "Podant %s"
+msgstr "S'està podant %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [podaria] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [podat] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "poda els remots després d'obtenir-los"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "No hi ha tal remot '%s'"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "afegeix branca"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "cap remot especificat"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 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:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "retorna tots els URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "cap URL configurat per al remot '%s'"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "manipula els URL de pujada"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "afegeix URL"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "suprimeix URLs"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete no té sentit"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Patró d'URL antic no vàlid: %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "No s'ha trobat tal URL: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "No se suprimiran tots els URL no de pujada"
 
-#: builtin/remote.c:1595
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "sigues detallat; s'ha de col·locar abans d'una subordre"
 
+#: builtin/remote.c:1622
+#, 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:159
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "empaqueta-ho tot en un únic paquet"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "el mateix que -a, i solta els objectes inabastables"
 
-#: builtin/repack.c:164
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "elimina els paquets redundants, i executeu git-prune-packed"
 
-#: builtin/repack.c:166
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passa --no-reuse-delta a git-pack-objects"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passa --no-reuse-object a git-pack-objects"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "no executis git-update-server-info"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "passa --local a git-pack-objects"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "escriu índex de mapa de bits"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "data aproximada"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:178
 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:179
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr "amb -a, reempaqueta els objectes inabastables"
+
+#: builtin/repack.c:182
 msgid "size of the window used for delta compression"
 msgstr "mida de la finestra que s'usa per a compressió de deltes"
 
-#: builtin/repack.c:180 builtin/repack.c:184
+#: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:181
+#: builtin/repack.c:184
 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:183
+#: builtin/repack.c:186
 msgid "limits the maximum delta depth"
 msgstr "limita la profunditat màxima de les deltes"
 
-#: builtin/repack.c:185
+#: builtin/repack.c:188
 msgid "maximum size of each packfile"
 msgstr "mida màxima de cada fitxer de paquet"
 
-#: builtin/repack.c:187
+#: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr "reempaqueta els objectes en paquets marcats amb .keep"
 
-#: builtin/repack.c:197
+#: builtin/repack.c:200
 msgid "cannot delete packs in a precious-objects repo"
-msgstr "no es pot suprimir paquets en un dipòsit d'objectes precioses"
+msgstr "no es pot suprimir paquets en un dipòsit d'objectes preciosos"
 
-#: builtin/repack.c:381
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable i -A són incompatibles"
+
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
-msgid "removing '%s' failed"
-msgstr "l'eliminació de '%s' ha fallat"
+msgid "failed to remove '%s'"
+msgstr "s'ha fallat en eliminar '%s'"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
@@ -10106,11 +11717,11 @@ msgstr ""
 #: builtin/replace.c:401
 #, c-format
 msgid "the original commit '%s' has a gpg signature."
-msgstr "la comissió original '%s' té una firma gpg."
+msgstr "la comissió original '%s' té una signatura gpg."
 
 #: builtin/replace.c:402
 msgid "the signature will be removed in the replacement commit!"
-msgstr "la firma s'eliminarà en la comissió de reemplaçament!"
+msgstr "s'eliminarà la signatura en la comissió de reemplaçament!"
 
 #: builtin/replace.c:408
 #, c-format
@@ -10160,8 +11771,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>...]"
@@ -10281,27 +11892,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:350
+#: 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:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 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:393
 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:396
 msgid "output in stuck long form"
 msgstr "emet en forma llarga enganxada"
 
-#: 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"
@@ -10373,31 +11984,27 @@ msgstr "opció"
 msgid "option for merge strategy"
 msgstr "opció d'estratègia de fusió"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:100
 msgid "append commit name"
 msgstr "nom de la comissió a annexar"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:102
 msgid "preserve initially empty commits"
 msgstr "preserva les comissions inicialment buides"
 
-#: builtin/revert.c:107
+#: builtin/revert.c:103
 msgid "allow commits with empty messages"
 msgstr "permet les comissions amb missatges buits"
 
-#: builtin/revert.c:108
+#: builtin/revert.c:104
 msgid "keep redundant, empty commits"
 msgstr "retén les comissions redundants i buides"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "error de programa"
-
-#: builtin/revert.c:197
+#: builtin/revert.c:192
 msgid "revert failed"
 msgstr "la reversió ha fallat"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "el recull de cireres ha fallat"
 
@@ -10489,16 +12096,10 @@ msgstr "permet l'eliminació recursiva"
 msgid "exit with a zero status even if nothing matched"
 msgstr "surt amb estat zero encara que res hagi coincidit"
 
-#: builtin/rm.c:317
-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"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
-msgstr "no eliminant '%s' recursivament sense -r"
+msgstr "no s'està eliminant '%s' recursivament sense -r"
 
 #: builtin/rm.c:374
 #, c-format
@@ -10574,70 +12175,125 @@ 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: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'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:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "no hi ha referències coincidents amb %s"
+
+#: builtin/show-branch.c:639
 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:641
 msgid "show remote-tracking branches"
 msgstr "mostra les branques amb seguiment remot"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colora '*!+-' corresponent a la branca"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 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:647
 msgid "synonym to more=-1"
 msgstr "sinònim de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "omet l'anomenament de cadenes"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "inclou la branca actual"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 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:654
 msgid "show possible merge bases"
 msgstr "mostra les bases de fusió possibles"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 msgid "show refs unreachable from any other ref"
 msgstr "mostra les referències inabastables de qualsevulla altra referència"
 
-#: builtin/show-branch.c:659
+#: builtin/show-branch.c:658
 msgid "show commits in topological order"
 msgstr "mostra les comissions en ordre topològic"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 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:663
 msgid "show merges reachable from only one tip"
 msgstr "mostra les fusions abastables de només una punta"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 msgid "topologically sort, maintaining date order where possible"
 msgstr "ordena topològicament, mantenint l'ordre de dates on sigui possible"
 
-#: builtin/show-branch.c:669
+#: builtin/show-branch.c:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 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:703
+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:727
+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:730
+msgid "--reflog option needs one branch name"
+msgstr "l'opció --reflog necessita un nom de branca"
+
+#: 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] "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:737
+#, c-format
+msgid "no such ref %s"
+msgstr "no hi ha tal referència %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] "no es pot gestionar més d'%d revisió."
+msgstr[1] "no es poden gestionar més de %d revisions."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' no és una referència vàlida."
+
+#: builtin/show-branch.c:836
+#, c-format
+msgid "cannot find commit %s (%s)"
+msgstr "no es pot trobar la comissió %s (%s)"
+
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -10701,82 +12357,225 @@ msgstr ""
 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:73 builtin/submodule--helper.c:161
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr "No hi ha tal referència: %s"
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "S'espera un nom de referència ple, s'ha rebut %s"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "no es pot despullar un component de l'url '%s'"
+
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "àncora alternativa per als camins relatius"
 
-#: builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<camí>] [<camí>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, 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:369
+#, 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'"
+
+#: builtin/submodule--helper.c:373
+#, 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:383
+#, 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:390
+#, 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'"
+
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Omet la sortida d'inicialitzar un submòdul"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<camí>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <camí>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, 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:164
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "el submòdul '%s' no pot afegir un alternatiu: %s"
+
+#: builtin/submodule--helper.c:563
+#, 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:570
+#, 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:593
 msgid "where the new submodule will be cloned to"
 msgstr "a on es clonarà el submòdul nou"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "nom del submòdul nou"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url del qual clonar el submòdul"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "profunditat dels clons superficials"
 
-#: builtin/submodule--helper.c:182
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "força el progrés del clonatge"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<camí>] [--quiet] [--reference "
-"<dipòsit>] [--name <nom>] [--url <url>][--depth <profunditat>] [--] "
-"[<camí>...]"
+"<dipòsit>] [--name <nom>] [--depth <profunditat>] --url <url> --path <camí>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "no s'ha pogut crear el directori '%s'"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, 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:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "no es pot obrir el fitxer '%s'"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "no s'ha pogut tancar el fitxer %s"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, 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:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr "fatal: s'ha d'executar la subordre submodule--helper amb una subordre"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "El camí de submòdul '%s' no està inicialitzat"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Potser voleu usar 'update --init'?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "S'està saltant el submòdul no fusionat %s"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "S'està saltant el submòdul '%s'"
+
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "S'ha fallat en clonar '%s'. S'ha programat un reintent"
+
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr "S'ha fallat una segona vegada en clonar '%s', s'està avortant"
+
+#: builtin/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr "camí a l'arbre de treball"
+
+#: builtin/submodule--helper.c:948
+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:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout o none"
+
+#: builtin/submodule--helper.c:956
+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:959
+msgid "parallel jobs"
+msgstr "tasques paral·leles"
+
+#: builtin/submodule--helper.c:961
+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:962
+msgid "don't print cloning progress"
+msgstr "no imprimeixis el progrés del clonatge"
+
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<camí>] [<camí>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "valor dolent per al paràmetre update"
+
+#: 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 ""
+"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:274
+#: builtin/submodule--helper.c:1100
+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:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "fatal: '%s' no és una subordre vàlida de submodule--helper"
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "'%s' no és una subordre vàlida de submodule--helper"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
@@ -10831,27 +12630,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nom-d'etiqueta>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'etiqueta massa llarg: %.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
-msgstr "etiqueta '%s' no trobada."
+msgstr "no s'ha trobat l'etiqueta '%s'."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
-msgstr "L'etiqueta '%s' s'ha suprimit (era %s)\n"
-
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "no s'ha pogut verificar l'etiqueta '%s'"
+msgstr "S'ha suprimit l'etiqueta '%s' (era %s)\n"
 
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -10864,7 +12658,7 @@ msgstr ""
 "  %s\n"
 "Les línies que comencin amb '%c' s'ignoraran.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -10881,7 +12675,7 @@ msgstr ""
 
 #: builtin/tag.c:199
 msgid "unable to sign the tag"
-msgstr "no s'ha pogut firmar l'etiqueta"
+msgstr "no s'ha pogut signar l'etiqueta"
 
 #: builtin/tag.c:201
 msgid "unable to write tag file"
@@ -10889,15 +12683,15 @@ msgstr "no s'ha pogut escriure el fitxer d'etiqueta"
 
 #: builtin/tag.c:226
 msgid "bad object type."
-msgstr "tipus d'objecte dolent."
+msgstr "el tipus d'objecte és dolent."
 
 #: builtin/tag.c:239
 msgid "tag header too big."
-msgstr "capçalera d'etiqueta massa gran."
+msgstr "la capçalera d'etiqueta és massa gran."
 
 #: builtin/tag.c:275
 msgid "no tag message?"
-msgstr "cap missatge d'etiqueta?"
+msgstr "no hi ha cap missatge d'etiqueta?"
 
 #: builtin/tag.c:281
 #, c-format
@@ -10934,11 +12728,11 @@ msgstr "missatge d'etiqueta"
 
 #: builtin/tag.c:352
 msgid "annotated and GPG-signed tag"
-msgstr "etiqueta anotada i firmada per GPG"
+msgstr "etiqueta anotada i signada per GPG"
 
 #: builtin/tag.c:356
 msgid "use another key to sign the tag"
-msgstr "usa una altra clau per a firmar l'etiqueta"
+msgstr "usa una altra clau per a signar l'etiqueta"
 
 #: builtin/tag.c:357
 msgid "replace the tag if exists"
@@ -10996,28 +12790,28 @@ msgstr "es permeten les opcions --merged i --no-merged només amb -l"
 msgid "only one -F or -m option is allowed."
 msgstr "només es permet una opció -F o -m."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "massa paràmetres"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' no és un nom d'etiqueta vàlid."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'etiqueta '%s' ja existeix"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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 "Desempaquetant objectes"
+msgstr "S'estan desempaquetant els objectes"
 
 #: builtin/update-index.c:79
 #, c-format
@@ -11047,7 +12841,7 @@ msgstr "s'ha fallat en suprimir el directori %s"
 #: builtin/update-index.c:133
 #, c-format
 msgid "Testing mtime in '%s' "
-msgstr "Provant mtime en '%s'"
+msgstr "S'està provant mtime en '%s' "
 
 #: builtin/update-index.c:145
 msgid "directory stat info does not change after adding a new file"
@@ -11084,144 +12878,152 @@ msgstr ""
 msgid " OK"
 msgstr " D'acord"
 
-#: builtin/update-index.c:575
+#: builtin/update-index.c:564
 msgid "git update-index [<options>] [--] [<file>...]"
 msgstr "git update-index [<opcions>] [--] [<fitxer>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 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:922
 msgid "refresh: ignore submodules"
 msgstr "actualitza: ignora els submòduls"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "no ignoris els fitxers nous"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 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:929
 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:931
 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:934
 msgid "refresh stat information"
 msgstr "actualitza la informació d'estadístiques"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 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:942
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>,<objecte>,<camí>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "afegeix l'entrada especificada a l'índex"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: 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/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "marca els fitxers com a \"no canviant\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "neteja el bit assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "marca els fitxers com a \"només índex\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "neteja el bit 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 ""
 "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:966
 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:968
 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:970
 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:974
 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:978
 msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr "reemplena les etapes #2 i #3 per als camins llistats"
 
-#: builtin/update-index.c:993
+#: builtin/update-index.c:982
 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:986
 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:989
 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:991
 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:995
 msgid "write index in this format"
 msgstr "escriu l'índex en aquest format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "habilita o inhabilita l'índex dividit"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "habilita/inhabilita la memòria cau no seguida"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 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:1003
 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:1119
+msgid ""
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
+msgstr ""
+"core.untrackedCache està establert a veritable; elimineu-lo o canvieu-lo, si "
+"realment voleu inhabilitar el cau no seguit"
+
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
 msgstr "La memòria cau no seguida està inhabilitada"
 
-#: 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 està establert a fals; elimineu-lo o canviar-lo, si "
+"realment voleu habilitar el cau no seguit"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "La memòria cau no seguida està habilitada per a '%s'"
@@ -11271,7 +13073,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:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "imprimeix la sortida crua de l'estat gpg"
 
@@ -11291,7 +13093,7 @@ msgstr "mostra només estadístiques"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <etiqueta>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "imprimeix els continguts de l'etiqueta"
 
@@ -11300,80 +13102,111 @@ msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<opcions>] <camí> [<branca>]"
 
 #: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<opcions>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<opcions>] <camí>"
+
+#: builtin/worktree.c:18
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<opcions>]"
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<opcions>]"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <camí>"
 
-#: builtin/worktree.c:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Eliminació de worktrees/%s: no és un directori vàlid"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Eliminació de worktrees/%s: el fitxer gitdir no existeix"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, 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:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Eliminació de worktrees/%s: fitxer gitdir no vàlid"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, 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:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "s'ha fallat en eliminar: %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' ja existeix"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "no s'ha pogut crear directori de '%s'"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
-msgstr "Preparant %s (identificador %s)"
+msgstr "S'està preparant %s (identificador %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 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:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "crea una branca nova"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "crea o restableix una branca"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "separa el HEAD a la comissió anomenada"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "emplena l'arbre de treball nou"
+
+#: builtin/worktree.c:337
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B i --detach són mutualment exclusius"
 
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "raó per bloquejar"
+
+#: builtin/worktree.c:482 builtin/worktree.c:515
+#, 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
+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
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "'%s' ja està bloquejat, raó: '%s'"
+
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "'%s' ja està bloquejat"
+
+#: builtin/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "'%s' no està bloquejat"
+
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]"
@@ -11390,7 +13223,42 @@ msgstr "escriu l'objecte d'arbre per a un subdirectori <prefix>"
 msgid "only useful for debugging"
 msgstr "només útil per a la depuració"
 
-#: credential-cache--daemon.c:262
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<opcions>] <directori>"
+
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "surt després d'un sol intercanvi de sol·licitud/resposta"
+
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "surt immediatament després del anunci inicial de referència"
+
+#: upload-pack.c:1032
+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:1034
+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"
+"potser que altres usuaris poden llegir els 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"
 
@@ -11405,7 +13273,11 @@ msgstr ""
 "'git help <concepte>' per a llegir sobre una subordre o concepte\n"
 "específic."
 
-#: http.c:321
+#: http.c:342
+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:351
 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"
 
@@ -11514,7 +13386,7 @@ msgstr "Mostra l'estat de l'arbre de treball"
 #: common-cmds.h:37
 msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr ""
-"Crea, llista, suprimeix o verifica un objecte d'etiqueta firmat amb GPG"
+"Crea, llista, suprimeix o verifica un objecte d'etiqueta signat amb GPG"
 
 #: parse-options.h:145
 msgid "expiry-date"
@@ -11524,49 +13396,49 @@ 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"
 
-#: rerere.h:38
+#: rerere.h:40
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "actualitza l'índex amb la resolució de conflicte reusada si és possible"
 
-#: git-bisect.sh:55
+#: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
 msgstr "Cal començar per \"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 "Voleu que ho faci per vós [Y/n]? "
 
-#: git-bisect.sh:122
+#: git-bisect.sh:121
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "opció no reconeguda: '$arg'"
 
-#: git-bisect.sh:126
+#: git-bisect.sh:125
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' no sembla una revisió vàlida"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:154
 msgid "Bad HEAD - I need a HEAD"
 msgstr "HEAD dolent - Cal un HEAD"
 
-#: git-bisect.sh:168
+#: git-bisect.sh:167
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11574,27 +13446,28 @@ msgstr ""
 "L'agafament de '$start_head' ha fallat. Proveu 'git bisect reset <branca-"
 "vàlida>'."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "no es bisecarà en un arbre en el qual s'ha fet cg-seek"
 
-#: git-bisect.sh:182
+#: git-bisect.sh:181
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "HEAD dolent - referència simbòlica estranya"
 
-#: git-bisect.sh:234
+#: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Paràmetre bisect_write dolent: $state"
 
-#: git-bisect.sh:263
+#: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Introducció de revisió dolenta: $arg"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Si us plau, invoqueu 'bisect_state' amb almenys un paràmetre."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Entrada de revisió dolenta: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
@@ -11609,7 +13482,7 @@ msgstr "'git bisect $TERM_BAD' pot acceptar només un paràmetre."
 #: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
-msgstr "Avís: bisecant amb només comissió $TERM_BAD."
+msgstr "Advertència: bisecant amb només comissió $TERM_BAD."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
@@ -11672,7 +13545,7 @@ msgstr "?? de què parleu?"
 #: git-bisect.sh:492
 #, sh-format
 msgid "running $command"
-msgstr "executant $command"
+msgstr "s'està executant $command"
 
 #: git-bisect.sh:499
 #, sh-format
@@ -11722,7 +13595,8 @@ msgstr "no es pot canviar el significat del terme '$term'"
 #: git-bisect.sh:606
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
-msgstr "Ordre no vàlida: actualment esteu en una bisecció $TERM_BAD/$TERM_GOOD"
+msgstr ""
+"Ordre no vàlida: actualment esteu en una bisecció $TERM_BAD/$TERM_GOOD."
 
 #: git-bisect.sh:636
 msgid "no terms defined"
@@ -11737,7 +13611,48 @@ msgstr ""
 "paràmetre no vàlid $arg per a 'git bisect terms'.\n"
 "Les opcions admeses són: --term-good|--term-old i --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 ""
+"Error: Els vostres canvis locals als fitxers següents se sobreescriurien per "
+"fusionar"
+
+#: git-merge-octopus.sh:61
+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."
+msgstr "No s'ha de fer un pop."
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "No s'ha pogut trobar cap comissió en comú amb $pretty_name"
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Ja al dia amb $pretty_name"
+
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "S'està avançant ràpidament a: $pretty_name"
+
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "S'està intentant una fusió simple amb $pretty_name"
+
+#: git-merge-octopus.sh:102
+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
 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"
@@ -11745,20 +13660,26 @@ msgid ""
 "\"."
 msgstr ""
 "Quan hàgiu resolt aquest problema, executeu \"git rebase --continue\".\n"
-"Si preferiu saltar aquest pedaç, executeu \"git rebase --skip\" en lloc.\n"
+"Si preferiu saltar 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\"."
 
-#: git-rebase.sh:165
+#: git-rebase.sh:156 git-rebase.sh:395
+#, 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:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "No es pot emmagatzemar $stash_sha1"
 
-#: git-rebase.sh:169
+#: git-rebase.sh:171
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -11768,32 +13689,28 @@ msgstr ""
 "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:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "El ganxo de prerebasament ha refusat rebasar."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Sembla que git-am està en curs. No es pot rebasar."
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "L'opció --exec s'ha d'usar amb l'opció --interactive"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "No hi ha rebasament en curs?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 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."
 
-#: git-rebase.sh:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "No es pot llegir HEAD"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11801,12 +13718,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:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "No s'ha pogut tornar a $head_name"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11827,98 +13739,103 @@ msgstr ""
 "i executeu-me de nou. M'aturo per si encara hi teniu alguna cosa\n"
 "de valor."
 
-#: git-rebase.sh:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "font no vàlida $upstream_name"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, 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:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: no hi ha cap base de fusió"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "No assenyala una comissió vàlida: $onto_name"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: no hi ha tal branca: $branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "No es pot emmagatzemar automàticament"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "S'ha creat un magatzem automàtic: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Si us plau, cometeu-los o emmagatzemeu-los."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branca actual $branch_name està al dia."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, 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."
 
-#: git-rebase.sh:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Canvis de $mb a $onto:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
-"Primer, rebobinant el cap per a reproduir el vostre treball al damunt..."
+"Primer, s'està rebobinant el cap per a reproduir el vostre treball al "
+"damunt..."
 
-#: git-rebase.sh:623
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr "S'ha avançat $branch_name ràpidament a $onto_name"
+msgstr "S'ha avançat $branch_name ràpidament a $onto_name."
 
-#: git-stash.sh:51
+#: git-stash.sh:50
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear amb paràmetres no està implementat"
 
-#: git-stash.sh:74
+#: git-stash.sh:73
 msgid "You do not have the initial commit yet"
 msgstr "Encara no teniu la comissió inicial"
 
-#: git-stash.sh:89
+#: git-stash.sh:88
 msgid "Cannot save the current index state"
 msgstr "No es pot desar l'estat d'índex actual"
 
-#: git-stash.sh:124 git-stash.sh:137
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "No es pot desar els fitxers no seguits"
+
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "No es pot desar l'estat d'arbre de treball actual"
 
-#: git-stash.sh:141
+#: git-stash.sh:140
 msgid "No changes selected"
 msgstr "No hi ha canvis seleccionats"
 
-#: git-stash.sh:144
+#: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "No es pot eliminar l'índex temporal (això no pot passar)"
 
-#: git-stash.sh:157
+#: git-stash.sh:156
 msgid "Cannot record working tree state"
 msgstr "No es pot registrar l'estat de l'arbre de treball"
 
-#: git-stash.sh:189
+#: git-stash.sh:188
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "No es pot actualitzar $ref_stash amb $w_commit"
@@ -11933,7 +13850,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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -11942,115 +13859,127 @@ msgstr ""
 "error: opció desconeguda de 'stash save': $option\n"
 "       Per a proveir un missatge, useu 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 "No es poden usar --patch i --include-untracked o --all a la vegada."
+
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "No hi ha canvis locals a desar"
 
-#: git-stash.sh:264
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "No es pot inicialitzar el magatzem"
 
-#: git-stash.sh:268
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "No es pot desar l'estat actual"
 
-#: git-stash.sh:286
+#: git-stash.sh:268
+#, 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"
+
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "No es pot eliminar els canvis de l'arbre de treball"
 
-#: git-stash.sh:405
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opció desconeguda: $opt"
 
-#: git-stash.sh:415
+#: git-stash.sh:416
 msgid "No stash found."
-msgstr "Cap magatzem trobat."
+msgstr "No s'ha trobat cap magatzem."
 
-#: git-stash.sh:422
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
-msgstr "Massa revisions especificades: $REV"
+msgstr "S'han especificat massa revisions: $REV"
 
-#: git-stash.sh:428
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference no és una referència vàlida"
 
-#: git-stash.sh:456
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' no és una comissió de tipus magatzem"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' no és una referència de magatzem"
 
-#: git-stash.sh:475
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "no s'ha pogut actualitzar l'índex"
 
-#: git-stash.sh:479
+#: git-stash.sh:489
 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:487
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Hi ha conflictes en l'índex. Proveu-ho sense --index."
 
-#: git-stash.sh:489
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "No s'ha pogut desar l'arbre d'índex"
 
-#: git-stash.sh:523
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "No s'ha pogut restaurar els fitxers no seguits des d'emmagatzematge"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "No es pot desallistar fitxers modificats"
 
-#: git-stash.sh:538
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "L'índex no estava sense emmagatzemar."
 
-#: git-stash.sh:561
+#: git-stash.sh:562
+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:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} ($s) descartada"
 
-#: git-stash.sh:562
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: No s'ha pogut descartar l'entrada de magatzem"
 
-#: git-stash.sh:570
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Cap nom de branca especificat"
 
-#: git-stash.sh:642
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Per restaurar-les teclegeu \"git stash apply\")"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "no es pot despullar un component de l'url '$remoteurl'"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 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:291
+#: git-submodule.sh:194
 #, 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 ./|../"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ja existeix en l'índex"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12061,118 +13990,91 @@ msgstr ""
 "$sm_path\n"
 "Useu -f si realment voleu afegir-lo."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "Afegint el dipòsit existent a '$sm_path' a l'índex"
+msgstr "S'està afegint el dipòsit existent a '$sm_path' a l'índex"
 
-#: git-submodule.sh:332
+#: git-submodule.sh:235
 #, 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:340
+#: git-submodule.sh:243
 #, 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:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
-"Si voleu tornar a usar aquest directori de git local en lloc de clonar de "
-"nou des de"
-
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"useu l'opció '--force'. Si el directori de git local no és el dipòsit "
-"correcte"
-
-#: git-submodule.sh:345
+#: git-submodule.sh:245
 #, 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 ""
-"o esteu insegur de què vol dir això, trieu un altre nom amb l'opció '--name'."
+"Si voleu reusar aquest directori de git local en lloc de clonar de nou de\n"
+"  $realrepo\n"
+"useu l'opció '--force'. Si el directori de git local no és el dipòsit "
+"correcte\n"
+"o no esteu segur de què vol dir això, trieu un altre nom amb l'opció '--"
+"name'."
 
-#: git-submodule.sh:347
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr "Reactivant el directori de git local per al submòdul '$sm_name'."
+msgstr ""
+"S'està reactivant el directori de git local per al submòdul '$sm_name'."
 
-#: git-submodule.sh:359
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "no s'ha pogut agafar el submòdul '$sm_path'"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "S'ha fallat en afegir el submòdul '$sm_path'"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "S'ha fallat en registrar el submòdul '$sm_path'"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Entrant a '$prefix$displaypath'"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr ""
-"Aturant a '$prefix$displaypath'; l'script ha retornat un estat no zero."
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr ""
-"No s'ha trobat cap url per al camí de submòdul '$displaypath' a .gitmodules"
-
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "S'ha fallat en registrar l'url per al camí de submòdul '$displaypath'"
-
-#: git-submodule.sh:494
+#: git-submodule.sh:324
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "S'ha registrat el submòdul '$name' ($url) per al camí '$displaypath'"
+msgid "Entering '$displaypath'"
+msgstr "S'està entrant '$displaypath'"
 
-#: git-submodule.sh:511
+#: git-submodule.sh:344
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
+msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
-"S'ha fallat en registrar el mode d'actualització per al camí de submòdul "
-"'$displaypath'"
+"S'està aturant a '$displaypath'; l'script ha retornat un estat no zero."
 
-#: git-submodule.sh:549
+#: git-submodule.sh:415
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Useu '.' si realment voleu desinicialitzar tots els submòduls"
+msgid "pathspec and --all are incompatible"
+msgstr "--pathspec i --all són incompatibles"
 
-#: git-submodule.sh:566
+#: git-submodule.sh:420
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "L'arbre de treball de submòdul '$displaypath' conté un directori .git"
+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:567
+#: 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 ""
-"(useu 'rm -rf' si realment voleu eliminar-lo incloent tota la seva història)"
+"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:573
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -12181,133 +14083,617 @@ msgstr ""
 "L'arbre de treball de submòdul '$displaypath' conté modificacions locals; "
 "useu '-f' per a descartar-les"
 
-#: git-submodule.sh:576
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "S'ha netejat el directori '$displaypath'"
 
-#: git-submodule.sh:577
+#: git-submodule.sh:452
 #, 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:580
+#: git-submodule.sh:455
 #, 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:589
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Submòdul '$name' ($url) no registrat per al camí '$displaypath'"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"Camí de submòdul '$displaypath' no inicialitzat\n"
-"Potser voleu usar 'update --init'?"
-
-#: git-submodule.sh:736
+#: git-submodule.sh:617
 #, 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:745
+#: git-submodule.sh:627
 #, 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:768
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr ""
+"No s'ha pogut trobar la revisió actual de ${remote_name}/${branch} en el "
+"camí de submòdul '$sm_path'"
+
+#: git-submodule.sh:650
 #, 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:788
+#: 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 ""
+"S'ha obtingut en el camí de submòdul '$displaypath', però no contenia $sha1. "
+"L'obtenció directa d'aquella comissió ha fallat."
+
+#: git-submodule.sh:663
 #, 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:789
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha agafat '$sha1'"
 
-#: git-submodule.sh:793
+#: git-submodule.sh:668
 #, 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'"
 
-#: git-submodule.sh:794
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha rebasat en '$sha1'"
 
-#: git-submodule.sh:799
+#: git-submodule.sh:674
 #, 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:800
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Camí de submòdul '$displaypath': s'ha fusionat en '$sha1'"
 
-#: git-submodule.sh:805
+#: git-submodule.sh:680
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
-"L'execució de '$command $sha1' ha fallat en el camí de submòdul '$prefix"
-"$sm_path'"
+"L'execució de '$command $sha1' ha fallat en el camí de submòdul "
+"'$displaypath'"
 
-#: git-submodule.sh:806
+#: git-submodule.sh:681
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Camí de submòdul '$prefix$sm_path': '$command $sha1'"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Camí de submòdul '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:836
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$displaypath'"
 
-#: git-submodule.sh:944
+#: git-submodule.sh:820
 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:996
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "mode inesperat $mod_dst"
 
-#: git-submodule.sh:1016
+#: git-submodule.sh:892
 #, 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:1019
+#: git-submodule.sh:895
 #, 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:1022
+#: git-submodule.sh:898
 #, 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:1047
-msgid "blob"
-msgstr "blob"
-
-#: git-submodule.sh:1165
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "S'ha fallat en recursar al camí de submòdul '$sm_path'"
 
-#: git-submodule.sh:1229
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "Sincronitzant l'url de submòdul per a '$displaypath'"
+msgstr "S'està sincronitzant l'url de submòdul per a '$displaypath'"
+
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "Vegeu git-${cmd}(1) per detalls."
+
+#: git-rebase--interactive.sh:140
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "S'està rebasant ($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"
+"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"
+" 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"
+" x, exec = executa l'ordre (el reste de la línia) usant l'intèrpret "
+"d'ordres\n"
+" d, drop = elimina la comissió\n"
+"\n"
+"Es pot canviar l'ordre d'aquestes línies; s'executen de dalt a baix.\n"
+
+#: git-rebase--interactive.sh:171
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"No elimineu cap línia. Useu 'drop' explícitament per a eliminar una "
+"comissió.\n"
+
+#: git-rebase--interactive.sh:175
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Si elimineu una línia aquí, ES PERDRÀ AQUELLA COMISSIÓ.\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 ""
+"Podeu esmenar la comissió ara, amb\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Una vegada que estigueu satisfet amb els vostres canvis, executeu\n"
+"\n"
+"\tgit rebase --continue"
+
+#: 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"
+
+#: git-rebase--interactive.sh:275
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Nom de comissió no vàlid: $sha1"
+
+#: 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:369
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Avanç ràpid a $sha1"
+
+#: 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:380
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "No es pot moure HEAD a $first_parent"
+
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "S'està refusant aixafar una fusió: $sha1"
+
+#: git-rebase--interactive.sh:399
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "Error en refer la fusió $sha1"
+
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "No s'ha pogut escollir $sha1"
+
+#: 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:421
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "El missatge de comissió núm. ${n} se saltarà:"
+
+#: 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:440
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "No es pot escriure $fixup_msg"
+
+#: git-rebase--interactive.sh:443
+msgid "This is a combination of 2 commits."
+msgstr "Això és una combinació de 2 comissions."
+
+#: git-rebase--interactive.sh:444
+msgid "This is the 1st commit message:"
+msgstr "Aquest és el 1er missatge de comissió:"
+
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "No s'ha pogut aplicar $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 ""
+"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"
+"necessiteu resoldre el problema abans que pugueu canviar el missatge de\n"
+"comissió."
+
+#: git-rebase--interactive.sh:573
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "S'ha aturat a $sha1_abbrev... $rest"
+
+#: git-rebase--interactive.sh:588
+#, 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:630
+#, sh-format
+msgid "Executing: $rest"
+msgstr "S'està executant: $rest"
+
+#: git-rebase--interactive.sh:638
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "L'execució ha fallat: $rest"
+
+#: git-rebase--interactive.sh:640
+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:642
+msgid ""
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr ""
+"Podeu arreglar el problema, i llavors executeu\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 ""
+"L'execució ha tingut èxit: $rest\n"
+"però ha deixat canvis a l'índex o l'arbre de treball\n"
+"Cometeu o emmagatzemeu els vostres canvis, i llavors executeu\n"
+"\n"
+"\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:666
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Ordre desconeguda: $command $sha1 $rest"
+
+#: git-rebase--interactive.sh:667
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Si us plau, arregleu això usant 'git rebase --edit-todo'."
+
+#: git-rebase--interactive.sh:702
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "S'ha rebasat i actualitzat $head_name amb èxit."
+
+#: git-rebase--interactive.sh:749
+msgid "Could not skip unnecessary pick commands"
+msgstr "No s'ha pogut saltar ordres innecessaris d'elecció"
+
+#: 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 ""
+"Advertència: manca el SHA-1 o no és una comissió en la línia següent:\n"
+" - $line"
+
+#: git-rebase--interactive.sh:940
+#, sh-format
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"Advertència: no es reconeix l'ordre en la línia següent:\n"
+" - $line"
+
+#: git-rebase--interactive.sh:979
+msgid "could not detach HEAD"
+msgstr "no s'ha pogut separar HEAD"
+
+#: git-rebase--interactive.sh:1017
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+msgstr ""
+"Advertència: pot ser que algunes comissions s'hagin descartat "
+"accidentalment.\n"
+"Les comissions descartades (més nova a més vella):"
+
+#: 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 ""
+"Per a evitar aquest missatge, useu \"drop\" per a eliminar explícitament una "
+"comissió.\n"
+"\n"
+"Useu 'git config rebase.missingCommitsCheck' per a canviar el nivell "
+"d'advertències.\n"
+"Els comportaments possibles són: ignore, warn, error."
+
+#: git-rebase--interactive.sh:1036
+#, sh-format
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr ""
+"No s'ha reconegut l'ajust $check_level per a l'opció rebase."
+"missingCommitsCheck. S'està ignorant."
+
+#: git-rebase--interactive.sh:1053
+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:1054
+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:1078
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "No s'ha pogut eliminar 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 ""
+"Teniu canvis emmagatzemats en el vostre arbre de treball.\n"
+"Si aquests canvis són per a aixafar-se\n"
+"a la comissió prèvia, executeu:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Si són per a formar una comissió nova, executeu:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"En ambdós cassos, quan hàgiu terminat, continueu amb:\n"
+"\n"
+"  git rebase --continue\n"
+
+#: git-rebase--interactive.sh:1100
+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ó"
+
+#: 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 ""
+"Teniu canvis no comessos 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:1110 git-rebase--interactive.sh:1114
+msgid "Could not commit staged changes."
+msgstr "No s'ha pogut cometre els canvis emmagatzemats."
+
+#: 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"
+"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:1146 git-rebase--interactive.sh:1304
+msgid "Could not execute editor"
+msgstr "No s'ha pogut executar l'editor"
+
+#: git-rebase--interactive.sh:1159
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "No s'ha pogut agafar $switch_to"
+
+#: git-rebase--interactive.sh:1164
+msgid "No HEAD?"
+msgstr "No hi ha cap HEAD?"
+
+#: git-rebase--interactive.sh:1165
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "No s'ha pogut crear el $state_dir temporal"
+
+#: git-rebase--interactive.sh:1167
+msgid "Could not mark as interactive"
+msgstr "No s'ha pogut marcar com a interactiu"
+
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
+msgid "Could not init rewritten commits"
+msgstr "No s'ha pogut iniciar les comissions reescrites"
+
+#: git-rebase--interactive.sh:1282
+#, 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:1287
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr ""
+"\n"
+"No obstant, si elimineu tot, s'avortarà el rebasament.\n"
+"\n"
+
+#: git-rebase--interactive.sh:1294
+msgid "Note that empty commits are commented out"
+msgstr "Nota que les comissions buides estan comentades"
+
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
+#, sh-format
+msgid "usage: $dashless $USAGE"
+msgstr "ús: $dashless $USAGE"
+
+#: git-sh-setup.sh:190
+#, sh-format
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"No es pot canviar de directori a $cdup, el nivell superior de l'arbre de "
+"treball"
+
+#: 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: 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."
+
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
+msgstr "No es pot reescriure branques: Teniu canvis no allistats."
+
+#: 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."
+
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
+msgstr "No es pot $action: Teniu canvis no allistats."
+
+#: 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."
+
+#: 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."
+
+#: 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."
+
+#: 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"
index 0eadf3453983aaeefd92e98830959d97a34938ff..f25bd91529a29343498b5d4ca0541ad2345be142 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -1,14 +1,14 @@
 # German translations for Git.
-# Copyright (C) 2010-2015 Ralf Thielow <ralf.thielow@gmail.com>
+# Copyright (C) 2010-2016 Ralf Thielow <ralf.thielow@gmail.com>
 # This file is distributed under the same license as the Git package.
-# Ralf Thielow <ralf.thielow@gmail.com>, 2010-2015.
+# Ralf Thielow <ralf.thielow@gmail.com>, 2010-2016.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-03-16 00:16+0800\n"
-"PO-Revision-Date: 2015-01-21 15:01+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+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"
@@ -22,7 +22,38 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "Hinweis: %.*s\n"
 
-#: advice.c:88
+#: 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."
+
+#: 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."
+
+#: 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."
+
+#: 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."
+
+#: 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."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "%s ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+
+#: 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."
@@ -31,618 +62,1754 @@ msgstr ""
 "dann 'git add/rm <Datei>', um die Auflösung entsprechend zu markieren\n"
 "und zu committen."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Beende wegen unaufgelöstem Konflikt."
+
+#: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Bitte committen Sie Ihre Änderungen, bevor Sie mergen."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Beende wegen nicht abgeschlossenem Merge."
 
-#: 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
+#: 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 <Repository> [--exec <Programm>] [<Optionen>] <Commit-"
-"Referenz> [<Pfad>...]"
+"Hinweis: Checke '%s' aus.\n"
+"\n"
+"Sie befinden sich im Zustand eines 'lösgelösten HEAD'. Sie können sich\n"
+"umschauen, experimentelle Änderungen vornehmen und diese committen, und\n"
+"Sie können alle möglichen Commits, die Sie in diesem Zustand machen,\n"
+"ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie einen\n"
+"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"
+"mit der Option -b tun. Beispiel:\n"
+"\n"
+"  git checkout -b <neuer-Branchname>\n"
+"\n"
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "nicht erkannte Whitespace-Option: '%s'"
 
-#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#: apply.c:73
 #, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
 
-#: archive.c:429
-msgid "fmt"
-msgstr "Format"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:429
-msgid "archive format"
-msgstr "Archivformat"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached und --3way können nicht gemeinsam verwendet werden."
 
-#: archive.c:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "Präfix"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr ""
+"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
 
-#: 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:141
+msgid "--index outside a repository"
+msgstr ""
+"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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 "Datei"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr ""
+"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "das Archiv in diese Datei schreiben"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
+#: 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:436
-msgid "report archived files on stderr"
-msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
+#: 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:437
-msgid "store only"
-msgstr "nur speichern"
+#: 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:438
-msgid "compress faster"
-msgstr "schneller komprimieren"
+#: 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:446
-msgid "compress better"
-msgstr "besser komprimieren"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "unterstützte Archivformate auflisten"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "Repository"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: unerwartete Zeile: %.*s"
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "Archiv vom Remote-Repository <Repository> abrufen"
+#: 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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "Programm"
+#: 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:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
+#: 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)"
 
-#: 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:1759
+msgid "new file depends on old contents"
+msgstr "neue Datei hängt von alten Inhalten ab"
 
-#: branch.c:53
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "entfernte Datei hat noch Inhalte"
+
+#: apply.c:1795
 #, 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 "corrupt patch at line %d"
+msgstr "fehlerhafter Patch bei Zeile %d"
 
-#: branch.c:67
+#: apply.c:1832
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
+msgid "new file %s depends on old contents"
+msgstr "neue Datei %s hängt von alten Inhalten ab"
 
-#: branch.c:93
+#: apply.c:1834
 #, 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."
+msgid "deleted file %s still has contents"
+msgstr "entfernte Datei %s hat noch Inhalte"
 
-#: branch.c:94
+#: apply.c:1837
 #, 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 "** warning: file %s becomes empty but is not deleted"
+msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 
-#: branch.c:98
+#: apply.c:1984
 #, 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 "corrupt binary patch at line %d: %.*s"
+msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
-#: branch.c:99
+#: apply.c:2021
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
+msgid "unrecognized binary patch at line %d"
+msgstr "nicht erkannter Binär-Patch bei Zeile %d"
 
-#: branch.c:104
+#: apply.c:2182
 #, 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 "patch with only garbage at line %d"
+msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
 
-#: branch.c:105
+#: apply.c:2274
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
+msgid "unable to read symlink %s"
+msgstr "konnte symbolische Verknüpfung %s nicht lesen"
 
-#: branch.c:109
+#: apply.c:2278
 #, 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."
+msgid "unable to open or read %s"
+msgstr "konnte %s nicht öffnen oder lesen"
 
-#: branch.c:110
+#: apply.c:2931
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
+msgid "invalid start of line: '%c'"
+msgstr "Ungültiger Zeilenanfang: '%c'"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Konnte Konfiguration zu Upstream-Branch nicht schreiben."
+#: apply.c:3050
+#, 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)"
 
-#: branch.c:156
+#: apply.c:3062
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden"
+
+#: apply.c:3068
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
-"mehrdeutig."
+"bei der Suche nach:\n"
+"%.*s"
 
-#: branch.c:185
+#: apply.c:3090
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' ist kein gültiger Branchname."
+msgid "missing binary patch data for '%s'"
+msgstr "keine Daten in Binär-Patch für '%s'"
 
-#: branch.c:190
+#: apply.c:3098
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Branch '%s' existiert bereits."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr ""
+"kann binären Patch nicht in umgekehrter Reihenfolge anwenden ohne einen\n"
+"umgekehrten Patch-Block auf '%s'"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
+#: apply.c:3144
+#, c-format
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "kann binären Patch auf '%s' nicht ohne eine vollständige Index-Zeile anwenden"
 
-#: branch.c:218
+#: apply.c:3154
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
-"Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
-"Branch."
+"der Patch wird angewendet auf '%s' (%s), was nicht den aktuellen Inhalten\n"
+"entspricht"
 
-#: branch.c:220
+#: apply.c:3162
 #, 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 "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"
 
-#: branch.c:266
+#: apply.c:3180
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ungültiger Objekt-Name: '%s'"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "das erforderliche Postimage %s für '%s' kann nicht gelesen werden"
 
-#: branch.c:286
+#: apply.c:3193
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "mehrdeutiger Objekt-Name: '%s'"
+msgid "binary patch does not apply to '%s'"
+msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: branch.c:291
+#: apply.c:3199
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ungültiger Branchpunkt: '%s'"
+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)"
 
-#: branch.c:344
+#: apply.c:3220
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' ist bereits in '%s' ausgecheckt"
+msgid "patch failed: %s:%ld"
+msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
 
-#: bundle.c:34
+#: apply.c:3342
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
+msgid "cannot checkout %s"
+msgstr "kann %s nicht auschecken"
 
-#: bundle.c:61
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
+msgid "failed to read %s"
+msgstr "Fehler beim Lesen von %s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3398
 #, c-format
-msgid "could not open '%s'"
-msgstr "Konnte '%s' nicht öffnen"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
-msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
+#: apply.c:3427 apply.c:3667
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "Pfad %s wurde umbenannt/gelöscht"
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
+#: apply.c:3510 apply.c:3681
+#, c-format
+msgid "%s: does not exist in index"
+msgstr "%s ist nicht im Index"
 
-#: bundle.c:185
+#: apply.c:3519 apply.c:3689
 #, 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:"
+msgid "%s: does not match index"
+msgstr "%s entspricht nicht der Version im Index"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Das Paket speichert eine komplette Historie."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"Dem Repository fehlt der notwendige Blob, um auf einen 3-Wege-Merge\n"
+"zurückzufallen."
 
-#: bundle.c:194
+#: apply.c:3557
 #, 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"
+msgid "Falling back to three-way merge...\n"
+msgstr "Falle zurück auf 3-Wege-Merge ...\n"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "Erstellung der Paketobjekte abgebrochen"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "kann aktuelle Inhalte von '%s' nicht lesen"
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "\"rev-list\" abgebrochen"
+#: apply.c:3589
+#, c-format
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Fehler beim Zurückfallen auf 3-Wege-Merge...\n"
 
-#: bundle.c:353
+#: apply.c:3603
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch auf '%s' mit Konflikten angewendet.\n"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3608
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "nicht erkanntes Argument: %s"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch auf '%s' sauber angewendet.\n"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Erstellung eines leeren Pakets zurückgewiesen."
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "Lösch-Patch hinterlässt Dateiinhalte"
 
-#: bundle.c:459
+#: apply.c:3706
 #, c-format
-msgid "cannot create '%s'"
-msgstr "kann '%s' nicht erstellen"
-
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "Erstellung der Paketindexdatei abgebrochen"
+msgid "%s: wrong type"
+msgstr "%s: falscher Typ"
 
-#: color.c:275
+#: apply.c:3708
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "Ungültiger Farbwert: %.*s"
+msgid "%s has type %o, expected %o"
+msgstr "%s ist vom Typ %o, erwartete %o"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "could not parse %s"
-msgstr "konnte %s nicht parsen"
+msgid "invalid path '%s'"
+msgstr "Ungültiger Pfad '%s'"
 
-#: commit.c:42
+#: apply.c:3917
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s ist kein Commit!"
+msgid "%s: already exists in index"
+msgstr "%s ist bereits bereitgestellt"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "Speicher verbraucht"
+#: apply.c:3920
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr "%s existiert bereits im Arbeitsverzeichnis"
 
-#: config.c:475 config.c:477
+#: apply.c:3940
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
 
-#: config.c:593
+#: apply.c:3945
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %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"
 
-#: config.c:595
+#: apply.c:3965
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: config.c:680
+#: apply.c:3969
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
+msgid "%s: patch does not apply"
+msgstr "%s: Patch konnte nicht angewendet werden"
 
-#: config.c:758 config.c:769
+#: apply.c:3984
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "ungültiger zlib Komprimierungsgrad %d"
+msgid "Checking patch %s..."
+msgstr "Prüfe Patch %s ..."
 
-#: config.c:891
+#: apply.c:4075
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "Ungültiger Modus für Objekterstellung: %s"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar für Submodul %s"
 
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr ""
-"Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
+#: apply.c:4082
+#, c-format
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "Modusänderung für %s, was sich nicht im aktuellen HEAD befindet"
 
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr ""
-"Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
+#: apply.c:4085
+#, c-format
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "SHA-1 Information fehlt oder ist unbrauchbar (%s)."
 
-#: config.c:1629
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, 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."
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
 
-#: config.c:1631
+#: apply.c:4094
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "ungültige Konfigurationsvariable '%s' in Datei '%s' bei Zeile %d"
+msgid "could not add %s to temporary index"
+msgstr "konnte %s nicht zum temporären Index hinzufügen"
 
-#: config.c:1690
+#: apply.c:4104
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s hat mehrere Werte"
+msgid "could not write temporary index to %s"
+msgstr "konnte temporären Index nicht nach %s schreiben"
 
-#: config.c:2226
+#: apply.c:4242
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Konnte '%s' nicht zu '%s' setzen."
+msgid "unable to remove %s from index"
+msgstr "konnte %s nicht aus dem Index entfernen"
 
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Konnte 'git rev-list' nicht ausführen"
+#: apply.c:4277
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "fehlerhafter Patch für Submodul %s"
 
-#: connected.c:89
+#: apply.c:4283
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "Fehler beim Schreiben nach rev-list: %s"
+msgid "unable to stat newly created file '%s'"
+msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: connected.c:97
+#: apply.c:4291
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe: %s"
+msgid "unable to create backing store for newly created file %s"
+msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
 
-#: date.c:95
-msgid "in the future"
-msgstr "in der Zukunft"
+#: apply.c:4297 apply.c:4441
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: date.c:101
+#: apply.c:4338
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "vor %lu Sekunde"
-msgstr[1] "vor %lu Sekunden"
+msgid "failed to write to '%s'"
+msgstr "Fehler beim Schreiben nach '%s'"
 
-#: date.c:108
+#: apply.c:4342
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "vor %lu Minute"
-msgstr[1] "vor %lu Minuten"
+msgid "closing file '%s'"
+msgstr "schließe Datei '%s'"
 
-#: date.c:115
+#: apply.c:4412
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "vor %lu Stunde"
-msgstr[1] "vor %lu Stunden"
+msgid "unable to write file '%s' mode %o"
+msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: date.c:122
+#: apply.c:4510
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "vor %lu Tag"
-msgstr[1] "vor %lu Tagen"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s sauber angewendet"
+
+#: apply.c:4518
+msgid "internal error"
+msgstr "interner Fehler"
 
-#: date.c:128
+#: apply.c:4521
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "vor %lu Woche"
-msgstr[1] "vor %lu Wochen"
+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..."
 
-#: date.c:135
+#: apply.c:4532
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "vor %lu Monat"
-msgstr[1] "vor %lu Monaten"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: date.c:146
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "vor %lu Jahr"
-msgstr[1] "vor %lu Jahren"
+msgid "cannot open %s"
+msgstr "kann '%s' nicht öffnen"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4554
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s, und %lu Monat"
-msgstr[1] "%s, und %lu Monaten"
+msgid "Hunk #%d applied cleanly."
+msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: date.c:154 date.c:159
+#: apply.c:4558
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "vor %lu Jahr"
-msgstr[1] "vor %lu Jahren"
+msgid "Rejected hunk #%d."
+msgstr "Patch-Block #%d zurückgewiesen."
 
-#: diffcore-order.c:24
+#: apply.c:4668
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
+msgid "Skipped patch '%s'."
+msgstr "Patch '%s' ausgelassen."
 
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "nicht erkannte Eingabe"
 
-#: diff.c:115
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-"  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "Konnte Index-Datei nicht lesen"
 
-#: diff.c:120
+#: apply.c:4833
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
+msgid "can't open patch '%s': %s"
+msgstr "kann Patch '%s' nicht öffnen: %s"
 
-#: diff.c:215
+#: apply.c:4858
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
-
-#: diff.c:267
+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:4864 apply.c:4879
+#, 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:4872
+#, 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:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Konnte neue Index-Datei nicht schreiben."
+
+#: 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 "Pfad"
+
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "keine Änderungen im angegebenen Pfad anwenden"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "Änderungen nur im angegebenen Pfad anwenden"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "Anzahl"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
+"entfernen"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "hinzugefügte Zeilen des Patches ignorieren"
+
+#: apply.c:4931
+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:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+"die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen"
+
+#: apply.c:4937
+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:4939
+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:4941
+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:4943
+msgid "apply a patch without touching the working tree"
+msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr ""
+"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+
+#: apply.c:4949
+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:4951
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"einen temporären Index, basierend auf den integrierten Index-Informationen, "
+"erstellen"
+
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "Pfade sind getrennt durch NUL Zeichen"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr ""
+"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "Aktion"
+
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "den Patch in umgekehrter Reihenfolge anwenden"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "keinen Kontext erwarten"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
+"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "sich überlappende Patch-Blöcke erlauben"
+
+#: 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 "erweiterte Ausgaben"
+
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
+
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
+
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "Wurzelverzeichnis"
+
+#: apply.c:4982
+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:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "Format"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "Archivformat"
+
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "Präfix"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
+
+#: 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 "Datei"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "das Archiv in diese Datei schreiben"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr ".gitattributes aus dem Arbeitsverzeichnis lesen"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "archivierte Dateien in der Standard-Fehlerausgabe ausgeben"
+
+#: archive.c:437
+msgid "store only"
+msgstr "nur speichern"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "schneller komprimieren"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "besser komprimieren"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "unterstützte Archivformate auflisten"
+
+#: 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 "Repository"
+
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "Archiv vom Remote-Repository <Repository> abrufen"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "Programm"
+
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
+
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Unerwartete Option --remote"
+
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Unerwartete Option --output"
+
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Unbekanntes Archivformat '%s'"
+
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argument für Format '%s' nicht unterstützt: -%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."
+
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Konnte Datei '%s' nicht öffnen"
+
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
+
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Keine binäre Suche mehr möglich!\n"
+
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s ist kein gültiger Commit-Name"
+
+#: 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 ""
+"Die Merge-Basis %s ist fehlerhaft.\n"
+"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
+
+#: bisect.c:737
+#, 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:742
+#, 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: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 ""
+"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: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 ""
+"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:798
+#, 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:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "ein %s Commit wird benötigt"
+
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "konnte Datei '%s' nicht erstellen"
+
+#: bisect.c:917
+#, 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"
+
+#: bisect.c:967
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s war sowohl %s als auch %s\n"
+
+#: bisect.c:975
+#, 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:994
+#, 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: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] "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:363
+#, 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:963 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: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 "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:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, 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:290
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "Ungültiger Farbwert: %.*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 "konnte %s nicht parsen"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s ist kein Commit!"
+
+#: commit.c:1514
+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:516
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Blob %s"
+
+#: config.c:520
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "Ungültige Konfigurationszeile %d in Datei %s"
+
+#: config.c:524
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
+
+#: config.c:528
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
+
+#: config.c:532
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
+
+#: config.c:536
+#, 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"
+
+#: config.c:655
+msgid "invalid unit"
+msgstr "Ungültige Einheit"
+
+#: 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"
+
+#: config.c:666
+#, 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:669
+#, 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"
+
+#: config.c:672
+#, 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"
+
+#: config.c:675
+#, 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"
+
+#: config.c:678
+#, 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"
+
+#: config.c:681
+#, 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
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
+
+#: config.c:852 config.c:863
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "ungültiger zlib Komprimierungsgrad %d"
+
+#: config.c:978
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "Ungültiger Modus für Objekterstellung: %s"
+
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr ""
+"Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
+
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr ""
+"Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
+
+#: config.c:1716
+#, 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
+#, 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
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s hat mehrere Werte"
+
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "Konnte '%s' nicht zu '%s' setzen."
+
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
+msgstr "Konnte '%s' nicht aufheben."
+
+#: 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:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Prüfe Konnektivität"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Konnte 'git rev-list' nicht ausführen"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "Fehler beim Schreiben nach rev-list"
+
+#: 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"
+
+#: date.c:103
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "vor %lu Sekunde"
+msgstr[1] "vor %lu Sekunden"
+
+#: date.c:110
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "vor %lu Minute"
+msgstr[1] "vor %lu Minuten"
+
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "vor %lu Stunde"
+msgstr[1] "vor %lu Stunden"
+
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "vor %lu Tag"
+msgstr[1] "vor %lu Tagen"
+
+#: date.c:130
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "vor %lu Woche"
+msgstr[1] "vor %lu Wochen"
+
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "vor %lu Monat"
+msgstr[1] "vor %lu Monaten"
+
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "vor %lu Jahr"
+msgstr[1] "vor %lu Jahren"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s, und %lu Monat"
+msgstr[1] "%s, und %lu Monaten"
+
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "vor %lu Jahr"
+msgstr[1] "vor %lu Jahren"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+
+#: 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:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
+
+#: diff.c:283
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
+
+#: diff.c:346
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
+"%s"
+
+#: diff.c:3087
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
+
+#: diff.c:3412
+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:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow erfordert genau eine Pfadspezifikation"
+
+#: diff.c:3665
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
+"%s"
+
+#: diff.c:3679
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
+
+#: diff.c:4700
+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:4703
+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:4706
+#, 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:1866
+msgid "failed to get kernel name and information"
+msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
+
+#: dir.c:1985
+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."
+
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: erwartete shallow-Liste"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: ACK/NAK erwartet, EOF bekommen"
+
+#: fetch-pack.c:243
+#, c-format
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK erwartet, '%s' bekommen"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc benötigt multi_ack_detailed"
+
+#: fetch-pack.c:381
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "Ungültige shallow-Zeile: %s"
+
+#: fetch-pack.c:387
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "Ungültige unshallow-Zeile: %s"
+
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "Objekt nicht gefunden: %s"
+
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "Fehler in Objekt: %s"
+
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "Kein shallow-Objekt gefunden: %s"
+
+#: fetch-pack.c:397
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
-"%s"
+msgid "expected shallow/unshallow, got %s"
+msgstr "shallow/unshallow erwartet, %s bekommen"
 
-#: diff.c:2997
+#: fetch-pack.c:436
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
+msgid "got %s %d %s"
+msgstr "%s %d %s bekommen"
 
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow erfordert genau eine Pfadspezifikation"
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "Ungültiger Commit %s"
+
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "Gebe auf"
 
-#: diff.c:3556
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "Fertig"
+
+#: fetch-pack.c:505
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
-"%s"
+msgid "got %s (%d) %s"
+msgstr "%s (%d) %s bekommen"
 
-#: diff.c:3570
+#: fetch-pack.c:551
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
+msgid "Marking %s as complete"
+msgstr "Markiere %s als vollständig"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
+#: fetch-pack.c:697
+#, c-format
+msgid "already have %s (%s)"
+msgstr "habe %s (%s) bereits"
 
-#: dir.c:2123
-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."
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: Fehler beim Starten des sideband demultiplexer"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "Protokollfehler: ungültiger Pack-Header"
+
+#: fetch-pack.c:799
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: konnte %s nicht starten"
+
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "%s fehlgeschlagen"
+
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "Fehler in sideband demultiplexer"
+
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Server unterstützt keine shallow-Clients"
+
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Server unterstützt multi_ack_detailed"
+
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Server unterstützt no-done"
+
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Server unterstützt multi_ack"
+
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Server unterstützt side-band-64k"
+
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Server unterstützt side-band"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Server unterstützt allow-tip-sha1-in-want"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Server unterstützt allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Server unterstützt ofs-delta"
+
+#: fetch-pack.c:890
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Server-Version ist %.*s"
+
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Server unterstützt kein --shallow-since"
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "konnte gpg nicht ausführen"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Server unterstützt kein --shallow-exclude"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg hat die Daten nicht akzeptiert"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Server unterstützt kein --deepen"
 
-#: gpg-interface.c:189
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "keine gemeinsamen Commits"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: Abholen fehlgeschlagen."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "kein übereinstimmender Remote-Branch"
+
+#: gpg-interface.c:185
 msgid "gpg failed to sign the data"
 msgstr "gpg beim Signieren der Daten fehlgeschlagen"
 
-#: gpg-interface.c:222
-#, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "konnte temporäre Datei '%s' nicht erstellen: %s"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "konnte temporäre Datei nicht erstellen"
 
-#: gpg-interface.c:225
+#: gpg-interface.c:217
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "Fehler beim Schreiben der Signatur nach '%s': %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
 
-#: grep.c:1718
+#: grep.c:1782
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte %s nicht lesen"
 
-#: grep.c:1735
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s': %s"
+msgid "failed to stat '%s'"
+msgstr "Konnte '%s' nicht lesen"
 
-#: grep.c:1746
+#: grep.c:1810
 #, c-format
-msgid "'%s': short read %s"
-msgstr "'%s': read() zu kurz %s"
+msgid "'%s': short read"
+msgstr "'%s': read() zu kurz"
 
-#: help.c:205
+#: help.c:203
 #, c-format
 msgid "available git commands in '%s'"
 msgstr "Vorhandene Git-Befehle in '%s'"
 
-#: help.c:212
+#: help.c:210
 msgid "git commands available from elsewhere on your $PATH"
 msgstr "Vorhandene Git-Befehle anderswo in Ihrem $PATH"
 
-#: help.c:244
+#: help.c:241
 msgid "These are common Git commands used in various situations:"
 msgstr "Allgemeine Git-Befehle, verwendet in verschiedenen Situationen:"
 
-#: help.c:309
+#: help.c:306
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
@@ -651,11 +1818,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:361
 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:383
 #, c-format
 msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -664,17 +1831,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:388
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "Automatische Ausführung in %0.1f Sekunden ..."
 
-#: help.c:400
+#: help.c:395
 #, 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:464
+#: help.c:399 help.c:465
 msgid ""
 "\n"
 "Did you mean this?"
@@ -688,92 +1855,138 @@ msgstr[1] ""
 "\n"
 "Haben Sie eines von diesen gemeint?"
 
-#: help.c:460
+#: help.c:461
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %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"
+"*** 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"
+
+#: 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 ""
+"Konnte '%s.lock' nicht erstellen: %s.\n"
+"\n"
+"Ein anderer Git-Prozess scheint in diesem Repository ausgeführt\n"
+"zu werden, zum Beispiel ein noch offener Editor von 'git commit'.\n"
+"Bitte stellen Sie sicher, dass alle Prozesse beendet wurden und\n"
+"versuchen Sie es erneut. Falls es immer noch fehlschlägt, könnte\n"
+"ein früherer Git-Prozess in diesem Repository abgestürzt sein:\n"
+"Löschen Sie die Datei manuell um fortzufahren."
+
+#: lockfile.c:160
+#, c-format
+msgid "Unable to create '%s.lock': %s"
+msgstr "Konnte '%s.lock' nicht erstellen: %s"
+
 #: merge.c:41
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
+#: 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 "Konnte neue Index-Datei nicht schreiben."
 
-#: merge-recursive.c:189
-#, c-format
+#: merge-recursive.c:209
 msgid "(bad commit)\n"
 msgstr "(ungültiger Commit)\n"
 
-#: merge-recursive.c:209
+#: merge-recursive.c:231
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
 
-#: merge-recursive.c:270
+#: merge-recursive.c:301
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
 
-#: merge-recursive.c:689
+#: merge-recursive.c:720
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:700
+#: merge-recursive.c:731
 #, 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:714 merge-recursive.c:735
+#: merge-recursive.c:745 merge-recursive.c:764
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:725
+#: merge-recursive.c:754
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:767
+#: merge-recursive.c:798
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:790 builtin/clone.c:374
+#: merge-recursive.c:822
 #, c-format
-msgid "failed to open '%s'"
-msgstr "Fehler beim Öffnen von '%s'"
+msgid "failed to open '%s': %s"
+msgstr "Fehler beim Öffnen von '%s': %s"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:833
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'"
+msgid "failed to symlink '%s': %s"
+msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s"
 
-#: merge-recursive.c:801
+#: merge-recursive.c:838
 #, 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:939
+#: merge-recursive.c:978
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:982
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "nicht unterstützter Objekttyp im Verzeichnis"
-
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -782,7 +1995,7 @@ 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:1040 merge-recursive.c:1053
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -791,20 +2004,20 @@ 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:1094
+#: merge-recursive.c:1143
 msgid "rename"
 msgstr "umbenennen"
 
-#: merge-recursive.c:1094
+#: merge-recursive.c:1143
 msgid "renamed"
 msgstr "umbenannt"
 
-#: merge-recursive.c:1150
+#: merge-recursive.c:1200
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu"
 
-#: merge-recursive.c:1172
+#: merge-recursive.c:1225
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -813,151 +2026,159 @@ msgstr ""
 "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
 "und \"%s\"->\"%s\" in Branch \"%s\"%s"
 
-#: merge-recursive.c:1177
+#: merge-recursive.c:1230
 msgid " (left unresolved)"
 msgstr " (bleibt unaufgelöst)"
 
-#: merge-recursive.c:1231
+#: merge-recursive.c:1292
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s "
 "in %s"
 
-#: merge-recursive.c:1261
+#: merge-recursive.c:1325
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
 
-#: merge-recursive.c:1460
+#: merge-recursive.c:1531
 #, 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:1470
+#: merge-recursive.c:1546
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1526
+#: merge-recursive.c:1610
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1529
+#: merge-recursive.c:1613
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1676
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1683
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1718
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1732
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatischer Merge von %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
+#: merge-recursive.c:1736 git-submodule.sh:924
 msgid "submodule"
 msgstr "Submodul"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1737
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1831
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1857
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1768
+#: merge-recursive.c:1863
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1773
+#: merge-recursive.c:1868
 #, 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:1783
+#: merge-recursive.c:1877
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Fataler Merge-Fehler. Sollte nicht passieren."
-
-#: merge-recursive.c:1819
+#: merge-recursive.c:1914
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1828
+#: merge-recursive.c:1923
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "unverarbeiteter Pfad??? %s"
-
-#: merge-recursive.c:1906
+#: merge-recursive.c:2006
 msgid "Merging:"
 msgstr "Merge:"
 
-#: merge-recursive.c:1919
+#: merge-recursive.c:2019
 #, 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:1956
+#: merge-recursive.c:2058
 msgid "merge returned no commit"
 msgstr "Merge hat keinen Commit zurückgegeben"
 
-#: merge-recursive.c:2013
+#: merge-recursive.c:2121
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2024 builtin/merge.c:646
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
 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 ""
@@ -986,28 +2207,28 @@ msgstr "Ungültiger %s Wert: '%s'"
 msgid "unable to parse object: %s"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: parse-options.c:570
+#: parse-options.c:572
 msgid "..."
 msgstr "..."
 
-#: parse-options.c:588
+#: parse-options.c:590
 #, c-format
 msgid "usage: %s"
 msgstr "Verwendung: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:592
+#: parse-options.c:594
 #, c-format
 msgid "   or: %s"
 msgstr "      oder: %s"
 
-#: parse-options.c:595
+#: parse-options.c:597
 #, c-format
 msgid "    %s"
 msgstr "    %s"
 
-#: parse-options.c:629
+#: parse-options.c:631
 msgid "-NUM"
 msgstr "-NUM"
 
@@ -1016,7 +2237,7 @@ msgstr "-NUM"
 msgid "malformed object name '%s'"
 msgstr "fehlerhafter Objekt-Name '%s'"
 
-#: path.c:752
+#: path.c:826
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Konnte Gruppenschreibrecht für %s nicht setzen."
@@ -1075,12 +2296,20 @@ 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:408
+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:440
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "Pfadspezifikation '%s' ist hinter einer symbolischen Verknüpfung"
 
-#: pathspec.c:442
+#: pathspec.c:449
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
@@ -1088,15 +2317,11 @@ msgstr ""
 ":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
 "Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
 
-#: pretty.c:969
+#: pretty.c:971
 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:1315
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
@@ -1105,7 +2330,7 @@ msgstr ""
 "index.version gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1325
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -1114,23 +2339,22 @@ msgstr ""
 "GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
 "Verwende Version %i"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: refs.c:576 builtin/merge.c:840
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: refs/files-backend.c:2374
+#: refs/files-backend.c:2481
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "Konnte Referenz %s nicht entfernen: %s"
 
-#: refs/files-backend.c:2377
+#: refs/files-backend.c:2484
 #, c-format
 msgid "could not delete references: %s"
 msgstr "Konnte Referenzen nicht entfernen: %s"
 
-#: refs/files-backend.c:2386
+#: refs/files-backend.c:2493
 #, c-format
 msgid "could not remove reference %s"
 msgstr "Konnte Referenz %s nicht löschen"
@@ -1259,32 +2483,32 @@ msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
 msgid "ignoring broken ref %s"
 msgstr "Ignoriere fehlerhafte Referenz %s"
 
-#: ref-filter.c:1651
+#: ref-filter.c:1633
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "Format: %%(end) Atom fehlt"
 
-#: ref-filter.c:1705
+#: ref-filter.c:1687
 #, c-format
 msgid "malformed object name %s"
 msgstr "Missgebildeter Objektname %s"
 
-#: remote.c:745
+#: 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:749
+#: remote.c:750
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s folgt üblicherweise %s, nicht %s"
 
-#: remote.c:753
+#: remote.c:754
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s folgt sowohl %s als auch %s"
 
-#: remote.c:761
+#: remote.c:762
 msgid "Internal error"
 msgstr "Interner Fehler"
 
@@ -1394,38 +2618,38 @@ msgstr ""
 "  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
 "zusammenzuführen)\n"
 
-#: revision.c:2131
+#: revision.c:2158
 msgid "your current branch appears to be broken"
 msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: revision.c:2134
+#: revision.c:2161
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: revision.c:2328
+#: revision.c:2355
 msgid "--first-parent is incompatible with --bisect"
 msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
 
-#: run-command.c:92
+#: run-command.c:106
 msgid "open /dev/null failed"
 msgstr "Öffnen von /dev/null fehlgeschlagen"
 
-#: run-command.c:94
+#: run-command.c:108
 #, c-format
 msgid "dup2(%d,%d) failed"
 msgstr "dup2(%d,%d) fehlgeschlagen"
 
-#: send-pack.c:295
+#: send-pack.c:297
 msgid "failed to sign the push certificate"
 msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
 
-#: send-pack.c:404
+#: send-pack.c:410
 msgid "the receiving end does not support --signed push"
 msgstr ""
 "die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
 
-#: send-pack.c:406
+#: send-pack.c:412
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
@@ -1433,11 +2657,23 @@ msgstr ""
 "kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
 "Versand (\"--signed push\") unterstützt"
 
-#: send-pack.c:418
+#: send-pack.c:424
 msgid "the receiving end does not support --atomic push"
 msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
 
-#: sequencer.c:174
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "die Gegenseite unterstützt keine Push-Optionen"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "Revert"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "Cherry-Pick"
+
+#: sequencer.c:228
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
@@ -1445,7 +2681,7 @@ msgstr ""
 "nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'"
 
-#: sequencer.c:177
+#: sequencer.c:231
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
@@ -1455,1997 +2691,1942 @@ msgstr ""
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
 "'git commit' ein"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
-#, c-format
-msgid "Could not write to %s"
-msgstr "Konnte nicht nach %s schreiben"
-
-#: sequencer.c:193
-#, c-format
-msgid "Error wrapping up %s"
-msgstr "Fehler bei Nachbereitung von %s"
-
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr ""
-"Ihre lokalen Änderungen würden von \"cherry-pick\" überschrieben werden."
-
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Ihre lokalen Änderungen würden von \"revert\" überschrieben werden."
-
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr ""
-"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
-
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Konnte neue Index-Datei nicht schreiben"
-
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Konnte Commit von HEAD nicht auflösen\n"
-
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
-
-#: sequencer.c:390
-#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Konnte Commit %s nicht parsen\n"
-
-#: sequencer.c:395
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Konnte Eltern-Commit %s nicht parsen\n"
-
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Ihre Index-Datei ist nicht zusammengeführt."
-
-#: sequencer.c:479
-#, 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."
-
-#: sequencer.c:487
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Commit %s hat keinen Elternteil %d"
-
-#: sequencer.c:491
-#, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
-
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: kann Eltern-Commit %s nicht parsen"
-
-#: sequencer.c:508
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Kann keine Commit-Beschreibung für %s bekommen"
-
-#: sequencer.c:594
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
-
-#: sequencer.c:595
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "Konnte %s... (%s) nicht anwenden"
-
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "leere Menge von Commits übergeben"
-
-#: sequencer.c:638
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: Fehler beim Lesen des Index"
-
-#: sequencer.c:642
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: Fehler beim Aktualisieren des Index"
-
-#: sequencer.c:702
-#, c-format
-msgid "Cannot %s during a %s"
-msgstr "Kann %s nicht während eines %s durchführen"
-
-#: sequencer.c:724
-#, c-format
-msgid "Could not parse line %d."
-msgstr "Konnte Zeile %d nicht parsen."
-
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Keine Commits geparst."
-
-#: sequencer.c:741
-#, c-format
-msgid "Could not open %s"
-msgstr "Konnte %s nicht öffnen"
-
-#: sequencer.c:745
-#, c-format
-msgid "Could not read %s."
-msgstr "Konnte %s nicht lesen."
-
-#: sequencer.c:752
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Unbenutzbares Instruktionsblatt: %s"
-
-#: sequencer.c:782
-#, c-format
-msgid "Invalid key: %s"
-msgstr "Ungültiger Schlüssel: %s"
-
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Ungültiger Wert für %s: %s"
-
-#: sequencer.c:795
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Fehlerhaftes Optionsblatt: %s"
-
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
-
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
-
-#: sequencer.c:819
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
+msgid "could not lock '%s'"
+msgstr "Konnte '%s' nicht sperren"
 
-#: sequencer.c:835 sequencer.c:917
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Fehler beim Einpacken von %s."
-
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
-
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "kann HEAD nicht auflösen"
-
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+msgid "could not write to '%s'"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: sequencer.c:251
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "Kann %s nicht öffnen: %s"
+msgid "could not write eol to '%s'"
+msgstr "Konnte EOL nicht nach '%s' schreiben."
 
-#: sequencer.c:881
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "Kann %s nicht lesen: %s"
+msgid "failed to finalize '%s'."
+msgstr "Fehler beim Fertigstellen von '%s'."
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "Unerwartetes Dateiende"
-
-#: sequencer.c:888
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
+msgid "could not read '%s'"
+msgstr "Konnte '%s' nicht lesen"
 
-#: sequencer.c:910
+#: sequencer.c:305
 #, c-format
-msgid "Could not format %s."
-msgstr "Konnte %s nicht formatieren."
+msgid "your local changes would be overwritten by %s."
+msgstr "Ihre lokalen Änderungen würden durch den %s überschrieben werden."
 
-#: sequencer.c:1055
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr ""
+"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
 
-#: sequencer.c:1058
+#: sequencer.c:324
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: ungültiger Commit"
-
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
+msgid "%s: fast-forward"
+msgstr "%s: Vorspulen"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen."
-
-#: setup.c:246
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "failed to read %s"
-msgstr "Fehler beim Lesen von %s"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Konnte neue Index-Datei nicht schreiben"
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "Konnte HEAD-Commit nicht auflösen\n"
 
-#: sha1_file.c:2459
-#, 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?)"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
 
-#: sha1_file.c:2463
+#: sequencer.c:483
 #, 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?)"
-
-#: 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"
+"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 checkout -b $br $(git rev-parse ...)\n"
+"  git commit --amend %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\""
-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"
+"If they are meant to go into a new commit, run:\n"
 "\n"
-"  git checkout -b $br $(git rev-parse ...)\n"
+"  git commit %s\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."
-
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+"In both cases, once you're done, continue with:\n"
+"\n"
+"  git rebase --continue\n"
 msgstr ""
-"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n"
-"Sie zuerst die Konflikte auf"
+"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"
+"  git commit --amend %s\n"
+"\n"
+"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"Im Anschluss führen Sie zum Fortfahren aus:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: submodule.c:66 submodule.c:100
+#: sequencer.c:567
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
+msgid "could not parse commit %s\n"
+msgstr "Konnte Commit %s nicht parsen\n"
 
-#: submodule.c:74
+#: sequencer.c:572
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
+msgid "could not parse parent commit %s\n"
+msgstr "Konnte Eltern-Commit %s nicht parsen\n"
+
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "Ihre Index-Datei ist nicht zusammengeführt."
 
-#: submodule.c:107
+#: sequencer.c:675
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
+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."
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "Commit %s hat keinen Eltern-Commit %d"
 
-#: trailer.c:237
+#: sequencer.c:687
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "unbekannter Wert '%s' für Schlüssel %s"
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: kann Eltern-Commit %s nicht parsen"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: sequencer.c:705
 #, c-format
-msgid "more than one %s"
-msgstr "mehr als ein %s"
+msgid "cannot get commit message for %s"
+msgstr "Kann keine Commit-Beschreibung für %s bekommen."
 
-#: trailer.c:582
+#: sequencer.c:797
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "leerer Anhang-Token in Anhang '%.*s'"
+msgid "could not revert %s... %s"
+msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen"
 
-#: trailer.c:702
+#: sequencer.c:798
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
+msgid "could not apply %s... %s"
+msgstr "Konnte %s... (%s) nicht anwenden"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "konnte nicht von der Standard-Eingabe lesen"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "leere Menge von Commits übergeben"
 
-#: trailer.c:857 builtin/am.c:42
+#: sequencer.c:843
 #, c-format
-msgid "could not stat %s"
-msgstr "Konnte '%s' nicht lesen"
+msgid "git %s: failed to read the index"
+msgstr "git %s: Fehler beim Lesen des Index"
 
-#: trailer.c:859
+#: sequencer.c:850
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "Datei '%s' ist keine reguläre Datei"
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: Fehler beim Aktualisieren des Index"
 
-#: trailer.c:861
+#: sequencer.c:944
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
+msgid "invalid line %d: %.*s"
+msgstr "Ungültige Zeile %d: %.*s"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "konnte temporäre Datei '%s' nicht öffnen"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "Keine Commits geparst."
 
-#: trailer.c:912
+#: sequencer.c:966
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "konnte temporäre Datei nicht zu %s umbenennen"
+msgid "could not read '%s'."
+msgstr "Konnte '%s' nicht lesen."
 
-#: transport-helper.c:1041
+#: sequencer.c:972
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Konnte Referenz %s nicht lesen."
+msgid "unusable instruction sheet: '%s'"
+msgstr "Unbenutzbares Instruktionsblatt: '%s'"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "Checke Dateien aus"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: sequencer.c:1028
 #, 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 "invalid key: %s"
+msgstr "Ungültiger Schlüssel: %s"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "eine 'file:' URL darf keine Portnummer enthalten"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "Ungültiger Wert für %s: %s"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "Hostname enthält ungültige Zeichen"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "Fehlerhaftes Optionsblatt: '%s'"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "ungültige Portnummer"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "ungültiges '..' Pfadsegment"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: wrapper.c:222 wrapper.c:381
+#: sequencer.c:1106
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
+msgid "could not create sequencer directory '%s'"
+msgstr "Konnte \"sequencer\"-Verzeichnis '%s' nicht erstellen."
 
-#: wrapper.c:224 wrapper.c:383
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "Konnte HEAD nicht sperren"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "Konnte '%s' nicht zum Lesen öffnen."
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
+
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "kann HEAD nicht auflösen"
 
-#: wrapper.c:611
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
+
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "konnte nicht auf '%s' zugreifen: %s"
+msgid "cannot open '%s'"
+msgstr "kann '%s' nicht öffnen"
 
-#: wrapper.c:632
+#: sequencer.c:1177
 #, c-format
-msgid "unable to access '%s'"
-msgstr "konnte nicht auf '%s' zugreifen"
+msgid "cannot read '%s': %s"
+msgstr "Kann '%s' nicht lesen: %s"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "Unerwartetes Dateiende"
 
-#: wrapper.c:667
+#: sequencer.c:1184
 #, c-format
-msgid "could not open %s for writing"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
 
-#: wrapper.c:678 builtin/am.c:410
+#: sequencer.c:1354
 #, c-format
-msgid "could not write to %s"
-msgstr "Konnte nicht nach '%s' schreiben."
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
 
-#: wrapper.c:684
+#: sequencer.c:1358
 #, c-format
-msgid "could not close %s"
-msgstr "Konnte '%s' nicht schließen."
+msgid "%s: bad revision"
+msgstr "%s: ungültiger Commit"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Nicht zusammengeführte Pfade:"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
-#: wt-status.c:176 wt-status.c:203
+#: setup.c:160
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
-"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
-
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgid ""
+"%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 rm --cached <Datei>...\" zum Entfernen aus der Staging-"
-"Area)"
+"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
+"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
+"nicht existieren."
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
+#: 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 ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+"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:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: 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 ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung entsprechend zu "
-"markieren)"
+"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:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-"  (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)"
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "zum Commit vorgemerkte Änderungen:"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "Unbekannte Repository-Erweiterungen gefunden:"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
+#: setup.c:762
+#, 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:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-"  (benutzen Sie \"git add <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
+#: 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"
 
-#: wt-status.c:221
-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)"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
 
-#: wt-status.c:222
+#: setup.c:920
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"Not a git repository (or any parent up to mount point %s)\n"
+"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
 msgstr ""
-"  (benutzen Sie \"git checkout -- <Datei>...\", um die Änderungen im "
-"Arbeitsverzeichnis zu verwerfen)"
+"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt "
+"%s)\n"
+"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
 
-#: wt-status.c:224
-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)"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Kann nicht in Verzeichnis '%s/..' wechseln"
 
-#: wt-status.c:236
+#: setup.c:989
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid ""
+"Problem with core.sharedRepository filemode value (0%.3o).\n"
+"The owner of files must always have read and write permissions."
 msgstr ""
-"  (benutzen Sie \"git %s <Datei>...\", um die Änderungen zum Commit "
-"vorzumerken)"
-
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "beide gelöscht:"
-
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "von uns hinzugefügt:"
-
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "von denen gelöscht:"
-
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "von denen hinzugefügt:"
-
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "von uns gelöscht:"
-
-#: wt-status.c:261
-msgid "both added:"
-msgstr "von beiden hinzugefügt:"
-
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "von beiden geändert:"
+"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:265
+#: sha1_file.c:473
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "Bug: unbehandelter Unmerged-Status %x"
-
-#: wt-status.c:273
-msgid "new file:"
-msgstr "neue Datei:"
-
-#: wt-status.c:275
-msgid "copied:"
-msgstr "kopiert:"
-
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "gelöscht:"
-
-#: wt-status.c:279
-msgid "modified:"
-msgstr "geändert:"
-
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "umbenannt:"
+msgid "path '%s' does not exist"
+msgstr "Pfad '%s' existiert nicht"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "Typänderung:"
+#: sha1_file.c:499
+#, 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:285
-msgid "unknown:"
-msgstr "unbekannt:"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "nicht gemerged:"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "neue Commits, "
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "geänderter Inhalt, "
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "unversionierter Inhalt, "
+#: sha1_file.c:2592
+#, 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:390
+#: sha1_file.c:2596
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "Fehler: unbehandelter Differenz-Status %c"
+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:754
-msgid "Submodules changed but not updated:"
-msgstr "Submodule geändert, aber nicht aktualisiert:"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "Kurzer SHA-1 %s ist mehrdeutig."
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Änderungen in Submodul zum Committen:"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Die Kandidaten sind:"
 
-#: wt-status.c:837
+#: sha1_name.c:578
 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."
+"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:948
-msgid "You have unmerged paths."
-msgstr "Sie haben nicht zusammengeführte Pfade."
+#: submodule.c:64 submodule.c:98
+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:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
+#: 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"
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Eine \"am\"-Sitzung ist im Gange."
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "Der aktuelle Patch ist leer."
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt"
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "Ungültiger Wert für %s"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "Ausführen des Anhang-Befehls '%s' fehlgeschlagen"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
-"wiederherzustellen)"
+#: 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 "unbekannter Wert '%s' für Schlüssel %s"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Keine Befehle ausgeführt."
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mehr als ein %s"
 
-#: wt-status.c:1108
+#: trailer.c:672
 #, 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 "empty trailer token in trailer '%.*s'"
+msgstr "leerer Anhang-Token in Anhang '%.*s'"
 
-#: wt-status.c:1119
+#: trailer.c:695
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (mehr Informationen in Datei %s)"
+msgid "could not read input file '%s'"
+msgstr "Konnte Eingabe-Datei '%s' nicht lesen"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Keine Befehle verbleibend."
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "konnte nicht von der Standard-Eingabe lesen"
 
-#: wt-status.c:1127
+#: trailer.c:929 builtin/am.c:44
 #, 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):"
-
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
+msgid "could not stat %s"
+msgstr "Konnte '%s' nicht lesen"
 
-#: wt-status.c:1148
+#: trailer.c:931
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
+msgid "file %s is not a regular file"
+msgstr "Datei '%s' ist keine reguläre Datei"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Sie sind gerade beim Rebase."
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
-"aus)"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "konnte temporäre Datei '%s' nicht öffnen"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
+#: trailer.c:983
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "konnte temporäre Datei nicht zu %s umbenennen"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr ""
-"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
-"auszuchecken)"
+#: 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:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: ungültige --depth Option '%s'"
 
-#: wt-status.c:1181
+#: transport.c:817
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
-"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
-"'%s' im Gange ist."
-
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
+"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
+"Remote-Repository gefunden wurden:\n"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+#: transport.c:821
+#, 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 ""
-"  (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
-"continue\" aus)"
+"\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"
+
+#: transport.c:829
+msgid "Aborting."
+msgstr "Abbruch."
 
-#: wt-status.c:1193
+#: transport-helper.c:1075
 #, 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 "Could not read ref %s"
+msgstr "Konnte Referenz %s nicht lesen."
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "Sie editieren gerade einen Commit während eines Rebase."
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "zu kurzes Tree-Objekt"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
-"nachzubessern)"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "fehlerhafter Modus in Tree-Eintrag"
 
-#: wt-status.c:1203
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "leerer Dateiname in Tree-Eintrag"
+
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "zu kurze Tree-Datei"
+
+#: unpack-trees.c:64
+#, 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 checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"  (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
-"abgeschlossen sind)"
+"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:1213
+#: unpack-trees.c:66
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
-
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
-"\" aus)"
+"Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
+"überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: 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 ""
-"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
+"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:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: unpack-trees.c:71
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"  (benutzen Sie \"git cherry-pick --abort\", um die Cherry-Pick-Operation "
-"abzubrechen)"
+"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1232
+#: unpack-trees.c:74
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Sie sind gerade an einem Revert von Commit '%s'."
-
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --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 ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
-"aus)"
-
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
+"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:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: unpack-trees.c:76
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
-"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
+"Ihre lokalen Änderungen würden durch %s überschrieben werden.\n"
+"%%s"
 
-#: wt-status.c:1253
+#: unpack-trees.c:81
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
-
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Sie sind gerade bei einer binären Suche."
-
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
 msgstr ""
-"  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
-"zurückzukehren)"
-
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "Auf Branch "
-
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "interaktives Rebase im Gange; auf "
-
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "Rebase im Gange; auf "
-
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD losgelöst bei "
-
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD losgelöst von "
+"Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
+"Dateien in diesen Verzeichnissen verloren gehen:\n"
+"%s"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Im Moment auf keinem Branch."
+#: 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 ""
+"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:1474
-msgid "Initial commit"
-msgstr "Initialer Commit"
+#: unpack-trees.c:87
+#, 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"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Unversionierte Dateien"
+#: 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 ""
+"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:1490
-msgid "Ignored files"
-msgstr "Ignorierte Dateien"
+#: unpack-trees.c:92
+#, 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"
 
-#: wt-status.c:1494
+#: unpack-trees.c:95
 #, 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 %s:\n"
+"%%sPlease move or remove them before you %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')."
+"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:1500
+#: unpack-trees.c:97
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Unversionierte Dateien nicht aufgelistet%s"
+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:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
+#: 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."
+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."
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Keine Änderungen"
+#: unpack-trees.c:104
+#, 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"
 
-#: wt-status.c:1513
+#: unpack-trees.c:107
 #, 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 merge:\n"
+"%%sPlease move or remove them before you merge."
 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 Merge überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
 
-#: wt-status.c:1516
+#: unpack-trees.c:109
 #, 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 overwritten by merge:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1519
+#: unpack-trees.c:112
 #, 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 overwritten by %s:\n"
+"%%sPlease move or remove them before you %s."
 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 %s überschrieben werden:\n"
+"%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
-#: wt-status.c:1522
+#: unpack-trees.c:114
 #, 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 overwritten by %s:\n"
+"%%s"
+msgstr ""
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
+"den\n"
+"%s überschrieben werden:\n"
+"%%s"
 
-#: wt-status.c:1525
+#: unpack-trees.c:121
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Eintrag '%s' überschneidet sich mit '%s'. Kann nicht verbinden."
+
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
 msgstr ""
-"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
-"add\" zum Versionieren)\n"
+"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind "
+"nicht\n"
+"aktuell:\n"
+"%s"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: unpack-trees.c:126
 #, c-format
-msgid "nothing to commit\n"
-msgstr "nichts zu committen\n"
+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"
 
-#: wt-status.c:1531
+#: unpack-trees.c:128
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
-"anzuzeigen)\n"
+"Die folgenden Dateien im Arbeitsverzeichnis würden durch die Aktualisierung\n"
+"über einen partiellen Checkout entfernt werden:\n"
+"%s"
 
-#: wt-status.c:1535
+#: unpack-trees.c:205
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
+msgid "Aborting\n"
+msgstr "Abbruch\n"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Initialer Commit auf "
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "Checke Dateien aus"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (kein Branch)"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "entfernt"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "ungültige Escape-Sequenz %XX"
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "hinterher "
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "fehlender Host und Schema ist nicht 'file:'"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "voraus "
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "eine 'file:' URL darf keine Portnummer enthalten"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "Konnte '%s' nicht entfernen."
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "Hostname enthält ungültige Zeichen"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "ungültige Portnummer"
 
-#: builtin/add.c:65
-#, c-format
-msgid "unexpected diff status %c"
-msgstr "unerwarteter Differenz-Status %c"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "ungültiges '..' Pfadsegment"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "Aktualisierung der Dateien fehlgeschlagen"
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "Fehler beim Lesen von '%s'"
 
-#: builtin/add.c:80
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "remove '%s'\n"
-msgstr "lösche '%s'\n"
+msgid "could not open '%s' for reading and writing"
+msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr ""
-"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
+#: 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:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Konnte den Index nicht lesen"
+#: 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 "Konnte '%s' nicht zum Lesen öffnen."
 
-#: builtin/add.c:205
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Konnte '%s' nicht zum Schreiben öffnen."
+msgid "unable to access '%s'"
+msgstr "konnte nicht auf '%s' zugreifen"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Konnte Patch nicht schreiben"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "Bearbeitung des Patches fehlgeschlagen"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "Konnte nicht nach '%s' schreiben."
 
-#: builtin/add.c:215
+#: wrapper.c:660
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Konnte Verzeichnis '%s' nicht lesen"
+msgid "could not close %s"
+msgstr "Konnte '%s' nicht schließen."
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Leerer Patch. Abgebrochen."
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Nicht zusammengeführte Pfade:"
 
-#: builtin/add.c:222
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Konnte '%s' nicht anwenden."
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr ""
+"  (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
-"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
-"ignoriert:\n"
+"  (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-"
+"Area)"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "Probelauf"
+#: 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:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "erweiterte Ausgaben"
+#: wt-status.c:186 wt-status.c:190
+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)"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "interaktives Auswählen"
+#: 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:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "Blöcke interaktiv auswählen"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "zum Commit vorgemerkte Änderungen:"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "aktuelle Unterschiede editieren und anwenden"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
+#: 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:256
-msgid "update tracked files"
-msgstr "versionierte Dateien aktualisieren"
+#: 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/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll"
+#: 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/add.c:258
-msgid "add changes from all tracked and untracked files"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
-"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
+"  (committen oder verwerfen Sie den unversionierten oder geänderten Inhalt "
+"in den Submodulen)"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)"
+#: wt-status.c:238
+#, c-format
+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/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "nichts hinzufügen, nur den Index aktualisieren"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "beide gelöscht:"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr ""
-"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
-"konnten"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "von uns hinzugefügt:"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "von denen gelöscht:"
 
-#: builtin/add.c:287
-#, 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"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "von denen hinzugefügt:"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "Hinzufügen von Dateien fehlgeschlagen"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "von uns gelöscht:"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
+#: wt-status.c:263
+msgid "both added:"
+msgstr "von beiden hinzugefügt:"
+
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "von beiden geändert:"
+
+#: wt-status.c:275
+msgid "new file:"
+msgstr "neue Datei:"
 
-#: builtin/add.c:337
-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."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "kopiert:"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "gelöscht:"
 
-#: builtin/add.c:353
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Meinten Sie vielleicht 'git add .'?\n"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "geändert:"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "Index-Datei beschädigt"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "umbenannt:"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Konnte neue Index-Datei nicht schreiben."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "Typänderung:"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
-#, c-format
-msgid "could not read '%s'"
-msgstr "Konnte '%s' nicht lesen"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "unbekannt:"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "konnte Autor-Skript nicht parsen"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "nicht gemerged:"
 
-#: builtin/am.c:507
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "neue Commits, "
 
-#: builtin/am.c:548 builtin/notes.c:300
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Fehlerhafte Eingabezeile: '%s'."
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "geänderter Inhalt, "
 
-#: builtin/am.c:585 builtin/notes.c:315
-#, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "unversionierter Inhalt, "
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "\"fseek\" fehlgeschlagen"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Submodule geändert, aber nicht aktualisiert:"
 
-#: builtin/am.c:772 builtin/am.c:860
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "Konnte '%s' nicht zum Lesen öffnen: %s"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Änderungen in Submodul zum Committen:"
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "Konnte '%s' nicht zum Schreiben öffnen: %s"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"Ändern Sie nicht die obige Zeile.\n"
+"Alles unterhalb von ihr wird entfernt."
 
-#: builtin/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "konnte Patch '%s' nicht parsen"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Sie haben nicht zusammengeführte Pfade."
 
-#: builtin/am.c:853
-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:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "ungültiger Zeitstempel"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "Ungültige \"Date\"-Zeile"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "Ungültiger Offset in der Zeitzone"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Patch-Formaterkennung fehlgeschlagen."
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Eine \"am\"-Sitzung ist im Gange."
 
-#: builtin/am.c:1001 builtin/clone.c:378
-#, c-format
-msgid "failed to create directory '%s'"
-msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Der aktuelle Patch ist leer."
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Fehler beim Aufteilen der Patches."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr ""
+"  (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "Konnte Index-Datei nicht schreiben."
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
-"Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus."
+"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
+"wiederherzustellen)"
+
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Keine Befehle ausgeführt."
 
-#: builtin/am.c:1189
+#: wt-status.c:1175
 #, 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."
+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:1190
+#: wt-status.c:1186
 #, 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."
+msgid "  (see more in file %s)"
+msgstr "  (mehr Informationen in Datei %s)"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Patch ist leer. War dessen Aufteilung falsch?"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Keine Befehle verbleibend."
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: wt-status.c:1194
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "Ungültige Identifikationszeile: %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:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)"
 
-#: builtin/am.c:1429
+#: wt-status.c:1215
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "Konnte Commit '%s' nicht parsen."
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
 
-#: builtin/am.c:1631
-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:1220
+msgid "You are currently rebasing."
+msgstr "Sie sind gerade beim Rebase."
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
-"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
-"nachzustellen ..."
+"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
+"aus)"
 
-#: builtin/am.c:1652
-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."
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)"
 
-#: builtin/am.c:1658
-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:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr ""
+"  (benutzen Sie \"git rebase --abort\", um den ursprünglichen Branch "
+"auszuchecken)"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Merge der Änderungen fehlgeschlagen."
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
+#: wt-status.c:1248
+#, 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."
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "auf leere Historie anwenden"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "Fehler beim Schreiben des Commit-Objektes."
+#: wt-status.c:1256
+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:1749 builtin/am.c:1753
+#: wt-status.c:1260
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "Kann nicht fortsetzen: %s existiert nicht"
-
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
-"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
-"Terminal verbunden ist."
+"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
+"'%s'."
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "Commit-Beschreibung ist:"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Sie editieren gerade einen Commit während eines Rebase."
 
-#. 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:1784
-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:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+"  (benutzen Sie \"git commit --amend\", um den aktuellen Commit "
+"nachzubessern)"
 
-#: builtin/am.c:1834
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
+#: wt-status.c:1270
+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:1869 builtin/am.c:1941
+#: wt-status.c:1280
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Wende an: %.*s"
+msgid "You are currently cherry-picking commit %s."
+msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Keine Änderungen -- Patches bereits angewendet."
+#: wt-status.c:1285
+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:1893
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
 
-#: builtin/am.c:1899
+#: wt-status.c:1290
+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)"
+
+#: wt-status.c:1299
 #, 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 reverting commit %s."
+msgstr "Sie sind gerade an einem Revert von Commit '%s'."
 
-#: builtin/am.c:1944
-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."
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
 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."
+"  (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
+"aus)"
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
+
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
-"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
-"Haben Sie vergessen 'git add' zu benutzen?"
+"  (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1320
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Konnte Objekt '%s' nicht parsen."
+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:2111
-msgid "failed to clean index"
-msgstr "Fehler beim Bereinigen des Index"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Sie sind gerade bei einer binären Suche."
 
-#: builtin/am.c:2145
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to 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 bisect reset\", um zum ursprünglichen Branch "
+"zurückzukehren)"
 
-#: builtin/am.c:2206
-#, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Ungültiger Wert für --patch-format: %s"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "Auf Branch "
 
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<Optionen>] [(<mbox>|<E-Mail-Verzeichnis>)...]"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "interaktives Rebase im Gange; auf "
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "Rebase im Gange; auf "
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "interaktiv ausführen"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD losgelöst bei "
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "historische Option -- kein Effekt"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD losgelöst von "
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Im Moment auf keinem Branch."
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "weniger Ausgaben"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Initialer Commit"
 
-#: builtin/am.c:2253
-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:1574
+msgid "Untracked files"
+msgstr "Unversionierte Dateien"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "nach UTF-8 umkodieren (Standard)"
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Ignorierte Dateien"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "-k an git-mailinfo übergeben"
+#: 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 ""
+"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:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "-b an git-mailinfo übergeben"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Unversionierte Dateien nicht aufgelistet%s"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "-m an git-mailinfo übergeben"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
 
-#: builtin/am.c:2264
-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:1594
+msgid "No changes"
+msgstr "Keine Änderungen"
 
-#: builtin/am.c:2267
-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:1599
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
+"\"git commit -a\")\n"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "alles vor einer Scheren-Zeile entfernen"
+#: wt-status.c:1602
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "Aktion"
+#: wt-status.c:1605
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien (benutzen "
+"Sie \"git add\" zum Versionieren)\n"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "an git-apply übergeben"
+#: wt-status.c:1608
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "Wurzelverzeichnis"
+#: wt-status.c:1611
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
+"add\" zum Versionieren)\n"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "Pfad"
+#: wt-status.c:1614 wt-status.c:1619
+#, c-format
+msgid "nothing to commit\n"
+msgstr "nichts zu committen\n"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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 "Anzahl"
+#: wt-status.c:1617
+#, c-format
+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/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "Anzahl"
+#: wt-status.c:1621
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "Format"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Initialer Commit auf "
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "Patch-Format"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (kein Branch)"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "entfernt"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "hinterher "
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "Synonyme für --continue"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "voraus "
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "den aktuellen Patch auslassen"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "%s nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
 
-#: builtin/am.c:2313
-msgid "restore the original branch and abort the patching operation."
-msgstr ""
-"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich enthält die Staging-Area nicht committete Änderungen."
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "Autor-Datum als Commit-Datum verwenden"
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s nicht möglich: Die Staging-Area enthält nicht committete Änderungen."
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "Konnte '%s' nicht entfernen."
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "GPG-Schlüsselkennung"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..."
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "Commits mit GPG signieren"
+#: builtin/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "unerwarteter Differenz-Status %c"
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(intern für git-rebase verwendet)"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "Aktualisierung der Dateien fehlgeschlagen"
 
-#: builtin/am.c:2340
-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."
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "lösche '%s'\n"
+
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
 msgstr ""
-"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
-"entfernt. Bitte verwenden Sie diese nicht mehr."
+"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "Fehler beim Lesen des Index"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Konnte den Index nicht lesen"
 
-#: builtin/am.c:2362
+#: builtin/add.c:220
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
+msgid "Could not open '%s' for writing."
+msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: builtin/am.c:2386
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Konnte Patch nicht schreiben"
+
+#: builtin/add.c:227
+msgid "editing patch failed"
+msgstr "Bearbeitung des Patches fehlgeschlagen"
+
+#: builtin/add.c:230
 #, 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."
+msgid "Could not stat '%s'"
+msgstr "Konnte Verzeichnis '%s' nicht lesen"
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Leerer Patch. Abgebrochen."
+
+#: builtin/add.c:237
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "Konnte '%s' nicht anwenden."
+
+#: 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:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<Optionen>] [<Patch>...]"
+#: 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 "Probelauf"
 
-#: builtin/apply.c:111
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "nicht erkannte Whitespace-Option: '%s'"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "interaktives Auswählen"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "Blöcke interaktiv auswählen"
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "aktuelle Unterschiede editieren und anwenden"
 
-#: builtin/apply.c:827
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben"
 
-#: builtin/apply.c:908
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "versionierte Dateien aktualisieren"
 
-#: builtin/apply.c:940
-#, 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"
+#: 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/apply.c:944
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
+"Änderungen von allen versionierten und unversionierten Dateien hinzufügen"
 
-#: builtin/apply.c:945
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+#: 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 ""
-"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
+"Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden "
+"konnten"
 
-#: builtin/apply.c:952
-#, 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"
+#: 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:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: unerwartete Zeile: %.*s"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
 
-#: builtin/apply.c:1489
+#: builtin/add.c:305
 #, 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 "Use -f if you really want to add them.\n"
+msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "neue Datei hängt von alten Inhalten ab"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "Hinzufügen von Dateien fehlgeschlagen"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "entfernte Datei hat noch Inhalte"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
-#: builtin/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "fehlerhafter Patch bei Zeile %d"
+#: 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/apply.c:1719
+#: builtin/add.c:359
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "neue Datei %s hängt von alten Inhalten ab"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
-#: builtin/apply.c:1721
+#: builtin/add.c:374
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "entfernte Datei %s hat noch Inhalte"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
-#: builtin/apply.c:1724
+#: builtin/add.c:375
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Meinten Sie vielleicht 'git add .'?\n"
 
-#: builtin/apply.c:1870
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*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:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "Index-Datei beschädigt"
 
-#: builtin/apply.c:1899
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "nicht erkannter Binär-Patch bei Zeile %d"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "konnte Autor-Skript nicht parsen"
 
-#: builtin/apply.c:2050
+#: builtin/am.c:491
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' wurde durch den applypatch-msg Hook entfernt"
 
-#: builtin/apply.c:2140
+#: builtin/am.c:532
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "konnte symbolische Verknüpfung %s nicht lesen"
+msgid "Malformed input line: '%s'."
+msgstr "Fehlerhafte Eingabezeile: '%s'."
 
-#: builtin/apply.c:2144
+#: builtin/am.c:569
 #, c-format
-msgid "unable to open or read %s"
-msgstr "konnte %s nicht öffnen oder lesen"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
 
-#: builtin/apply.c:2777
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "Ungültiger Zeilenanfang: '%c'"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "\"fseek\" fehlgeschlagen"
 
-#: builtin/apply.c:2896
+#: builtin/am.c:775
 #, 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)"
+msgid "could not parse patch '%s'"
+msgstr "konnte Patch '%s' nicht parsen"
 
-#: builtin/apply.c:2908
-#, 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/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
 
-#: builtin/apply.c:2914
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"bei der Suche nach:\n"
-"%.*s"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "ungültiger Zeitstempel"
 
-#: builtin/apply.c:2934
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "keine Daten in Binär-Patch für '%s'"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "Ungültige \"Date\"-Zeile"
 
-#: builtin/apply.c:3035
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "Ungültiger Offset in der Zeitzone"
 
-#: builtin/apply.c:3041
-#, 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)"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Patch-Formaterkennung fehlgeschlagen."
 
-#: builtin/apply.c:3062
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
+msgid "failed to create directory '%s'"
+msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
 
-#: builtin/apply.c:3186
-#, c-format
-msgid "cannot checkout %s"
-msgstr "kann %s nicht auschecken"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Fehler beim Aufteilen der Patches."
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
-#, c-format
-msgid "read of %s failed"
-msgstr "Konnte %s nicht lesen"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "Konnte Index-Datei nicht schreiben."
 
-#: builtin/apply.c:3239
+#: builtin/am.c:1176
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "'%s' ist hinter einer symbolischen Verknüpfung"
+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:3267 builtin/apply.c:3489
+#: builtin/am.c:1177
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "Pfad %s wurde umbenannt/gelöscht"
+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:3348 builtin/apply.c:3503
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s ist nicht im Index"
+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:3352 builtin/apply.c:3495 builtin/apply.c:3517
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Patch ist leer. War dessen Aufteilung falsch?"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s entspricht nicht der Version im Index"
-
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "Lösch-Patch hinterlässt Dateiinhalte"
+msgid "invalid ident line: %s"
+msgstr "Ungültige Identifikationszeile: %s"
 
-#: builtin/apply.c:3528
+#: builtin/am.c:1417
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: falscher Typ"
+msgid "unable to parse commit %s"
+msgstr "Konnte Commit '%s' nicht parsen."
 
-#: builtin/apply.c:3530
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s ist vom Typ %o, erwartete %o"
+#: builtin/am.c:1610
+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:3689 builtin/apply.c:3691
-#, c-format
-msgid "invalid path '%s'"
-msgstr "Ungültiger Pfad '%s'"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr ""
+"Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis "
+"nachzustellen ..."
 
-#: builtin/apply.c:3746
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s ist bereits bereitgestellt"
+#: builtin/am.c:1631
+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:3749
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s existiert bereits im Arbeitsverzeichnis"
+#: builtin/am.c:1637
+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:3769
-#, 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)"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Merge der Änderungen fehlgeschlagen."
 
-#: builtin/apply.c:3774
-#, 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:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
 
-#: builtin/apply.c:3794
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "auf leere Historie anwenden"
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: Patch konnte nicht angewendet werden"
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "Fehler beim Schreiben des Commit-Objektes."
 
-#: builtin/apply.c:3812
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Prüfe Patch %s ..."
+msgid "cannot resume: %s does not exist."
+msgstr "Kann nicht fortsetzen: %s existiert nicht"
 
-#: builtin/apply.c:3905 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:1759
+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:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "konnte %s nicht aus dem Index entfernen"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Commit-Beschreibung ist:"
 
-#: builtin/apply.c:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "fehlerhafter Patch für Submodul %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 "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
 
-#: builtin/apply.c:4081
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "konnte neu erstellte Datei '%s' nicht lesen"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)"
 
-#: builtin/apply.c:4086
+#: builtin/am.c:1861 builtin/am.c:1933
 #, 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"
+msgid "Applying: %.*s"
+msgstr "Wende an: %.*s"
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
-#, 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:1877
+msgid "No changes -- Patch already applied."
+msgstr "Keine Änderungen -- Patches bereits angewendet."
 
-#: builtin/apply.c:4122
+#: builtin/am.c:1885
 #, c-format
-msgid "closing file '%s'"
-msgstr "schließe Datei '%s'"
+msgid "Patch failed at %s %.*s"
+msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s"
 
-#: builtin/apply.c:4171
+#: builtin/am.c:1891
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
+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:4258
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s sauber angewendet"
+#: 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 ""
+"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:4266
-msgid "internal error"
-msgstr "interner Fehler"
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"Sie haben immer noch nicht zusammengeführte Pfade im Index.\n"
+"Haben Sie vergessen 'git add' zu benutzen?"
 
-#: builtin/apply.c:4269
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, 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..."
+msgid "Could not parse object '%s'."
+msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: builtin/apply.c:4279
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "Fehler beim Bereinigen des Index"
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Patch-Bereich #%d sauber angewendet."
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
+"Keine Zurücksetzung zu ORIG_HEAD."
 
-#: builtin/apply.c:4303
+#: builtin/am.c:2200
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Patch-Block #%d zurückgewiesen."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Ungültiger Wert für --patch-format: %s"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "nicht erkannte Eingabe"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<Optionen>] [(<mbox> | <E-Mail-Verzeichnis>)...]"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "Konnte Index-Datei nicht lesen"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<Optionen>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4507
-msgid "don't apply changes matching the given path"
-msgstr "keine Änderungen im angegebenen Pfad anwenden"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "interaktiv ausführen"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "Änderungen nur im angegebenen Pfad anwenden"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "historische Option -- kein Effekt"
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-"<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden "
-"entfernen"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "hinzugefügte Zeilen des Patches ignorieren"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "weniger Ausgaben"
 
-#: builtin/apply.c:4518
-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:2247
+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:4522
-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:2250
+msgid "recode into utf8 (default)"
+msgstr "nach UTF-8 umkodieren (Standard)"
 
-#: builtin/apply.c:4524
-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:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "-k an git-mailinfo übergeben"
 
-#: builtin/apply.c:4526
-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:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "-b an git-mailinfo übergeben"
 
-#: builtin/apply.c:4528
-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:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "-m an git-mailinfo übergeben"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-"Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt"
+#: builtin/am.c:2261
+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/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "alles vor einer Scheren-Zeile entfernen"
 
-#: builtin/apply.c:4536
-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: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 "an git-apply übergeben"
 
-#: builtin/apply.c:4538
-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: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 "Anzahl"
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "Pfade sind getrennt durch NUL Zeichen"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "Format"
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-"sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "Patch-Format"
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "den Patch in umgekehrter Reihenfolge anwenden"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "Synonyme für --continue"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "keinen Kontext erwarten"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "den aktuellen Patch auslassen"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
-"zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen"
+"ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "sich überlappende Patch-Blöcke erlauben"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "Autor-Datum als Commit-Datum verwenden"
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "aktuellen Zeitstempel als Autor-Datum verwenden"
 
-#: builtin/apply.c:4566
-msgid "do not trust the line counts in the hunk headers"
-msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen"
+#: 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 "GPG-Schlüsselkennung"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "Commits mit GPG signieren"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr ""
-"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden."
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(intern für git-rebase verwendet)"
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
+#: 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 ""
-"Die Option --index kann nicht außerhalb eines Repositories verwendet werden."
+"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
+"entfernt. Bitte verwenden Sie diese nicht mehr."
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr ""
-"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden."
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "Fehler beim Lesen des Index"
 
-#: builtin/apply.c:4621
+#: builtin/am.c:2356
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "kann Patch '%s' nicht öffnen"
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben."
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2380
 #, 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"
+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:4641 builtin/apply.c:4651
-#, 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:2386
+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
@@ -3502,140 +4683,196 @@ 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:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "Verarbeite Zeilen"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "leere SHA-1 für Grenz-Commits anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Ursprungs-Commit nicht als Grenzen behandeln (Standard: aus)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Statistiken zum Arbeitsaufwand anzeigen"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Anzeige in einem Format für maschinelle Auswertung"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr ""
 "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 "Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2591
 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:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Unterschiede im Whitespace ignorieren"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"eine experimentelle, auf Einrückungen basierende Heuristik zur Verbesserung\n"
+"der Darstellung von Unterschieden verwenden"
+
+#: builtin/blame.c:2600
+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"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Länger arbeiten, um bessere Übereinstimmungen zu finden"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "Bewertung"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 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:2654
+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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "vor 4 Jahren, und 11 Monaten"
 
-#: builtin/branch.c:25
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents und --reverse funktionieren gemeinsam nicht."
+
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "kann --contents nicht mit endgültigem Namen des Commit-Objektes benutzen"
+
+#: builtin/blame.c:2805
+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:2832
+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:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "Pfad %s nicht in %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "kann Blob %s für Pfad '%s' nicht lesen"
+
+#: builtin/blame.c:2873
+#, 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]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<Optionen>] [-l] [-f] <Branchname> [<Startpunkt>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<Optionen>] [-r] (-d | -D) <Branchname>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<Optionen>] (-m | -M) [<alter-Branch>] <neuer-Branch>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<Optionen>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3644,7 +4881,7 @@ msgstr ""
 "entferne Branch '%s', der zusammengeführt wurde mit\n"
 "         '%s', aber noch nicht mit HEAD zusammengeführt wurde."
 
-#: builtin/branch.c:146
+#: builtin/branch.c:147
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3653,12 +4890,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:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Konnte Commit-Objekt für '%s' nicht nachschlagen."
 
-#: builtin/branch.c:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3668,303 +4905,334 @@ msgstr ""
 "Wenn Sie sicher sind diesen Branch zu entfernen, führen Sie 'git branch -D "
 "%s' aus."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen."
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "kann -a nicht mit -d benutzen"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Konnte Commit-Objekt für HEAD nicht nachschlagen."
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr ""
-"Kann Branch '%s' nicht entfernen, da Sie sich gerade auf diesem befinden."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Kann Branch '%s' nicht entfernen, ausgecheckt in '%s'."
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "Remote-Tracking-Branch '%s' nicht gefunden"
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "Branch '%s' nicht gefunden."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Fehler beim Entfernen des Remote-Tracking-Branches '%s'"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fehler beim Entfernen des Branches '%s'"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Remote-Tracking-Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Branch %s entfernt (war %s).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: entfernt]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: %d hinterher]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[%d hinterher]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: %d voraus]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[%d voraus]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: %d voraus, %d hinterher]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[%d voraus, %d hinterher]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** ungültige Referenz ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(kein Branch, Rebase von Branch %s im Gange)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(kein Branch, binäre Suche begonnen bei %s)"
 
-#: builtin/branch.c:375
+#. 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)"
 
-#: builtin/branch.c:378
+#. 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:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(kein Branch)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "Branch %s wird auf %s umgesetzt"
+
+#: builtin/branch.c:548
+#, 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
 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:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Ungültiger Branchname: '%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "Umbenennung des Branches fehlgeschlagen"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "falsch benannten Branch '%s' umbenannt"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, 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:564
+#: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist "
 "fehlgeschlagen."
 
-#: builtin/branch.c:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "Konnte Beschreibungsvorlage für Branch nicht schreiben: %s"
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Bitte ändern Sie die Beschreibung für den Branch\n"
+"  %s\n"
+"Zeilen, die mit '%c' beginnen, werden entfernt.\n"
 
-#: builtin/branch.c:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "Hash und Betreff anzeigen; -vv: zusätzlich Upstream-Branch"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "Informationsmeldungen unterdrücken"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "den Übernahmemodus einstellen (siehe git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "Informationen zum Upstream-Branch ändern"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "Upstream"
+
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "Informationen zum Upstream-Branch ändern"
+
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Informationen zum Upstream-Branch entfernen"
+
+#: builtin/branch.c:661
 msgid "use colored output"
 msgstr "farbige Ausgaben verwenden"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "auf Remote-Tracking-Branches wirken"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "nur Branches ausgeben, welche diesen Commit beinhalten"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "spezifische Aktionen für \"git-branch\":"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches auflisten"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "vollständig zusammengeführten Branch entfernen"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "Branch löschen (auch wenn nicht zusammengeführt)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "einen Branch und dessen Reflog verschieben/umbenennen"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr ""
 "einen Branch verschieben/umbenennen, auch wenn das Ziel bereits existiert"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "Branchnamen auflisten"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "das Reflog des Branches erzeugen"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "die Beschreibung für den Branch bearbeiten"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "Erstellung, Verschiebung/Umbenennung oder Löschung erzwingen"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "nur zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "nur nicht zusammengeführte Branches ausgeben"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "Branches in Spalten auflisten"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "Schüssel"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "sortiere nach diesem Feld"
 
-#: builtin/branch.c:650 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 "Objekt"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "nur Branches von diesem Objekt ausgeben"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Konnte HEAD nicht als gültige Referenz auflösen."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "Die Optionen --column und --verbose sind inkompatibel."
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "Branchname erforderlich"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Noch kein Commit in Branch '%s'."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Branch '%s' nicht vorhanden."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "zu viele Branches für eine Umbenennen-Operation angegeben"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "zu viele Branches angegeben, um Upstream-Branch zu setzen"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3972,43 +5240,43 @@ msgstr ""
 "Konnte keinen neuen Upstream-Branch von HEAD zu %s setzen, da dieser auf\n"
 "keinen Branch zeigt."
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "Kein solcher Branch '%s'"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "Branch '%s' existiert nicht"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr ""
 "zu viele Branches angegeben, um Konfiguration zu Upstream-Branch zu entfernen"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 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:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "'HEAD' darf nicht manuell erstellt werden"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 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:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4017,7 +5285,7 @@ msgstr ""
 "Die --set-upstream Option ist veraltet und wird entfernt. Benutzen Sie --"
 "track oder --set-upstream-to\n"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -4028,16 +5296,6 @@ msgstr ""
 "Wenn Sie wollten, dass '%s' den Branch '%s' als Upstream-Branch hat, führen "
 "Sie aus:\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -4051,68 +5309,80 @@ msgstr "Um ein Paket zu erstellen wird ein Repository benötigt."
 msgid "Need a repository to unbundle."
 msgstr "Zum Entpacken wird ein Repository benötigt."
 
-#: 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|"
-"<Art>|--textconv) <Objekt>"
+"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 | --filters) [--path=<Pfad>] <Objekt>"
 
-#: 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 "<Art> kann sein: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "Objektart anzeigen"
 
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "Objektgröße anzeigen"
 
-#: builtin/cat-file.c:470
+#: 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:471
+#: builtin/cat-file.c:556
 msgid "pretty-print object's content"
 msgstr "ansprechende Anzeige des Objektinhaltes"
 
-#: builtin/cat-file.c:473
+#: 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:475
+#: 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:923
+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:476
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "Ausgabe von --batch puffern"
 
-#: builtin/cat-file.c:478
+#: 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:481
+#: 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:484
+#: 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:486
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "alle Objekte mit --batch oder --batch-check anzeigen"
 
@@ -4132,7 +5402,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"
 
@@ -4140,7 +5410,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:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -4233,8 +5503,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:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "Zeichenkette"
 
@@ -4285,80 +5556,76 @@ msgstr "Pfad '%s': kann nicht zusammenführen"
 msgid "Unable to add merge result for '%s'"
 msgstr "Konnte Merge-Ergebnis von '%s' nicht hinzufügen."
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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' kann nicht mit der Aktualisierung von Pfaden verwendet werden"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, 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:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "beschädigte Index-Datei"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 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:623
+#: builtin/checkout.c:624
 #, 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:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "Konnte HEAD nicht aktualisieren."
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4381,7 +5648,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4408,152 +5675,152 @@ msgstr[1] ""
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch geboren wird"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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 "Branch"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "HEAD zu benanntem Commit setzen"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "second guess 'git checkout <no-such-branch>'"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 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:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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 "Fortschrittsanzeige erzwingen"
 
-#: builtin/checkout.c:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Branchnamen; versuchen Sie -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4563,12 +5830,12 @@ msgstr ""
 "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1263
+#: builtin/checkout.c:1264
 #, 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4720,8 +5987,8 @@ msgstr "interaktives Clean"
 msgid "remove whole directories"
 msgstr "ganze Verzeichnisse löschen"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "Muster"
 
@@ -4761,105 +6028,134 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "ein Bare-Repository erstellen"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "ein Spiegelarchiv erstellen (impliziert --bare)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "von einem lokalen Repository klonen"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "lokal keine harten Verweise verwenden, immer Kopien"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "als verteiltes Repository einrichten"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "Submodule im Klon initialisieren"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "Anzahl der parallel zu klonenden Submodule"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "Repository referenzieren"
 
-#: builtin/clone.c:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "--reference nur während des Klonens benutzen"
 
-#: builtin/clone.c:82 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 "Name"
 
-#: builtin/clone.c:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "<Name> statt 'origin' für Upstream-Repository verwenden"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "<Branch> auschecken, anstatt HEAD des Remote-Repositories"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668 builtin/pull.c:202
 msgid "depth"
 msgstr "Tiefe"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr ""
 "einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe erstellen"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "Zeit"
+
+#: builtin/clone.c:100
+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:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "Commit"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr ""
+"die Historie eines Klons mit unvollständiger Historie (shallow) mittels\n"
+"Ausschluss eines Commits vertiefen"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "nur einen Branch klonen, HEAD oder --branch"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "jedes geklonte Submodul mit unvollständiger Historie (shallow)"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren"
 
-#: builtin/clone.c:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "Schlüssel=Wert"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "Konfiguration innerhalb des neuen Repositories setzen"
 
-#: builtin/clone.c:96 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 "nur IPv4-Adressen benutzen"
 
-#: builtin/clone.c:98 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 "nur IPv6-Adressen benutzen"
 
-#: builtin/clone.c:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4867,62 +6163,42 @@ msgstr ""
 "Konnte keinen Verzeichnisnamen erraten.\n"
 "Bitte geben Sie ein Verzeichnis auf der Befehlszeile an."
 
-#: builtin/clone.c:305
-#, 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:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
-
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
-
-#: builtin/clone.c:315
+#: builtin/clone.c:303
 #, 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "Konnte '%s' nicht lesen"
+msgid "failed to open '%s'"
+msgstr "Fehler beim Öffnen von '%s'"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existiert und ist kein Verzeichnis"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "Konnte %s nicht lesen\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "Konnte Verweis '%s' nicht erstellen"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "Konnte Datei nicht nach '%s' kopieren"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "Fertig.\n"
 
-#: builtin/clone.c:459
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4932,132 +6208,141 @@ 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:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Konnte zu klonenden Remote-Branch %s nicht finden."
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Prüfe Konnektivität ... "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "kann %s nicht aktualisieren"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 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:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "konnte Parameter nicht in Konfigurationsdatei schreiben"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "Kann \"repack\" zum Aufräumen nicht aufrufen"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Sie müssen ein Repository zum Klonen angeben."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "Die Optionen --bare und --origin %s sind inkompatibel."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:897
+#: builtin/clone.c:915
 #, 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:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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 "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:925
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:984
+#: builtin/clone.c:963
+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:1019
 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:987
+#: builtin/clone.c:1021
+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:1023
+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:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
 "local"
 
-#: builtin/clone.c:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Weiß nicht wie %s zu klonen ist."
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -5200,67 +6485,67 @@ msgstr ""
 "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
 "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "Konnte temporären Index nicht erstellen."
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "interaktives Hinzufügen fehlgeschlagen"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "Konnte temporären Index nicht aktualisieren."
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Konnte Haupt-Cache-Verzeichnis nicht aktualisieren"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: 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:447
+#: 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:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "Konnte temporäre Index-Datei nicht schreiben."
 
-#: builtin/commit.c:580
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "Commit '%s' fehlt Autor-Kopfbereich"
 
-#: builtin/commit.c:582
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "Commit '%s' hat fehlerhafte Autor-Zeile"
 
-#: builtin/commit.c:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "Fehlerhafter --author Parameter"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "Ungültiges Datumsformat: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5268,38 +6553,38 @@ msgstr ""
 "Konnte kein Kommentar-Zeichen auswählen, das nicht in\n"
 "der aktuellen Commit-Beschreibung verwendet wird."
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
 
-#: builtin/commit.c:704
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "Konnte Log nicht von Standard-Eingabe lesen."
 
-#: builtin/commit.c:708
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "Konnte Log-Datei '%s' nicht lesen"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "Konnte MERGE_MSG nicht lesen"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "Konnte SQUASH_MSG nicht lesen"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "Konnte MERGE_MSG nicht lesen"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "Konnte Commit-Vorlage nicht schreiben"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5314,7 +6599,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5329,7 +6614,7 @@ msgstr ""
 "\t%s\n"
 "und versuchen Sie es erneut.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5339,7 +6624,7 @@ msgstr ""
 "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5352,157 +6637,161 @@ msgstr ""
 "entfernen.\n"
 "Eine leere Beschreibung bricht den Commit ab.\n"
 
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:           %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDatum:            %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommit-Ersteller: %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Kann Index nicht lesen"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
 
-#: builtin/commit.c:953 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 ""
 "Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n"
 
-#: builtin/commit.c:1055
+#: 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:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ungültiger Modus '%s' für unversionierte Dateien"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "Die Optionen --long und -z sind inkompatibel."
 
-#: builtin/commit.c:1137
+#: 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:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Sie haben nichts für \"--amend\"."
 
-#: builtin/commit.c:1149
+#: 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:1151
+#: 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:1154
+#: 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:1164
+#: 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:1166
+#: 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:1174
+#: 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:1191
+#: 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:1193
+#: 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:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 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:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Ungültiger \"cleanup\" Modus %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "Die Option -a kann nicht mit der Angabe von Pfaden verwendet werden."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "Status im Kurzformat anzeigen"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "Branchinformationen anzeigen"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "Version"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "Status im Langformat anzeigen (Standard)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "Einträge mit NUL-Zeichen abschließen"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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 "Modus"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
+#: builtin/commit.c:1354 builtin/commit.c:1629
 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "ignorierte Dateien anzeigen"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "wann"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5510,203 +6799,203 @@ msgstr ""
 "Änderungen in Submodulen ignorieren, optional wenn: all, dirty, untracked. "
 "(Standard: all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "unversionierte Dateien in Spalten auflisten"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "Konnte neu erstellten Commit nicht nachschlagen."
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "Konnte neulich erstellten Commit nicht analysieren."
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "losgelöster HEAD"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (Basis-Commit)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "Zusammenfassung nach erfolgreichem Commit unterdrücken"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "Unterschiede in Commit-Beschreibungsvorlage anzeigen"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Optionen für Commit-Beschreibung"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "Beschreibung von Datei lesen"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "Autor"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "Autor eines Commits überschreiben"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "Datum"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "Datum eines Commits überschreiben"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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 "Beschreibung"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "Commit-Beschreibung"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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 "Commit"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden und editieren"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "Beschreibung des angegebenen Commits wiederverwenden"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
 "angegebenen Commits verwenden"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 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:1588 builtin/log.c:1219 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:'-Zeile hinzufügen"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "angegebene Vorlagendatei verwenden"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "Bearbeitung des Commits erzwingen"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "Standard"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr ""
 "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "Status in die Commit-Beschreibungsvorlage einfügen"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "Commit mit GPG signieren"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Optionen für Commit-Inhalt"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "alle geänderten Dateien committen"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "nur die angegebenen Dateien committen"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "\"pre-commit hook\" umgehen"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "Hooks pre-commit und commit-msg umgehen"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "anzeigen, was committet werden würde"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "vorherigen Commit ändern"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "\"post-rewrite hook\" umgehen"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "Aufzeichnung einer leeren Änderung erlauben"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "Aufzeichnung einer Änderung mit einer leeren Beschreibung erlauben"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "Konnte Commit von HEAD nicht analysieren."
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "Konnte MERGE_MODE nicht lesen"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, 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:1740
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5721,141 +7010,141 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<Optionen>]"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "Config file location"
 msgstr "Ort der Konfigurationsdatei"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use global config file"
 msgstr "globale Konfigurationsdatei verwenden"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use system config file"
 msgstr "systemweite Konfigurationsdatei verwenden"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "use repository config file"
 msgstr "Konfigurationsdatei des Repositories verwenden"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "use given config file"
 msgstr "die angegebene Konfigurationsdatei verwenden"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "blob-id"
 msgstr "Blob-Id"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "read config from given blob object"
 msgstr "Konfiguration von angegebenem Blob-Objekt lesen"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "Action"
 msgstr "Aktion"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get value: name [value-regex]"
 msgstr "Wert zurückgeben: Name [Wert-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "alle Werte zurückgeben: Schlüssel [Wert-regex]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 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:66
+#: builtin/config.c:65
 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:67
+#: builtin/config.c:66
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "alle passenden Variablen ersetzen: Name Wert [Wert-regex] "
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "neue Variable hinzufügen: Name Wert"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "eine Variable entfernen: Name [Wert-regex]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "alle Übereinstimmungen entfernen: Name [Wert-regex]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "eine Sektion umbenennen: alter-Name neuer-Name"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "eine Sektion entfernen: Name"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "list all"
 msgstr "alles auflisten"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "open an editor"
 msgstr "einen Editor öffnen"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "find the color configured: slot [default]"
 msgstr "die konfigurierte Farbe finden: Slot [Standard]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "die Farbeinstellung finden: Slot [Standard-Ausgabe-ist-Terminal]"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "Type"
 msgstr "Typ"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is \"true\" or \"false\""
 msgstr "Wert ist \"true\" oder \"false\""
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is decimal number"
 msgstr "Wert ist eine Dezimalzahl"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "value is --bool or --int"
 msgstr "Wert ist --bool oder --int"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "value is a path (file or directory name)"
 msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "Other"
 msgstr "Sonstiges"
 
-#: builtin/config.c:83
+#: builtin/config.c:82
 msgid "terminate values with NUL byte"
 msgstr "schließt Werte mit NUL-Byte ab"
 
-#: builtin/config.c:84
+#: builtin/config.c:83
 msgid "show variable names only"
 msgstr "nur Variablennamen anzeigen"
 
-#: builtin/config.c:85
+#: builtin/config.c:84
 msgid "respect include directives on lookup"
 msgstr "beachtet \"include\"-Direktiven beim Nachschlagen"
 
-#: builtin/config.c:86
+#: builtin/config.c:85
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 "Ursprung der Konfiguration anzeigen (Datei, Standard-Eingabe, Blob, "
 "Befehlszeile)"
 
-#: builtin/config.c:328
+#: builtin/config.c:327
 msgid "unable to parse default color value"
 msgstr "konnte Standard-Farbwert nicht parsen"
 
-#: builtin/config.c:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5870,16 +7159,26 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: builtin/config.c:613
 #, c-format
 msgid "cannot create configuration file %s"
 msgstr "Konnte Konfigurationsdatei '%s' nicht erstellen."
 
-#: 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 ""
+"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"
 
@@ -5906,7 +7205,7 @@ msgstr "annotiertes Tag %s hat keinen eingebetteten Namen"
 msgid "tag '%s' is really '%s' here"
 msgstr "Tag '%s' ist eigentlich '%s' hier"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s ist kein gültiger Objekt-Name"
@@ -5999,7 +7298,7 @@ msgstr "die jüngsten <n> Tags betrachten (Standard: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "nur Tags, die <Muster> entsprechen, betrachten"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "gekürztes Commit-Objekt anzeigen, wenn sonst nichts zutrifft"
 
@@ -6035,21 +7334,21 @@ msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung"
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "Kein Git-Repository"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
@@ -6106,187 +7405,188 @@ msgstr "Refspec auf exportierte Referenzen anwenden"
 msgid "anonymize output"
 msgstr "Ausgabe anonymisieren"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<Optionen>] [<Repository> [<Refspec>...]]"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [<Optionen>] <Gruppe>"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [<Optionen>] [(<Repository> | <Gruppe>)...]"
 
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<Optionen>]"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "fordert von allen Remote-Repositories an"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:96 builtin/pull.c:172
+#: 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:97 builtin/pull.c:174
+#: builtin/fetch.c:100 builtin/pull.c:183
 msgid "force overwrite of local branch"
 msgstr "das Überschreiben von lokalen Branches erzwingen"
 
-#: builtin/fetch.c:99
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "von mehreren Remote-Repositories anfordern"
 
-#: builtin/fetch.c:101 builtin/pull.c:176
+#: 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:103
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "nicht alle Tags anfordern (--no-tags)"
 
-#: builtin/fetch.c:105
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "Anzahl der parallel anzufordernden Submodule"
 
-#: builtin/fetch.c:107 builtin/pull.c:179
+#: 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:108 builtin/pull.c:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "bei-Bedarf"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "rekursive Anforderungen von Submodulen kontrollieren"
 
-#: builtin/fetch.c:113 builtin/pull.c:191
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "heruntergeladenes Paket behalten"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "Aktualisierung der \"HEAD\"-Referenz erlauben"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
+#: 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"
+"die Historie eines Klons mit unvollständiger Historie (shallow) vertiefen"
+
+#: 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:120 builtin/pull.c:197
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "zu einem vollständigen Repository konvertieren"
 
-#: builtin/fetch.c:122 builtin/log.c:1236
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "Verzeichnis"
 
-#: builtin/fetch.c:123
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "dies an die Ausgabe der Submodul-Pfade voranstellen"
 
-#: builtin/fetch.c:126
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "Standard-Modus für Rekursion"
 
-#: builtin/fetch.c:128 builtin/pull.c:200
+#: 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:129 builtin/pull.c:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "Refmap"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "Refmap für 'fetch' angeben"
 
-#: builtin/fetch.c:386
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, c-format
+msgid "configuration fetch.output contains invalid value %s"
+msgstr "Konfiguration fetch.output enthält ungültigen Wert %s"
+
+#: builtin/fetch.c:607
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[aktuell]"
 
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr ""
-"! %-*s %-*s -> %s  (kann \"fetch\" im aktuellen Branch nicht ausführen)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen"
+
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (kann lokale Referenz nicht aktualisieren)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "kann lokale Referenz nicht aktualisieren"
 
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[neues Tag]"
 
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "kann lokale Referenz nicht aktualisieren"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(kein Vorspulen)"
-
-#: builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "kann %s nicht öffnen: %s\n"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "kein Vorspulen"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\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 wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
 "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
 
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "Von %.*s\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6295,57 +7595,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:787
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s wird unreferenziert)"
 
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s wurde unreferenziert)"
 
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[gelöscht]"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(nichts)"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
 #, 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:860
+#: builtin/fetch.c:998
 #, 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:863
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Option \"%s\" wird ignoriert für %s\n"
 
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Weiß nicht wie von %s angefordert wird."
 
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Fordere an von %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 "Konnte nicht von %s anfordern"
 
-#: 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."
@@ -6354,35 +7654,43 @@ msgstr ""
 "oder den Namen des Remote-Repositories an, von welchem neue\n"
 "Commits angefordert werden sollen."
 
-#: builtin/fetch.c:1123
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Negative Tiefe wird von --deepen nicht unterstützt."
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen und --depth schließen sich gegenseitig aus"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
 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:1187
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
 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"
@@ -6395,23 +7703,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"
 
@@ -6471,63 +7779,63 @@ 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:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Prüfe Konnektivität"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
 msgid "Checking object directories"
 msgstr "Prüfe Objekt-Verzeichnisse"
 
-#: builtin/fsck.c:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<Optionen>] [<Objekt>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "unerreichbare Objekte anzeigen"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "unreferenzierte Objekte anzeigen"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "Tags melden"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "Hauptwurzeln melden"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "Index-Objekte in Erreichbarkeitsprüfung einbeziehen"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "Reflogs in Erreichbarkeitsprüfung einbeziehen (Standard)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "ebenso Pakete und alternative Objekte betrachten"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "nur Konnektivität prüfen"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "genauere Prüfung aktivieren"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "unreferenzierte Objekte nach .git/lost-found schreiben"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "ausführliche Namen für erreichbare Objekte anzeigen"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
@@ -6627,236 +7935,231 @@ msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 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:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, 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:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "kann '%s' nicht öffnen"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "im Index anstatt im Arbeitsverzeichnis suchen"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "auch in Inhalten finden, die nicht von Git verwaltet werden"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "in versionierten und unversionierten Dateien suchen"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "Dateien, die über '.gitignore' angegeben sind, ignorieren"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "Zeilen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "Übereinstimmungen unabhängig von Groß- und Kleinschreibung finden"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "nur ganze Wörter suchen"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "binäre Dateien als Text verarbeiten"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "keine Muster in Binärdateien finden"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "binäre Dateien mit \"textconv\"-Filtern verarbeiten"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "höchstens <Tiefe> Ebenen durchlaufen"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "erweiterte reguläre Ausdrücke aus POSIX verwenden"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "grundlegende reguläre Ausdrücke aus POSIX verwenden (Standard)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "Muster als feste Zeichenketten interpretieren"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "Perl-kompatible reguläre Ausdrücke verwenden"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "Zeilennummern anzeigen"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "keine Dateinamen anzeigen"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "Dateinamen anzeigen"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "Dateinamen relativ zum Projektverzeichnis anzeigen"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "nur Dateinamen anzeigen anstatt übereinstimmende Zeilen"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "Synonym für --files-with-matches"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "nur die Dateinamen ohne Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "NUL-Zeichen nach Dateinamen ausgeben"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen anzeigen"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "Übereinstimmungen hervorheben"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr ""
 "eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien ausgeben"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 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:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "<n> Zeilen vor und nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "<n> Zeilen vor den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "<n> Zeilen nach den Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "<n> Threads benutzen"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "Kurzform für -C NUM"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "eine Zeile mit dem Funktionsnamen vor Übereinstimmungen anzeigen"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "die umgebende Funktion anzeigen"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "Muster von einer Datei lesen"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "<Muster> finden"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "Muster kombinieren, die mit -e angegeben wurden"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "Übereinstimmungen nur durch Beendigungsstatus anzeigen"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr ""
 "nur Übereinstimmungen von Dateien anzeigen, die allen Mustern entsprechen"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "geparstes Verzeichnis für \"grep\"-Ausdruck anzeigen"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "Anzeigeprogramm"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "Dateien mit Übereinstimmungen im Anzeigeprogramm anzeigen"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 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:899
+#: builtin/grep.c:902
 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:904
+#: builtin/grep.c:907
 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:907
+#: builtin/grep.c:910
 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:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
 
@@ -6872,85 +8175,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': %s"
-msgstr "Fehler beim Ausführen von '%s': %s"
+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"
@@ -6959,7 +8266,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"
@@ -6968,430 +8275,432 @@ 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:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definition von Attributen pro Pfad"
 
-#: builtin/help.c:409
+#: 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:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Ein Git-Glossar"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Definition von Submodul-Eigenschaften"
 
-#: builtin/help.c:413
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Spezifikation von Commits und Bereichen für Git"
 
-#: builtin/help.c:414
+#: 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:415
+#: builtin/help.c:410
 msgid "An overview of recommended workflows with Git"
 msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git"
 
-#: builtin/help.c:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "Verwendung: %s%s"
-
-#: builtin/help.c:481
+#: 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:152
+#: 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:202
+#: 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:222
+#: 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:225
+#: 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:267
+#: 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:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "zu frühes Dateiende"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "Fehler beim Lesen der Eingabe"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:297
+#: 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:313
+#: 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:318
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "Kann Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "Paketsignatur stimmt nicht überein"
 
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "Paketversion %<PRIu32> nicht unterstützt"
 
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "Paket hat ein ungültiges Objekt bei Versatz %lu: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "Paket hat ein ungültiges Objekt bei Versatz %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "Dekomprimierung gab %d zurück"
 
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "Wert für Versatz bei Differenzobjekt übergelaufen"
 
-#: builtin/index-pack.c:530
+#: builtin/index-pack.c:535
 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:538
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "Unbekannter Objekt-Typ %d"
 
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "Kann Paketdatei %s nicht lesen"
 
-#: 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] "frühzeitiges Ende der Paketdatei, vermisse %lu Byte"
-msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %lu Bytes"
+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:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 
-#: 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 KOLLISION MIT %s GEFUNDEN !"
 
-#: 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 "kann %s nicht lesen"
 
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "Kann existierendes Objekt %s nicht lesen."
 
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "ungültiges Blob-Objekt %s"
 
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "Ungültiger Objekt-Typ %s"
 
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Fehler in Objekt"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 #, c-format
 msgid "Not all child objects of %s are reachable"
 msgstr "Nicht alle Kind-Objekte von %s sind erreichbar"
 
-#: 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 "Konnte Dateiunterschied nicht anwenden"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "Empfange Objekte"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "Indiziere Objekte"
 
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "Paket ist beschädigt (SHA1 unterschiedlich)"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "kann Paketdatei nicht lesen"
 
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "Paketende enthält nicht verwendbaren Inhalt"
 
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "Fehler beim Ausführen von \"parse_pack_objects()\""
 
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
 
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "Fehler beim Auflösen der Unterschiede"
 
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "completed with %d local objects"
-msgstr "abgeschlossen mit %d lokalen Objekten"
+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:1263
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1272
 #, 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:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokales Objekt %s ist beschädigt"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "Fehler beim Schließen der Paketdatei"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "Kann Paketdatei nicht speichern"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kann existierende Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, 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:1587
+#: builtin/index-pack.c:1591
 #, 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:1594
+#: builtin/index-pack.c:1598
 #, 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:1624
-msgid "Cannot come back to cwd"
-msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
+#: builtin/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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 ist ungültig"
 
-#: builtin/index-pack.c:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'"
-
-#: builtin/index-pack.c:1730
+#: builtin/index-pack.c:1740
 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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "keine Vorlagen in '%s' gefunden"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "kopiere keine Vorlagen mit einer falschen Formatversion %d von '%s'"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s existiert bereits"
+msgid "not copying templates from '%s': %s"
+msgstr "kopiere keine Vorlagen von '%s': %s"
 
-#: builtin/init-db.c:340
+#: 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:343
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
-#. 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:399
+#: 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 "%s%s Git repository in %s%s\n"
-msgstr "%s%s Git-Repository in %s%s\n"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
+msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:400
-msgid "Reinitialized existing"
-msgstr "Reinitialisierte existierendes"
+#: 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:400
-msgid "Initialized empty"
-msgstr "Initialisierte leeres"
+#: 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:401
-msgid " shared"
-msgstr " gemeinsames"
+#: 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:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7399,25 +8708,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:472
+#: 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:506 builtin/init-db.c:511
+#: 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:515
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:536
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7426,7 +8735,7 @@ msgstr ""
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -7459,279 +8768,332 @@ msgstr "Anhang/Anhänge hinzufügen"
 msgid "no input file given for in-place editing"
 msgstr "keine Datei zur direkten Bearbeitung angegeben"
 
-#: builtin/log.c:43
+#: builtin/log.c:44
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<Optionen>] [<Commitbereich>] [[--] <Pfad>...]"
 
-#: builtin/log.c:44
+#: builtin/log.c:45
 msgid "git show [<options>] <object>..."
 msgstr "git show [<Optionen>] <Objekt>..."
 
-#: builtin/log.c:83
+#: builtin/log.c:84
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "Ungültige Option für --decorate: %s"
 
-#: builtin/log.c:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "Ausgabe der Unterschiede unterdrücken"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "Quelle anzeigen"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "\"mailmap\"-Datei verwenden"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "decorate-Optionen"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 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:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "letzte Ausgabe: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: ungültige Datei"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "Kann Objekt %s nicht lesen."
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Unbekannter Typ: %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers ohne Wert"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "Name des Ausgabeverzeichnisses ist zu lang."
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Kann Patch-Datei %s nicht öffnen"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "Brauche genau einen Commit-Bereich."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "Kein Commit-Bereich."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Unbekannter Commit %s"
+
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
+
+#: builtin/log.c:1263
+msgid "Could not find exact merge base."
+msgstr "Konnte keine exakte Merge-Basis finden."
+
+#: 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 ""
+"Fehler beim Bestimmen des Upstream-Branches. Wenn Sie den Basis-Commit\n"
+"automatisch speichern lassen möchten, benutzen Sie bitte\n"
+"'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:1287
+msgid "Failed to find exact merge base"
+msgstr "Fehler beim Finden einer exakten Merge-Basis."
+
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
+msgstr "Basis-Commit sollte der Vorgänger der Revisionsliste sein."
+
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
+msgstr "Basis-Commit sollte nicht in der Revisionsliste enthalten sein."
+
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "kann Patch-Id nicht lesen"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "[PATCH n/m] auch mit einzelnem Patch verwenden"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "[PATCH] auch mit mehreren Patches verwenden"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "Ausgabe der Patches in Standard-Ausgabe"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "ein Deckblatt erzeugen"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "einfache Nummernfolge für die Namen der Ausgabedateien verwenden"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "Dateiendung"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "<Dateiendung> anstatt '.patch' verwenden"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "die Nummerierung der Patches bei <n> anstatt bei 1 beginnen"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "die Serie als n-te Fassung kennzeichnen"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "[RFC PATCH] anstatt [PATCH] verwenden"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "[<Präfix>] anstatt [PATCH] verwenden"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "erzeugte Dateien in <Verzeichnis> speichern"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH] nicht entfernen/hinzufügen"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "keine binären Unterschiede ausgeben"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "Hash mit Nullen in \"From\"-Header ausgeben"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 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:1248
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "E-Mail-Einstellungen"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "Header"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "E-Mail-Header hinzufügen"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "E-Mail"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "\"To:\"-Header hinzufügen"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "\"Cc:\"-Header hinzufügen"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "Ident"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 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:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "message-id"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "aus erster E-Mail eine Antwort zu <message-id> machen"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "Grenze"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "den Patch anhängen"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "den Patch direkt in die Nachricht einfügen"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "Signatur"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "eine Signatur hinzufügen"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "Basis-Commit"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "erforderliche Revisions-Informationen der Patch-Serie hinzufügen"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "eine Signatur aus einer Datei hinzufügen"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "keine Dateinamen der Patches anzeigen"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "Die Optionen -n und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc und -k schließen sich gegenseitig aus."
 
-#: builtin/log.c:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "Die Option --name-only kann nicht verwendet werden."
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "Die Option --name-status kann nicht verwendet werden."
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "Die Option --check kann nicht verwendet werden."
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "Konnte Signatur-Datei '%s' nicht lesen"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7739,109 +9101,108 @@ msgstr ""
 "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> "
 "manuell an.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Unbekannter Commit %s"
-
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<Optionen>] [<Datei>...]"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "den Dateistatus mit Tags anzeigen"
 
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 "Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung verwenden"
 
-#: builtin/ls-files.c:431
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr "zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)"
 
-#: builtin/ls-files.c:433
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "entfernte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "geänderte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "sonstige Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "ignorierte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
 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:444
+#: builtin/ls-files.c:524
 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:446
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "nur Namen von 'sonstigen' Verzeichnissen anzeigen"
 
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "Zeilenenden von Dateien anzeigen"
 
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "keine leeren Verzeichnisse anzeigen"
 
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "nicht zusammengeführte Dateien in der Ausgabe anzeigen"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "'resolve-undo' Informationen anzeigen"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "Dateien auslassen, die einem Muster entsprechen"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "Muster, gelesen von <Datei>, ausschließen"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
 msgid "read additional per-directory exclude patterns in <file>"
 msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei> auslesen"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "die standardmäßigen Git-Ausschlüsse hinzufügen"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
 msgstr "Ausgabe relativ zum Projektverzeichnis"
 
-#: builtin/ls-files.c:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "Rekursion in Submodulen durchführen"
+
+#: builtin/ls-files.c:553
 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:472
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "Commit-Referenz"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
 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:475
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "Ausgaben zur Fehlersuche anzeigen"
 
@@ -7931,187 +9292,177 @@ msgstr ""
 "das gesamte Verzeichnis auflisten; nicht nur das aktuelle Verzeichnis "
 "(impliziert --full-name)"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<Optionen>] [<Commit>...]"
 
-#: builtin/merge.c:46
+#: builtin/merge.c:47
 msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr "git merge [<Optionen>] <Beschreibung> HEAD <Commit>"
 
-#: builtin/merge.c:47
+#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "Schalter 'm' erfordert einen Wert."
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Konnte Merge-Strategie '%s' nicht finden.\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Verfügbare Strategien sind:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Verfügbare benutzerdefinierte Strategien sind:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 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:196 builtin/pull.c:126
+#: builtin/merge.c:198 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:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(Synonym für --stat)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 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:202 builtin/pull.c:135
+#: builtin/merge.c:204 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:204 builtin/pull.c:138
+#: builtin/merge.c:206 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:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "Bearbeitung der Beschreibung vor dem Commit"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "Vorspulen erlauben (Standard)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "abbrechen, wenn kein Vorspulen möglich ist"
 
-#: builtin/merge.c:213
-msgid "Verify that the named commit has a valid GPG signature"
+#: builtin/merge.c:215 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:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "Strategie"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "zu verwendende Merge-Strategie"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "Option=Wert"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "Option für ausgewählte Merge-Strategie"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 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:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "den sich im Gange befindlichen Merge abbrechen"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "Konnte \"stash\" nicht ausführen."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "\"stash\" fehlgeschlagen"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "kein gültiges Objekt: %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "read-tree fehlgeschlagen"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (nichts zu quetschen)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Quetsche Commit -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Konnte nicht nach '%s' schreiben."
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Schreibe SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Schließe SQUASH_MSG ab"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Keine Merge-Commit-Beschreibung -- HEAD wird nicht aktualisiert\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' zeigt auf keinen Commit"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Ungültiger branch.%s.mergeoptions String: %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur der Merge von zwei Branches behandelt."
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:782
+#: builtin/merge.c:742
 #, 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:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8127,55 +9478,69 @@ msgstr ""
 "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n"
 "bricht den Commit ab.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "Leere Commit-Beschreibung"
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, 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:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' ist kein Commit"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "Sie befinden sich auf keinem Branch."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "Kein Remote-Repository für den aktuellen Branch."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 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:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
-#: builtin/merge.c:1080
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Fehlerhafter Wert '%s' in Umgebungsvariable '%s'"
+
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen"
 
-#: builtin/merge.c:1207
+#: builtin/merge.c:1061
+#, 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
+msgid "not something we can merge"
+msgstr "nichts was wir zusammenführen können"
+
+#: builtin/merge.c:1162
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (MERGE_HEAD fehlt)"
 
-#: builtin/merge.c:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8183,7 +9548,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:1230
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8191,105 +9556,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:1233
+#: builtin/merge.c:1188
 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:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Sie können --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1267
+#: builtin/merge.c:1222
 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:1269
+#: builtin/merge.c:1224
 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:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 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:1332
+#: builtin/merge.c:1287
 #, 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:1335
+#: builtin/merge.c:1290
 #, 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:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, 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:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "Verweigere den Merge von nicht zusammenhängenden Historien."
+
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Bereits aktuell."
+
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1500
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Bereits aktuell."
+
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Merge-Strategie %s ...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, 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:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8315,23 +9692,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"
 
@@ -8375,6 +9752,37 @@ msgstr "keine Warnung bei Konflikten"
 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]"
@@ -8400,7 +9808,7 @@ msgstr "git mv [<Optionen>] <Quelle>... <Ziel>"
 msgid "Directory %s is in index and no submodule?"
 msgstr "Verzeichnis %s ist zum Commit vorgemerkt und kein Submodul?"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Bitte merken Sie Ihre Änderungen in .gitmodules zum Commit vor oder "
@@ -8420,109 +9828,109 @@ msgstr "Verschieben/Umbenennen erzwingen, auch wenn das Ziel existiert"
 msgid "skip move/rename errors"
 msgstr "Fehler beim Verschieben oder Umbenennen überspringen"
 
-#: builtin/mv.c:152
+#: builtin/mv.c:155
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "Ziel '%s' ist kein Verzeichnis"
 
-#: builtin/mv.c:163
+#: builtin/mv.c:166
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Prüfe Umbenennung von '%s' nach '%s'\n"
 
-#: builtin/mv.c:167
+#: builtin/mv.c:170
 msgid "bad source"
 msgstr "ungültige Quelle"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:173
 msgid "can not move directory into itself"
 msgstr "kann Verzeichnis nicht in sich selbst verschieben"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:176
 msgid "cannot move directory over file"
 msgstr "kann Verzeichnis nicht über Datei verschieben"
 
-#: builtin/mv.c:182
+#: builtin/mv.c:185
 msgid "source directory is empty"
 msgstr "Quellverzeichnis ist leer"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:210
 msgid "not under version control"
 msgstr "nicht unter Versionskontrolle"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:213
 msgid "destination exists"
 msgstr "Ziel existiert bereits"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:221
 #, c-format
 msgid "overwriting '%s'"
 msgstr "überschreibe '%s'"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:224
 msgid "Cannot overwrite"
 msgstr "Kann nicht überschreiben"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:227
 msgid "multiple sources for the same target"
 msgstr "mehrere Quellen für das selbe Ziel"
 
-#: builtin/mv.c:226
+#: builtin/mv.c:229
 msgid "destination directory does not exist"
 msgstr "Zielverzeichnis existiert nicht"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:236
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, Quelle=%s, Ziel=%s"
 
-#: builtin/mv.c:254
+#: builtin/mv.c:257
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Benenne %s nach %s um\n"
 
-#: builtin/mv.c:257 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 "Umbenennung von '%s' fehlgeschlagen"
 
-#: builtin/name-rev.c:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<Optionen>] <Commit>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<Optionen>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<Optionen>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "nur Namen anzeigen (keine SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "nur Tags verwenden, um die Commits zu benennen"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "nur Referenzen verwenden die <Muster> entsprechen"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "alle Commits auflisten, die von allen Referenzen erreichbar sind"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "von der Standard-Eingabe lesen"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "Ausgabe von `undefinierten` Namen erlauben (Standard)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "Tags in der Eingabe dereferenzieren (interne Verwendung)"
 
@@ -8638,6 +10046,10 @@ msgstr "git notes prune [<Optionen>]"
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
+msgstr "Schreiben/Bearbeiten der Notizen für das folgende Objekt:"
+
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -8652,89 +10064,99 @@ msgstr "Konnte Ausgabe von 'show' nicht lesen."
 msgid "failed to finish 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "konnte Datei '%s' nicht erstellen"
-
-#: builtin/notes.c:193
-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."
+#: builtin/notes.c:194
+msgid "please supply the note contents using either -m or -F option"
+msgstr "Bitte liefern Sie die Notiz-Inhalte unter Verwendung der Option -m oder -F."
 
-#: builtin/notes.c:202
+#: builtin/notes.c:203
 msgid "unable to write note object"
 msgstr "Konnte Notiz-Objekt nicht schreiben"
 
-#: builtin/notes.c:204
+#: 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:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "kann '%s' nicht lesen"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "konnte '%s' nicht öffnen oder lesen"
 
-#: 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:880 builtin/tag.c:456
+#: 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."
+msgid "failed to resolve '%s' as a valid ref."
 msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
 
-#: builtin/notes.c:256
+#: 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:260
+#: 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:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:945
+#: 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:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
 msgid "too many parameters"
 msgstr "zu viele Parameter"
 
-#: 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."
+msgid "no note found for object %s."
 msgstr "Keine Notiz für Objekt %s gefunden."
 
-#: builtin/notes.c:396 builtin/notes.c:559
+#: builtin/notes.c:399 builtin/notes.c:562
 msgid "note contents as a string"
 msgstr "Notizinhalte als Zeichenkette"
 
-#: builtin/notes.c:399 builtin/notes.c:562
+#: builtin/notes.c:402 builtin/notes.c:565
 msgid "note contents in a file"
 msgstr "Notizinhalte in einer Datei"
 
-#: builtin/notes.c:402 builtin/notes.c:565
+#: 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:405 builtin/notes.c:568
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
 
-#: builtin/notes.c:408 builtin/notes.c:571
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "Speichern leerer Notiz erlauben"
 
-#: builtin/notes.c:409 builtin/notes.c:480
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "existierende Notizen ersetzen"
 
-#: builtin/notes.c:434
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8743,31 +10165,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:449 builtin/notes.c:528
+#: 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:460 builtin/notes.c:621 builtin/notes.c:885
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Entferne Notiz für Objekt %s\n"
 
-#: builtin/notes.c:481
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "Objekte von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:483
+#: 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:501
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "zu wenig Parameter"
 
-#: builtin/notes.c:522
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8776,12 +10198,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:534
+#: 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:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8790,15 +10212,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:767
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "Fehler beim Löschen der Referenz NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "Fehler beim Löschen des Arbeitsverzeichnisses von 'git notes merge'."
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "Fehler beim Lesen der Referenz NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht finden."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "Konnte Commit von NOTES_MERGE_PARTIAL nicht parsen."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "Fehler beim Auflösen von NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "Fehler beim Abschließen der Zusammenführung der Notizen."
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "unbekannte Merge-Strategie '%s' für Notizen"
+
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Merge-Optionen"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8806,244 +10265,290 @@ msgstr ""
 "löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "nicht zusammengeführte Notizen eintragen"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 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:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Konfliktauflösung beim Merge von Notizen abbrechen"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "Merge von Notizen abbrechen"
 
-#: builtin/notes.c:856
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "Kann --commit, --abort oder -s/--strategy nicht kombinieren."
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "Sie müssen eine Notiz-Referenz zum Mergen angeben."
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "Unbekannter Wert für -s/--strategy: %s"
+
+#: 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 "Ein Merge von Notizen nach %s ist bereits im Gange bei %s"
 
-#: builtin/notes.c:883
+#: builtin/notes.c:863
+#, c-format
+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: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 ""
+"Automatisches Zusammenführen der Notizen fehlgeschlagen. Beheben Sie die\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:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objekt %s hat keine Notiz\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 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:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:979
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "nicht löschen, nur anzeigen"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "gelöschte Notizen melden"
+
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "Notiz-Referenz"
 
-#: builtin/notes.c:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: builtin/notes.c:1019
 #, 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 ""
 "git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: 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 "Fehler beim Komprimieren (%d)"
 
-#: builtin/pack-objects.c:772
+#: builtin/pack-objects.c:768
+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:781
 msgid "Writing objects"
 msgstr "Schreibe Objekte"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
-"Deaktiviere Schreiben des Bitmap-Index, da einige Objekte nicht in\n"
-"eine Pack-Datei geschrieben wurden"
+"Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-"
+"Datei\n"
+"geschrieben wurden."
 
-#: builtin/pack-objects.c:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "Nicht unterstützte Index-Version %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "Ungültige Index-Version '%s'"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "keine Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr ""
 "Forschrittsanzeige während der Phase des Schreibens der Objekte anzeigen"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 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:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "gepackte Objekte ignorieren"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "Paketfenster durch Objekte begrenzen"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2815
 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:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "existierende Unterschiede wiederverwenden"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "existierende Objekte wiederverwenden"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA Objekte verwenden"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 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:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "keine leeren Pakete erzeugen"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 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:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr ""
 "Objekte einschließen, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "Objekte einschließen, die vom Index referenziert werden"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 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:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "Zeit"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "nicht erreichbare lose Objekte packen"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr ""
 "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "Pakete ignorieren, die .keep Dateien haben"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 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:2661
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "Bitmap-Index zusammen mit Pack-Index schreiben"
 
-#: builtin/pack-objects.c:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
@@ -9071,15 +10576,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:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "nicht löschen, nur anzeigen"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "gelöschte Objekte melden"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "Objekte älter als <Zeit> verfallen lassen"
 
@@ -9087,56 +10588,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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Optionen bezogen auf Merge"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "Integration von Änderungen durch Rebase statt Merge"
 
-#: builtin/pull.c:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "Vorspulen erlauben"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "den genannten Commit auf eine gültige GPG-Signatur überprüfen"
+#: 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:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Optionen bezogen auf Fetch"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "Anzahl der parallel mit 'pull' zu verarbeitenden Submodule"
 
-#: builtin/pull.c:275
+#: 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:359
-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:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
-
-#: builtin/pull.c:367
-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:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9144,14 +10634,14 @@ msgstr ""
 "Es gibt keinen Kandidaten für Rebase innerhalb der Referenzen, die eben "
 "angefordert wurden."
 
-#: builtin/pull.c:445
+#: 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:446
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9159,7 +10649,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:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9171,42 +10661,47 @@ msgstr ""
 "Repository für den aktuellen Branch ist, müssen Sie einen Branch auf\n"
 "der Befehlszeile angeben."
 
-#: builtin/pull.c:454
+#: 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:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: 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:469
+#: 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:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<Branch>"
+
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
 "Wenn Sie Tracking-Informationen für diesen Branch setzen möchten, können "
 "Sie\n"
-"dies tun mit:\n"
-"\n"
-" git branch --set-upstream-to=%s/<Branch> %s\n"
+"dies tun mit:"
 
-#: builtin/pull.c:483
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9216,13 +10711,29 @@ msgstr ""
 "des Remote-Repositories durchzuführen, aber diese Referenz\n"
 "wurde nicht angefordert."
 
-#: builtin/pull.c:841
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "Ignoriere --verify-signatures für Rebase"
+
+#: 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: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:870
+#: 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"
@@ -9232,7 +10743,7 @@ msgstr ""
 "\"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
 "Spule Ihr Arbeitsverzeichnis von Commit %s vor."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9249,11 +10760,11 @@ msgstr ""
 "$ git reset --hard\n"
 "zur Wiederherstellung aus."
 
-#: builtin/pull.c:890
+#: 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:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Kann Rebase nicht auf mehrere Branches ausführen."
 
@@ -9430,12 +10941,12 @@ msgstr "Versende nach %s\n"
 msgid "failed to push some refs to '%s'"
 msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
 
-#: builtin/push.c:365
+#: builtin/push.c:366
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Repository '%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 "
@@ -9457,103 +10968,115 @@ msgstr ""
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:381
+#: builtin/push.c:385
 msgid "--all and --tags are incompatible"
 msgstr "Die Optionen --all und --tags sind inkompatibel."
 
-#: builtin/push.c:382
+#: builtin/push.c:386
 msgid "--all can't be combined with refspecs"
 msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:387
+#: builtin/push.c:391
 msgid "--mirror and --tags are incompatible"
 msgstr "Die Optionen --mirror und --tags sind inkompatibel."
 
-#: builtin/push.c:388
+#: builtin/push.c:392
 msgid "--mirror can't be combined with refspecs"
 msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
 
-#: builtin/push.c:393
+#: builtin/push.c:397
 msgid "--all and --mirror are incompatible"
 msgstr "Die Optionen --all und --mirror sind inkompatibel."
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "repository"
 msgstr "Repository"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
+#: builtin/push.c:516 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "alle Referenzen versenden"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
+#: builtin/push.c:517 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "alle Referenzen spiegeln"
 
-#: builtin/push.c:509
+#: builtin/push.c:519
 msgid "delete refs"
 msgstr "Referenzen löschen"
 
-#: builtin/push.c:510
+#: builtin/push.c:520
 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:513 builtin/send-pack.c:164
+#: builtin/push.c:523 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "Aktualisierung erzwingen"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
+#: builtin/push.c:525 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "Referenzname>:<Erwartungswert"
 
-#: 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 "Referenz muss sich auf dem angegebenen Wert befinden"
 
-#: builtin/push.c:519
+#: builtin/push.c:529
 msgid "control recursive pushing of submodules"
 msgstr "rekursiven \"push\" von Submodulen steuern"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
+#: builtin/push.c:531 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "kleinere Pakete verwenden"
 
-#: 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 "'receive pack' Programm"
 
-#: builtin/push.c:524
+#: builtin/push.c:534
 msgid "set upstream for git pull/status"
 msgstr "Upstream für \"git pull/status\" setzen"
 
-#: builtin/push.c:527
+#: builtin/push.c:537
 msgid "prune locally removed refs"
 msgstr "lokal gelöschte Referenzen entfernen"
 
-#: builtin/push.c:529
+#: builtin/push.c:539
 msgid "bypass pre-push hook"
 msgstr "\"pre-push hook\" umgehen"
 
-#: builtin/push.c:530
+#: builtin/push.c:540
 msgid "push missing but relevant tags"
 msgstr "fehlende, aber relevante Tags versenden"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
+#: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "signiert \"push\" mit 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 "Referenzen atomar versenden"
 
-#: builtin/push.c:549
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "serverspezifisch"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "Option übertragen"
+
+#: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
-#: builtin/push.c:551
+#: builtin/push.c:562
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
+#: builtin/push.c:579
+msgid "push options must not have new line characters"
+msgstr "Push-Optionen dürfen keine Zeilenvorschubzeichen haben"
+
 #: builtin/read-tree.c:37
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
@@ -9623,11 +11146,76 @@ msgstr "weder den Index, noch das Arbeitsverzeichnis aktualisieren"
 
 #: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
-msgstr "Anwendung des Filters für spärliches Auschecken überspringen"
+msgstr "Anwendung des Filters für partielles Auschecken überspringen"
 
 #: builtin/read-tree.c:139
 msgid "debug unpack-trees"
-msgstr "Entpacken der Bäume protokollieren"
+msgstr "unpack-trees protokollieren"
+
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <Git-Verzeichnis>"
+
+#: 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 ""
+"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 zu '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: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 ""
+"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:1883
+msgid "quiet"
+msgstr "weniger Ausgaben"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Sie müssen ein Repository angeben."
 
 #: builtin/reflog.c:423
 #, c-format
@@ -9781,12 +11369,12 @@ msgstr ""
 "Die Angabe von zu folgenden Branches kann nur mit dem Anfordern von "
 "Spiegelarchiven verwendet werden."
 
-#: builtin/remote.c:190 builtin/remote.c:633
+#: builtin/remote.c:190 builtin/remote.c:629
 #, c-format
 msgid "remote %s already exists."
 msgstr "externes Repository %s existiert bereits"
 
-#: 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' ist kein gültiger Name für ein Remote-Repository"
@@ -9809,17 +11397,17 @@ msgstr "(übereinstimmend)"
 msgid "(delete)"
 msgstr "(lösche)"
 
-#: 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 "Kein solches Remote-Repository: %s"
 
-#: builtin/remote.c:643
+#: builtin/remote.c:639
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen"
 
-#: builtin/remote.c:663
+#: builtin/remote.c:659
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9830,17 +11418,17 @@ msgstr ""
 "\t%s\n"
 "\tBitte aktualisieren Sie, falls notwendig, die Konfiguration manuell."
 
-#: builtin/remote.c:699
+#: builtin/remote.c:695
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "Konnte '%s' nicht löschen"
 
-#: builtin/remote.c:733
+#: builtin/remote.c:729
 #, c-format
 msgid "creating '%s' failed"
 msgstr "Konnte '%s' nicht erstellen"
 
-#: 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:"
@@ -9856,125 +11444,137 @@ msgstr[1] ""
 "entfernt;\n"
 "um diese zu entfernen, benutzen Sie:"
 
-#: builtin/remote.c:810
+#: builtin/remote.c:806
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen"
 
-#: builtin/remote.c:911
+#: builtin/remote.c:907
 #, 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:914
+#: builtin/remote.c:910
 msgid " tracked"
 msgstr " gefolgt"
 
-#: builtin/remote.c:916
+#: builtin/remote.c:912
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)"
 
-#: 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 "ungültiges branch.%s.merge; kann Rebase nicht auf > 1 Branch ausführen"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "interaktiver Rebase auf Remote-Branch %s"
 
-#: builtin/remote.c:971
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "Rebase auf Remote-Branch %s"
+
+#: builtin/remote.c:967
 #, c-format
 msgid " merges with remote %s"
 msgstr " führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    und mit Remote-Branch"
-
-#: builtin/remote.c:974
+#: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
 msgstr "führt mit Remote-Branch %s zusammen"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   und mit Remote-Branch"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    und mit Remote-Branch %s\n"
 
-#: builtin/remote.c:1021
+#: builtin/remote.c:1016
 msgid "create"
 msgstr "erstellt"
 
-#: builtin/remote.c:1024
+#: builtin/remote.c:1019
 msgid "delete"
 msgstr "gelöscht"
 
-#: builtin/remote.c:1028
+#: builtin/remote.c:1023
 msgid "up to date"
 msgstr "aktuell"
 
-#: builtin/remote.c:1031
+#: builtin/remote.c:1026
 msgid "fast-forwardable"
 msgstr "vorspulbar"
 
-#: builtin/remote.c:1034
+#: builtin/remote.c:1029
 msgid "local out of date"
 msgstr "lokal nicht aktuell"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1036
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s erzwingt Versandt nach %-*s (%s)"
 
-#: builtin/remote.c:1044
+#: builtin/remote.c:1039
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s versendet nach %-*s (%s)"
 
-#: builtin/remote.c:1048
+#: builtin/remote.c:1043
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s erzwingt Versand nach %s"
 
-#: builtin/remote.c:1051
+#: builtin/remote.c:1046
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s versendet nach %s"
 
-#: builtin/remote.c:1119
+#: builtin/remote.c:1114
 msgid "do not query remotes"
 msgstr "keine Abfrage von Remote-Repositories"
 
-#: builtin/remote.c:1146
+#: builtin/remote.c:1141
 #, c-format
 msgid "* remote %s"
 msgstr "* Remote-Repository %s"
 
-#: builtin/remote.c:1147
+#: builtin/remote.c:1142
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL zum Abholen: %s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(keine URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  URL zum Versenden: %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Hauptbranch: %s"
 
-#: builtin/remote.c:1167
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(nicht abgefragt)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(unbekannt)"
+
+#: builtin/remote.c:1164
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9982,241 +11582,254 @@ msgstr ""
 "  Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden "
 "sein):\n"
 
-#: builtin/remote.c:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Remote-Branch:%s"
 msgstr[1] "  Remote-Branches:%s"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (Zustand nicht abgefragt)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 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:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Lokale Referenzen werden von 'git push' gespiegelt"
 
-#: builtin/remote.c:1206
+#: 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] "  Lokale Referenz konfiguriert für 'git push'%s:"
 msgstr[1] "  Lokale Referenzen konfiguriert für 'git push'%s:"
 
-#: builtin/remote.c:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "entfernt refs/remotes/<Name>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Kann HEAD des Remote-Repositories nicht bestimmen"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 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:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Konnte %s nicht entfernen"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "keine gültige Referenz: %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Konnte %s nicht einrichten"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s wird unreferenziert!"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s wurde unreferenziert!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "entferne veraltete Branches von %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [würde veralteten Branch entfernen] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr "* [veralteten Branch entfernt] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "entferne veraltete Branches im Remote-Repository nach \"fetch\""
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Kein solches Remote-Repository '%s'"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "Branch hinzufügen"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "kein Remote-Repository angegeben"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "nur URLs für Push ausgeben"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "alle URLs ausgeben"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "Keine URLs für Remote-Repository '%s' konfiguriert."
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "URLs für \"push\" manipulieren"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "URL hinzufügen"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "URLs löschen"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr ""
 "Die Optionen --add und --delete können nicht gemeinsam verwendet werden."
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "ungültiges altes URL Format: %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Keine solche URL gefunden: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
 
-#: builtin/remote.c:1595
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "erweiterte Ausgaben; muss vor einem Unterbefehl angegeben werden"
 
+#: builtin/remote.c:1622
+#, 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:159
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "alles in eine einzige Pack-Datei packen"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
 
-#: builtin/repack.c:164
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "redundante Pakete entfernen und \"git-prune-packed\" ausführen"
 
-#: builtin/repack.c:166
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "--no-reuse-delta an git-pack-objects übergeben"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "--no-reuse-object an git-pack-objects übergeben"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "git-update-server-info nicht ausführen"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "--local an git-pack-objects übergeben"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "Bitmap-Index schreiben"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "Datumsangabe"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, keine Objekte älter als dieses Datum löschen"
 
-#: builtin/repack.c:179
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr "mit -a, nicht erreichbare Objekte neu packen"
+
+#: builtin/repack.c:182
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
-#: builtin/repack.c:180 builtin/repack.c:184
+#: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "Bytes"
 
-#: builtin/repack.c:181
+#: builtin/repack.c:184
 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:183
+#: builtin/repack.c:186
 msgid "limits the maximum delta depth"
 msgstr "die maximale Delta-Tiefe limitieren"
 
-#: builtin/repack.c:185
+#: builtin/repack.c:188
 msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
-#: builtin/repack.c:187
+#: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden"
 
-#: builtin/repack.c:197
+#: builtin/repack.c:200
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen"
 
-#: builtin/repack.c:381
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable und -A sind inkompatibel"
+
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
-msgid "removing '%s' failed"
-msgstr "Löschen von '%s' fehlgeschlagen"
+msgid "failed to remove '%s'"
+msgstr "Fehler beim Löschen von '%s'"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
@@ -10319,8 +11932,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>...]"
@@ -10440,28 +12053,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:350
+#: 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:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<Optionen>] -- [<Argumente>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "`--` als Argument lassen"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 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:396
 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:527
 msgid ""
 "git rev-parse --parseopt [<options>] -- [<args>...]\n"
 "   or: git rev-parse --sq-quote [<arg>...]\n"
@@ -10533,31 +12146,27 @@ msgstr "Option"
 msgid "option for merge strategy"
 msgstr "Option für Merge-Strategie"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:100
 msgid "append commit name"
 msgstr "Commit-Namen anhängen"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:102
 msgid "preserve initially empty commits"
 msgstr "ursprüngliche, leere Commits erhalten"
 
-#: builtin/revert.c:107
+#: builtin/revert.c:103
 msgid "allow commits with empty messages"
 msgstr "Commits mit leerer Beschreibung erlauben"
 
-#: builtin/revert.c:108
+#: builtin/revert.c:104
 msgid "keep redundant, empty commits"
 msgstr "redundante, leere Commits behalten"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "Programmfehler"
-
-#: builtin/revert.c:197
+#: builtin/revert.c:192
 msgid "revert failed"
 msgstr "\"revert\" fehlgeschlagen"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" fehlgeschlagen"
 
@@ -10652,13 +12261,6 @@ msgstr "rekursive Entfernung erlauben"
 msgid "exit with a zero status even if nothing matched"
 msgstr "mit Rückgabewert 0 beenden, wenn keine Übereinstimmung gefunden wurde"
 
-#: builtin/rm.c:317
-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/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10738,71 +12340,125 @@ 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:375
+#, 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:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "keine übereinstimmenden Referenzen mit %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
 msgstr "Remote-Tracking und lokale Branches anzeigen"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
 msgstr "Remote-Tracking-Branches anzeigen"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "'*!+-' entsprechend des Branches einfärben"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 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:647
 msgid "synonym to more=-1"
 msgstr "Synonym für more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "Namen unterdrücken"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "den aktuellen Branch einbeziehen"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "Commits nach ihren Objektnamen benennen"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
 msgstr "mögliche Merge-Basen anzeigen"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 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:658
 msgid "show commits in topological order"
 msgstr "Commits in topologischer Ordnung anzeigen"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 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:663
 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:665
 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:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<Basis>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 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:703
+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:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "keine Branches angegeben, und HEAD ist ungültig"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "Die Option --reflog benötigt einen Branchnamen."
+
+#: 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] "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:737
+#, c-format
+msgid "no such ref %s"
+msgstr "Referenz nicht gefunden: %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] "Kann nicht mehr als %d Commit behandeln."
+msgstr[1] "Kann nicht mehr als %d Commits behandeln."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' ist keine gültige Referenz."
+
+#: builtin/show-branch.c:836
+#, 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 | --"
@@ -10869,81 +12525,232 @@ msgstr ""
 msgid "prepend comment character and space to each line"
 msgstr "Kommentarzeichen mit Leerzeichen an jede Zeile voranstellen"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr "Referenz nicht gefunden: %s"
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Vollständiger Referenzname erwartet, %s erhalten"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "Kann eine Komponente von URL '%s' nicht extrahieren"
+
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "Alternativer Anker für relative Pfade"
 
-#: builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<Pfad>] [<Pfad>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, 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:369
+#, 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:373
+#, 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:383
+#, 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:390
+#, 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:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Ausgaben bei Initialisierung eines Submoduls unterdrücken"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<Pfad>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <Pfad>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, 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:164
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "Submodul '%s' kann Alternative nicht hinzufügen: %s"
+
+#: builtin/submodule--helper.c:563
+#, 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:570
+#, 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:593
 msgid "where the new submodule will be cloned to"
 msgstr "Pfad für neues Submodul"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "Name des neuen Submoduls"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "URL von der das Submodul geklont wird"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "Tiefe des Klons mit unvollständiger Historie (shallow)"
 
-#: builtin/submodule--helper.c:182
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "Fortschrittsanzeige beim Klonen erzwingen"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<Pfad>] [--quiet] [--reference "
-"<Repository>] [--name <Name>] [--url <URL>][--depth <Tiefe>] [--] [<Pfad>...]"
+"<Repository>] [--name <Name>] [--url <URL>] [--name <Name>] [--depth "
+"<Tiefe>] --url <URL> --path <Pfad>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "Klonen von '%s' in Submodul-Pfad '%s' fehlgeschlagen"
 
-#: builtin/submodule--helper.c:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "Kann Datei '%s' nicht öffnen"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "Konnte Datei '%s' nicht schließen."
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "Konnte Submodul-Verzeichnis '%s' nicht finden."
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr "fatal: submodule--helper muss mit einem Unterbefehl aufgerufen werden"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "Submodul-Pfad '%s' nicht initialisiert"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Meinten Sie vielleicht 'update --init'?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "Überspringe nicht zusammengeführtes Submodul %s"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "Überspringe Submodul '%s'"
+
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Fehler beim Klonen von '%s'. Weiterer Versuch geplant"
+
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr "Zweiter Versuch '%s' zu klonen fehlgeschlagen, breche ab."
+
+#: builtin/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr "Pfad zum Arbeitsverzeichnis"
+
+#: builtin/submodule--helper.c:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr ""
+"Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg"
+
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout oder none"
+
+#: builtin/submodule--helper.c:956
+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:959
+msgid "parallel jobs"
+msgstr "Parallele Ausführungen"
+
+#: builtin/submodule--helper.c:961
+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:962
+msgid "don't print cloning progress"
+msgstr "keine Fortschrittsanzeige beim Klonen"
+
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<Pfad>] [<Pfad>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "Fehlerhafter Wert für --update Parameter"
+
+#: 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 ""
+"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:274
+#: builtin/submodule--helper.c:1100
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr "submodule--helper muss mit einem Unterbefehl aufgerufen werden"
+
+#: builtin/submodule--helper.c:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "fatal: '%s' ist kein gültiger Unterbefehl von submodule--helper"
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
@@ -10998,27 +12805,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <Tagname>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "Tagname zu lang: %.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "Tag '%s' nicht gefunden."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' gelöscht (war %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "Konnte Tag '%s' nicht verifizieren"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -11031,7 +12833,7 @@ msgstr ""
 "  %s\n"
 "ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -11163,26 +12965,26 @@ msgstr "Die Optionen --merged und --no-merged sind nur mit -l erlaubt."
 msgid "only one -F or -m option is allowed."
 msgstr "nur eine -F oder -m Option ist erlaubt."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "zu viele Parameter"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' ist kein gültiger Tagname."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "Tag '%s' existiert bereits"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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"
 
@@ -11255,147 +13057,155 @@ 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 [<Optionen>] [--] [<Datei>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 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:922
 msgid "refresh: ignore submodules"
 msgstr "Aktualisierung: ignoriert Submodule"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "keine neuen Dateien ignorieren"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 msgid "let files replace directories and vice-versa"
 msgstr "Dateien Verzeichnisse ersetzen lassen, und umgedreht"
 
-#: builtin/update-index.c:940
+#: builtin/update-index.c:929
 msgid "notice files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis beachten"
 
-#: builtin/update-index.c:942
+#: builtin/update-index.c:931
 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:934
 msgid "refresh stat information"
 msgstr "Dateiinformationen aktualisieren"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 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:942
 msgid "<mode>,<object>,<path>"
 msgstr "<Modus>,<Objekt>,<Pfad>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "den angegebenen Eintrag zum Commit vormerken"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben"
-
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "diese Datei immer als unverändert betrachten"
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "\"assumed-unchanged\"-Bit löschen"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "Dateien als \"index-only\" markieren"
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "\"skip-worktree\"-Bit löschen"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 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:966
 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:968
 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:970
 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:974
 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:978
 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:982
 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:986
 msgid "ignore files missing from worktree"
 msgstr "fehlende Dateien im Arbeitsverzeichnis ignorieren"
 
-#: builtin/update-index.c:1000
+#: builtin/update-index.c:989
 msgid "report actions to standard output"
 msgstr "die Aktionen in der Standard-Ausgabe ausgeben"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 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:995
 msgid "write index in this format"
 msgstr "Index-Datei in diesem Format schreiben"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "Splitting des Index aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "Cache für unversionierte Dateien aktivieren oder deaktivieren"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 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:1003
 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:1119
+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:1123
 msgid "Untracked cache disabled"
 msgstr "Cache für unversionierte Dateien deaktiviert"
 
-#: 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 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:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Cache für unversionierte Dateien für '%s' aktiviert"
@@ -11445,7 +13255,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:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "unbearbeitete Ausgabe des Status von gpg ausgeben"
 
@@ -11465,7 +13275,7 @@ msgstr "nur Statistiken anzeigen"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <Tag>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "Tag-Inhalte ausgeben"
 
@@ -11474,80 +13284,111 @@ msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<Optionen>] <Pfad> [<Branch>]"
 
 #: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<Optionen>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<Optionen>] <Pfad>"
+
+#: builtin/worktree.c:18
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<Optionen>]"
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<Optionen>]"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <Pfad>"
 
-#: builtin/worktree.c:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Lösche worktrees/%s: kein gültiges Verzeichnis"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Lösche worktrees/%s: gitdir-Datei existiert nicht"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, 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:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Lösche worktrees/%s: ungültige gitdir-Datei"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, 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:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "Fehler beim Löschen: %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existiert bereits"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Bereite %s vor (Identifikation %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 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:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "neuen Branch erstellen"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "Branch erstellen oder umsetzen"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "HEAD bei benanntem Commit loslösen"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "das neue Arbeitsverzeichnis auschecken"
+
+#: builtin/worktree.c:337
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B und --detach schließen sich gegenseitig aus"
 
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "Sperrgrund"
+
+#: builtin/worktree.c:482 builtin/worktree.c:515
+#, c-format
+msgid "'%s' is not a working tree"
+msgstr "'%s' ist kein Arbeitsverzeichnis"
+
+#: builtin/worktree.c:484 builtin/worktree.c:517
+msgid "The main working tree cannot be locked or unlocked"
+msgstr "Das Hauptarbeitsverzeichnis kann nicht gesperrt oder entsperrt werden."
+
+#: builtin/worktree.c:489
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "'%s' ist bereits gesperrt, Grund: %s"
+
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "'%s' ist bereits gesperrt"
+
+#: builtin/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "'%s' ist nicht gesperrt"
+
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr "git write-tree [--missing-ok] [--prefix=<Präfix>/]"
@@ -11564,7 +13405,45 @@ msgstr "das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix> schreiben"
 msgid "only useful for debugging"
 msgstr "nur nützlich für Fehlersuche"
 
-#: credential-cache--daemon.c:262
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<Optionen>] <Verzeichnis>"
+
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "nach einem einzigen Request/Response-Austausch beenden"
+
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "direkt nach der initialen Angabe der Commits beenden"
+
+#: upload-pack.c:1032
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+msgstr ""
+"kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis "
+"ist"
+
+#: upload-pack.c:1034
+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"
 
@@ -11579,7 +13458,11 @@ msgstr ""
 "oder 'git help <Konzept>', um mehr über einen spezifischen Befehl oder\n"
 "Konzept zu erfahren."
 
-#: http.c:321
+#: http.c:342
+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:351
 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"
@@ -11707,49 +13590,49 @@ 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"
 
-#: rerere.h:38
+#: rerere.h:40
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "Index, wenn möglich, mit wiederverwendeter Konfliktauflösung aktualisieren"
 
-#: git-bisect.sh:55
+#: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
 msgstr "Sie müssen mit \"git bisect start\" beginnen."
 
 #. 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 "Wollen Sie, dass ich es für Sie mache [Y/n]? "
 
-#: git-bisect.sh:122
+#: git-bisect.sh:121
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "nicht erkannte Option: '$arg'"
 
-#: git-bisect.sh:126
+#: git-bisect.sh:125
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' scheint kein gültiger Commit zu sein"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:154
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Ungültiger HEAD - HEAD wird benötigt"
 
-#: git-bisect.sh:168
+#: git-bisect.sh:167
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11757,28 +13640,29 @@ msgstr ""
 "Auschecken von '$start_head' fehlgeschlagen. Versuchen Sie 'git bisect reset "
 "<gültiger-Branch>'."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "binäre Suche auf einem durch 'cg-seek' geändertem Verzeichnis nicht möglich"
 
-#: git-bisect.sh:182
+#: git-bisect.sh:181
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Ungültiger HEAD - merkwürdige symbolische Referenz"
 
-#: git-bisect.sh:234
+#: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Ungültiges \"bisect_write\" Argument: $state"
 
-#: git-bisect.sh:263
+#: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Ungültige Referenz-Eingabe: $arg"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Bitte rufen Sie 'bisect_state' mit mindestens einem Argument auf."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Ungültige Referenz-Eingabe: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
@@ -11914,20 +13798,61 @@ msgstr ""
 "Ungültiger Befehl: Sie sind gerade bei einer binären $TERM_BAD/$TERM_GOOD "
 "Suche."
 
-#: git-bisect.sh:636
-msgid "no terms defined"
-msgstr "Keine Begriffe definiert."
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "Keine Begriffe definiert."
+
+#: 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 ""
+"Ungültiges Argument $arg für 'git bisect terms'.\n"
+"Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
+
+#: git-merge-octopus.sh:46
+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"
+"überschrieben werden"
+
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "Automatischer Merge hat nicht funktioniert."
+
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "Sollte keinen Octopus-Merge ausführen."
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Konnte keinen gemeinsamen Commit mit $pretty_name finden."
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Bereits aktuell mit $pretty_name"
+
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Spule vor zu: $pretty_name"
 
-#: git-bisect.sh:653
+#: git-merge-octopus.sh:97
 #, sh-format
-msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-"Ungültiges Argument $arg für 'git bisect terms'.\n"
-"Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
+msgid "Trying simple merge with $pretty_name"
+msgstr "Versuche einfachen Merge mit $pretty_name"
+
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr "Einfacher Merge hat nicht funktioniert, versuche automatischen Merge."
 
-#: git-rebase.sh:57
+#: 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"
@@ -11941,52 +13866,53 @@ msgstr ""
 "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n"
 "führen Sie \"git rebase --abort\" aus."
 
-#: git-rebase.sh:165
+#: git-rebase.sh:156 git-rebase.sh:395
+#, 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 "\"autostash\" angewendet."
+msgstr "Automatischen Stash angewendet."
 
-#: git-rebase.sh:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Kann $stash_sha1 nicht speichern."
 
-#: git-rebase.sh:169
+#: 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 von \"autostash\" resultierte in Konflikten.\n"
+"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:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 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:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "Die Option --exec muss mit --interactive verwendet werden."
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Kein Rebase im Gange?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 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:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Kann HEAD nicht lesen"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11994,12 +13920,7 @@ msgstr ""
 "Sie müssen alle Merge-Konflikte editieren und diese dann\n"
 "mittels \"git add\" als aufgelöst markieren"
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Konnte nicht zu $head_name zurückgehen"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12020,100 +13941,104 @@ msgstr ""
 "und führen Sie diesen Befehl nochmal aus. Es wird angehalten, falls noch\n"
 "etwas Schützenswertes vorhanden ist."
 
-#: git-rebase.sh:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "ungültiger Upstream-Branch $upstream_name"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, 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:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: es gibt keine Merge-Basis"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "$onto_name zeigt auf keinen gültigen Commit"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: Branch $branch_name nicht gefunden"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
-msgstr "Kann \"autostash\" nicht ausführen."
+msgstr "Kann automatischen Stash nicht erzeugen."
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
-msgstr "\"autostash\" erzeugt: $stash_abbrev"
+msgstr "Automatischen Stash erzeugt: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Aktueller Branch $branch_name ist auf dem neuesten Stand."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, 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:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Änderungen von $mb zu $onto:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 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:623
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name zu $onto_name vorgespult."
 
-#: git-stash.sh:51
+#: git-stash.sh:50
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear mit Parametern ist nicht implementiert"
 
-#: git-stash.sh:74
+#: git-stash.sh:73
 msgid "You do not have the initial commit yet"
 msgstr "Sie haben bisher noch keinen initialen Commit"
 
-#: git-stash.sh:89
+#: git-stash.sh:88
 msgid "Cannot save the current index state"
 msgstr "Kann den aktuellen Zustand des Index nicht speichern"
 
-#: git-stash.sh:124 git-stash.sh:137
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Kann die unversionierten Dateien nicht speichern"
+
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
 
-#: git-stash.sh:141
+#: git-stash.sh:140
 msgid "No changes selected"
 msgstr "Keine Änderungen ausgewählt"
 
-#: git-stash.sh:144
+#: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Kann temporären Index nicht löschen (kann nicht passieren)"
 
-#: git-stash.sh:157
+#: git-stash.sh:156
 msgid "Cannot record working tree state"
 msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen"
 
-#: git-stash.sh:189
+#: git-stash.sh:188
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren."
@@ -12128,7 +14053,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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12138,115 +14063,127 @@ msgstr ""
 "        Um eine Beschreibung anzugeben, benutzen Sie \"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 "Kann nicht gleichzeitig --patch und --include-untracked oder --all verwenden"
+
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Keine lokalen Änderungen zum Speichern"
 
-#: git-stash.sh:264
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Kann \"stash\" nicht initialisieren"
 
-#: git-stash.sh:268
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Kann den aktuellen Status nicht speichern"
 
-#: git-stash.sh:286
+#: git-stash.sh:268
+#, sh-format
+msgid "Saved working directory and index state $stash_msg"
+msgstr "Speicherte Arbeitsverzeichnis und Index-Status $stash_msg"
+
+#: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
-#: git-stash.sh:405
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "unbekannte Option: $opt"
 
-#: git-stash.sh:415
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "Kein Stash-Eintrag gefunden."
 
-#: git-stash.sh:422
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Zu viele Commits angegeben: $REV"
 
-#: git-stash.sh:428
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference ist keine gültige Referenz"
 
-#: git-stash.sh:456
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' ist kein \"stash\"-artiger Commit"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' ist keine \"stash\"-Referenz"
 
-#: git-stash.sh:475
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "Konnte den Index nicht aktualisieren."
 
-#: git-stash.sh:479
+#: git-stash.sh:489
 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:487
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Konflikte im Index. Versuchen Sie es ohne --index."
 
-#: git-stash.sh:489
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
-#: git-stash.sh:523
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Konnte unversionierte Dateien vom Stash nicht wiederherstellen"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus dem Index entfernen"
 
-#: git-stash.sh:538
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
-#: git-stash.sh:561
+#: git-stash.sh:562
+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:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
-#: git-stash.sh:562
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
-#: git-stash.sh:570
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Kein Branchname spezifiziert"
 
-#: git-stash.sh:642
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 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:291
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12257,127 +14194,96 @@ msgstr ""
 "$sm_path\n"
 "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, 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:332
+#: git-submodule.sh:235
 #, 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:340
+#: git-submodule.sh:243
 #, 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:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
-"Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt "
-"erneut zu klonen"
-
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das "
-"korrekte Repository ist"
-
-#: git-submodule.sh:345
+#: git-submodule.sh:245
 #, 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 ""
-"oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen "
-"Namen mit der Option '--name'."
+"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"
+"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:347
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
-#: git-submodule.sh:359
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Betrete '$prefix$displaypath'"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr "Stoppe bei '$prefix$displaypath'; Skript gab nicht-Null Status zurück."
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr "Keine URL für Submodul-Pfad '$displaypath' in .gitmodules gefunden"
-
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr ""
-"Fehler beim Eintragen der URL für Submodul-Pfad '$displaypath' in die "
-"Konfiguration."
-
-#: git-submodule.sh:494
+#: git-submodule.sh:324
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr ""
-"Submodul '$name' ($url) für Pfad '$displaypath' in die Konfiguration "
-"eingetragen."
+msgid "Entering '$displaypath'"
+msgstr "Betrete '$displaypath'"
 
-#: git-submodule.sh:511
+#: git-submodule.sh:344
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr ""
-"Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad "
-"'$displaypath' in der Konfiguration."
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr "Stoppe bei '$displaypath'; Skript gab nicht-Null Status zurück."
 
-#: git-submodule.sh:549
+#: git-submodule.sh:415
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr ""
-"Verwenden Sie '.' wenn Sie wirklich alle Submodule\n"
-"deinitialisieren möchten."
+msgid "pathspec and --all are incompatible"
+msgstr "Pfadspezifikationen und --all sind inkompatibel."
 
-#: git-submodule.sh:566
+#: git-submodule.sh:420
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
+msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
-"Arbeitsverzeichnis des Submoduls in '$displaypath' enthält ein .git-"
-"Verzeichnis"
+"Verwenden Sie '--all', wenn Sie wirklich alle Submodule deinitialisieren\n"
+"möchten."
 
-#: git-submodule.sh:567
+#: 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 ""
-"(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
-"seiner Historie löschen möchten)"
+"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:573
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -12386,764 +14292,682 @@ msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f', um diese zu verwerfen"
 
-#: git-submodule.sh:576
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Verzeichnis '$displaypath' bereinigt."
 
-#: git-submodule.sh:577
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
 
-#: git-submodule.sh:580
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
 
-#: git-submodule.sh:589
+#: git-submodule.sh:464
 #, 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:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"Submodul-Pfad '$displaypath' ist nicht initialisiert.\n"
-"Vielleicht möchten Sie 'update --init' benutzen?"
-
-#: git-submodule.sh:736
+#: git-submodule.sh:617
 #, 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:745
+#: git-submodule.sh:627
 #, 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:768
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr ""
+"Konnte aktuellen Commit von ${remote_name}/${branch} in Submodul-Pfad\n"
+"'$sm_path' nicht finden."
+
+#: git-submodule.sh:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
-#: git-submodule.sh:788
+#: 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 ""
+"\"fetch\" in Submodul-Pfad '$displaypath' ausgeführt, aber $sha1 nicht\n"
+"enthalten. Direktes Anfordern dieses Commits ist fehlgeschlagen."
+
+#: git-submodule.sh:663
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
-#: git-submodule.sh:789
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:793
+#: git-submodule.sh:668
 #, 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:794
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
 
-#: git-submodule.sh:799
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
 
-#: git-submodule.sh:800
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:805
+#: git-submodule.sh:680
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
-"Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' "
+"Ausführung von '$command $sha1' in Submodul-Pfad '$displaypath' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:806
+#: git-submodule.sh:681
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Submodul-Pfad '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:836
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
 
-#: git-submodule.sh:944
+#: git-submodule.sh:820
 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:996
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:1016
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_src"
 
-#: git-submodule.sh:1019
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
 
-#: git-submodule.sh:1022
+#: git-submodule.sh:898
 #, 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:1047
-msgid "blob"
-msgstr "Blob"
-
-#: git-submodule.sh:1165
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 
-#: git-submodule.sh:1229
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 
-#~ msgid "Forward-port local commits to the updated upstream head"
-#~ msgstr "lokale Commits auf einem aktuellerem Upstream-Branch neu aufbauen"
-
-#~ msgid "unable to parse format"
-#~ msgstr "Konnte Format nicht parsen."
-
-#~ msgid "improper format entered align:%s"
-#~ msgstr "Sie haben ein ungültiges Format eingegeben align:%s"
-
-#~ msgid "Could not set core.worktree in %s"
-#~ msgstr "Konnte core.worktree in '%s' nicht setzen."
-
-#~ msgid ""
-#~ "push.default is unset; its implicit value has changed in\n"
-#~ "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-#~ "and maintain the traditional behavior, use:\n"
-#~ "\n"
-#~ "  git config --global push.default matching\n"
-#~ "\n"
-#~ "To squelch this message and adopt the new behavior now, use:\n"
-#~ "\n"
-#~ "  git config --global push.default simple\n"
-#~ "\n"
-#~ "When push.default is set to 'matching', git will push local branches\n"
-#~ "to the remote branches that already exist with the same name.\n"
-#~ "\n"
-#~ "Since Git 2.0, Git defaults to the more conservative 'simple'\n"
-#~ "behavior, which only pushes the current branch to the corresponding\n"
-#~ "remote branch that 'git pull' uses to update the current branch.\n"
-#~ "\n"
-#~ "See 'git help config' and search for 'push.default' for further "
-#~ "information.\n"
-#~ "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
-#~ "'current' instead of 'simple' if you sometimes use older versions of Git)"
-#~ msgstr ""
-#~ "'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n"
-#~ "wurde in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung "
-#~ "zu\n"
-#~ "unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n"
-#~ "beizubehalten, benutzen Sie:\n"
-#~ "\n"
-#~ "  git config --global push.default matching\n"
-#~ "\n"
-#~ "Um diese Meldung zu unterdrücken und das neue Verhalten jetzt zu "
-#~ "übernehmen, benutzen Sie:\n"
-#~ "\n"
-#~ "  git config --global push.default simple\n"
-#~ "\n"
-#~ "Wenn 'push.default' auf den Wert 'matching' gesetzt ist, werden lokale\n"
-#~ "Branches zu den Remote-Branches mit den selben Namen versendet.\n"
-#~ "\n"
-#~ "In Git 2.0 wurde das Standardverhalten zu 'simple' geändert. Hierbei "
-#~ "wird\n"
-#~ "der aktuelle Branch zu dem entsprechenden Remote-Branch versendet, den\n"
-#~ "'git pull' zur Aktualisierung des aktuellen Branches verwendet.\n"
-#~ "\n"
-#~ "Führen Sie 'git help config' aus und suchen Sie nach 'push.default' für\n"
-#~ "weitere Informationen.\n"
-#~ "(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den "
-#~ "ähnlichen\n"
-#~ "Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen "
-#~ "von\n"
-#~ "Git benutzen.)"
-
-#~ msgid "check|on-demand|no"
-#~ msgstr "check|on-demand|no"
-
-#~ msgid "Could not append '%s'"
-#~ msgstr "Konnte '%s' nicht anhängen."
-
-#~ msgid "Could not set '%s'"
-#~ msgstr "Konnte '%s' nicht setzen"
-
-#~ msgid "Missing author: %s"
-#~ msgstr "fehlender Autor: %s"
-
-#~ msgid "Testing "
-#~ msgstr "Prüfe "
-
-#~ msgid "unable to look up current user in the passwd file: %s"
-#~ msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s"
-
-#~ msgid "no such user"
-#~ msgstr "kein solcher Benutzer"
-
-#~ msgid "branch '%s' does not point at a commit"
-#~ msgstr "Branch '%s' zeigt auf keinen Commit"
-
-#~ msgid "object '%s' does not point to a commit"
-#~ msgstr "Objekt '%s' zeigt auf keinen Commit"
-
-#~ msgid "some refs could not be read"
-#~ msgstr "Konnte einige Referenzen nicht lesen"
-
-#~ msgid "print only merged branches"
-#~ msgstr "nur Branches ausgeben, die zusammengeführt sind"
-
-#~ msgid "--dissociate given, but there is no --reference"
-#~ msgstr "--dissociate ohne --reference angegeben"
-
-#~ msgid "show usage"
-#~ msgstr "Verwendung anzeigen"
-
-#~ msgid "insanely long template name %s"
-#~ msgstr "zu langer Vorlagen-Name %s"
-
-#~ msgid "insanely long symlink %s"
-#~ msgstr "zu lange symbolische Verknüpfung %s"
-
-#~ msgid "insanely long template path %s"
-#~ msgstr "zu langer Vorlagen-Pfad %s"
-
-#~ msgid "insane git directory %s"
-#~ msgstr "ungültiges Git-Verzeichnis %s"
-
-#~ msgid "unsupported sort specification '%s'"
-#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s'"
-
-#~ msgid "unsupported sort specification '%s' in variable '%s'"
-#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s' in Variable '%s'"
-
-#~ msgid "switch 'points-at' requires an object"
-#~ msgstr "Option 'points-at' erfordert ein Objekt"
-
-#~ msgid "sort tags"
-#~ msgstr "Tags sortieren"
-
-#~ msgid "--sort and -n are incompatible"
-#~ msgstr "--sort und -n sind inkompatibel"
-
-#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-#~ msgstr ""
-#~ "Git-Verzeichnis '$a' ist Teil des Submodul-Pfades '$b', oder umgekehrt"
-
-#~ msgid "false|true|preserve"
-#~ msgstr "false|true|preserve"
-
-#~ msgid "BUG: reopen a lockfile that is still open"
-#~ msgstr "FEHLER: Wiederöffnen einer bereits geöffneten Lock-Datei"
-
-#~ msgid "BUG: reopen a lockfile that has been committed"
-#~ msgstr "FEHLER: Wiederöffnen einer bereits committeten Lock-Datei"
-
-#~ msgid "option %s does not accept negative form"
-#~ msgstr "Option %s akzeptiert keine negative Form"
-
-#~ msgid "unable to parse value '%s' for option %s"
-#~ msgstr "konnte Wert '%s' für Option %s nicht parsen"
-
-#~ msgid "-b and -B are mutually exclusive"
-#~ msgstr "-b und -B schließen sich gegenseitig aus"
-
-#~ msgid "You need to set your committer info first"
-#~ msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
-
-#~ msgid ""
-#~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
-#~ "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
-#~ "To restore the original branch and stop patching, run \"$cmdline --abort"
-#~ "\"."
-#~ msgstr ""
-#~ "Wenn Sie das Problem gelöst haben, führen Sie \"$cmdline --continue\" "
-#~ "aus.\n"
-#~ "Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen\n"
-#~ "\"$cmdline --skip\" aus.\n"
-#~ "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der\n"
-#~ "Patches abzubrechen, führen Sie \"$cmdline --abort\" aus."
-
-#~ msgid "Patch format $patch_format is not supported."
-#~ msgstr "Patch-Format $patch_format wird nicht unterstützt."
-
-#~ msgid "Please make up your mind. --skip or --abort?"
-#~ msgstr "Bitte werden Sie sich klar. --skip oder --abort?"
-
-#~ msgid ""
-#~ "Patch is empty.  Was it split wrong?\n"
-#~ "If you would prefer to skip this patch, instead run \"$cmdline --skip\".\n"
-#~ "To restore the original branch and stop patching run \"$cmdline --abort\"."
-#~ msgstr ""
-#~ "Patch ist leer. Wurde er falsch aufgeteilt?\n"
-#~ "Wenn Sie diesen Patch auslassen möchten, führen Sie stattdessen\n"
-#~ "\"$cmdline --skip\" aus.\n"
-#~ "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der "
-#~ "Patches\n"
-#~ "abzubrechen, führen Sie \"$cmdline --abort\" aus."
-
-#~ msgid "Patch does not have a valid e-mail address."
-#~ msgstr "Patch enthält keine gültige E-Mail-Adresse."
-
-#~ msgid "Applying: $FIRSTLINE"
-#~ msgstr "Wende an: $FIRSTLINE"
-
-#~ msgid "Patch failed at $msgnum $FIRSTLINE"
-#~ msgstr "Anwendung des Patches fehlgeschlagen bei $msgnum $FIRSTLINE"
-
-#~ msgid ""
-#~ "Pull is not possible because you have unmerged files.\n"
-#~ "Please, 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 ""
-#~ "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien "
-#~ "haben.\n"
-#~ "Bitte korrigieren Sie dies im Arbeitsverzeichnis und benutzen Sie dann\n"
-#~ "'git add/rm <Datei>', um die Auflösung entsprechend zu markieren und zu\n"
-#~ "committen."
-
-#~ msgid "Pull is not possible because you have unmerged files."
-#~ msgstr ""
-#~ "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
-
-#~ msgid ""
-#~ "You have not concluded your merge (MERGE_HEAD exists).\n"
-#~ "Please, commit your changes before you can merge."
-#~ msgstr ""
-#~ "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
-#~ "Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können."
-
-#~ msgid "no branch specified"
-#~ msgstr "Kein Branch spezifiziert"
-
-#~ msgid "check a branch out in a separate working directory"
-#~ msgstr "Branch in separatem Arbeitsverzeichnis auschecken"
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "Siehe git-${cmd}(1) für weitere Details."
 
-#~ msgid "prune .git/worktrees"
-#~ msgstr ""
-#~ "Informationen zu nicht mehr existierenden Arbeitsverzeichnissen in .git/"
-#~ "worktrees entfernen"
+#: git-rebase--interactive.sh:140
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Führe Rebase aus ($new_count/$total)"
 
-#~ msgid "The most commonly used git commands are:"
-#~ msgstr "Die allgemein verwendeten Git-Kommandos sind:"
+#: 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"
+"Befehle:\n"
+" p, pick = Commit verwenden\n"
+" r, reword = Commit verwenden, aber Commit-Beschreibung bearbeiten\n"
+" e, edit = Commit verwenden, aber zum Nachbessern anhalten\n"
+" s, squash = Commit verwenden, aber mit vorherigem Commit vereinen\n"
+" f, fixup = wie \"squash\", aber diese Commit-Beschreibung verwerfen\n"
+" x, exec = Befehl (Rest der Zeile) mittels Shell ausführen\n"
+" d, drop = Commit entfernen\n"
+"\n"
+"Diese Zeilen können umsortiert werden; Sie werden von oben nach unten\n"
+"ausgeführt.\n"
 
-#~ msgid "No such branch: '%s'"
-#~ msgstr "Kein solcher Branch '%s'"
+#: git-rebase--interactive.sh:171
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"Keine Zeile entfernen. Benutzen Sie 'drop', um explizit einen Commit zu\n"
+"entfernen.\n"
 
-#~ msgid "Could not create git link %s"
-#~ msgstr "Konnte git-Verweis %s nicht erstellen"
+#: git-rebase--interactive.sh:175
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Wenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
 
-#~ msgid "Invalid gc.pruneexpire: '%s'"
-#~ msgstr "Ungültiges Wert für \"gc.pruneexpire\": '%s'"
+#: 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 ""
+"Sie können den Commit nun nachbessern mit:\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Sobald Sie mit Ihren Änderungen zufrieden sind, führen Sie aus:\n"
+"\n"
+"\tgit rebase --continue"
 
-#~ msgid "(detached from %s)"
-#~ msgstr "(losgelöst von %s)"
+#: git-rebase--interactive.sh:236
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1: kein Commit der gepickt werden kann"
 
-#~ msgid "search also in ignored files"
-#~ msgstr "auch in ignorierten Dateien suchen"
+#: git-rebase--interactive.sh:275
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Ungültiger Commit-Name: $sha1"
 
-#~ msgid "No existing author found with '%s'"
-#~ msgstr "Kein existierender Autor mit '%s' gefunden."
+#: git-rebase--interactive.sh:317
+msgid "Cannot write current commit's replacement sha1"
+msgstr "Kann ersetzenden SHA-1 des aktuellen Commits nicht schreiben"
 
-#~ msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
-#~ msgstr "git remote set-head <Name> (-a | --auto | -d | --delete | <Branch>)"
+#: git-rebase--interactive.sh:369
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Spule vor zu $sha1"
 
-#~ msgid "no files added"
-#~ msgstr "keine Dateien hinzugefügt"
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "Kann nicht zu $sha1 vorspulen"
 
-#~ msgid "force creation (when already exists)"
-#~ msgstr "Branch auch erzeugen, wenn dieser bereits existiert"
+#: git-rebase--interactive.sh:380
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Kann HEAD nicht auf $first_parent setzen"
 
-#~ msgid "slot"
-#~ msgstr "Slot"
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "\"squash\" eines Merges ($sha1) zurückgewiesen."
 
-#~ msgid "check"
-#~ msgstr "check|on-demand"
+#: git-rebase--interactive.sh:399
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "Fehler beim Wiederholen des Merges von $sha1"
 
-#~ msgid "Failed to lock ref for update"
-#~ msgstr "Fehler beim Sperren der Referenz zur Aktualisierung."
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "Konnte $sha1 nicht picken"
 
-#~ msgid "Failed to write ref"
-#~ msgstr "Fehler beim Schreiben der Referenz."
+#: git-rebase--interactive.sh:416
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "Das ist Commit-Beschreibung #${n}:"
 
-#~ msgid "Failed to lock HEAD during fast_forward_to"
-#~ msgstr "Fehler beim Sperren von HEAD während fast_forward_to"
+#: git-rebase--interactive.sh:421
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "Commit-Beschreibung #${n} wird ausgelassen:"
 
-#~ msgid "invalid commit: %s"
-#~ msgstr "Ungültiger Commit: %s"
+#: 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."
 
-#~ msgid "cannot lock HEAD ref"
-#~ msgstr "Kann Referenz von HEAD nicht sperren."
+#: git-rebase--interactive.sh:440
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "Kann $fixup_msg nicht schreiben"
 
-#~ msgid "cannot update HEAD ref"
-#~ msgstr "Kann Referenz von HEAD nicht aktualisieren."
+#: git-rebase--interactive.sh:443
+msgid "This is a combination of 2 commits."
+msgstr "Das ist eine Kombination aus 2 Commits."
 
-#~ msgid "cannot tell cwd"
-#~ msgstr "kann aktuelles Arbeitsverzeichnis nicht ermitteln"
+#: git-rebase--interactive.sh:444
+msgid "This is the 1st commit message:"
+msgstr "Das ist die erste Commit-Beschreibung:"
 
-#~ msgid "%s: cannot lock the ref"
-#~ msgstr "%s: kann Referenz nicht sperren"
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "Konnte $sha1... ($rest) nicht anwenden"
 
-#~ msgid "%s: cannot update the ref"
-#~ msgstr "%s: kann Referenz nicht aktualisieren"
+#: 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 ""
+"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."
+
+#: git-rebase--interactive.sh:573
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Angehalten bei $sha1_abbrev... $rest"
 
-#~ msgid "commit has empty message"
-#~ msgstr "Commit hat eine leere Beschreibung"
+#: git-rebase--interactive.sh:588
+#, sh-format
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "Kann nicht '$squash_style' ohne vorherigen Commit"
 
-#~ msgid "Failed to chdir: %s"
-#~ msgstr "Fehler beim Verzeichniswechsel: %s"
+#: git-rebase--interactive.sh:630
+#, sh-format
+msgid "Executing: $rest"
+msgstr "Führe aus: $rest"
 
-#~ msgid "key id"
-#~ msgstr "Schlüssel-ID"
+#: git-rebase--interactive.sh:638
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "Ausführung fehlgeschlagen: $rest"
 
-#~ msgid "Tracking not set up: name too long: %s"
-#~ msgstr ""
-#~ "Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s"
-
-#~ msgid "bug"
-#~ msgstr "Fehler"
-
-#~ msgid ", behind "
-#~ msgstr ", hinterher "
-
-#~ msgid "could not find .gitmodules in index"
-#~ msgstr "Konnte .gitmodules nicht in der Staging-Area finden"
-
-#~ msgid "reading updated .gitmodules failed"
-#~ msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen"
-
-#~ msgid "unable to stat updated .gitmodules"
-#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen"
-
-#~ msgid "unable to remove .gitmodules from index"
-#~ msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen"
-
-#~ msgid "adding updated .gitmodules failed"
-#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen"
-
-#~ msgid ""
-#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
-#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
-#~ "anymore.\n"
-#~ "To add content for the whole tree, run:\n"
-#~ "\n"
-#~ "  git add %s :/\n"
-#~ "  (or git add %s :/)\n"
-#~ "\n"
-#~ "To restrict the command to the current directory, run:\n"
-#~ "\n"
-#~ "  git add %s .\n"
-#~ "  (or git add %s .)\n"
-#~ "\n"
-#~ "With the current Git version, the command is restricted to the current "
-#~ "directory.\n"
-#~ msgstr ""
-#~ "Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n"
-#~ "einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n"
-#~ "mehr verwendet werden.\n"
-#~ "Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie "
-#~ "aus:\n"
-#~ "\n"
-#~ "  git add %s :/\n"
-#~ "  (oder git add %s :/)\n"
-#~ "\n"
-#~ "Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n"
-#~ "\n"
-#~ "  git add %s .\n"
-#~ "  (oder git add %s .)\n"
-#~ "\n"
-#~ "Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n"
-#~ "Verzeichnis beschränkt.\n"
-
-#~ msgid ""
-#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-#~ "whose behaviour will change in Git 2.0 with respect to paths you "
-#~ "removed.\n"
-#~ "Paths like '%s' that are\n"
-#~ "removed from your working tree are ignored with this version of Git.\n"
-#~ "\n"
-#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-#~ "  ignores paths you removed from your working tree.\n"
-#~ "\n"
-#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
-#~ "\n"
-#~ "Run 'git status' to check the paths you removed from your working tree.\n"
-#~ msgstr ""
-#~ "Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n"
-#~ "ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n"
-#~ "Berücksichtigung der gelöschten Pfade.\n"
-#~ "Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n"
-#~ "dieser Version von Git ignoriert.\n"
-#~ "\n"
-#~ "* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n"
-#~ "  Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n"
-#~ "* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n"
-#~ "  Pfade.\n"
-#~ "Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n"
-
-#~ msgid ""
-#~ "Auto packing the repository for optimum performance. You may also\n"
-#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
-#~ msgstr ""
-#~ "Die Datenbank des Repositories wird für eine optimale Performance\n"
-#~ "komprimiert. Sie können auch \"git gc\" manuell ausführen.\n"
-#~ "Siehe \"git help gc\" für weitere Informationen.\n"
-
-#~ msgid ""
-#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
-#~ "counterpart. If you did not intend to push that branch, you may want to\n"
-#~ "specify branches to push or set the 'push.default' configuration "
-#~ "variable\n"
-#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
-#~ msgstr ""
-#~ "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines "
-#~ "versendeten\n"
-#~ "Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie "
-#~ "nicht\n"
-#~ "beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu "
-#~ "versendenden\n"
-#~ "Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu "
-#~ "'simple', 'current'\n"
-#~ "oder 'upstream' setzen, um nur den aktuellen Branch zu versenden."
+#: git-rebase--interactive.sh:640
+msgid "and made changes to the index and/or the working tree"
+msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert."
 
-#~ msgid "copied:     %s -> %s"
-#~ msgstr "kopiert:     %s -> %s"
+#: git-rebase--interactive.sh:642
+msgid ""
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
+msgstr ""
+"Sie können das Problem beheben, und dann\n"
+"\n"
+"\tgit rebase --continue\n"
+"\n"
+"ausführen."
 
-#~ msgid "deleted:    %s"
-#~ msgstr "gelöscht:    %s"
+#. 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 ""
+"Ausführung erfolgreich: $rest\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"
+"\tgit rebase --continue"
 
-#~ msgid "modified:   %s"
-#~ msgstr "geändert:   %s"
+#: git-rebase--interactive.sh:666
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Unbekannter Befehl: $command $sha1 $rest"
 
-#~ msgid "renamed:    %s -> %s"
-#~ msgstr "umbenannt:    %s -> %s"
+#: git-rebase--interactive.sh:667
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Bitte beheben Sie das, indem Sie 'git rebase --edit-todo' ausführen."
 
-#~ msgid "unmerged:   %s"
-#~ msgstr "nicht zusammengeführt:   %s"
+#: git-rebase--interactive.sh:702
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "Erfolgreich Rebase ausgeführt und $head_name aktualisiert."
 
-#~ msgid "input paths are terminated by a null character"
-#~ msgstr "Eingabepfade sind durch ein NUL Zeichen abgeschlossen"
+#: git-rebase--interactive.sh:749
+msgid "Could not skip unnecessary pick commands"
+msgstr "Fehler beim Auslassen von nicht erforderlichen \"pick\"-Befehlen."
 
-#~ msgid ""
-#~ "The following untracked files would NOT be saved but need to be removed "
-#~ "by stash save:"
-#~ msgstr ""
-#~ "Die folgenden unbeobachteten Dateien würden NICHT gespeichert werden,\n"
-#~ "müssen aber durch \"stash save\" entfernt werden:"
+#: 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 ""
+"Warnung: Der SHA-1 in der folgenden Zeile fehlt oder ist kein Commit:\n"
+" - $line"
 
-#~ msgid ""
-#~ "Aborting. Consider using either the --force or --include-untracked option."
-#~ msgstr ""
-#~ "Abgebrochen. Benutzen Sie entweder die Option --force oder --include-"
-#~ "untracked."
+#: git-rebase--interactive.sh:940
+#, sh-format
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"Warnung: Das Kommando in der folgenden Zeile wurde nicht erkannt:\n"
+" - $line"
 
-#~ msgid "  (fix conflicts and then run \"git am --resolved\")"
-#~ msgstr ""
-#~ "  (beheben Sie die Konflikte und führen Sie dann \"git am --resolved\" "
-#~ "aus)"
+#: git-rebase--interactive.sh:979
+msgid "could not detach HEAD"
+msgstr "Konnte HEAD nicht loslösen"
 
-#~ msgid "  (all conflicts fixed: run \"git commit\")"
-#~ msgstr "  (alle Konflikte behoben: führen Sie \"git commit\" aus)"
+#: git-rebase--interactive.sh:1017
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+msgstr ""
+"Warnung: Einige Commits könnten aus Versehen entfernt worden sein.\n"
+"Entfernte Commits (neu zu alt):"
 
-#~ msgid "more than %d trees given: '%s'"
-#~ msgstr "Mehr als %d \"Tree\"-Objekte angegeben: '%s'"
+#: 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 ""
+"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"
+"zu ändern.\n"
+"Die möglichen Verhaltensweisen sind: ignore, warn, error."
 
-#~ msgid "You cannot combine --no-ff with --ff-only."
-#~ msgstr "Sie können --no-ff nicht mit --ff--only kombinieren."
+#: git-rebase--interactive.sh:1036
+#, sh-format
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr ""
+"Nicht erkannte Einstellung $check_level für Option rebase."
+"missingCommitsCheck.\n"
+"Ignoriere."
 
-#~ msgid ""
-#~ "submodule '%s' (or one of its nested submodules) uses a .git directory\n"
-#~ "(use 'rm -rf' if you really want to remove it including all of its "
-#~ "history)"
-#~ msgstr ""
-#~ "Submodul '%s' (oder ein geschachteltes Submodul hiervon) verwendet\n"
-#~ "ein .git-Verzeichnis (benutzen Sie 'rm -rf' wenn Sie dieses wirklich "
-#~ "mitsamt\n"
-#~ "seiner Historie löschen möchten)"
-
-#~ msgid ""
-#~ "'%s' has changes staged in the index\n"
-#~ "(use --cached to keep the file, or -f to force removal)"
-#~ msgstr ""
-#~ "'%s' hat zum Commit vorgemerkte Änderungen\n"
-#~ "(benutzen Sie --cached um die Datei zu behalten, oder -f um die "
-#~ "Entfernung zu erzwingen)"
+#: git-rebase--interactive.sh:1053
+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."
 
-#~ msgid "show commits where no parent comes before its children"
-#~ msgstr ""
-#~ "zeigt Commits, bei denen kein Eltern-Commit vor seinem Kind-Commit kommt"
+#: git-rebase--interactive.sh:1054
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "Oder Sie können den Rebase mit 'git rebase --abort' abbrechen."
 
-#~ msgid "show the HEAD reference"
-#~ msgstr "zeigt Referenz von HEAD"
+#: git-rebase--interactive.sh:1078
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Konnte CHERRY_PICK_HEAD nicht löschen"
 
-#~ msgid "Unable to fetch in submodule path '$prefix$sm_path'"
-#~ msgstr "Konnte \"fetch\" in Submodul-Pfad '$prefix$sm_path' nicht ausführen"
+#: 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 ""
+"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"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"Im Anschluss führen Sie zum Fortfahren aus:\n"
+"\n"
+"  git rebase --continue\n"
 
-#~ msgid "Failed to recurse into submodule path '$prefix$sm_path'"
-#~ msgstr "Fehler bei Rekursion in Submodul-Pfad '$prefix$sm_path'"
+#: git-rebase--interactive.sh:1100
+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"
 
-#~ msgid "It took %.2f seconds to enumerate untracked files.  'status -uno'"
-#~ msgstr ""
-#~ "Es dauerte %.2f Sekunden die unbeobachteten Dateien zu bestimmen.'status -"
-#~ "uno'"
+#: 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 ""
+"Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n"
+"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' "
+"erneut\n"
+"aus."
 
-#~ msgid "may speed it up, but you have to be careful not to forget to add"
-#~ msgstr "könnte das beschleunigen, aber Sie müssen darauf achten, neue"
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
+msgid "Could not commit staged changes."
+msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
-#~ msgid "new files yourself (see 'git help status')."
-#~ msgstr "Dateien selbstständig hinzuzufügen (siehe 'git help status')."
+#: 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"
+"Sie bearbeiten gerade die TODO-Datei eines laufenden interaktiven Rebase.\n"
+"Um den Rebase nach dem Editieren fortzusetzen, führen Sie aus:\n"
+"    git rebase --continue\n"
+"\n"
 
-#~ msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"
-#~ msgstr ""
-#~ "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] "
-#~ "[<Versionsidentifikation>... ]"
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
+msgid "Could not execute editor"
+msgstr "Konnte Editor nicht ausführen."
 
-#~ msgid "See 'git help <command>' for more information on a specific command."
-#~ msgstr ""
-#~ "Siehe 'git help <Kommando>' für weitere Informationen zu einem "
-#~ "spezifischen Kommando"
+#: git-rebase--interactive.sh:1159
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "Konnte $switch_to nicht auschecken."
 
-#~ msgid "use any ref in .git/refs"
-#~ msgstr "verwendet alle Referenzen in .git/refs"
+#: git-rebase--interactive.sh:1164
+msgid "No HEAD?"
+msgstr "Kein HEAD?"
 
-#~ msgid "use any tag in .git/refs/tags"
-#~ msgstr "verwendet alle Markierungen in .git/refs/tags"
+#: git-rebase--interactive.sh:1165
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "Konnte temporäres Verzeichnis $state_dir nicht erstellen."
 
-#~ msgid "bad object %s"
-#~ msgstr "ungültiges Objekt %s"
+#: git-rebase--interactive.sh:1167
+msgid "Could not mark as interactive"
+msgstr "Konnte nicht als interaktiven Rebase markieren."
 
-#~ msgid "bogus committer info %s"
-#~ msgstr "unechte Einreicher-Informationen %s"
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
+msgid "Could not init rewritten commits"
+msgstr "Konnte neu geschriebene Commits nicht initialisieren."
 
-#~ msgid "can't fdopen 'show' output fd"
-#~ msgstr "konnte Datei-Deskriptor für Ausgabe von 'show' nicht öffnen"
+#: git-rebase--interactive.sh:1282
+#, 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)"
 
-#~ msgid "failed to close pipe to 'show' for object '%s'"
-#~ msgstr ""
-#~ "Schließen der Verbindung zu 'show' ist für Objekt '%s' fehlgeschlagen."
+#: git-rebase--interactive.sh:1287
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n"
+"\n"
 
-#~ msgid "You do not have a valid HEAD"
-#~ msgstr "Sie haben keine gültige Zweigspitze (HEAD)"
+#: git-rebase--interactive.sh:1294
+msgid "Note that empty commits are commented out"
+msgstr "Leere Commits sind auskommentiert."
 
-#~ msgid "oops"
-#~ msgstr "Ups"
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
+#, sh-format
+msgid "usage: $dashless $USAGE"
+msgstr "Verwendung: $dashless $USAGE"
 
-#~ msgid "Would not remove %s\n"
-#~ msgstr "Würde '%s' nicht löschen\n"
+#: git-sh-setup.sh:190
+#, sh-format
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"Konnte nicht in Verzeichnis $cdup wechseln, der obersten Ebene des\n"
+"Arbeitsverzeichnisses."
 
-#~ msgid "Not removing %s\n"
-#~ msgstr "Entferne nicht %s\n"
+#: 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."
 
-#~ msgid "Could not read index"
-#~ msgstr "Konnte Bereitstellung nicht lesen"
+#: 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."
 
-#~ msgid " 0 files changed"
-#~ msgstr " 0 Dateien geändert"
+#: 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"
+"vorgemerkt sind."
 
-#~ msgid " %d file changed"
-#~ msgid_plural " %d files changed"
-#~ msgstr[0] " %d Datei geändert"
-#~ msgstr[1] " %d Dateien geändert"
+#: 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."
 
-#~ msgid ", %d insertion(+)"
-#~ msgid_plural ", %d insertions(+)"
-#~ msgstr[0] ", %d Zeile hinzugefügt(+)"
-#~ msgstr[1] ", %d Zeilen hinzugefügt(+)"
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
+msgstr ""
+"Kann $action nicht ausführen: Sie haben Änderungen, die nicht zum Commit\n"
+"vorgemerkt sind."
 
-#~ msgid ", %d deletion(-)"
-#~ msgid_plural ", %d deletions(-)"
-#~ msgstr[0] ", %d Zeile entfernt(-)"
-#~ msgstr[1] ", %d Zeilen entfernt(-)"
+#: 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."
 
-#~ msgid "git remote set-head <name> (-a | -d | <branch>])"
-#~ msgstr "git remote set-head <Name> (-a | -d | <Zweig>])"
+#: 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."
 
-#~ msgid " (use \"git add\" to track)"
-#~ msgstr " (benutze \"git add\" zum Beobachten)"
+#: git-sh-setup.sh:248
+#, sh-format
+msgid "Cannot $action: Your index contains uncommitted changes."
+msgstr ""
+"Kann $action nicht ausführen: Die Staging-Area beinhaltet nicht committete\n"
+"Änderungen."
 
-#~ msgid "--detach cannot be used with -b/-B/--orphan"
-#~ msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen."
 
-#~ msgid "--detach cannot be used with -t"
-#~ msgstr "--detach kann nicht mit -t benutzt werden"
+#: 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."
 
-#~ msgid "--orphan and -b|-B are mutually exclusive"
-#~ msgstr "--orphan und -b|-B sind gegenseitig exklusiv"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Konnte absoluten Pfad des Git-Verzeichnisses nicht bestimmen."
 
-#~ msgid "--orphan cannot be used with -t"
-#~ msgstr "--orphan kann nicht mit -t benutzt werden"
+#~ msgid "Could not write to %s"
+#~ msgstr "Konnte nicht nach %s schreiben"
 
-#~ msgid "git checkout: -f and -m are incompatible"
-#~ msgstr "git checkout: -f und -m sind inkompatibel"
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Fehler beim Einpacken von %s."
 
-#~ msgid ""
-#~ "git checkout: updating paths is incompatible with switching branches."
+#~ msgid "Your local changes would be overwritten by cherry-pick."
 #~ msgstr ""
-#~ "git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem "
-#~ "Wechsel von Zweigen."
-
-#~ msgid "diff setup failed"
-#~ msgstr "diff_setup_done fehlgeschlagen"
+#~ "Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
 
-#~ msgid "merge-recursive: disk full?"
-#~ msgstr "merge-recursive: Festplatte voll?"
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
 
-#~ msgid "diff_setup_done failed"
-#~ msgstr "diff_setup_done fehlgeschlagen"
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr ""
+#~ "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
 
-#~ msgid "-d option is no longer supported.  Do not use."
-#~ msgstr "-d Option wird nicht länger unterstützt. Nicht benutzen."
+#~ msgid "Could not parse line %d."
+#~ msgstr "Konnte Zeile %d nicht parsen."
 
-#~ msgid "%s: has been deleted/renamed"
-#~ msgstr "%s wurde gelöscht/umbenannt"
+#~ msgid "Could not open %s"
+#~ msgstr "Konnte %s nicht öffnen"
 
-#~ msgid "'%s': not a documentation directory."
-#~ msgstr "'%s' ist kein Dokumentationsverzeichnis"
+#~ msgid "Could not read %s."
+#~ msgstr "Konnte %s nicht lesen."
 
-#~ msgid "--"
-#~ msgstr "--"
+#~ msgid "Could not format %s."
+#~ msgstr "Konnte %s nicht formatieren."
 
-#~ msgid "Could not extract email from committer identity."
-#~ msgstr "Konnte E-Mail-Adresse des Einreichers nicht extrahieren."
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
 
-#~ msgid "cherry-pick"
-#~ msgstr "cherry-pick"
+#~ msgid "cannot open %s: %s"
+#~ msgstr "Kann %s nicht öffnen: %s"
 
-#~ msgid ""
-#~ "To prevent you from losing history, non-fast-forward updates were "
-#~ "rejected\n"
-#~ "Merge the remote changes (e.g. 'git pull') before pushing again.  See "
-#~ "the\n"
-#~ "'Note about fast-forwards' section of 'git push --help' for details.\n"
-#~ msgstr ""
-#~ "Um dich vor Verlust von Historie zu bewahren, wurden nicht vorzuspulende "
-#~ "Aktualisierungen zurückgewiesen.\n"
-#~ "Führe die externen Änderungen zusammen (z.B. 'git pull') bevor du erneut "
-#~ "versendest. Siehe auch die 'Note about fast-forwards' Sektion von \n"
-#~ "'git push --help' für weitere Details.\n"
+#~ msgid "You need to set your committer info first"
+#~ msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
index 88b0b8a78ad7da5dd488a015c450455d94ce3eca..c06fb40f8280a5036f15d0f06337159a1f552a18 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,7 +1,7 @@
 # French translations for Git.
 # Copyright (C) 2015 Jean-Noël Avila <jn.avila@free.fr>
 # This file is distributed under the same license as the Git package.
-# Jean-Noël Avila <jn.avila@free.fr>, 2015.
+# Jean-Noël Avila <jn.avila@free.fr>, 2016.
 # Sébastien Helleu <flashcode@flashtux.org>, 2013.
 #
 # French translations of common Git words used in this file:
@@ -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-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-14 20:26+0100\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:55+0800\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"
@@ -88,7 +88,32 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "astuce: %.*s\n"
 
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr "Impossible de picorer car vous avez des fichiers non fusionnés."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Impossible de valider car vous avez des fichiers non fusionnés."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr "Impossible de fusionner car vous avez des fichiers non fusionnés."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr "Impossible de tirer car vous avez des fichiers non fusionnés."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr "Impossible d'annuler car vous avez des fichiers non fusionnés."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "%s n'est pas possible car vous avez des fichiers non fusionné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."
@@ -96,3387 +121,4533 @@ msgstr ""
 "Corrigez-les puis lancez 'git add/rm <fichier>'\n"
 "si nécessaire pour marquer la résolution et valider."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Abandon à cause de conflit non résolu."
+
+#: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Veuillez valider vos changements avant de fusionner."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Abandon à cause d'une fusion non terminée."
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<options>] <arbre ou apparenté> [<chemin>...]"
-
-#: 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 <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"
+"Note : extraction de '%s'.\n"
+"\n"
+"Vous êtes dans l'état « HEAD détachée ». Vous pouvez visiter, faire des "
+"modifications\n"
+"expérimentales et les valider. Il vous suffit de faire une autre extraction "
+"pour\n"
+"abandonner les commits que vous faites dans cet état sans impacter les "
+"autres branches\n"
+"\n"
+"Si vous voulez créer une nouvelle branche pour conserver les commits que "
+"vous créez,\n"
+"il vous suffit d'utiliser « checkout -b » (maintenant ou plus tard) comme "
+"ceci :\n"
+"\n"
+"  git checkout -b <nom-de-la-nouvelle-branche>\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 "le chemin '%s' ne correspond à aucun fichier"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+msgid "unrecognized whitespace option '%s'"
+msgstr "option d'espace non reconnue '%s'"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "format d'archive"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "option d'ignorance d'espace non reconnue '%s'"
 
-#: archive.c:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "préfixe"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject et --3way ne peuvent pas être utilisés ensemble."
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
-msgstr "préfixer chaque chemin de fichier dans l'archive"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached et --3way ne peuvent pas être utilisés ensemble."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547 builtin/blame.c:2548
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:720 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 "fichier"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way hors d'un dépôt"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "écrire l'archive dans ce fichier"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index hors d'un dépôt"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "lire .gitattributes dans le répertoire de travail"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached hors d'un dépôt"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "afficher les fichiers archivés sur stderr"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "Impossible de préparer la regexp d'horodatage %s"
 
-#: archive.c:437
-msgid "store only"
-msgstr "stockage seulement"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec a retourné %d pour l'entrée : %s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "compression rapide"
+#: 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:446
-msgid "compress better"
-msgstr "compression efficace"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "afficher les formats d'archive supportés"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "dépôt"
+#: 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: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: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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "commande"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recomptage : ligne inattendue : %.*s"
 
-#: 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:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
 
-#: attr.c:263
+#: apply.c:1577
+#, c-format
 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."
+"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)"
 
-#: branch.c:53
+#: apply.c:1589
 #, 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 "git diff header lacks filename information (line %d)"
 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\"."
+"information de nom de fichier manquante dans l'en-tête de git diff (ligne %d)"
 
-#: branch.c:67
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "le nouveau fichier dépend de contenus anciens"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "le fichier supprimé a encore du contenu"
+
+#: apply.c:1795
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "La branche %s ne peut pas être sa propre branche amont."
+msgid "corrupt patch at line %d"
+msgstr "patch corrompu à la ligne %d"
 
-#: branch.c:93
+#: apply.c:1832
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr ""
-"La branche %s est paramétrée pour suivre la branche distante %s de %s en "
-"rebasant."
+msgid "new file %s depends on old contents"
+msgstr "le nouveau fichier %s dépend de contenus anciens"
 
-#: branch.c:94
+#: apply.c:1834
 #, 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 "deleted file %s still has contents"
+msgstr "le fichier supprimé %s a encore du contenu"
 
-#: branch.c:98
+#: apply.c:1837
 #, 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 "** warning: file %s becomes empty but is not deleted"
+msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
 
-#: branch.c:99
+#: apply.c:1984
 #, 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 "corrupt binary patch at line %d: %.*s"
+msgstr "patch binaire corrompu à la ligne %d : %.*s"
 
-#: branch.c:104
+#: apply.c:2021
 #, 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 "unrecognized binary patch at line %d"
+msgstr "patch binaire non reconnu à la ligne %d"
 
-#: branch.c:105
+#: apply.c:2182
 #, 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 "patch with only garbage at line %d"
+msgstr "patch totalement incompréhensible à la ligne %d"
 
-#: branch.c:109
+#: apply.c:2274
 #, 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."
+msgid "unable to read symlink %s"
+msgstr "lecture du lien symbolique %s impossible"
 
-#: branch.c:110
+#: apply.c:2278
 #, 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."
+msgid "unable to open or read %s"
+msgstr "ouverture ou lecture de %s impossible"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Échec de l'écriture de la configuration de branche amont"
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "début de ligne invalide : '%c'"
 
-#: branch.c:156
+#: apply.c:3050
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Pas de suivi : information ambiguë pour la référence %s"
+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)."
 
-#: branch.c:185
+#: apply.c:3062
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' n'est pas un nom de branche valide."
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Contexte réduit à (%ld/%ld) pour appliquer le fragment à la ligne %d"
 
-#: branch.c:190
+#: apply.c:3068
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Une branche nommée '%s' existe déjà."
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"pendant la recherche de :\n"
+"%.*s"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Impossible de forcer la mise à jour de la branche courante."
+#: apply.c:3090
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "données de patch binaire manquantes pour '%s'"
 
-#: branch.c:218
+#: apply.c:3098
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est "
-"pas une branche."
+"impossible d'appliquer l'inverse d'un patch binaire à '%s' sans la section "
+"inverse"
 
-#: branch.c:220
+#: apply.c:3144
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "la branche amont demandée '%s' n'existe pas"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"impossible d'appliquer un patch binaire à '%s' sans la ligne complète d'index"
 
-#: branch.c:222
+#: apply.c:3154
+#, 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."
+"the patch applies to '%s' (%s), which does not match the current contents."
 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 patch s'applique à '%s' (%s), ce qui ne correspond pas au contenu actuel."
 
-#: branch.c:266
+#: apply.c:3162
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Nom d'objet invalide : '%s'."
+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"
 
-#: branch.c:286
+#: apply.c:3180
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objet ambigu : '%s'."
+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"
 
-#: branch.c:291
+#: apply.c:3193
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Point d'embranchement invalide : '%s'."
+msgid "binary patch does not apply to '%s'"
+msgstr "le patch binaire ne s'applique par correctement à '%s'"
 
-#: branch.c:344
+#: apply.c:3199
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' est déjà extrait dans '%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é)"
 
-#: bundle.c:34
+#: apply.c:3220
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' ne semble pas être un fichier bundle v2"
+msgid "patch failed: %s:%ld"
+msgstr "le patch a échoué : %s:%ld"
 
-#: bundle.c:61
+#: apply.c:3342
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "en-tête non reconnu : %s%s (%d)"
+msgid "cannot checkout %s"
+msgstr "extraction de %s impossible"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, 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:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "échec de la préparation du parcours des révisions"
+msgid "failed to read %s"
+msgstr "échec de la lecture de %s"
 
-#: bundle.c:185
+#: apply.c:3398
 #, 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 :"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "lecture depuis '%s' au-delà d'un lien symbolique"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "Le colis enregistre l'historique complet."
+#: apply.c:3427 apply.c:3667
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "le chemin %s a été renommé/supprimé"
 
-#: bundle.c:194
+#: apply.c:3510 apply.c:3681
 #, 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 :"
+msgid "%s: does not exist in index"
+msgstr "%s : n'existe pas dans l'index"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "Impossible de créer des objets groupés"
+#: apply.c:3519 apply.c:3689
+#, c-format
+msgid "%s: does not match index"
+msgstr "%s : ne correspond pas à l'index"
 
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "les objets groupés ont disparu"
+#: apply.c:3554
+msgid "repository lacks the necessary blob 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."
 
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list a disparu"
+#: apply.c:3557
+#, c-format
+msgid "Falling back to three-way merge...\n"
+msgstr "Retour à une fusion à 3 points…\n"
 
-#: bundle.c:353
+#: apply.c:3573 apply.c:3577
 #, 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 "cannot read the current contents of '%s'"
+msgstr "impossible de lire le contenu actuel de '%s'"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3589
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "argument non reconnu : %s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Echec du retour à une fusion à 3 points…\n"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Refus de créer un colis vide."
+#: apply.c:3603
+#, c-format
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch %s appliqué avec des conflits.\n"
 
-#: bundle.c:459
+#: apply.c:3608
 #, c-format
-msgid "cannot create '%s'"
-msgstr "impossible de créer '%s'"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch %s appliqué proprement.\n"
 
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "l'index de groupe a disparu"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "le patch de suppression laisse un contenu dans le fichier"
 
-#: color.c:275
+#: apply.c:3706
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "Valeur invalide de couleur : %.*s"
+msgid "%s: wrong type"
+msgstr "%s : type erroné"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3708
 #, c-format
-msgid "could not parse %s"
-msgstr "impossible d'analyser %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s est de type %o, mais %o attendu"
 
-#: commit.c:42
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s n'est pas un commit !"
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "plus de mémoire"
+msgid "invalid path '%s'"
+msgstr "chemin invalide '%s'"
 
-#: config.c:475 config.c:477
+#: apply.c:3917
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "ligne %d de fichier de config incorrecte dans %s %s"
+msgid "%s: already exists in index"
+msgstr "%s : existe déjà dans l'index"
 
-#: config.c:593
+#: apply.c:3920
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr ""
-"valeur numérique de configuration incorrecte '%s' pour '%s' dans %s %s : %s"
+msgid "%s: already exists in working directory"
+msgstr "%s : existe déjà dans la copie de travail"
 
-#: config.c:595
+#: apply.c:3940
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valeur numérique de configuration invalide '%s' pour '%s' : %s"
+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)"
 
-#: config.c:680
+#: apply.c:3945
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "impossible d'étendre le répertoire utilisateur dans : '%s'"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr ""
+"le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o) de %s"
 
-#: config.c:758 config.c:769
+#: apply.c:3965
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "niveau de compression zlib incorrect %d"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "le fichier affecté '%s' est au-delà d'un lien symbolique"
 
-#: config.c:891
+#: apply.c:3969
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "mode invalide pour la création d'objet : %s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "lecture de la configuration de ligne de commande impossible"
-
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "erreur inconnue pendant la lecture des fichiers de configuration"
+msgid "%s: patch does not apply"
+msgstr "%s : le patch ne s'applique pas"
 
-#: config.c:1629
+#: apply.c:3984
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-"impossible d'analyser '%s' depuis le configuration en ligne de commande"
+msgid "Checking patch %s..."
+msgstr "Vérification du patch %s..."
 
-#: config.c:1631
+#: apply.c:4075
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
+msgid "sha1 information is lacking or useless for submodule %s"
 msgstr ""
-"variable de configuration '%s' incorrecte dans le fichier '%s' à la ligne %d"
+"l'information sha1 est manquante ou inutilisable pour le sous-module %s"
 
-#: config.c:1690
+#: apply.c:4082
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s a des valeurs multiples"
+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"
 
-#: config.c:2226
+#: apply.c:4085
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Impossible de régler '%s' à '%s'"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Impossible de lancer 'git rev-list'"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "l'information de sha1 est manquante ou inutilisable (%s)."
 
-#: connected.c:89
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "impossible d'écrire dans la rev-list : %s"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "échec de make_cache_entry pour le chemin '%s'"
 
-#: connected.c:97
+#: apply.c:4094
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "impossible de fermer l'entrée standard du rev-list : %s"
+msgid "could not add %s to temporary index"
+msgstr "impossible d'ajouter %s à l'index temporaire"
 
-#: date.c:95
-msgid "in the future"
-msgstr "dans le futur"
-
-#: date.c:101
+#: apply.c:4104
 #, 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"
+msgid "could not write temporary index to %s"
+msgstr "impossible d'écrire l'index temporaire dans %s"
 
-#: date.c:108
+#: apply.c:4242
 #, 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"
+msgid "unable to remove %s from index"
+msgstr "suppression de %s dans l'index impossible"
 
-#: date.c:115
+#: apply.c:4277
 #, 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"
+msgid "corrupt patch for submodule %s"
+msgstr "patch corrompu pour le sous-module %s"
 
-#: date.c:122
+#: apply.c:4283
 #, 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"
+msgid "unable to stat newly created file '%s'"
+msgstr "stat du fichier nouvellement créé '%s' impossible"
 
-#: date.c:128
+#: apply.c:4291
 #, 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"
+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"
 
-#: date.c:135
+#: apply.c:4297 apply.c:4441
 #, 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"
+msgid "unable to add cache entry for %s"
+msgstr "ajout de l'élément de cache %s impossible"
 
-#: date.c:146
+#: apply.c:4338
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu an"
-msgstr[1] "%lu ans"
+msgid "failed to write to '%s'"
+msgstr "échec de l'écriture dans '%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] "il y a %s et %lu mois"
-msgstr[1] "il y a %s et %lu mois"
+msgid "closing file '%s'"
+msgstr "fermeture du fichier '%s'"
 
-#: date.c:154 date.c:159
+#: apply.c:4412
 #, 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"
+msgid "unable to write file '%s' mode %o"
+msgstr "écriture du fichier '%s' mode %o impossible"
 
-#: diffcore-order.c:24
+#: apply.c:4510
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "impossible de lire le fichier de commande '%s'"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s appliqué proprement."
 
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Détection de renommage inexact en cours"
+#: apply.c:4518
+msgid "internal error"
+msgstr "erreur interne"
 
-#: diff.c:115
+#: apply.c:4521
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-"  Impossible d'analyser le pourcentage de modification de dirstat '%s'\n"
+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..."
 
-#: diff.c:120
+#: apply.c:4532
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Paramètre dirstat inconnu '%s'\n"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "troncature du nom de fichier .rej en %.*s.rej"
 
-#: diff.c:215
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-"Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
+msgid "cannot open %s"
+msgstr "impossible d'ouvrir %s"
 
-#: diff.c:267
+#: apply.c:4554
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Erreurs dans la variable de configuration 'diff.dirstat' :\n"
-"%s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Section n°%d appliquée proprement."
 
-#: diff.c:2997
+#: apply.c:4558
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "l'application de diff externe a disparu, arrêt à %s"
-
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow a besoin d'une spécification de chemin unique"
+msgid "Rejected hunk #%d."
+msgstr "Section n°%d rejetée."
 
-#: diff.c:3556
+#: apply.c:4668
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
-"%s"
-
-#: diff.c:3570
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
-
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "echec de l'obtention d'information de kernel"
-
-#: dir.c:2123
-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."
+msgid "Skipped patch '%s'."
+msgstr "Chemin '%s' non traité."
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "impossible de lancer gpg."
-
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg n'a pas accepté les données"
-
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg n'a pas pu signer les données"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "entrée non reconnue"
 
-#: gpg-interface.c:222
-#, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "impossible de créer un fichier temporaire '%s' : %s"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "lecture du fichier d'index impossible"
 
-#: gpg-interface.c:225
+#: apply.c:4833
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "impossible d'écrire la signature détachée dans '%s' : %s"
+msgid "can't open patch '%s': %s"
+msgstr "ouverture impossible du patch '%s' :%s"
 
-#: grep.c:1718
+#: apply.c:4858
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s' : lecture de %s impossible"
+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"
 
-#: grep.c:1735
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s' : %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."
 
-#: grep.c:1746
+#: apply.c:4872
 #, c-format
-msgid "'%s': short read %s"
-msgstr "'%s' : lecture tronquée %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."
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "commandes git disponibles dans '%s'"
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Impossible d'écrire le nouveau fichier d'index"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
+#: 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 "chemin"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Ci-dessous les commandes Git habituelles dans diverses situations :"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
 
-#: 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 ?"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "appliquer les modifications qui correspondent au chemin donné"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ahem. Votre système n'indique aucune commande Git."
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "num"
 
-#: 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'"
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "dans %0.1f secondes automatiquement..."
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "ignorer les additions réalisées par le patch"
 
-#: 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'."
+#: apply.c:4931
+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"
 
-#: help.c:404 help.c:464
-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à ?"
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+"afficher le nombre de lignes ajoutées et supprimées en notation décimale"
 
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+#: apply.c:4937
+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"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "impossible de lire le cache"
+#: apply.c:4939
+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"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
-msgstr "impossible d'écrire le nouveau fichier d'index"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "s'assurer que le patch est applicable sur l'index actuel"
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
-msgstr "(mauvais commit)\n"
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "appliquer les patch sans toucher à la copie de travail"
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "échec de addinfo_cache pour le chemin '%s'"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "accepter un patch qui touche hors de la copie de travail"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "erreur de construction des arbres"
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr "impossible de créer le chemin '%s' %s"
+#: apply.c:4949
+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"
 
-#: merge-recursive.c:700
-#, 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"
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+"construire un index temporaire fondé sur l'information de l'index embarqué"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": peut-être un conflit D/F ?"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "les chemins sont séparés par un caractère NUL"
 
-#: merge-recursive.c:725
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "refus de perdre le fichier non suivi '%s'"
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "impossible de lire l'objet %s '%s'"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "action"
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob attendu pour %s '%s'"
+#: apply.c:4958
+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"
 
-#: merge-recursive.c:790 builtin/clone.c:374
-#, c-format
-msgid "failed to open '%s'"
-msgstr "échec à l'ouverture de '%s'"
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
-msgstr "échec à la création du lien symbolique '%s'"
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "appliquer le patch en sens inverse"
 
-#: merge-recursive.c:801
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "ne sait pas traiter %06o %s '%s'"
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "ne pas s'attendre à au moins une ligne de contexte"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Échec à l'exécution de la fusion interne"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "Impossible d'ajouter %s à la base de données"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "accepter les recouvrements de sections"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "type d'objet non supporté dans l'arbre"
+#: 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 "mode verbeux"
 
-#: 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."
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
-"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
-"%s laissée dans l'arbre."
+"tolérer des erreurs de détection de retours chariot manquants en fin de "
+"fichier"
 
-#: 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."
-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."
+#: apply.c:4979
+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"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "renommage"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "racine"
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "renommé"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "préfixer tous les noms de fichier avec <root>"
 
-#: merge-recursive.c:1150
-#, 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"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<options>] <arbre ou apparenté> [<chemin>...]"
 
-#: merge-recursive.c:1172
-#, c-format
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
-"\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
+"git archive --remote <dépôt> [--exec <commande>] [<options>] <arbre ou "
+"apparenté> [<chemin>...]"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (laissé non résolu)"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
 
-#: merge-recursive.c:1231
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, 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 "pathspec '%s' did not match any files"
+msgstr "le chemin '%s' ne correspond à aucun fichier"
 
-#: merge-recursive.c:1261
-#, 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"
+#: archive.c:429
+msgid "fmt"
+msgstr "fmt"
 
-#: merge-recursive.c:1460
-#, 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"
+#: archive.c:429
+msgid "archive format"
+msgstr "format d'archive"
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
-msgstr "Ajout de %s fusionné"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "préfixe"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
-msgstr "Ajout plutôt comme %s"
-
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
-msgstr "impossible de lire l'objet %s"
-
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
-msgstr "l'objet %s n'est pas un blob"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "préfixer chaque chemin de fichier dans l'archive"
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "modification"
+#: archive.c:432 builtin/archive.c:88 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 "fichier"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "modifié"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "écrire l'archive dans ce fichier"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "contenu"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "lire .gitattributes dans le répertoire de travail"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "ajout/ajout"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "afficher les fichiers archivés sur stderr"
 
-#: merge-recursive.c:1632
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "%s sauté (fusion identique à l'existant)"
+#: archive.c:437
+msgid "store only"
+msgstr "stockage seulement"
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Fusion automatique de %s"
+#: archive.c:438
+msgid "compress faster"
+msgstr "compression rapide"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "sous-module"
+#: archive.c:446
+msgid "compress better"
+msgstr "compression efficace"
 
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "afficher les formats d'archive supportés"
 
-#: merge-recursive.c:1737
-#, c-format
-msgid "Removing %s"
-msgstr "Suppression de %s"
+#: 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 "dépôt"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "fichier/répertoire"
+#: 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>"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "répertoire/fichier"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "commande"
 
-#: merge-recursive.c:1773
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-"CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
+#: 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"
 
-#: merge-recursive.c:1783
-#, c-format
-msgid "Adding %s"
-msgstr "Ajout de %s"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Option --remote inattendue"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
+#: 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"
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "Déjà à jour !"
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Option --output inattendue"
 
-#: merge-recursive.c:1828
+#: archive.c:487
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "échec de fusion des arbres %s et %s"
+msgid "Unknown archive format '%s'"
+msgstr "Format d'archive inconnu '%s'"
 
-#: merge-recursive.c:1858
+#: archive.c:494
 #, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Chemin non traité ??? %s"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argument non supporté pour le format '%s' : -%d"
 
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "Fusion :"
+#: 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."
 
-#: merge-recursive.c:1919
+#: bisect.c:441
 #, 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 :"
+msgid "Could not open file '%s'"
+msgstr "impossible d'ouvrir le fichier '%s'"
 
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
-msgstr "la fusion n'a pas retourné de commit"
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Contenu mal cité dans le fichier '%s' : %s"
 
-#: merge-recursive.c:2013
+#: bisect.c:655
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Impossible d'analyser l'objet '%s'"
+msgid "We cannot bisect more!\n"
+msgstr "Impossible de pousser la bissection plus loin !\n"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "Impossible d'écrire l'index."
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s n'est pas un nom de commit valide"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Impossible de valider un arbre de notes non initialisé/référencé"
+#: 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 ""
+"La base de fusion %s est mauvaise.\n"
+"Cela signifie que le bogue été corrigé entre %s et [%s].\n"
 
-#: notes-utils.c:100
+#: bisect.c:737
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Mauvaise valeur de notes.rewriteMode : '%s'"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"La base de fusion %s est nouvelle.\n"
+"La propriété a changé entre %s et [%s].\n"
 
-#: notes-utils.c:110
+#: bisect.c:742
 #, 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 ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
+msgstr ""
+"La base de fusion %s est %s.\n"
+"Ceci signifie que le premier commit '%s' est entre %s et [%s].\n"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bisect.c:750
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Mauvaise valeur de %s : '%s'"
+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 ""
+"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"
 
-#: object.c:242
+#: bisect.c:763
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "impossible d'analyser l'objet : %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 ""
+"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."
 
-#: parse-options.c:570
-msgid "..."
-msgstr "..."
+#: bisect.c:798
+#, c-format
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bissection : une base de fusion doit être testée\n"
 
-#: parse-options.c:588
+#: bisect.c:849
 #, c-format
-msgid "usage: %s"
-msgstr "usage : %s"
+msgid "a %s revision is needed"
+msgstr "une révision %s est nécessaire"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "   or: %s"
-msgstr "   ou : %s"
+msgid "could not create file '%s'"
+msgstr "impossible de créer le fichier '%s'"
 
-#: parse-options.c:595
+#: bisect.c:917
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "could not read file '%s'"
+msgstr "impossible de lire le fichier '%s'"
 
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-NUM"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "impossible de lire les références de bissection"
 
-#: parse-options-cb.c:108
+#: bisect.c:967
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "nom d'objet malformé '%s'"
+msgid "%s was both %s and %s\n"
+msgstr "%s était à la fois %s et %s\n"
 
-#: path.c:752
+#: bisect.c:975
 #, 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"
-
-#: pathspec.c:143
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 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'"
+"Aucun commit testable n'a été trouvé\n"
+"Peut-être avez-vous démarré avec un mauvais paramètre de chemin ?\n"
 
-#: pathspec.c:183
+#: bisect.c:994
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "La spécification magique de chemin '%.*s' est invalide dans '%s'"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(à peu près %d étape)"
+msgstr[1] "(à peu près %d étapes)"
 
-#: pathspec.c:187
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, 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 "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"
 
-#: pathspec.c:205
+#: branch.c:53
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Spécificateur magique '%c' non implémenté 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\"."
 
-#: pathspec.c:230
+#: branch.c:67
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s : 'literal' et 'glob' sont incompatibles"
+msgid "Not setting branch %s as its own upstream."
+msgstr "La branche %s ne peut pas être sa propre branche amont."
 
-#: pathspec.c:241
+#: branch.c:93
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s : '%s' est hors du dépôt"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"La branche %s est paramétrée pour suivre la branche distante %s de %s en "
+"rebasant."
 
-#: pathspec.c:291
+#: branch.c:94
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
+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."
 
-#: pathspec.c:353
+#: branch.c:98
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
+msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
-"%s : le spécificateur magique de chemin n'est pas supporté par cette "
-"commande : %s"
+"La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
 
-#: pathspec.c:433
+#: branch.c:99
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "le chemin '%s' est au-delà d'un lien symbolique"
+msgid "Branch %s set up to track local branch %s."
+msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
+#: branch.c:104
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
-"Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
-"Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
-
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "impossible d'analyser le format --pretty"
-
-#: progress.c:235
-msgid "done"
-msgstr "fait"
+"La branche %s est paramétrée pour suivre la référence distante %s en "
+"rebasant."
 
-#: read-cache.c:1281
+#: branch.c:105
 #, 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 "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."
 
-#: read-cache.c:1291
+#: branch.c:109
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
-"GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
-"Utilisation de la version %i"
+"La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: branch.c:110
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Impossible d'ouvrir '%s' en écriture"
+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."
 
-#: refs/files-backend.c:2374
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "Impossible de supprimer la référence %s : %s"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Échec de l'écriture de la configuration de branche amont"
 
-#: refs/files-backend.c:2377
+#: branch.c:156
 #, c-format
-msgid "could not delete references: %s"
-msgstr "impossible de supprimer les références : %s"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Pas de suivi : information ambiguë pour la référence %s"
 
-#: refs/files-backend.c:2386
+#: branch.c:185
 #, c-format
-msgid "could not remove reference %s"
-msgstr "impossible de supprimer la référence %s"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' n'est pas un nom de branche valide."
 
-#: ref-filter.c:55
+#: branch.c:190
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "format attendu : %%(color:<couleur>)"
+msgid "A branch named '%s' already exists."
+msgstr "Une branche nommée '%s' existe déjà."
 
-#: ref-filter.c:57
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "couleur non reconnue : %%(color:%s)"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Impossible de forcer la mise à jour de la branche courante."
 
-#: ref-filter.c:71
+#: branch.c:218
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "format non reconnu %%(%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."
 
-#: ref-filter.c:77
+#: branch.c:220
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) n'accepte pas d'argument"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "la branche amont demandée '%s' n'existe pas"
 
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) n'accepte pas d'argument"
+#: 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 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."
 
-#: ref-filter.c:101
+#: branch.c:265
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "valeur positive attendue contents:lines=%s"
+msgid "Not a valid object name: '%s'."
+msgstr "Nom d'objet invalide : '%s'."
 
-#: ref-filter.c:103
+#: branch.c:285
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "argument %%(contents) non reconnu : %s"
+msgid "Ambiguous object name: '%s'."
+msgstr "Nom d'objet ambigu : '%s'."
 
-#: ref-filter.c:113
+#: branch.c:290
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "argument %%(objectname) non reconnu : %s"
+msgid "Not a valid branch point: '%s'."
+msgstr "Point d'embranchement invalide : '%s'."
 
-#: ref-filter.c:135
+#: branch.c:344
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "format attendu : %%(align:<largeur>,<position>)"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' est déjà extrait dans '%s'"
 
-#: ref-filter.c:147
+#: branch.c:363
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "position non reconnue : %s"
+msgid "HEAD of working tree %s is not updated"
+msgstr "la HEAD de la copie de travail %s n'est pas mise à jour"
 
-#: ref-filter.c:151
+#: bundle.c:34
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "largeur non reconnue : %s"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' ne semble pas être un fichier bundle v2"
 
-#: ref-filter.c:157
+#: bundle.c:61
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "argument %%(align) non reconnu : %s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "en-tête non reconnu : %s%s (%d)"
 
-#: ref-filter.c:161
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "valeur positive attendue avec l'atome %%(align)"
+msgid "could not open '%s'"
+msgstr "impossible d'ouvrir '%s'"
 
-#: ref-filter.c:244
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr "nom de champ malformé %.*s"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
 
-#: ref-filter.c:270
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr "nom de champ inconnu : %.*s"
+#: 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 "échec de la préparation du parcours des révisions"
 
-#: ref-filter.c:372
+#: bundle.c:185
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "format : atome %%(end) utilisé sans atome correspondant"
+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 :"
 
-#: ref-filter.c:424
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Le colis enregistre l'historique complet."
+
+#: bundle.c:194
 #, c-format
-msgid "malformed format string %s"
-msgstr "Chaîne de formatage mal formée %s"
+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 :"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requiert un argument entier positif"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Impossible de créer des objets groupés"
 
-#: ref-filter.c:883
+#: 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"
+
+#: bundle.c:353
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "la réf '%s' n'a pas %ld composants à :strip"
+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:1046
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "format de %.*s inconnu %s"
+msgid "unrecognized argument: %s"
+msgstr "argument non reconnu : %s"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Refus de créer un colis vide."
+
+#: bundle.c:463
 #, c-format
-msgid "missing object %s for %s"
-msgstr "objet manquant %s pour %s"
+msgid "cannot create '%s'"
+msgstr "impossible de créer '%s'"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "l'index de groupe a disparu"
+
+#: color.c:290
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "echec de parse_object_buffer sur %s pour %s"
+msgid "invalid color value: %.*s"
+msgstr "Valeur invalide de couleur : %.*s"
 
-#: ref-filter.c:1311
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "objet malformé à '%s'"
+msgid "could not parse %s"
+msgstr "impossible d'analyser %s"
 
-#: ref-filter.c:1373
+#: commit.c:42
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "réf avec un nom cassé %s ignoré"
+msgid "%s %s is not a commit!"
+msgstr "%s %s n'est pas un commit !"
 
-#: ref-filter.c:1378
+#: commit.c:1514
+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"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "plus de mémoire"
+
+#: config.c:516
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "réf cassé %s ignoré"
+msgid "bad config line %d in blob %s"
+msgstr "ligne %d de config incorrecte dans le blob %s"
 
-#: ref-filter.c:1651
+#: config.c:520
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: atome %%(end) manquant"
+msgid "bad config line %d in file %s"
+msgstr "ligne %d de config incorrecte dans le fichier %s"
 
-#: ref-filter.c:1705
+#: config.c:524
 #, c-format
-msgid "malformed object name %s"
-msgstr "nom d'objet malformé %s"
+msgid "bad config line %d in standard input"
+msgstr "ligne %d de config incorrecte dans l'entrée standard"
 
-#: remote.c:745
+#: config.c:528
 #, 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 config line %d in submodule-blob %s"
+msgstr "ligne %d de config incorrecte dans le blob de sous-module %s"
 
-#: remote.c:749
+#: config.c:532
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s suit habituellement %s, pas %s"
+msgid "bad config line %d in command line %s"
+msgstr "ligne %d de config incorrecte dans la ligne de commande %s"
 
-#: remote.c:753
+#: config.c:536
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s suit à la fois %s et %s"
+msgid "bad config line %d in %s"
+msgstr "ligne %d de config incorrecte dans %s"
 
-#: remote.c:761
-msgid "Internal error"
-msgstr "Erreur interne"
+#: config.c:655
+msgid "out of range"
+msgstr "hors plage"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD ne pointe pas sur une branche"
+#: config.c:655
+msgid "invalid unit"
+msgstr "unité invalide"
 
-#: remote.c:1686
+#: config.c:661
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "pas de branche '%s'"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valeur numérique de configuration invalide '%s' pour '%s' : %s"
 
-#: remote.c:1689
+#: config.c:666
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "aucune branche amont configurée pour la branche '%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"
 
-#: remote.c:1695
+#: config.c:669
 #, 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 "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"
 
-#: remote.c:1710
+#: config.c:672
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr ""
-"la destination de poussée '%s' sur le serveur distant '%s' n'a pas de "
-"branche locale de suivi"
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans l'entrée "
+"standard : %s"
 
-#: remote.c:1725
+#: config.c:675
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "la branche '%s' n'a aucune branche distante de poussée"
+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"
 
-#: remote.c:1736
+#: config.c:678
 #, 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 numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
-"impossible de résoudre une poussée 'simple' pour une destination unique"
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans la ligne de "
+"commande %s : %s"
 
-#: remote.c:2073
+#: config.c:681
 #, 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 "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr ""
+"valeur numérique de configuration incorrecte '%s' pour '%s' dans %s : %s"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
-
-#: remote.c:2080
+#: config.c:768
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Votre branche est à jour avec '%s'.\n"
+msgid "failed to expand user dir in: '%s'"
+msgstr "impossible d'étendre le répertoire utilisateur dans : '%s'"
 
-#: remote.c:2084
+#: config.c:852 config.c:863
 #, 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"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
+msgid "bad zlib compression level %d"
+msgstr "niveau de compression zlib incorrect %d"
 
-#: remote.c:2093
+#: config.c:978
 #, 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"
+msgid "invalid mode for object creation: %s"
+msgstr "mode invalide pour la création d'objet : %s"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "lecture de la configuration de ligne de commande impossible"
 
-#: remote.c:2104
-#, 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"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "erreur inconnue pendant la lecture des fichiers de configuration"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+#: config.c:1716
+#, c-format
+msgid "unable to parse '%s' from command-line config"
 msgstr ""
-"  (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
-
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "votre branche actuelle semble cassée"
+"impossible d'analyser '%s' depuis le configuration en ligne de commande"
 
-#: revision.c:2134
+#: config.c:1718
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "votre branche actuelle '%s' ne contient encore aucun commit"
-
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent est incompatible avec --bisect"
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr ""
+"variable de configuration '%s' incorrecte dans le fichier '%s' à la ligne %d"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "échec de l'ouverture de /dev/null"
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s a des valeurs multiples"
 
-#: run-command.c:94
+#: config.c:2311
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "échec de dup2(%d,%d)"
+msgid "could not set '%s' to '%s'"
+msgstr "impossible de régler '%s' à '%s'"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "impossible de signer le certificat de poussée"
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
+msgstr "impossible de désinitialiser '%s'"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "Le receveur ne gère pas les poussées avec --signed"
+#: 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"
 
-#: send-pack.c:406
+#: connect.c:51
 msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
 msgstr ""
-"pas d'envoi de certificat de poussée car le receveur ne gère pas les "
-"poussées avec --signed"
+"Impossilble 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."
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "Le receveur ne gère pas les poussées avec --atomic"
+#: connected.c:63 builtin/fsck.c:173 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"
 
-#: sequencer.c:174
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "impossible de fermer l'entrée standard du rev-list"
+
+#: convert.c:201
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"après résolution des conflits, marquez les chemins corrigés\n"
-"avec 'git add <chemins>' ou 'git rm <chemins>'"
+"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."
 
-#: sequencer.c:177
+#: 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 ""
-"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'"
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 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'"
+"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."
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: convert.c:215
 #, c-format
-msgid "Could not write to %s"
-msgstr "Impossible d'écrire dans %s"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "Les LF seraient remplacés par des CRLF dans %s"
 
-#: sequencer.c:193
-#, c-format
-msgid "Error wrapping up %s"
-msgstr "Erreur à l'emballage de %s"
+#: date.c:97
+msgid "in the future"
+msgstr "dans le futur"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Vos modifications locales seraient écrasées par cherry-pick."
+#: 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"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Vos modifications locales seraient écrasées par revert."
+#: 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"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Validez vos modifications ou les remiser pour continuer."
+#: 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"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: date.c:124
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Impossible d'écrire le nouveau fichier index"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "il y a %lu jour"
+msgstr[1] "il y a %lu jours"
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Impossible de résoudre le commit HEAD\n"
+#: 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"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Impossible de mettre à jour l'arbre de cache\n"
+#: 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"
 
-#: sequencer.c:390
+#: date.c:148
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Impossible d'analyser le commit %s\n"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu an"
+msgstr[1] "%lu ans"
 
-#: sequencer.c:395
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Impossible d'analyser le commit parent %s\n"
+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"
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Votre fichier d'index n'est pas fusionné."
+#: 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"
 
-#: sequencer.c:479
+#: diffcore-order.c:24
 #, 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 "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"
 
-#: sequencer.c:487
+#: diff.c:62
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Le commit %s n'a pas le parent %d"
+msgid "option '%s' requires a value"
+msgstr "le commutateur '%s' a besoin d'une valeur"
 
-#: sequencer.c:491
+#: diff.c:124
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
-"Une branche principale a été spécifiée mais le commit %s n'est pas une "
-"fusion."
+"  Impossible d'analyser le pourcentage de modification de dirstat '%s'\n"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: diff.c:129
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s : impossible d'analyser le commit parent %s"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Paramètre dirstat inconnu '%s'\n"
 
-#: sequencer.c:508
+#: diff.c:283
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Impossible d'obtenir un message de validation pour %s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+"Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'"
 
-#: sequencer.c:594
+#: diff.c:346
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "impossible d'annuler %s... %s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Erreurs dans la variable de configuration 'diff.dirstat' :\n"
+"%s"
 
-#: sequencer.c:595
+#: diff.c:3087
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "impossible d'appliquer %s... %s"
+msgid "external diff died, stopping at %s"
+msgstr "l'application de diff externe a disparu, arrêt à %s"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "l'ensemble de commits spécifié est vide"
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check et -s sont mutuellement exclusifs"
 
-#: sequencer.c:638
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s : échec à la lecture de l'index"
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow a besoin d'une spécification de chemin unique"
 
-#: sequencer.c:642
+#: diff.c:3665
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s : échec du rafraîchissement de l'index"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
+"%s"
 
-#: sequencer.c:702
+#: diff.c:3679
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "Impossible de %s pendant un %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
 
-#: sequencer.c:724
-#, c-format
-msgid "Could not parse line %d."
-msgstr "Impossible d'analyser la ligne %d."
+#: diff.c:4700
+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."
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Aucun commit analysé."
+#: diff.c:4703
+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:741
+#: diff.c:4706
 #, c-format
-msgid "Could not open %s"
-msgstr "Impossible d'ouvrir %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."
+
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "echec de l'obtention d'information de kernel"
+
+#: dir.c:1985
+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:745
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack : list courte attendue"
+
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack : ACK/NACK attendu, EOF reçu"
+
+#: fetch-pack.c:243
 #, c-format
-msgid "Could not read %s."
-msgstr "Impossible de lire %s."
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack : ACK/NACK attendu, '%s' reçu"
 
-#: sequencer.c:752
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc nécessite multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Feuille d'instruction inutilisable : %s"
+msgid "invalid shallow line: %s"
+msgstr "ligne de superficiel invalide : %s"
 
-#: sequencer.c:782
+#: fetch-pack.c:387
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Clé invalide: %s"
+msgid "invalid unshallow line: %s"
+msgstr "ligne de fin de superficiel invalide : %s"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: fetch-pack.c:389
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valeur invalide pour %s : %s"
+msgid "object not found: %s"
+msgstr "objet non trouvé : %s"
 
-#: sequencer.c:795
+#: fetch-pack.c:392
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Feuille d'options malformée : %s"
+msgid "error in object: %s"
+msgstr "Erreur dans l'objet : %s"
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "un picorage ou un retour est déjà en cours"
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "Pas de superficiel trouvé : %s"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "superficiel/non superficiel attendu, %s trouvé"
 
-#: sequencer.c:819
+#: fetch-pack.c:436
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Impossible de créer le répertoire de séquenceur %s"
+msgid "got %s %d %s"
+msgstr "réponse %s %d %s"
 
-#: sequencer.c:835 sequencer.c:917
+#: fetch-pack.c:450
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Erreur lors de l'emballage de %s."
+msgid "invalid commit %s"
+msgstr "commit invalide %s"
 
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "aucun picorage ou retour en cours"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "abandon"
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "impossible de résoudre HEAD"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "fait"
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "impossible d'abandonner depuis une branche non encore créée"
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "%s trouvé (%d) %s"
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: fetch-pack.c:551
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "impossible d'ouvrir %s : %s"
+msgid "Marking %s as complete"
+msgstr "Marquage de %s comme terminé"
 
-#: sequencer.c:881
+#: fetch-pack.c:697
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "impossible de lire %s : %s"
+msgid "already have %s (%s)"
+msgstr "%s déjà possédé (%s)"
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "fin de fichier inattendue"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack : impossible de dupliquer le démultiplexeur latéral"
 
-#: sequencer.c:888
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "erreur de protocole : mauvais entête de paquet"
 
-#: sequencer.c:910
+#: fetch-pack.c:799
 #, c-format
-msgid "Could not format %s."
-msgstr "Impossible de formater %s."
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack : impossible de dupliquer %s"
 
-#: sequencer.c:1055
+#: fetch-pack.c:815
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s : impossible de picorer un %s"
+msgid "%s failed"
+msgstr "échec de %s"
 
-#: sequencer.c:1058
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s : mauvaise révision"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "erreur dans le démultiplexer latéral"
 
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "Impossible d'annuler en tant que commit initial"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Le serveur ne supporte les clients superficiels"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Impossible de picorer vers une HEAD vide"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Le serveur supporte multi_ack_detailed"
 
-#: setup.c:246
-#, c-format
-msgid "failed to read %s"
-msgstr "échec de la lecture de %s"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Le serveur support no-done"
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset avant la fin du fichier paquet (.idx cassé ?)"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Le serveur supporte multi_ack"
 
-#: sha1_file.c:2459
-#, 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 ?)"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Le serveur supporte side-band-64k"
 
-#: sha1_file.c:2463
-#, 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é ?)"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Le serveru supporte side-band"
 
-#: 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 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\""
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Le serveur supporte allow-tip-sha1-in-want"
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"Modification impossible de .gitmodules non fusionné, résolvez les conflits "
-"d'abord"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Le serveur supporte allow-reachable-sha1-in-want"
 
-#: submodule.c:66 submodule.c:100
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Impossible de trouver une section où path=%s dans .gitmodules"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Le serveur support ofs-delta"
 
-#: submodule.c:74
+#: fetch-pack.c:890
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Impossible de mettre à jour l'élément %s de .gitmodules"
+msgid "Server version is %.*s"
+msgstr "La version du serveur est %.*s"
 
-# ici %s est un chemin
-#: submodule.c:107
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Le receveur ne gère pas --shallow-since"
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "échec de la mise en index du .gitmodules mis à jour"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Le receveur ne gère pas --shallow-exclude"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Le receveur ne gère pas --deepen"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "pas de commit commun"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack : échec de le récupération."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "pas de HEAD distante correspondante"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg n'a pas pu signer les données"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "impossible de créer un fichier temporaire"
 
-#: trailer.c:237
+#: gpg-interface.c:217
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "échec de la commande trailer '%s'"
+msgid "failed writing detached signature to '%s'"
+msgstr "impossible d'écrire la signature détachée dans '%s'"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: grep.c:1782
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "valeur inconnue '%s' pour la clé '%s'"
+msgid "'%s': unable to read %s"
+msgstr "'%s' : lecture de %s impossible"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "more than one %s"
-msgstr "plus d'un %s"
+msgid "failed to stat '%s'"
+msgstr "échec du stat de '%s'"
 
-#: trailer.c:582
+#: grep.c:1810
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "symbole vide dans la ligne de fin '%.*s'"
+msgid "'%s': short read"
+msgstr "'%s' : lecture tronquée"
 
-#: trailer.c:702
+#: help.c:203
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "impossible de lire le fichier d'entrée '%s'"
+msgid "available git commands in '%s'"
+msgstr "commandes git disponibles dans '%s'"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "Impossible de lire depuis l'entrée standard"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "stat impossible de %s"
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Ci-dessous les commandes Git habituelles dans diverses situations :"
 
-#: trailer.c:859
+#: help.c:306
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "%s n'est pas un fichier régulier"
+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 ?"
+
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Ahem. Votre système n'indique aucune commande Git."
 
-#: trailer.c:861
+#: help.c:383
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "le fichier %s n'est pas inscriptible par l'utilisateur"
+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'"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "impossible de créer un fichier temporaire"
+#: help.c:388
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "dans %0.1f secondes automatiquement..."
 
-#: trailer.c:912
+#: help.c:395
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "impossible de renommer un fichier temporaire en %s"
+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:399 help.c:465
+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à ?"
 
-#: transport-helper.c:1041
+#: help.c:461
 #, c-format
-msgid "Could not read ref %s"
-msgstr "impossible de lire la réf %s"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "Extraction des fichiers"
+#: 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"
+"*** 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"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
+#: 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."
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: lockfile.c:160
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "séquence d'échappement %XX invalide"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Impossible de créer '%s.lock' : %s"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "hôte manquant et le schéma n'est pas 'file:'"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "impossible de lire le cache"
 
-#: 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"
+#: 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 "impossible d'écrire le nouveau fichier d'index"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "caractères invalides dans le nom d'hôte"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(mauvais commit)\n"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "numéro de port invalide"
+#: merge-recursive.c:231
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "échec de addinfo_cache pour le chemin '%s'"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segment de chemin '..' invalide"
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "erreur de construction des arbres"
 
-#: wrapper.c:222 wrapper.c:381
+#: merge-recursive.c:720
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "impossible d'ouvrir '%s' en lecture/écriture"
+msgid "failed to create path '%s'%s"
+msgstr "impossible de créer le chemin '%s' %s"
 
-#: wrapper.c:224 wrapper.c:383
+#: merge-recursive.c:731
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "impossible d'ouvrir '%s' en écriture"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Suppression de %s pour faire de la place pour le sous-répertoire\n"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "impossible d'ouvrir '%s' en lecture"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": peut-être un conflit D/F ?"
 
-#: wrapper.c:611
+#: merge-recursive.c:754
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "impossible d'accéder à '%s' : %s"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "refus de perdre le fichier non suivi '%s'"
 
-#: wrapper.c:632
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "unable to access '%s'"
-msgstr "impossible d'accéder à '%s'"
+msgid "cannot read object %s '%s'"
+msgstr "impossible de lire l'objet %s '%s'"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "impossible d'accéder au répertoire de travail courant"
+#: merge-recursive.c:798
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "blob attendu pour %s '%s'"
 
-#: wrapper.c:667
+#: merge-recursive.c:822
 #, c-format
-msgid "could not open %s for writing"
-msgstr "Impossible d'ouvrir '%s' en écriture"
+msgid "failed to open '%s': %s"
+msgstr "échec à l'ouverture de '%s' : %s"
 
-#: wrapper.c:678 builtin/am.c:410
+#: merge-recursive.c:833
 #, c-format
-msgid "could not write to %s"
-msgstr "Impossible d'écrire dans %s"
+msgid "failed to symlink '%s': %s"
+msgstr "échec à la création du lien symbolique '%s' : %s"
 
-#: wrapper.c:684
+#: merge-recursive.c:838
 #, c-format
-msgid "could not close %s"
-msgstr "impossible de fermer %s"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "ne sait pas traiter %06o %s '%s'"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Chemins non fusionnés :"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Échec à l'exécution de la fusion interne"
 
-#: wt-status.c:176 wt-status.c:203
+#: merge-recursive.c:982
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (utilisez \"git reset %s <fichier>...\" pour désindexer)"
-
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (utilisez \"git rm --cached <fichier>...\" pour désindexer)"
+msgid "Unable to add %s to database"
+msgstr "Impossible d'ajouter %s à la base de données"
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git add <fichier>...\" pour marquer comme résolu)"
+#: merge-recursive.c:1081 merge-recursive.c:1095
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
+"%s laissée dans l'arbre."
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: merge-recursive.c:1087 merge-recursive.c:1100
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
-"  (utilisez \"git add/rm <fichier>...\" si nécessaire pour marquer comme "
-"résolu)"
+"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
+"%s laissée dans l'arbre dans le fichier %s."
 
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git rm <fichier>...\" pour marquer comme résolu)"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "renommage"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Modifications qui seront validées :"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "renommé"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Modifications qui ne seront pas validées :"
+#: merge-recursive.c:1200
+#, 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"
 
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
+#: merge-recursive.c:1225
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"  (utilisez \"git add <fichier>...\" pour mettre à jour ce qui sera validé)"
-
-#: wt-status.c:221
-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é)"
+"CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
+"\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
-#: wt-status.c:222
-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)"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (laissé non résolu)"
 
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: merge-recursive.c:1292
+#, c-format
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"  (valider ou annuler le contenu non suivi ou modifié dans les sous-modules)"
+"CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage '%s'-"
+">'%s' dans %s"
 
-#: wt-status.c:236
+#: merge-recursive.c:1325
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Renommage de %s en %s et de %s en %s à la place"
+
+#: merge-recursive.c:1531
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
-"  (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)"
+"CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "supprimé des deux côtés :"
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
+msgstr "Ajout de %s fusionné"
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "ajouté par nous :"
+#: merge-recursive.c:1553 merge-recursive.c:1766
+#, c-format
+msgid "Adding as %s instead"
+msgstr "Ajout plutôt comme %s"
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "supprimé par eux :"
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
+msgstr "impossible de lire l'objet %s"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "ajouté par eux :"
+#: merge-recursive.c:1613
+#, c-format
+msgid "object %s is not a blob"
+msgstr "l'objet %s n'est pas un blob"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "supprimé par nous :"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "modification"
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "ajouté de deux côtés :"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "modifié"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "modifié des deux côtés :"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "contenu"
 
-#: wt-status.c:265
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "ajout/ajout"
+
+#: merge-recursive.c:1718
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "bogue : état de non-fusion non géré %x"
+msgid "Skipped %s (merged same as existing)"
+msgstr "%s sauté (fusion identique à l'existant)"
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "nouveau fichier :"
+#: merge-recursive.c:1732
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Fusion automatique de %s"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "copié :"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "sous-module"
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "supprimé :"
+#: merge-recursive.c:1737
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "modifié :"
+#: merge-recursive.c:1831
+#, c-format
+msgid "Removing %s"
+msgstr "Suppression de %s"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "renommé :"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "fichier/répertoire"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "modif. type :"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "répertoire/fichier"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "inconnu :"
+#: merge-recursive.c:1868
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "non fusionné :"
+#: merge-recursive.c:1877
+#, c-format
+msgid "Adding %s"
+msgstr "Ajout de %s"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "nouveaux commits, "
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Déjà à jour !"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "contenu modifié, "
+#: merge-recursive.c:1923
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "échec de fusion des arbres %s et %s"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "contenu non suivi, "
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Fusion :"
 
-#: wt-status.c:390
+#: merge-recursive.c:2019
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "bogue : état de diff non géré %c"
+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 :"
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Sous-modules modifiés mais non mis à jour :"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "la fusion n'a pas retourné de commit"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Changements du sous-module à valider :"
+#: merge-recursive.c:2121
+#, 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."
 
-#: wt-status.c:837
+#: notes-merge.c:273
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"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 ""
-"Ne touchez pas à la ligne ci-dessus\n"
-"Tout ce qui suit sera éliminé."
-
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "Vous avez des chemins non fusionnés."
-
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (réglez les conflits puis lancez \"git commit\")"
+"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."
 
-#: wt-status.c:954
-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."
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "Vous n'avez pas terminé votre fusion de notes (%s existe)."
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "Impossible de valider un arbre de notes non initialisé/référencé"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Vous êtes au milieu d'une session am."
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Mauvaise valeur de notes.rewriteMode : '%s'"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "Le patch actuel est vide."
+#: 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/)"
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
+#. 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'"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "impossible d'analyser l'objet : %s"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Aucune commande réalisée."
+#: parse-options.c:590
+#, c-format
+msgid "usage: %s"
+msgstr "usage : %s"
 
-#: wt-status.c:1108
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, 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 "   or: %s"
+msgstr "   ou : %s"
 
-#: wt-status.c:1119
+#: parse-options.c:597
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (voir plus dans le fichier %s)"
+msgid "    %s"
+msgstr "    %s"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Aucune commande restante."
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: wt-status.c:1127
+#: parse-options-cb.c:108
 #, 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) :"
-
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (utilisez \"git rebase --edit-todo\" pour voir et éditer)"
+msgid "malformed object name '%s'"
+msgstr "nom d'objet malformé '%s'"
 
-#: wt-status.c:1148
+#: path.c:826
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'."
+msgid "Could not make %s writable by group"
+msgstr "Impossible de rendre %s inscriptible pour le groupe"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Vous êtes en train de rebaser."
+#: 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"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
+#: pathspec.c:143
+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"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "paramètre invalide pour le spécificateur magique de chemin 'prefix'"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "La spécification magique de chemin '%.*s' est invalide dans '%s'"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
+#: pathspec.c:187
+#, 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:1181
+#: pathspec.c:205
 #, 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 "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Spécificateur magique '%c' non implémenté dans '%s'"
 
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-"Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s : 'literal' et 'glob' sont incompatibles"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr ""
-"  (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")"
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s : '%s' est hors du dépôt"
 
-#: wt-status.c:1193
+#: pathspec.c:291
 #, 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 "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
-"Vous êtes actuellement en train d'éditer un commit pendant un rebasage."
-
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
+"%s : le spécificateur magique de chemin n'est pas supporté par cette "
+"commande : %s"
 
-#: wt-status.c:1203
+#: pathspec.c:408
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"  (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos "
-"modifications)"
+"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:1213
+#: pathspec.c:440
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Vous êtes actuellement en train de picorer le commit %s."
-
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "le chemin '%s' est au-delà d'un lien symbolique"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: pathspec.c:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
-"  (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
+"Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
+"Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "impossible d'analyser le format --pretty"
 
-#: wt-status.c:1232
+#: read-cache.c:1315
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Vous êtes actuellement en train de rétablir le commit %s."
-
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
+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"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
+#: read-cache.c:1325
+#, 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"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
+#: refs.c:576 builtin/merge.c:840
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "Impossible d'ouvrir '%s' en écriture"
 
-#: wt-status.c:1253
+#: refs/files-backend.c:2481
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Vous êtes en cours de bissection, depuis la branche '%s'."
+msgid "could not delete reference %s: %s"
+msgstr "Impossible de supprimer la référence %s : %s"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Vous êtes en cours de bissection."
+#: refs/files-backend.c:2484
+#, c-format
+msgid "could not delete references: %s"
+msgstr "impossible de supprimer les références : %s"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "impossible de supprimer la référence %s"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "Sur la branche "
+#: ref-filter.c:55
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "format attendu : %%(color:<couleur>)"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "rebasage interactif en cours ; sur "
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "couleur non reconnue : %%(color:%s)"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "rebasage en cours ; sur "
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "format non reconnu %%(%s)"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD détachée sur "
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) n'accepte pas d'argument"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD détachée depuis "
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) n'accepte pas d'argument"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Actuellement sur aucun branche."
+#: ref-filter.c:101
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "valeur positive attendue contents:lines=%s"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "Validation initiale"
+#: ref-filter.c:103
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "argument %%(contents) non reconnu : %s"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Fichiers non suivis"
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "argument %%(objectname) non reconnu : %s"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "Fichiers ignorés"
+#: ref-filter.c:135
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "format attendu : %%(align:<largeur>,<position>)"
 
-#: wt-status.c:1494
+#: ref-filter.c:147
 #, 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 "unrecognized position:%s"
+msgstr "position non reconnue : %s"
 
-#: wt-status.c:1500
+#: ref-filter.c:151
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Fichiers non suivis non affichés%s"
+msgid "unrecognized width:%s"
+msgstr "largeur non reconnue : %s"
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (utilisez -u pour afficher les fichiers non suivis)"
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "argument %%(align) non reconnu : %s"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Aucune modification"
+#: ref-filter.c:161
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "valeur positive attendue avec l'atome %%(align)"
 
-#: wt-status.c:1513
+#: ref-filter.c:244
 #, c-format
-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"
+msgid "malformed field name: %.*s"
+msgstr "nom de champ malformé %.*s"
 
-#: wt-status.c:1516
+#: ref-filter.c:270
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "aucune modification ajoutée à la validation\n"
+msgid "unknown field name: %.*s"
+msgstr "nom de champ inconnu : %.*s"
 
-#: wt-status.c:1519
+#: ref-filter.c:372
 #, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-"aucune modification ajoutée à la validation mais des fichiers non suivis "
-"sont présents (utilisez \"git add\" pour les suivre)\n"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "format : atome %%(end) utilisé sans atome correspondant"
 
-#: wt-status.c:1522
+#: ref-filter.c:424
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr ""
-"aucune modification ajoutée à la validation mais des fichiers non suivis "
-"sont présents\n"
+msgid "malformed format string %s"
+msgstr "Chaîne de formatage mal formée %s"
 
-#: wt-status.c:1525
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= requiert un argument entier positif"
+
+#: ref-filter.c:883
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-"rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
-"suivre)\n"
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "la réf '%s' n'a pas %ld composants à :strip"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: ref-filter.c:1046
 #, c-format
-msgid "nothing to commit\n"
-msgstr "rien à valider\n"
+msgid "unknown %.*s format %s"
+msgstr "format de %.*s inconnu %s"
 
-#: wt-status.c:1531
+#: ref-filter.c:1066 ref-filter.c:1097
 #, 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 "missing object %s for %s"
+msgstr "objet manquant %s pour %s"
 
-#: wt-status.c:1535
+#: ref-filter.c:1069 ref-filter.c:1100
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "rien à valider, la copie de travail est propre\n"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "echec de parse_object_buffer sur %s pour %s"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Validation initiale sur "
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objet malformé à '%s'"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (aucune branche)"
-
-# à priori on parle d'une branche ici
-#: wt-status.c:1675
-msgid "gone"
-msgstr "disparue"
-
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "derrière "
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "réf avec un nom cassé %s ignoré"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "devant "
+#: ref-filter.c:1378
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "réf cassé %s ignoré"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: ref-filter.c:1633
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "échec lors de l'unlink de '%s'"
+msgid "format: %%(end) atom missing"
+msgstr "format: atome %%(end) manquant"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<options>] [--] <chemin>..."
+#: ref-filter.c:1687
+#, c-format
+msgid "malformed object name %s"
+msgstr "nom d'objet malformé %s"
 
-#: builtin/add.c:65
+#: remote.c:746
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "status de diff inattendu %c"
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Impossible de récupérer à la fois %s et %s pour %s"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "échec de la mise à jour des fichiers"
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s suit habituellement %s, pas %s"
 
-#: builtin/add.c:80
+#: remote.c:754
 #, c-format
-msgid "remove '%s'\n"
-msgstr "suppression de '%s'\n"
+msgid "%s tracks both %s and %s"
+msgstr "%s suit à la fois %s et %s"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Modifications non indexées après rafraîchissement de l'index :"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Erreur interne"
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Impossible de lire l'index"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD ne pointe pas sur une branche"
 
-#: builtin/add.c:205
+#: remote.c:1686
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Impossible d'ouvrir '%s' en écriture."
+msgid "no such branch: '%s'"
+msgstr "pas de branche '%s'"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Impossible d'écrire le patch"
+#: remote.c:1689
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "aucune branche amont configurée pour la branche '%s'"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "échec de l'édition du patch"
+#: remote.c:1695
+#, 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"
 
-#: builtin/add.c:215
+#: remote.c:1710
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Stat de '%s' impossible"
+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"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Patch vide. Abandon."
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "la branche '%s' n'a aucune branche distante de poussée"
 
-#: builtin/add.c:222
+#: remote.c:1736
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Impossible d'appliquer '%s'"
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "les références de spec pour '%s' n'incluent pas '%s'"
 
-#: builtin/add.c:232
-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"
+#: 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')"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "simuler l'action"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr ""
+"impossible de résoudre une poussée 'simple' pour une destination unique"
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "mode verbeux"
+#: remote.c:2073
+#, 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"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "sélection interactive"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (utilisez \"git branch --unset-upstream\" pour corriger)\n"
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "sélection interactive des sections"
+#: remote.c:2080
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Votre branche est à jour avec '%s'.\n"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "édition du diff actuel et application"
+#: 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] "Votre branche est en avance sur '%s' de %d commit.\n"
+msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "permettre l'ajout de fichiers ignorés"
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "mettre à jour les fichiers suivis"
+#: 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"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
+#: remote.c:2104
+#, 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"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
-"ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
+"  (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "ne pas ajouter, juste rafraîchir l'index"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "votre branche actuelle semble cassée"
 
-#: builtin/add.c:264
-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"
+#: revision.c:2161
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "votre branche actuelle '%s' ne contient encore aucun commit"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent est incompatible avec --bisect"
+
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "échec de l'ouverture de /dev/null"
 
-#: builtin/add.c:287
+#: run-command.c:108
 #, 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 "dup2(%d,%d) failed"
+msgstr "échec de dup2(%d,%d)"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "échec de l'ajout de fichiers"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "impossible de signer le certificat de poussée"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A et -u sont mutuellement incompatibles"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "Le receveur ne gère pas les poussées avec --signed"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
+"pas d'envoi de certificat de poussée car le receveur ne gère pas les "
+"poussées avec --signed"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Rien de spécifié, rien n'a été ajouté.\n"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "Le receveur ne gère pas les poussées avec --atomic"
 
-#: builtin/add.c:353
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "Le receveur ne gère pas les options de poussées"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "fichier d'index corrompu"
+#: sequencer.c:171
+msgid "revert"
+msgstr "revert"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Impossible d'écrire le nouveau fichier d'index"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
-#, c-format
-msgid "could not read '%s'"
-msgstr "impossible de lire '%s'"
+#: sequencer.c:228
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"après résolution des conflits, marquez les chemins corrigés\n"
+"avec 'git add <chemins>' ou 'git rm <chemins>'"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "impossible d'analyser le script author"
+#: sequencer.c:231
+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 ""
+"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'"
 
-#: builtin/am.c:507
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' a été effacé par le crochet applypatch-msg"
+msgid "could not lock '%s'"
+msgstr "impossible de verrouiller '%s'"
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, 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:585 builtin/notes.c:315
+#: sequencer.c:251
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Impossible de copier les notes de '%s' vers '%s'"
-
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "échec de fseek"
+msgid "could not write eol to '%s'"
+msgstr "impossible d'écrire la fin de ligne dans '%s'"
 
-#: builtin/am.c:772 builtin/am.c:860
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "impossible d'ouvrir '%s' en lecture : %s"
+msgid "failed to finalize '%s'."
+msgstr "échec lors de la finalisation de '%s'."
 
-#: builtin/am.c:779
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "impossible d'ouvrir '%s' en écriture : %s"
+msgid "could not read '%s'"
+msgstr "impossible de lire '%s'"
 
-#: builtin/am.c:788
+#: sequencer.c:305
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "impossible d'analyser le patch '%s'"
+msgid "your local changes would be overwritten by %s."
+msgstr "vos modifications locales seraient écrasées par %s."
 
-#: builtin/am.c:853
-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"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "validez vos modifications ou les remiser pour continuer."
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "horodatage invalide"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s : avance rapide"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "ligne de Date invalide"
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: Impossible d'écrire le nouveau fichier index"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "décalage horaire invalide"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "impossible de résoudre le commit HEAD\n"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Échec de détection du format du patch."
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "impossible de mettre à jour l'arbre de cache\n"
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: sequencer.c:483
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "échec de la création du répertoire '%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 ""
+"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/am.c:1005
-msgid "Failed to split patches."
-msgstr "Échec de découpage des patchs."
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "impossible d'analyser le commit %s\n"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "impossible d'écrire le fichier d'index"
+#: sequencer.c:572
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "impossible d'analyser le commit parent %s\n"
 
-#: builtin/am.c:1188
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "votre fichier d'index n'est pas fusionné."
+
+#: sequencer.c:675
 #, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Quand vous avez résolu ce problème, lancez \"%s --continue\"."
+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."
 
-#: builtin/am.c:1189
+#: sequencer.c:683
 #, 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\"."
+msgid "commit %s does not have parent %d"
+msgstr "le commit %s n'a pas de parent %d"
 
-#: builtin/am.c:1190
+#: sequencer.c:687
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
-"Pour restaurer la branche originale et arrêter de patcher, lancez \"%s --"
-"abort\"."
+"une branche principale a été spécifiée mais le commit %s n'est pas une "
+"fusion."
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Le patch est vide. Le découpage était-il bon ?"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s : impossible d'analyser le commit parent %s"
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: sequencer.c:705
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "ligne d'identification invalide : %s"
+msgid "cannot get commit message for %s"
+msgstr "impossible d'obtenir un message de validation pour %s"
 
-#: builtin/am.c:1429
+#: sequencer.c:797
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "impossible d'analyser le commit %s"
+msgid "could not revert %s... %s"
+msgstr "impossible d'annuler %s... %s"
 
-#: builtin/am.c:1631
-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."
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "impossible d'appliquer %s... %s"
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr ""
-"Utilisation de l'information de l'index pour reconstruire un arbre de base..."
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "l'ensemble de commits spécifié est vide"
 
-#: builtin/am.c:1652
-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."
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s : échec à la lecture de l'index"
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Retour à un patch de la base et fusion à 3 points..."
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s : échec du rafraîchissement de l'index"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Échec d'intégration des modifications."
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "ligne %d invalide : %.*s"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree a échoué à écrire un arbre"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "aucun commit analysé."
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "application à un historique vide"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "impossible de lire '%s'."
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "échec de l'écriture de l'objet commit"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "feuille d'instruction inutilisable : '%s'"
+
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "impossible de picorer pendant l'annulation d'un commit."
+
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "impossible d'annuler un commit pendant un picorage."
 
-#: builtin/am.c:1749 builtin/am.c:1753
+#: sequencer.c:1028
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "impossible de continuer : %s n'existe pas."
+msgid "invalid key: %s"
+msgstr "clé invalide : %s"
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"impossible d'être interactif sans entrée standard connectée à un terminal."
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "valeur invalide pour %s : %s"
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "Le corps de la validation est :"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "feuille d'options malformée : %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:1784
-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 : "
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "un picorage ou un retour est déjà en cours"
+
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
 
-#: builtin/am.c:1834
+#: sequencer.c:1106
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
+msgid "could not create sequencer directory '%s'"
+msgstr "impossible de créer le répertoire de séquenceur '%s'"
+
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "impossible de verrouiller HEAD"
 
-#: builtin/am.c:1869 builtin/am.c:1941
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "aucun picorage ou retour en cours"
+
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "impossible de résoudre HEAD"
+
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "impossible d'abandonner depuis une branche non encore créée"
+
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Application de  %.*s"
+msgid "cannot open '%s'"
+msgstr "impossible d'ouvrir '%s'"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Pas de changement -- Patch déjà appliqué."
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "impossible de lire '%s' : %s"
+
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "fin de fichier inattendue"
 
-#: builtin/am.c:1893
+#: sequencer.c:1184
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "le patch a échoué à %s %.*s"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
 
-#: builtin/am.c:1899
+#: sequencer.c:1354
 #, 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"
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s : impossible de picorer un %s"
+
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s : mauvaise révision"
 
-#: builtin/am.c:1944
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "impossible d'annuler en tant que commit initial"
+
+#: setup.c:160
+#, c-format
 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."
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 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."
+"%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."
 
-#: builtin/am.c:1951
+#: setup.c:173
+#, c-format
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"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 ""
-"Vous avez toujours des chemins non fusionnés dans votre index\n"
-"Auriez-vous oublié de faire 'git add' ?"
+"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>...]'"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: setup.c:223
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Impossible d'analyser l'objet '%s'."
-
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "échec du nettoyage de l'index"
-
-#: builtin/am.c:2145
 msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
-"Pas de retour à ORIG_HEAD"
+"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>...]'"
 
-#: builtin/am.c:2206
+#: setup.c:468
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valeur invalide pour --patch-format : %s"
-
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<options>] [(<mbox>|<Maildir>)...]"
-
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<options>] (--continue | --quit | --abort)"
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Version attendue du dépôt git <= %d, %d trouvée"
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "exécution interactive"
-
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "option historique -- no-op"
-
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "permettre de revenir à une fusion à 3 points si nécessaire"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "extensions de dépôt inconnues trouvées :"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "être silencieux"
+#: setup.c:762
+#, 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"
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
-msgstr "ajouter une ligne Signed-off-by au message de validation"
+#: 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"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "recoder en utf-8 (par défaut)"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Impossible d'accéder au répertoire de travail courant"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "passer l'option -k à git-mailinfo"
+#: 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 ""
+"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é)."
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "passer l'option -b à git-mailinfo"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Impossible de se déplacer vers le répertoire '%s/..'"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "passer l'option -m à git-mailinfo"
+#: 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 ""
+"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."
 
-#: builtin/am.c:2264
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "passer l'option --keep-cr à git-mailsplit fpour le format mbox"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "le chemin '%s' n'existe pas"
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
-"ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am.keepcr"
+"extraire le dépôt de référence '%s' comme une extraction liée n'est pas "
+"encore supporté."
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "retirer tout le contenu avant la ligne des ciseaux"
+#: sha1_file.c:505
+#, 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/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "action"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "le dépôt de référence '%s' est superficiel"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "le passer jusqu'à git-apply"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "le dépôt de référence '%s' est greffé"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "racine"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset avant la fin du fichier paquet (.idx cassé ?)"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "chemin"
+#: sha1_file.c:2592
+#, 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 ?)"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131 builtin/pull.c:185
-#: 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"
+#: sha1_file.c:2596
+#, 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é ?)"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "num"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "le SHA1 court %s est ambigu"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Les candidats sont :"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "format de présentation des patchs"
+#: 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 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: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"
+
+#: submodule.c:68 submodule.c:102
+#, 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:76
+#, 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:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
+
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "échec de la mise en index du .gitmodules mis à jour"
+
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "les valeurs négatives ne sont pas permises pour submodule.fetchJobs"
+
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "Valeur invalide pour %s"
+
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "échec de la commande trailer '%s'"
+
+#: 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 "valeur inconnue '%s' pour la clé '%s'"
+
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "plus d'un %s"
+
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "symbole vide dans la ligne de fin '%.*s'"
+
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "impossible de lire le fichier d'entrée '%s'"
+
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "Impossible de lire depuis l'entrée standard"
+
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "stat impossible de %s"
+
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "%s n'est pas un fichier régulier"
+
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "le fichier %s n'est pas inscriptible par l'utilisateur"
+
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "impossible de créer un fichier temporaire"
+
+#: trailer.c:983
+#, 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:817
+#, 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:821
+#, 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:829
+msgid "Aborting."
+msgstr "Abandon."
+
+#: transport-helper.c:1075
+#, 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: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 ""
+"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:66
+#, 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: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."
+
+#: 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"
+
+#: 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 ""
+"Vos modifications locales aux fichiers suivants seraient écrasées par %s :\n"
+"%%sVeuillez valider ou remiser vos modifications avant %s."
+
+#: unpack-trees.c:76
+#, 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:81
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"La mise à jour des répertoires suivants effacerait les fichiers non suivis "
+"contenus :\n"
+"%s"
+
+#: 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 ""
+"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:87
+#, 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: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 ""
+"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:92
+#, 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: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 ""
+"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:97
+#, 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: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."
+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:104
+#, 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: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 ""
+"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:109
+#, 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:112
+#, 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:114
+#, 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:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "L'entrée '%s' surcharge avec '%s'. Affectation impossible."
+
+#: unpack-trees.c:124
+#, 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:126
+#, 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:128
+#, 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:205
+#, c-format
+msgid "Aborting\n"
+msgstr "Abandon\n"
+
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "Extraction des fichiers"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, 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:'"
+
+#: 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"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "caractères invalides dans le nom d'hôte"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "numéro de port invalide"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "segment de chemin '..' invalide"
+
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "échec de la lecture de '%s'"
+
+#: 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"
+
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "impossible d'ouvrir '%s' en écriture"
+
+#: 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 "impossible d'ouvrir '%s' en lecture"
+
+#: wrapper.c:605 wrapper.c:626
+#, c-format
+msgid "unable to access '%s'"
+msgstr "impossible d'accéder à '%s'"
+
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "impossible d'accéder au répertoire de travail courant"
+
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "Impossible d'écrire dans %s"
+
+#: wrapper.c:660
+#, c-format
+msgid "could not close %s"
+msgstr "impossible de fermer %s"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Chemins non fusionnés :"
+
+#: wt-status.c:178 wt-status.c:205
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (utilisez \"git reset %s <fichier>...\" pour désindexer)"
+
+#: 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)"
+
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (utilisez \"git add <fichier>...\" pour marquer comme résolu)"
+
+#: 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)"
+
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (utilisez \"git rm <fichier>...\" pour marquer comme résolu)"
+
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Modifications qui seront validées :"
+
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Modifications qui ne seront pas validées :"
+
+#: 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é)"
+
+#: 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é)"
+
+#: 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)"
+
+#: 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)"
+
+#: wt-status.c:238
+#, 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é)"
+
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "supprimé des deux côtés :"
+
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "ajouté par nous :"
+
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "supprimé par eux :"
+
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "ajouté par eux :"
+
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "supprimé par nous :"
+
+#: wt-status.c:263
+msgid "both added:"
+msgstr "ajouté de deux côtés :"
+
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modifié des deux côtés :"
+
+#: wt-status.c:275
+msgid "new file:"
+msgstr "nouveau fichier :"
+
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copié :"
+
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "supprimé :"
+
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modifié :"
+
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "renommé :"
+
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "modif. type :"
+
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "inconnu :"
+
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "non fusionné :"
+
+#: 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:818
+msgid "Submodules changed but not updated:"
+msgstr "Sous-modules modifiés mais non mis à jour :"
+
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Changements du sous-module à valider :"
+
+#: wt-status.c:901
+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:1013
+msgid "You have unmerged paths."
+msgstr "Vous avez des chemins non fusionnés."
+
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (réglez les conflits puis lancez \"git commit\")"
+
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (utilisez \"git merge --abort\" pour annuler la fusion)"
+
+#: wt-status.c:1023
+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."
+
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (utilisez \"git commit\" pour terminer la fusion)"
+
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Vous êtes au milieu d'une session am."
+
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Le patch actuel est vide."
+
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git am --continue\")"
+
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
+
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
+
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Aucune commande réalisée."
+
+#: wt-status.c:1175
+#, 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) :"
+
+#: wt-status.c:1186
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (voir plus dans le fichier %s)"
+
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Aucune commande restante."
+
+#: wt-status.c:1194
+#, 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) :"
+
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (utilisez \"git rebase --edit-todo\" pour voir et éditer)"
+
+#: wt-status.c:1215
+#, 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:2302
-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:1220
+msgid "You are currently rebasing."
+msgstr "Vous êtes en train de rebaser."
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "continuer à appliquer les patchs après résolution d'un conflit"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git rebase --continue\")"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "synonymes de --continue"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (utilisez \"git rebase --skip\" pour sauter ce patch)"
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "sauter le patch courant"
+#: wt-status.c:1238
+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:2313
-msgid "restore the original branch and abort the patching operation."
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (tous les conflits sont réglés : lancez \"git rebase --continue\")"
+
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
-"restaurer la branche originale et abandonner les applications de patch."
+"Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
+"de la branche '%s' sur '%s'."
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "mentir sur la date de validation"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr ""
+"Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "utiliser l'horodatage actuel pour la date d'auteur"
+#: wt-status.c:1256
+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:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "id de clé"
+#: wt-status.c:1260
+#, 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:2322
-msgid "GPG-sign commits"
-msgstr "signer les commits avec GPG"
+#: wt-status.c:1265
+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:2325
-msgid "(internal use for git-rebase)"
-msgstr "(utilisation interne pour git-rebase)"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (utilisez \"git commit --amend\" pour corriger le commit actuel)"
 
-#: builtin/am.c:2340
+#: wt-status.c:1270
 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."
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
-"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
-"et elle sera supprimée. Veuillez ne plus l'utiliser."
+"  (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos "
+"modifications)"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "échec à la lecture de l'index"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Vous êtes actuellement en train de picorer le commit %s."
+
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2362
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
+
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
+
+#: wt-status.c:1299
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
+msgid "You are currently reverting commit %s."
+msgstr "Vous êtes actuellement en train de rétablir le commit %s."
+
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (réglez les conflits puis lancez \"git revert --continue\")"
+
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (tous les conflits sont réglés : lancez \"git revert --continue\")"
+
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (utilisez \"git revert --abort\" pour annuler le rétablissement)"
+
+#: wt-status.c:1320
+#, 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:1324
+msgid "You are currently bisecting."
+msgstr "Vous êtes en cours de bissection."
+
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
+
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "Sur la branche "
+
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "rebasage interactif en cours ; sur "
+
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "rebasage en cours ; sur "
+
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD détachée sur "
+
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD détachée depuis "
+
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Actuellement sur aucun branche."
+
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Validation initiale"
+
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Fichiers non suivis"
+
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Fichiers ignorés"
+
+#: 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 ""
-"le répertoire précédent de rebasage %s existe toujours mais mbox donnée."
+"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/am.c:2386
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "Fichiers non suivis non affichés%s"
+
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (utilisez -u pour afficher les fichiers non suivis)"
+
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Aucune modification"
+
+#: wt-status.c:1599
+#, c-format
+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"
+
+#: wt-status.c:1602
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "aucune modification ajoutée à la validation\n"
+
+#: wt-status.c:1605
 #, 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 ""
-"Répertoire abandonné %s trouvé.\n"
-"Utilisez \"git am --abort\" pour le supprimer."
+"aucune modification ajoutée à la validation mais des fichiers non suivis "
+"sont présents (utilisez \"git add\" pour les suivre)\n"
+
+#: wt-status.c:1608
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr ""
+"aucune modification ajoutée à la validation mais des fichiers non suivis "
+"sont présents\n"
+
+#: wt-status.c:1611
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
+"suivre)\n"
+
+#: wt-status.c:1614 wt-status.c:1619
+#, c-format
+msgid "nothing to commit\n"
+msgstr "rien à valider\n"
+
+#: wt-status.c:1617
+#, 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"
+
+#: wt-status.c:1621
+#, c-format
+msgid "nothing to commit, working tree clean\n"
+msgstr "rien à valider, la copie de travail est propre\n"
+
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Validation initiale sur "
+
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (aucune branche)"
+
+# à priori on parle d'une branche ici
+#: wt-status.c:1761
+msgid "gone"
+msgstr "disparue"
+
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "derrière "
+
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "devant "
+
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+msgid "cannot %s: You have unstaged changes."
+msgstr "Impossible de %s : vous avez des modifications non indexées."
+
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "de plus, votre index contient des modifications non validées."
+
+#: wt-status.c:2278
+#, c-format
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s impossible : votre index contient des modifications non validées."
+
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "échec lors de l'unlink de '%s'"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<options>] [--] <chemin>..."
+
+#: builtin/add.c:80
+#, c-format
+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/add.c:95
+#, c-format
+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:840
+msgid "Could not read the index"
+msgstr "Impossible de lire l'index"
+
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "Impossible d'ouvrir '%s' en écriture."
+
+#: 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 "Could not stat '%s'"
+msgstr "Stat de '%s' impossible"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Patch vide. Abandon."
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
+#: builtin/add.c:237
+#, c-format
+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 ""
-"Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
-"reprise."
+"Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<options>] [<patch>...]"
+#: 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 "simuler l'action"
 
-#: builtin/apply.c:111
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "option d'espace non reconnue '%s'"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "sélection interactive"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "option d'ignorance d'espace non reconnue '%s'"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "sélection interactive des sections"
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Impossible de préparer la regexp d'horodatage %s"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "édition du diff actuel et application"
 
-#: builtin/apply.c:827
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec a retourné %d pour l'entrée : %s"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "permettre l'ajout de fichiers ignorés"
 
-#: builtin/apply.c:908
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "nom de fichier du patch introuvable à la ligne %d"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "mettre à jour les fichiers suivis"
 
-#: builtin/apply.c:940
-#, 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"
+#: 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/apply.c:944
-#, 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"
+#: 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/apply.c:945
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
-"git apply : mauvais format de git-diff - ancien nom de fichier inconsistant "
-"à la ligne %d"
+"ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
 
-#: builtin/apply.c:952
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "ne pas ajouter, juste rafraîchir l'index"
+
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
 msgstr ""
-"git apply : mauvais format de git-diff - /dev/null attendu à la ligne %d"
+"sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait "
+"d'erreurs"
 
-#: builtin/apply.c:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recomptage : ligne inattendue : %.*s"
+#: 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/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de patch sans en-tête à la ligne %d : %.*s"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "outrepasser le bit exécutable pour les fichiers listés"
 
-#: builtin/apply.c:1489
+#: builtin/add.c:305
 #, 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 "Use -f if you really want to add them.\n"
+msgstr "Utilisez -f si vous voulez réellement les ajouter.\n"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "le nouveau fichier dépend de contenus anciens"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "échec de l'ajout de fichiers"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "le fichier supprimé a encore du contenu"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A et -u sont mutuellement incompatibles"
 
-#: builtin/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "patch corrompu à la ligne %d"
+#: builtin/add.c:355
+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"
 
-#: builtin/apply.c:1719
+#: builtin/add.c:359
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "le nouveau fichier %s dépend de contenus anciens"
+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:1721
+#: builtin/add.c:374
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "le fichier supprimé %s a encore du contenu"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Rien de spécifié, rien n'a été ajouté.\n"
 
-#: builtin/apply.c:1724
+#: builtin/add.c:375
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
 
-#: builtin/apply.c:1870
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binaire corrompu à la ligne %d : %.*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:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "fichier d'index corrompu"
 
-#: builtin/apply.c:1899
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "patch binaire non reconnu à la ligne %d"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "impossible d'analyser le script author"
 
-#: builtin/apply.c:2050
+#: builtin/am.c:491
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch totalement incompréhensible à la ligne %d"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' a été effacé par le crochet applypatch-msg"
 
-#: builtin/apply.c:2140
+#: builtin/am.c:532
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "lecture du lien symbolique %s impossible"
+msgid "Malformed input line: '%s'."
+msgstr "Ligne en entrée malformée : '%s'."
 
-#: builtin/apply.c:2144
+#: builtin/am.c:569
 #, c-format
-msgid "unable to open or read %s"
-msgstr "ouverture ou lecture de %s impossible"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Impossible de copier les notes de '%s' vers '%s'"
 
-#: builtin/apply.c:2777
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr "début de ligne invalide : '%c'"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "échec de fseek"
 
-#: builtin/apply.c:2896
+#: builtin/am.c:775
 #, 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 parse patch '%s'"
+msgstr "impossible d'analyser le patch '%s'"
 
-#: builtin/apply.c:2908
-#, 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"
+#: builtin/am.c:840
+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:2914
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"pendant la recherche de :\n"
-"%.*s"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "horodatage invalide"
 
-#: builtin/apply.c:2934
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "données de patch binaire manquantes pour '%s'"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "ligne de Date invalide"
 
-#: builtin/apply.c:3035
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "le patch binaire ne s'applique par correctement à '%s'"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "décalage horaire invalide"
 
-#: builtin/apply.c:3041
-#, 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é)"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Échec de détection du format du patch."
 
-#: builtin/apply.c:3062
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "le patch a échoué : %s:%ld"
+msgid "failed to create directory '%s'"
+msgstr "échec de la création du répertoire '%s'"
 
-#: builtin/apply.c:3186
-#, c-format
-msgid "cannot checkout %s"
-msgstr "extraction de %s impossible"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Échec de découpage des patchs."
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
-#, c-format
-msgid "read of %s failed"
-msgstr "échec de la lecture de %s"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "impossible d'écrire le fichier d'index"
 
-#: builtin/apply.c:3239
+#: builtin/am.c:1176
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "lecture depuis '%s' au-delà d'un lien symbolique"
+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:3267 builtin/apply.c:3489
+#: builtin/am.c:1177
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "le chemin %s a été renommé/supprimé"
+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:3348 builtin/apply.c:3503
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s : n'existe pas dans l'index"
+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:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Le patch est vide. Le découpage était-il bon ?"
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "%s: %s"
-msgstr "%s : %s"
+msgid "invalid ident line: %s"
+msgstr "ligne d'identification invalide : %s"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/am.c:1417
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s : ne correspond pas à l'index"
+msgid "unable to parse commit %s"
+msgstr "impossible d'analyser le commit %s"
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "le patch de suppression laisse un contenu dans le fichier"
+#: builtin/am.c:1610
+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."
 
-#: builtin/apply.c:3528
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s : type erroné"
+#: builtin/am.c:1612
+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:3530
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s est de type %o, mais %o attendu"
+#: builtin/am.c:1631
+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:3689 builtin/apply.c:3691
-#, c-format
-msgid "invalid path '%s'"
-msgstr "chemin invalide '%s'"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Retour à un patch de la base et fusion à 3 points..."
 
-#: builtin/apply.c:3746
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s : existe déjà dans l'index"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Échec d'intégration des modifications."
+
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree a échoué à écrire un arbre"
+
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "application à un historique vide"
 
-#: builtin/apply.c:3749
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s : existe déjà dans la copie de travail"
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "échec de l'écriture de l'objet commit"
 
-#: builtin/apply.c:3769
+#: builtin/am.c:1739 builtin/am.c:1743
 #, 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 "cannot resume: %s does not exist."
+msgstr "impossible de continuer : %s n'existe pas."
 
-#: builtin/apply.c:3774
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"le nouveau mode (%o) de %s ne correspond pas à l'ancien mode (%o) de %s"
+"impossible d'être interactif sans entrée standard connectée à un terminal."
 
-#: builtin/apply.c:3794
-#, 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:1764
+msgid "Commit Body is:"
+msgstr "Le corps de la validation est :"
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s : le patch ne s'applique pas"
+#. 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 "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all : "
 
-#: builtin/apply.c:3812
+#: builtin/am.c:1824
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Vérification du patch %s..."
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Index sale : impossible d'appliquer des patchs (sales : %s)"
 
-#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "échec de make_cache_entry pour le chemin '%s'"
+msgid "Applying: %.*s"
+msgstr "Application de  %.*s"
 
-#: builtin/apply.c:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "suppression de %s dans l'index impossible"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Pas de changement -- Patch déjà appliqué."
 
-#: builtin/apply.c:4077
+#: builtin/am.c:1885
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "patch corrompu pour le sous-module %s"
+msgid "Patch failed at %s %.*s"
+msgstr "le patch a échoué à %s %.*s"
 
-#: builtin/apply.c:4081
+#: builtin/am.c:1891
 #, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "stat du fichier nouvellement créé '%s' impossible"
+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:4086
-#, c-format
-msgid "unable to create backing store for newly created file %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 ""
-"création du magasin de stockage pour le fichier nouvellement créé %s "
-"impossible"
+"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:4089 builtin/apply.c:4197
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr "ajout de l'élément de cache %s impossible"
+#: builtin/am.c:1943
+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:4122
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
 #, c-format
-msgid "closing file '%s'"
-msgstr "fermeture du fichier '%s'"
+msgid "Could not parse object '%s'."
+msgstr "Impossible d'analyser l'objet '%s'."
 
-#: builtin/apply.c:4171
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "écriture du fichier '%s' mode %o impossible"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "échec du nettoyage de l'index"
+
+#: builtin/am.c:2137
+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:4258
+#: builtin/am.c:2200
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Patch %s appliqué proprement."
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valeur invalide pour --patch-format : %s"
 
-#: builtin/apply.c:4266
-msgid "internal error"
-msgstr "erreur interne"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<options>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4269
-#, 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..."
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<options>] (--continue | --quit | --abort)"
 
-#: builtin/apply.c:4279
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "troncature du nom de fichier .rej en %.*s.rej"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "exécution interactive"
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Section n°%d appliquée proprement."
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "option historique -- no-op"
 
-#: builtin/apply.c:4303
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr "Section n°%d rejetée."
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "permettre de revenir à une fusion à 3 points si nécessaire"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "entrée non reconnue"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "être silencieux"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "lecture du fichier d'index impossible"
+#: builtin/am.c:2247
+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:4507
-msgid "don't apply changes matching the given path"
-msgstr "ne pas appliquer les modifications qui correspondent au chemin donné"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "recoder en utf-8 (par défaut)"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "appliquer les modifications qui correspondent au chemin donné"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "passer l'option -k à git-mailinfo"
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "supprimer <num> barres obliques des chemins traditionnels de diff"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "passer l'option -b à git-mailinfo"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "ignorer les additions réalisées par le patch"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "passer l'option -m à git-mailinfo"
 
-#: builtin/apply.c:4518
-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:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "passer l'option --keep-cr à git-mailsplit fpour le format mbox"
 
-#: builtin/apply.c:4522
-msgid "show number of added and deleted lines in decimal notation"
+#: builtin/am.c:2261
+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"
-
-#: builtin/apply.c:4524
-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"
+"ne pas passer l'option --keep-cr à git-mailsplit indépendamment de am.keepcr"
 
-#: builtin/apply.c:4526
-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:2264
+msgid "strip everything before a scissors line"
+msgstr "retirer tout le contenu avant la ligne des ciseaux"
 
-#: builtin/apply.c:4528
-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: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 "le passer jusqu'à git-apply"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "appliquer les patch sans toucher à la copie de travail"
+#: 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:4532
-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:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "format"
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "appliquer aussi le patch (à utiliser avec ---stat/--summary/--check)"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "format de présentation des patchs"
 
-#: builtin/apply.c:4536
-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:2296
+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:4538
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-"construire un index temporaire fondé sur l'information de l'index embarqué"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "continuer à appliquer les patchs après résolution d'un conflit"
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "les chemins sont séparés par un caractère NUL"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "synonymes de --continue"
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "sauter le patch courant"
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
-"détecter des lignes nouvelles ou modifiées qui contiennent des erreurs "
-"d'espace"
+"restaurer la branche originale et abandonner les applications de patch."
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "mentir sur la date de validation"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "appliquer le patch en sens inverse"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "utiliser l'horodatage actuel pour la date d'auteur"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "ne pas s'attendre à au moins une ligne de contexte"
+#: 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 "id-clé"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "laisser les sections rejetées dans les fichiers *.rej correspondants"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "signer les commits avec GPG"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "accepter les recouvrements de sections"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(utilisation interne pour git-rebase)"
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: 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 ""
-"tolérer des erreurs de détection de retours chariot manquants en fin de "
-"fichier"
-
-#: builtin/apply.c:4566
-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/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "préfixer tous les noms de fichier avec <root>"
-
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way hors d'un dépôt"
-
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index hors d'un dépôt"
-
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached hors d'un dépôt"
+"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
+"et elle sera supprimée. Veuillez ne plus l'utiliser."
 
-#: builtin/apply.c:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "ouverture impossible du patch '%s'"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "échec à la lecture de l'index"
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2356
 #, 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"
+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:4641 builtin/apply.c:4651
+#: builtin/am.c:2380
 #, 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."
+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."
+
+#: builtin/am.c:2386
+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:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<options>] [<patch>...]"
 
 #: builtin/archive.c:17
 #, c-format
@@ -3533,144 +4704,200 @@ 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:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "Assignation de blâme au lignes"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 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:2531
+#: builtin/blame.c:2578
 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:2532
+#: builtin/blame.c:2579
 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:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Montrer les statistiques de coût d'activité"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Forcer l'affichage de l'état d'avancement"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Montrer le score de sortie pour les éléments de blâme"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Afficher dans un format propice à la consommation par machine"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2587
 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:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 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:2544
+#: builtin/blame.c:2591
 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:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Ignorer les différences d'espace"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"Utiliser une heuristique expérimentale reposant sur l'indentation pour "
+"améliorer les diffs"
+
+#: builtin/blame.c:2600
+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"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr ""
 "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2603
 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:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Utiliser le contenu de <fichier> comme image finale"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "score"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 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:2654
+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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "il y a 10 ans et 11 mois"
 
-#: builtin/branch.c:25
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents et --reverse ne font pas bon ménage."
+
+#: builtin/blame.c:2800
+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:2805
+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:2832
+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:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "pas de chemin %s dans %s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "impossible de lire le blob %s  pour le chemin %s"
+
+#: builtin/blame.c:2873
+#, 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]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<options] [-l] [-f] <nom-de-branche> [<point-de-départ>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<options>] [-r] (-d | -D) <nom-de-branche>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr ""
 "git branch [<options>] (-m | -M) [<ancienne-branche>] <nouvelle-branche>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<options>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3679,7 +4906,7 @@ msgstr ""
 "suppression de la branche '%s' qui a été fusionnée dans\n"
 "         '%s', mais pas dans HEAD."
 
-#: builtin/branch.c:146
+#: builtin/branch.c:147
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3688,12 +4915,12 @@ 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:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Impossible de rechercher l'objet commit pour '%s'"
 
-#: builtin/branch.c:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3702,301 +4929,333 @@ 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'."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "Échec de la mise à jour du fichier de configuration"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "impossible d'utiliser -a avec -d"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Impossible de rechercher l'objet commit pour HEAD"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Impossible de supprimer la branche '%s' sur laquelle vous êtes."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Impossible de supprimer la branche '%s' extraite dans '%s'"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "branche de suivi '%s' non trouvée."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "branche '%s' non trouvée."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Erreur lors de la suppression de la branche de suivi '%s'"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erreur lors de la suppression de la branche '%s'"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, 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:260
+#: builtin/branch.c:266
 #, 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:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: disparue]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: en retard de %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[en retard de %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s : en avance de %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[en avance de %d]"
 
-#: builtin/branch.c:324
+#: 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:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[en avance de %d, en retard de %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** référence invalide ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(aucune branche, rebasage de %s)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(aucune branche, bisect a démarré sur %s)"
 
-#: builtin/branch.c:375
+#. 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)"
 
-#: builtin/branch.c:378
+#. 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:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(aucune branche)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, 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
+#, 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
 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:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nom de branche invalide : '%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "Échec de renommage de la branche"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Renommage d'un branche mal nommée '%s'"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, 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:564
+#: builtin/branch.c:604
 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:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "impossible d'écrire le modèle de description de branche : %s"
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Veuillez éditer la description de la branche\n"
+"  %s\n"
+"Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/branch.c:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Options génériques"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 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:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "supprimer les messages d'information"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "régler le mode de suivi (voir git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "modifier l'information amont"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "amont"
+
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "modifier l'information amont"
+
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Désactiver l'information amont"
+
+#: builtin/branch.c:661
 msgid "use colored output"
 msgstr "utiliser la coloration dans la sortie"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "agir sur les branches de suivi distantes"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "afficher seulement les branches qui contiennent le commit"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "Actions spécifiques à git-branch :"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "afficher à la fois les branches de suivi et les branches locales"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "supprimer une branche totalement fusionnée"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "supprimer une branche (même non fusionnée)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "déplacer/renommer une branche et son reflog"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "déplacer/renommer une branche, même si la cible existe"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "afficher les noms des branches"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "créer le reflog de la branche"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "éditer la description de la branche"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "forcer la création, le déplacement/renommage, ou la suppression"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "afficher seulement les branches qui sont fusionnées"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "afficher seulement les branches qui ne sont pas fusionnées"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "afficher les branches en colonnes"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "clé"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "nom du champ servant à trier"
 
-#: builtin/branch.c:650 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 "objet"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "afficher seulement les branches de l'objet"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Échec de résolution de HEAD comme référence valide."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD non trouvée sous refs/heads !"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column et --verbose sont incompatibles"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "le nom de branche est requis"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "Impossible de décrire une HEAD détachée"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "impossible d'éditer la description de plus d'une branche"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Aucun commit sur la branche '%s'."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Aucune branche nommée '%s'."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "trop de branches pour une opération de renommage"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "trop de branches pour spécifier une branche amont"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -4004,41 +5263,41 @@ msgstr ""
 "impossible de spécifier une branche amont de HEAD par %s qui ne pointe sur "
 "aucune branche."
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "pas de branche '%s'"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "la branche '%s' n'existe pas"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "trop de branches pour désactiver un amont"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 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:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "La branche '%s' n'a aucune information de branche amont"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "créer manuellement 'HEAD' n'a pas de sens"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 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:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4047,7 +5306,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:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -4058,16 +5317,6 @@ msgstr ""
 "Si vous vouliez que '%s' suive '%s', faîtes ceci :\n"
 "\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -4081,66 +5330,82 @@ msgstr "La création d'un colis requiert un dépôt."
 msgid "Need a repository to unbundle."
 msgstr "Le dépaquetage d'un colis requiert un dépôt."
 
-#: 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>"
+"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: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 "<type> peut être : blob, tree, commit ou tag"
 
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "afficher le type de l'objet"
 
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "afficher la taille de l'objet"
 
-#: builtin/cat-file.c:470
+#: 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:471
+#: 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:473
+#: 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:475
+#: 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:923
+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:476
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "bufferiser la sortie de --batch"
 
-#: builtin/cat-file.c:478
+#: 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:481
+#: 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:484
+#: 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:486
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "montrer tous les objets avec --batch ou --batch-check"
 
@@ -4160,7 +5425,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"
 
@@ -4169,7 +5434,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:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "supprimer l'état d'avancement"
 
@@ -4261,8 +5526,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:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "chaîne"
 
@@ -4312,81 +5578,77 @@ msgstr "chemin '%s' : impossible de fusionner"
 msgid "Unable to add merge result for '%s'"
 msgstr "Impossible d'ajouter le résultat de fusion pour '%s'"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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' ne peut pas être utilisé avec des mises à jour de chemins"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' ne peut pas être utilisé avec %s"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, 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:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "fichier d'index corrompu"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "le chemin '%s' n'est pas fusionné"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "vous devez d'abord résoudre votre index courant"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Impossible de faire un reflog pour '%s' : %s\n"
 
-#: builtin/checkout.c:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD est maintenant sur"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "impossible de mettre à jour HEAD"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Déjà sur '%s'\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Basculement et remise à zéro de la branche '%s'\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Basculement sur la nouvelle branche '%s'\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Basculement sur la branche '%s'\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... et %d en plus.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4409,7 +5671,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4438,151 +5700,151 @@ msgstr[1] ""
 "git branch <nouvelle-branche> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "erreur interne lors du parcours des révisions"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "La position précédente de HEAD était sur"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Vous êtes sur une branche qui doit encore naître"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "une seule référence attendue, %d fournies."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "référence invalide : %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "la référence n'est pas un arbre : %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "impossible d'utiliser des chemins avec un basculement de branches"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, 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:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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' ne peut pas être utilisé avec '%s'"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1105
 #, 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:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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 "branche"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "créer et extraire une nouvelle branche"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "créer/réinitialiser et extraire une branche"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "créer un reflog pour une nouvelle branche"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "détacher la HEAD à la validation nommée"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "détacher la HEAD au commit nommé"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "paramétrer les coordonnées de branche amont pour une nouvelle branche"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "nouvelle branche"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "nouvelle branche sans parent"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "extraire notre version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "extraire leur version pour les fichiers non fusionnés"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "forcer l'extraction (laisser tomber les modifications locales)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "mettre à jour les fichiers ignorés (par défaut)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "style"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
-msgstr "style de conflit (fusion ou diff3)"
+msgstr "style de conflit (merge (fusion) ou diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 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:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "réessayer d'interpréter 'git checkout <branche-inexistante>'"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 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:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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 "forcer l'affichage de l'état d'avancement"
 
-#: builtin/checkout.c:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B et --orphan sont mutuellement exclusifs"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track requiert un nom de branche"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Nom de branche manquant ; essayez -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "spécification de chemin invalide"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4592,12 +5854,12 @@ msgstr ""
 "en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
 
-#: builtin/checkout.c:1263
+#: builtin/checkout.c:1264
 #, 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4749,8 +6011,8 @@ msgstr "nettoyage interactif"
 msgid "remove whole directories"
 msgstr "supprimer les répertoires entiers"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "motif"
 
@@ -4790,103 +6052,131 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<options>] [--] <dépôt> [<répertoire>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "ne pas créer d'extraction"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "créer un dépôt nu"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "créer un dépôt miroir (implique dépôt nu)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "pour cloner depuis un dépôt local"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "ne pas utiliser de liens durs locaux, toujours copier"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "régler comme dépôt partagé"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "initialiser les sous-modules dans le clone"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "nombre de sous-modules clonés en parallèle"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "répertoire-modèle"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 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:79 builtin/submodule--helper.c:173
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "dépôt de référence"
 
-#: builtin/clone.c:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "utiliser seulement --reference pour cloner"
 
-#: builtin/clone.c:82 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 "nom"
 
-#: builtin/clone.c:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "utiliser <nom> au lieu de 'origin' pour suivre la branche amont"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "chemin vers git-upload-pack sur le serveur distant"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665 builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "profondeur"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "créer un clone superficiel de cette profondeur"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "heure"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "créer un clone superficiel depuis une date spécifique"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "révision"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr ""
+"approfondir l'historique d'un clone superficiel en excluant une révision"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "cloner seulement une branche, HEAD ou --branch"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "tous les sous-modules clonés seront superficiels"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 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:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "clé=valeur"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "régler la configuration dans le nouveau dépôt"
 
-#: builtin/clone.c:96 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 "n'utiliser que des adresses IPv4"
 
-#: builtin/clone.c:98 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 "n'utiliser que des adresses IPv6"
 
-#: builtin/clone.c:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4894,59 +6184,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:305
-#, 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:307
-#, 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:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "le dépôt de référence '%s' est superficiel"
-
-#: builtin/clone.c:315
+#: builtin/clone.c:303
 #, 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "échec du stat de '%s'"
+msgid "failed to open '%s'"
+msgstr "échec à l'ouverture de '%s'"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe et n'est pas un répertoire"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "échec du stat de %s\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "échec de la création du lien '%s'"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "échec de la copie vers '%s'"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "fait.\n"
 
-#: builtin/clone.c:459
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4956,130 +6229,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:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Impossible de trouver la branche distante '%s' à cloner."
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Vérification de la connectivité... "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "impossible de mettre à jour %s"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 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:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "impossible d'extraire la copie de travail"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "impossible d'écrire les paramètres dans le fichier de configuration"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "impossible de remballer pour nettoyer"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "impossible de unlinker le fichier temporaire alternates"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Trop d'arguments."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Vous devez spécifier un dépôt à cloner."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "les options --bare et --origin %s sont incompatibles."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare et --separate-git-dir sont incompatibles."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "le dépôt '%s' n'existe pas"
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "la profondeur %s n'est pas un entier positif"
 
-#: builtin/clone.c:897
+#: builtin/clone.c:915
 #, 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:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "la copie de travail '%s' existe déjà."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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 "impossible de créer les répertoires de premier niveau dans '%s'"
 
-#: builtin/clone.c:925
+#: builtin/clone.c:943
 #, 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:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Clonage dans le dépôt nu '%s'\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Clonage dans '%s'...\n"
 
-#: builtin/clone.c:984
+#: builtin/clone.c:963
+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:1019
 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:987
+#: builtin/clone.c:1021
+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:1023
+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:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "le dépôt source est superficiel, option --local ignorée"
 
-#: builtin/clone.c:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local est ignoré"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Je ne sais pas cloner %s"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Vous semblez avoir cloné un dépôt vide."
 
@@ -5222,66 +6510,66 @@ msgstr ""
 "Puis \"git cherry-pick --continue\" continuera le picorage \n"
 "des commits restants.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "impossible de créer l'index temporaire"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "échec de l'ajout interactif"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "impossible de mettre à jour l'index temporaire"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Impossible de mettre à jour l'arbre de cache principal"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: 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:447
+#: 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:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "impossible de lire l'index"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "impossible d'écrire le fichier d'index temporaire"
 
-#: builtin/commit.c:580
+#: 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:582
+#: 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:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "paramètre --author mal formé"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "format de date invalide : %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5289,38 +6577,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:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, 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:704
+#: 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:708
+#: 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:730
-msgid "could not read MERGE_MSG"
-msgstr "impossible de lire MERGE_MSG"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "impossible de lire SQUASH_MSG"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "impossible de lire MERGE_MSG"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "impossible d'écrire le modèle de commit"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5335,7 +6623,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5350,7 +6638,7 @@ msgstr ""
 "\t%s\n"
 "et essayez à nouveau.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5360,7 +6648,7 @@ msgstr ""
 "commençant par '%c' seront ignorées, et un message vide abandonne la "
 "validation.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5371,150 +6659,154 @@ 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:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAuteur :     %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sDate :       %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sValidateur : %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Impossible de lire l'index"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Erreur lors de la construction des arbres"
 
-#: builtin/commit.c:953 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 "Veuillez fournir le message en utilisant l'option -m ou -F.\n"
 
-#: builtin/commit.c:1055
+#: 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:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Mode de fichier non suivi invalide '%s'"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long et -z sont incompatibles"
 
-#: builtin/commit.c:1137
+#: 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:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Il n'y a rien à corriger."
 
-#: builtin/commit.c:1149
+#: 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:1151
+#: 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:1154
+#: 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:1164
+#: 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:1166
+#: 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:1174
+#: 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:1191
+#: 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:1193
+#: 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:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Malin... correction du dernier avec un index sale."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 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:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Mode de nettoyage invalide %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 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:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "afficher le statut avec concision"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "afficher l'information de branche"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "version"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "sortie pour traitement automatique"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "afficher le statut en format long (par défaut)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "terminer les éléments par NUL"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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 "mode"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
+#: builtin/commit.c:1354 builtin/commit.c:1629
 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "afficher les fichiers ignorés"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "quand"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5522,201 +6814,201 @@ msgstr ""
 "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
 "(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "afficher les fichiers non suivis en colonnes"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "impossible de retrouver le commit nouvellement créé"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "impossible d'analyser le commit nouvellement créé"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "HEAD détachée"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (commit racine)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "supprimer le résumé après une validation réussie"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "afficher les diff dans le modèle de message de validation"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Options du message de validation"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "lire le message depuis un fichier"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "auteur"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "remplacer l'auteur pour la validation"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "date"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "remplacer la date pour la validation"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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 "message"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "message de validation"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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 "commit"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "réutiliser et éditer le message du commit spécifié"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "réutiliser le message du commit spécifié"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 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:1586
+#: builtin/commit.c:1598
 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:1587
+#: builtin/commit.c:1599
 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:1588 builtin/log.c:1219 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "ajouter une entrée Signed-off-by :"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "utiliser le fichier de modèle spécifié"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "forcer l'édition du commit"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "défaut"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "comment éliminer les espaces et les commentaires # du message"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "inclure le statut dans le modèle de message de validation"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "signer la validation avec GPG"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Valider les options des contenus"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "valider tous les fichiers modifiés"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "ajouter des fichiers en mode interactif"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "ajouter les modifications en mode interactif"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "valider seulement les fichiers spécifiés"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "éviter d'utiliser le crochet pre-commit"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "éviter d'utiliser les crochets pre-commit et commit-msg"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "afficher ce qui serait validé"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "corriger la validation précédente"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "éviter d'utiliser le crochet post-rewrite"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "accepter d'enregistrer une modification vide"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "accepter d'enregistrer une modification avec un message vide"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "impossible d'analyser le commit HEAD"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Fichier MERGE_HEAD corrompu (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "impossible de lire MERGE_MODE"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "impossible de lire le message de validation : %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, 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:1740
-#, c-format
+#: builtin/commit.c:1754
+#, fuzzy, 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:1788
+#: 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"
@@ -5730,142 +7022,142 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<options>]"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "Config file location"
 msgstr "Emplacement du fichier de configuration"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use global config file"
 msgstr "utiliser les fichier de configuration global"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use system config file"
 msgstr "utiliser le fichier de configuration du système"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "use repository config file"
 msgstr "utiliser le fichier de configuration du dépôt"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "use given config file"
 msgstr "utiliser le fichier de configuration spécifié"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "blob-id"
 msgstr "blob-id"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "read config from given blob object"
 msgstr "lire la configuration depuis l'objet blob fourni"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "Action"
 msgstr "Action"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get value: name [value-regex]"
 msgstr "obtenir la valeur : nom [regex-de-valeur]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "obtenir toutes les valeurs : clé [regex-de-valeur]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 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:66
+#: builtin/config.c:65
 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:67
+#: builtin/config.c:66
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "remplacer toutes les variables correspondant : nom valeur [regex-de-valeur]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "ajouter une nouvelle variable : nom valeur"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "supprimer une variable : nom [regex-de-valeur]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "supprimer toutes les correspondances nom [regex-de-valeur]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "renommer une section : ancien-nom nouveau-nom"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "supprimer une section : nom"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "list all"
 msgstr "afficher tout"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "open an editor"
 msgstr "ouvrir un éditeur"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "find the color configured: slot [default]"
 msgstr "trouver la couleur configurée : slot [par défaut]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "trouver le réglage de la couleur : slot [stdout-est-tty]"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "Type"
 msgstr "Type"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is \"true\" or \"false\""
 msgstr "la valeur est \"true\" (vrai) ou \"false\" (faux)"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is decimal number"
 msgstr "la valeur est un nombre décimal"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "value is --bool or --int"
 msgstr "la valeur est --bool ou --int"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 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:82
+#: builtin/config.c:81
 msgid "Other"
 msgstr "Autre"
 
-#: builtin/config.c:83
+#: builtin/config.c:82
 msgid "terminate values with NUL byte"
 msgstr "terminer les valeurs avec un caractère NUL"
 
-#: builtin/config.c:84
+#: builtin/config.c:83
 msgid "show variable names only"
 msgstr "n'afficher que les noms de variable"
 
-#: builtin/config.c:85
+#: builtin/config.c:84
 msgid "respect include directives on lookup"
 msgstr "respecter les directives d'inclusion lors de la recherche"
 
-#: builtin/config.c:86
+#: builtin/config.c:85
 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:328
+#: builtin/config.c:327
 msgid "unable to parse default color value"
 msgstr "impossible de lire la valeur de couleur par défaut"
 
-#: builtin/config.c:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5880,16 +7172,25 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: builtin/config.c:613
 #, 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:625
+#, 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"
 
@@ -5916,7 +7217,7 @@ msgstr "l'étiquette annotée %s n'a pas de nom embarqué"
 msgid "tag '%s' is really '%s' here"
 msgstr "l'étiquette '%s' est en fait '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s n'est pas un nom d'objet valide"
@@ -6011,7 +7312,7 @@ msgstr ""
 msgid "only consider tags matching <pattern>"
 msgstr "ne considérer que les étiquettes correspondant à <motif>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "afficher les objets commits abrégés en dernier recours"
 
@@ -6045,21 +7346,21 @@ msgstr "'%s' : n'est pas un fichier régulier ni un lien symbolique"
 msgid "invalid option: %s"
 msgstr "option invalide : %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "Ce n'est pas un dépôt git !"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objet spécifié '%s' invalide."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "plus de deux blobs spécifiés : '%s'"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objet non géré '%s' spécifié."
@@ -6117,184 +7418,185 @@ msgstr "Appliquer le spécificateur de référence aux références exportées"
 msgid "anonymize output"
 msgstr "anonymise la sortie"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<options>] [<dépôt> [<spécification-de-référence>...]]"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [<options>] <groupe>"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [<options>] [(<dépôt> | <groupe>)...]"
 
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<options>]"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
-msgstr "récupérer depuis tous le dépôts distants"
+msgstr "récupérer depuis tous les dépôts distants"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:96 builtin/pull.c:172
+#: 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:97 builtin/pull.c:174
+#: 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:99
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "récupérer depuis plusieurs dépôts distants"
 
-#: builtin/fetch.c:101 builtin/pull.c:176
+#: 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:103
+#: 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:105
+#: 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:107 builtin/pull.c:179
+#: 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:108 builtin/pull.c:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "à la demande"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: 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:113 builtin/pull.c:191
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "conserver le paquet téléchargé"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permettre la mise à jour de la référence HEAD"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
+#: 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:120 builtin/pull.c:197
+#: 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:122 builtin/log.c:1236
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
-msgstr "dir"
+msgstr "répertoire"
 
-#: builtin/fetch.c:123
+#: 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:126
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "mode par défaut pour la récursion"
 
-#: builtin/fetch.c:128 builtin/pull.c:200
+#: 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:129 builtin/pull.c:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "correspondance de référence"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: 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:386
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "impossible de trouver la référence HEAD distante"
 
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, 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:607
 #, c-format
 msgid "object %s not found"
 msgstr "objet %s non trouvé"
 
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[à jour]"
 
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (impossible de récupérer la branche actuelle)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[rejeté]"
 
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "impossible de récupérer dans la branche actuelle"
+
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[mise à jour de l'étiquette]"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (impossible de mettre à jour la référence locale)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "impossible de mettre à jour la référence locale"
 
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[nouvelle étiquette]"
 
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[nouvelle branche]"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[nouvelle référence]"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "impossible de mettre à jour la référence locale"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "mise à jour forcée"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(pas d'avance rapide)"
-
-#: builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "impossible d'ouvrir %s : %s\n"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "pas en avance rapide"
 
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
 #, 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:637
+#: builtin/fetch.c:769
 #, 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:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "Depuis %.*s\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6303,55 +7605,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:787
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s sera en suspens)"
 
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s est devenu en suspens)"
 
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[supprimé]"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(aucun(e))"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
 #, 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:860
+#: builtin/fetch.c:998
 #, 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:863
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "L'option \"%s\" est ignorée pour %s\n"
 
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Je ne sais pas récupérer depuis %s"
 
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Récupération de %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 "Impossible de récupérer %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."
@@ -6359,32 +7661,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:1123
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Vous devez spécifier un nom d'étiquette."
 
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Une profondeur négative dans --deepen n'est pas supportée"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen et --depth sont mutuellement exclusifs"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth et --unshallow ne peuvent pas être utilisés ensemble"
 
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
 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:1187
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all n'accepte pas d'argument de dépôt"
 
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
 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:1200
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "distant ou groupe distant inexistant : %s"
 
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
 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 "
@@ -6396,23 +7706,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"
 
@@ -6472,64 +7782,64 @@ 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:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Vérification de la connectivité"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
 msgid "Checking object directories"
 msgstr "Vérification des répertoires d'objet"
 
-#: builtin/fsck.c:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<options>] [<objet>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "afficher les objets inaccessibles"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "afficher les objets en suspens"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "afficher les étiquettes"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "signaler les nœuds racines"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 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:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "considérer les reflogs comme nœuds tête (par défaut)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "inspecter aussi les objets pack et alternatifs"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "ne vérifier que la connectivité"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "activer une vérification plus strict"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "écrire les objets en suspens dans .git/lost-found"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "afficher la progression"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "afficher les noms étendus pour les objets inaccessibles"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Vérification des objets"
 
@@ -6627,233 +7937,228 @@ msgstr "grep : échec de création du fil: %s"
 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:453 builtin/grep.c:488
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "impossible de lire l'arbre (%s)"
 
-#: builtin/grep.c:502
+#: builtin/grep.c:503
 #, 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:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "l'option '%c' attend un valeur numérique"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "impossible d'ouvrir '%s'"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 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:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "rechercher dans les contenus non gérés par git"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "rechercher dans les fichiers suivis et non-suivis"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorer les fichiers spécifiés via '.gitignore'"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "afficher les lignes qui ne correspondent pas"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "correspondance insensible à la casse"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "rechercher les motifs aux séparateurs de mots"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "traiter les fichiers binaires comme texte"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "ne pas chercher les motifs dans les fichiers binaires"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "traiter les fichiers binaires avec les filtres textconv"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "descendre au plus de <profondeur> dans l'arborescence"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "utiliser des expressions régulières étendues POSIX"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "interpréter les motifs comme de chaînes fixes"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "utiliser des expressions régulières compatibles avec Perl"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "afficher les numéros de ligne"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "ne pas pas afficher les noms de fichier"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "afficher les noms de fichier"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "afficher les noms de fichiers relativement au répertoire de base"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "synonyme pour --files-with-matches"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "n'afficher que les noms des fichiers sans correspondance"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "imprimer une caractère NUL après le noms de fichier"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "mettre en évidence les correspondances"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimer une ligne vide entre les correspondances de fichiers différents"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 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:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "afficher <n> lignes de contexte avant et après les correspondances"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "afficher <n> lignes de contexte avant les correspondances"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "afficher <n> lignes de contexte après les correspondances"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "utiliser <n> fils de travail"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "raccourci pour -C NUM"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 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:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "afficher la fonction contenante"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "lire les motifs depuis fichier"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "rechercher <motif>"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "combiner les motifs spécifiés par -e"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr ""
 "indiquer des correspondances avec le code de sortie mais sans rien afficher"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 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:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "afficher l'arbre d'analyse pour le motif grep"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "pagineur"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "afficher les fichiers correspondant dans le pagineur"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "aucun motif fourni."
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "nombre de fils spécifié invalide (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 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:899
+#: builtin/grep.c:902
 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:904
+#: builtin/grep.c:907
 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:907
+#: builtin/grep.c:910
 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:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "--cached et des arbres sont fournis en même temps."
 
@@ -6869,85 +8174,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': %s"
-msgstr "échec de l'exécution de '%s' : %s"
+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"
@@ -6956,7 +8265,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"
@@ -6965,432 +8274,433 @@ 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:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Définition des attributs par chemin"
 
-#: builtin/help.c:409
+#: 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:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Un glossaire Git"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr "Spécifie les fichiers non-suivis à ignorer intentionnellement"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Définition des propriétés de sous-module"
 
-#: builtin/help.c:413
+#: 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:414
+#: 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:415
+#: 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:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Les guides Git populaires sont : \n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "usage : %s%s"
-
-#: builtin/help.c:481
+#: 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:152
+#: 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:202
+#: builtin/index-pack.c:204
 #, c-format
 msgid "object type mismatch at %s"
 msgstr "type d'objet non correspondant à %s"
 
-#: builtin/index-pack.c:222
+#: 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:225
+#: 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:267
+#: 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:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "fin de fichier prématurée"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "erreur de lecture sur l'entrée"
 
-#: builtin/index-pack.c:290
+#: builtin/index-pack.c:292
 msgid "used more bytes than were available"
 msgstr "plus d'octets utilisés que disponibles"
 
-#: builtin/index-pack.c:297
+#: 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:313
+#: 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:318
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "impossible d'ouvrir le fichier paquet '%s'"
 
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "la signature du paquet ne correspond pas"
 
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "la version de paquet %<PRIu32> non supportée"
 
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "le paquet a un mauvais objet à l'offset %lu: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "le paquet a un mauvais objet à l'offset %<PRIuMAX> : %s"
 
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "la décompression (inflate) a retourné %d"
 
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
 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:530
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "l'objet delta de base est hors limite"
 
-#: builtin/index-pack.c:538
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "type d'objet inconnu %d"
 
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "impossible de lire (pread) le fichier paquet"
 
-#: 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] "fin prématurée du fichier paquet, %lu octet lu"
-msgstr[1] "fin prématurée du fichier paquet, %lu octets lus"
+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:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "grave incohérence dans la décompression (inflate)"
 
-#: 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 "COLLISION SHA1 TROUVÉE AVEC %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 "impossible de lire %s"
 
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "impossible de lire l'objet existant %s"
 
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objet blob invalide %s"
 
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "%s invalide"
 
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Erreur dans l'objet"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 #, 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:917 builtin/index-pack.c:948
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "échec d'application du delta"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "Réception d'objets"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "Indexation d'objets"
 
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "le paquet est corrompu (SHA1 ne correspond pas)"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "impossible d'obtenir le statut (fstat) du fichier paquet"
 
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "le paquet est invalide à la fin"
 
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "confusion extrême dans parse_pack_objects()"
 
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "Résolution des deltas"
 
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "impossible de créer le fil : %s"
 
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "confusion extrême"
 
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "completed with %d local objects"
-msgstr "complété avec %d objets locaux"
+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:1263
+#: builtin/index-pack.c:1268
 #, 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:1267
+#: builtin/index-pack.c:1272
 #, 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:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "impossible de compresser l'objet ajouté (%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "l'objet local %s est corrompu"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "erreur en fermeture du fichier paquet"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "impossible d'écrire le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "impossible de fermer le fichier \"keep\" '%s'"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "impossible de stocker le fichier paquet"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "impossible de stocker le fichier d'index"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "mauvais pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "pas de support des fils, ignore %s"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Impossible d'ouvrir le fichier paquet existant '%s'"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, 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:1587
+#: builtin/index-pack.c:1591
 #, 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:1594
+#: builtin/index-pack.c:1598
 #, 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:1624
-msgid "Cannot come back to cwd"
-msgstr "Impossible de revenir au répertoire de travail courant"
+#: builtin/index-pack.c:1611
+#, 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:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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 "mauvais %s"
 
-#: builtin/index-pack.c:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin ne peut pas être utilisé sans --stdin"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, 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:1730
+#: builtin/index-pack.c:1740
 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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "modèles non trouvés %s"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr ""
-"pas de copie des modèles étant dans une mauvaise version du format %d de '%s'"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s existe déjà"
+msgid "not copying templates from '%s': %s"
+msgstr "pas de copie des modèles depuis '%s' : %s"
 
-#: builtin/init-db.c:340
+#: 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:343
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "impossible de déplacer %s vers %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:399
+#: 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 "%s%s Git repository in %s%s\n"
-msgstr "Dépôt Git%2$s %1$s dans %3$s%4$s\n"
+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:400
-msgid "Reinitialized existing"
-msgstr "existant réinitialisé"
+#: 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:400
-msgid "Initialized empty"
-msgstr "vide initialisé"
+#: 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:401
-msgid " shared"
-msgstr " partagé"
+#: 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:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7398,25 +8708,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
 "shared[=<permissions>]] [<répertoire>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permissions"
 
-#: builtin/init-db.c:472
+#: 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:506 builtin/init-db.c:511
+#: 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:515
+#: 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:536
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7425,7 +8735,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:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Impossible d'accéder à l'arbre de travail '%s'"
@@ -7458,281 +8768,336 @@ msgstr "ligne(s) de fin à ajouter"
 msgid "no input file given for in-place editing"
 msgstr "aucun fichier en entrée pour l'éditon sur place"
 
-#: builtin/log.c:43
+#: builtin/log.c:44
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<options>] [<plage de révisions>] [[--] <chemin>...]"
 
-#: builtin/log.c:44
+#: builtin/log.c:45
 msgid "git show [<options>] <object>..."
 msgstr "git show [<options>] <objet>..."
 
-#: builtin/log.c:83
+#: builtin/log.c:84
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "option --decorate invalide : %s"
 
-#: builtin/log.c:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "supprimer la sortie des différences"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "afficher la source"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "Utiliser le fichier de correspondance de mail"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "décorer les options"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 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:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Sortie finale : %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s : fichier incorrect"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "Impossible de lire l'objet %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Type inconnu : %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers sans valeur"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "le nom du répertoire de sortie est trop long"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Impossible d'ouvrir le fichier correctif %s"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "Exactement une plage nécessaire."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "Ceci n'est pas une plage."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "La lettre de motivation doit être au format e-mail"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to aberrant : %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<options>] [<depuis> | <plage de révisions>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Deux répertoires de sortie ?"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Commit inconnu %s"
+
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, 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:1263
+msgid "Could not find exact merge base."
+msgstr "Impossible de trouver la base de fusion exacte."
+
+#: 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 ""
+"Impossible de récupérer l'amont, si vous voulez enregistrer le commit de "
+"base automatiquement,\n"
+"veuillez utiliser git branch --set-upstream-to pour suivre une branche "
+"distante\n"
+"ou vous pouvez spécifier le commit de base par --base=<id-du-commit-de-base> "
+"manuellement."
+
+#: builtin/log.c:1287
+msgid "Failed to find exact merge base"
+msgstr "Impossible de trouver la base de fusion exacte"
+
+#: builtin/log.c:1298
+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:1302
+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:1351
+msgid "cannot get patch id"
+msgstr "impossible d'obtenir l'id du patch"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "utiliser [PATCH n/m] même avec un patch unique"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "utiliser [PATCH] même avec des patchs multiples"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "afficher les patchs sur la sortie standard"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "générer une lettre de motivation"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 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:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "utiliser <sfx> au lieu de '.patch'"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 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:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "marquer la série comme une Nième réédition"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "utiliser [RFC PATCH] au lieu de [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "utiliser [<préfixe>] au lieu de [PATCH]"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "stocker les fichiers résultats dans <répertoire>"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "ne pas retirer/ajouter [PATCH]"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "ne pas imprimer les diffs binaires"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "écrire une empreinte à zéro dans l'entête From"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "ne pas inclure un patch correspondant à un commit amont"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1445
 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:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Communication"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "en-tête"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "ajouter l'en-tête d'e-mail"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "ajouter l'en-tête \"To:\""
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "ajouter l'en-tête \"Cc:\""
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "ident"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 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:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "id-message"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "répondre dans le premier message à <id-message>"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "attacher le patch"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "patch à l'intérieur"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 "activer l'enfilage de message, styles : shallow (superficiel), deep (profond)"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "signature"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "ajouter une signature"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "commit-de-base"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "Ajouter un arbre prérequis à la série de patchs"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "ajouter une signature depuis un fichier"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "ne pas afficher les noms de fichiers des patchs"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix et -k sont mutuellement exclusifs."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc et -k sont mutuellement exclusifs."
 
-#: builtin/log.c:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only n'a pas de sens"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status n'a pas de sens"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check n'a pas de sens"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "sortie standard, ou répertoire, lequel ?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Impossible de créer le répertoire '%s'"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "lecture du fichier de signature '%s' impossible"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Échec de création des fichiers en sortie"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<branche_amont> [<head> [<limite>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7740,107 +9105,106 @@ msgstr ""
 "Impossible de trouver une branche distante suivie, merci de spécifier "
 "<branche_amont> manuellement.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Commit inconnu %s"
-
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<options>] [<fichier>...]"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "identifier le statut de fichier avec les étiquettes"
 
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
 msgid "use lowercase letters for 'assume unchanged' files"
 msgstr "utiliser des minuscules pour les fichier 'assumés inchangés'"
 
-#: builtin/ls-files.c:431
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
 msgstr "afficher les fichiers mis en cache dans la sortie (défaut)"
 
-#: builtin/ls-files.c:433
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "afficher les fichiers supprimés dans la sortie"
 
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "afficher les fichiers modifiés dans la sortie"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "afficher les autres fichiers dans la sortie"
 
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "afficher les fichiers ignorés dans la sortie"
 
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
 msgid "show staged contents' object name in the output"
 msgstr "afficher les nom des objets indexés dans la sortie"
 
-#: builtin/ls-files.c:444
+#: builtin/ls-files.c:524
 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:446
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "afficher seulement les noms des répertoires 'other'"
 
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "afficher les fins de lignes des fichiers"
 
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "ne pas afficher les répertoires vides"
 
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
 msgstr "afficher les fichiers non fusionnés dans la sortie"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
 msgstr "afficher l'information resolv-undo"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "sauter les fichiers correspondant au motif"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "les motifs d'exclusion sont lus depuis <fichier>"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
 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:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "ajouter les exclusions git standard"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 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:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "parcourir récursivement les sous-modules"
+
+#: builtin/ls-files.c:553
 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:472
+#: builtin/ls-files.c:554
 msgid "tree-ish"
 msgstr "arbre ou apparenté"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
 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:475
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "afficher les données de débogage"
 
@@ -7930,187 +9294,177 @@ msgstr ""
 "afficher l'arbre entier ; pas seulement le répertoire courant (implique --"
 "full-name)"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<options>] [<commit>...]"
 
-#: builtin/merge.c:46
+#: builtin/merge.c:47
 msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr "git merge [<options>] <message> HEAD <commit>"
 
-#: builtin/merge.c:47
+#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "le commutateur `m' a besoin d'une valeur"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Impossible de trouver la stratégie de fusion '%s'.\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Les stratégies disponibles sont :"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Les stratégies personnalisées sont :"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 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:196 builtin/pull.c:126
+#: builtin/merge.c:198 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:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(synonyme de --stat)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 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:202 builtin/pull.c:135
+#: builtin/merge.c:204 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:204 builtin/pull.c:138
+#: builtin/merge.c:206 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:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "éditer le message avant la validation"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "autoriser l'avance rapide (défaut)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 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:213
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Vérifier que la validation a une signature GPG valide"
+#: builtin/merge.c:215 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:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "stratégie"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "stratégie de fusion à utiliser"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "option=valeur"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "option pour la stratégie de fusion sélectionnée"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 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:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "abandonner la fusion en cours"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "permettre la fusion d'historiques sans rapport"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "impossible de lancer le remisage."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "échec du remisage"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "pas un objet valide : %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "read-tree a échoué"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (rien à compresser)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Validation compressée -- HEAD non mise à jour\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Impossible d'écrire dans '%s'"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Écriture de SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Finition de SQUASH_MSG"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, 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:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' ne pointe pas sur un commit"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Mauvaise chaîne branch.%s.mergeoptions : %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 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:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Options inconnue pour merge-recursive : -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "impossible d'écrire %s"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Impossible de lire depuis '%s'"
 
-#: builtin/merge.c:782
+#: builtin/merge.c:742
 #, 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:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8127,54 +9481,68 @@ msgstr ""
 "Les lignes commençant par '%c' seront ignorées, et un message vide\n"
 "abandonne la validation.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "Message de validation vide."
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Merveilleux.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, 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:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' n'est pas une validation"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "Pas de branche courante."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "Pas de branche distante pour la branche courante."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 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:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Pas de branche de suivi pour %s depuis %s"
 
-#: builtin/merge.c:1080
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Mauvaise valeur '%s' dans l'environnement '%s'"
+
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "impossible de fermer '%s'"
 
-#: builtin/merge.c:1207
+#: builtin/merge.c:1061
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "pas possible de fusionner ceci dans %s : %s"
+
+#: builtin/merge.c:1095
+msgid "not something we can merge"
+msgstr "pas possible de fusionner ceci"
+
+#: builtin/merge.c:1162
 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:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8182,7 +9550,7 @@ msgstr ""
 "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
 "Veuillez valider vos modifications avant de pouvoir fusionner."
 
-#: builtin/merge.c:1230
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8190,102 +9558,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:1233
+#: builtin/merge.c:1188
 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:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 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:1267
+#: builtin/merge.c:1222
 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:1269
+#: builtin/merge.c:1224
 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:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - pas possible de fusionner ceci"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 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:1332
+#: builtin/merge.c:1287
 #, 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:1335
+#: builtin/merge.c:1290
 #, 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:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "La validation %s n'a pas de signature GPG."
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, 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:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "refus de fusionner des historiques sans relation"
+
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Déjà à jour."
+
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Mise à jour %s..%s\n"
 
-#: builtin/merge.c:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Essai de fusion vraiment triviale dans l'index...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Non.\n"
 
-#: builtin/merge.c:1500
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Déjà à jour. Ouais !"
+
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Pas possible d'avancer rapidement, abandon."
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Retour de l'arbre à l'original...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Essai de la stratégie de fusion %s...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, 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:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "La fusion avec la stratégie %s a échoué.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, 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:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -8311,23 +9691,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>"
 
@@ -8371,6 +9751,37 @@ msgstr "ne pas avertir à propos des conflits"
 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]"
@@ -8396,7 +9807,7 @@ msgstr "git mv [<options>] <source>... <destination>"
 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/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 "Veuillez indexer vos modifications de .gitmodules ou les remiser pour "
@@ -8415,110 +9826,110 @@ msgstr "forcer le déplacement/renommage même si la cible existe"
 msgid "skip move/rename errors"
 msgstr "sauter les erreurs de déplacement/renommage"
 
-#: builtin/mv.c:152
+#: builtin/mv.c:155
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "la destination '%s' n'est pas un répertoire"
 
-#: builtin/mv.c:163
+#: builtin/mv.c:166
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
 msgstr "Vérification du renommage de '%s' en '%s'\n"
 
-#: builtin/mv.c:167
+#: builtin/mv.c:170
 msgid "bad source"
 msgstr "mauvaise source"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:173
 msgid "can not move directory into itself"
 msgstr "impossible de déplacer un répertoire dans lui-même"
 
-#: builtin/mv.c:173
+#: builtin/mv.c:176
 msgid "cannot move directory over file"
 msgstr "impossible de déplacer un répertoire sur un fichier"
 
-#: builtin/mv.c:182
+#: builtin/mv.c:185
 msgid "source directory is empty"
 msgstr "le répertoire source est vide"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:210
 msgid "not under version control"
 msgstr "pas sous le contrôle de version"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:213
 msgid "destination exists"
 msgstr "la destination existe"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:221
 #, c-format
 msgid "overwriting '%s'"
 msgstr "écrasement de '%s'"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:224
 msgid "Cannot overwrite"
 msgstr "Impossible d'écraser"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:227
 msgid "multiple sources for the same target"
 msgstr "multiples sources pour la même destination"
 
-#: builtin/mv.c:226
+#: builtin/mv.c:229
 msgid "destination directory does not exist"
 msgstr "le répertoire de destination n'existe pas"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:236
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, source=%s, destination=%s"
 
-#: builtin/mv.c:254
+#: builtin/mv.c:257
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "Renommage de %s en %s\n"
 
-#: builtin/mv.c:257 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 "le renommage de '%s' a échoué"
 
-#: builtin/name-rev.c:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<options>] <validation>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<options>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<options>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "afficher seulement les noms (pas de SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "utiliser seulement les étiquettes pour nommer les validations"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "utiliser seulement les références correspondant à <motif>"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr ""
 "afficher toutes les validations accessibles depuis toutes les références"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "lire depuis l'entrée standard"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "autoriser l'affichage des noms `non définis` (par défaut)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "déréférencer les étiquettes en entrée (usage interne)"
 
@@ -8634,6 +10045,10 @@ msgstr "git notes prune [<options>]"
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
+msgstr "Écrire/éditer les notes pour l'objet suivant :"
+
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -8648,88 +10063,99 @@ msgstr "impossible de lire la sortie de 'show'"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "impossible de finir 'show' pour l'objet '%s'"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "impossible de créer le fichier '%s'"
-
-#: builtin/notes.c:193
-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: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"
 
-#: builtin/notes.c:202
+#: builtin/notes.c:203
 msgid "unable to write note object"
 msgstr "impossible d'écrire l'objet note"
 
-#: builtin/notes.c:204
+#: 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:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "impossible de lire '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "impossible d'ouvrir ou lire '%s'"
 
-#: 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:880 builtin/tag.c:456
+#: 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 "Impossible de résoudre '%s' comme une référence valide."
+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'."
+
+#: 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'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "ligne en entrée malformée : '%s'."
 
-#: builtin/notes.c:256
+#: builtin/notes.c:316
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Impossible de lire l'objet '%s'."
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "impossible de copier les notes de '%s' vers '%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 "Impossible de lire les informations de note d'un objet non-blob '%s'."
+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:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:945
+#: 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 "trop de paramètres"
 
-#: 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 "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:396 builtin/notes.c:559
+#: 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:399 builtin/notes.c:562
+#: 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:402 builtin/notes.c:565
+#: 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:405 builtin/notes.c:568
+#: 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:408 builtin/notes.c:571
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permettre de stocker une note vide"
 
-#: builtin/notes.c:409 builtin/notes.c:480
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "remplacer les notes existantes"
 
-#: builtin/notes.c:434
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8738,30 +10164,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:449 builtin/notes.c:528
+#: 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:460 builtin/notes.c:621 builtin/notes.c:885
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Suppression de la note pour l'objet %s\n"
 
-#: builtin/notes.c:481
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "lire les objets depuis l'entrée standard"
 
-#: builtin/notes.c:483
+#: 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:501
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "pas assez de paramètres"
 
-#: builtin/notes.c:522
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8770,12 +10196,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:534
+#: 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:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8784,15 +10210,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:767
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "échec de la suppression de la référence NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "échec de la suppression de la référence NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "échec de la suppression de la copie de travail 'git notes merge'"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "échec de la lecture de la référence NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "impossible de trouver le commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "impossible d'analyser le commit de NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "échec de la résolution de NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "impossible de finaliser la fusion de notes"
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "stratégie de fusion de notes inconnue %s"
+
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Options générales"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Options de fusion"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8800,242 +10263,286 @@ msgstr ""
 "résoudre les conflits de notes en utilisant la stratégie donnée (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "Validation des notes non fusionnées"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "finaliser la fusion de notes en validant les notes non fusionnées"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Abandon de la résolution de fusion des notes"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "abandonner la fusion de notes"
 
-#: builtin/notes.c:856
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "--commit, --abort et -s/--strategy sont mutuellement incompatibles"
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "vous devez spécifier une référence de notes à fusionner"
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "-s/--strategy inconnu : %s"
+
+#: builtin/notes.c:860
+#, 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"
+
+#: builtin/notes.c:863
+#, c-format
+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)"
+
+#: builtin/notes.c:865
 #, 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 ""
+"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 ""
+"La fusion automatique des notes a échoué. Corrigez les conflits dans %s et "
+"valide le résultat avec 'git notes merges --commit', ou abandonnez la fusion "
+"avec 'git notes merge --abort'.\n"
 
-#: builtin/notes.c:883
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "L'objet %s n'a pas de note\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 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:898
-msgid "read object names from the standard input"
-msgstr "lire les noms d'objet depuis l'entrée standard"
+#: builtin/notes.c:902
+msgid "read object names from the standard input"
+msgstr "lire les noms d'objet depuis l'entrée standard"
+
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "ne pas supprimer, afficher seulement"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "afficher les notes éliminées"
 
-#: builtin/notes.c:979
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "références-notes"
 
-#: builtin/notes.c:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "utiliser les notes depuis <références-notes>"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: builtin/notes.c:1019
 #, 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 ""
 "git pack-objects [options...] base-name [< <liste-références> | < <liste-"
 "objets>]"
 
-#: 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 "erreur de compression (%d)"
 
-#: builtin/pack-objects.c:772
+#: builtin/pack-objects.c:768
+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:781
 msgid "Writing objects"
 msgstr "Écriture des objets"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 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:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Compression des objets"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "version d'index non supportée %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "mauvaise version d'index '%s'"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "ne pas afficher la barre de progression"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "afficher la barre de progression"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 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:2599
+#: builtin/pack-objects.c:2800
 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:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "version[,offset]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 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:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "taille maximum de chaque fichier paquet en sortie"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "ignorer les objets empruntés à un autre magasin d'objets"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "ignorer les objets empaquetés"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "limiter la fenêtre d'empaquetage par objets"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 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:2614
+#: builtin/pack-objects.c:2815
 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:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "réutiliser les deltas existants"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "réutiliser les objets existants"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "utiliser les objets OFS_DELTA"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 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:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "ne pas créer un paquet vide"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "lire les paramètres de révision depuis l'entrée standard"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 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:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "inclure les objets accessibles depuis toute référence"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 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:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "inclure les objets référencés par l'index"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "afficher l'empaquetage sur la sortie standard"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 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:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "garder les objets inaccessibles"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "heure"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "empaqueter les objets inaccessibles détachés"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "dépaqueter les objets inaccessibles plus récents que <heure>"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "créer des paquets légers"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "créer des paquets permettant des récupérations superficielles"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorer les paquets qui ont un fichier .keep"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "niveau de compression du paquet"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "ne pas cacher les validations par greffes"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 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:2661
+#: builtin/pack-objects.c:2864
 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:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Décompte des objets"
 
@@ -9063,15 +10570,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:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "ne pas supprimer, afficher seulement"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "afficher les objets éliminés"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "faire expirer les objets plus vieux que <heure>"
 
@@ -9079,55 +10582,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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Options relatives à la fusion"
 
-#: builtin/pull.c:120
+#: 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:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "autoriser l'avance rapide"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "vérifier que le commit nommé a une signature GPG valide"
+#: 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:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Options relatives au rapatriement"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "nombre de sous-modules tirés en parallèle"
 
-#: builtin/pull.c:275
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valeur invalide pour pull.ff : %s"
 
-#: builtin/pull.c:359
-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:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "De plus, votre index contient des modifications non validées."
-
-#: builtin/pull.c:367
-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:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9135,14 +10628,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:445
+#: 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:446
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9150,7 +10643,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:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -9162,39 +10655,44 @@ msgstr ""
 "configuration\n"
 "pour la branche actuelle, vous devez spécifier la branche avec la commande."
 
-#: builtin/pull.c:454
+#: 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:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: 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:469
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "<distant>"
+
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<branche>"
+
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"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 :\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branche> %s\n"
+"branche, vous pouvez le faire avec :"
 
-#: builtin/pull.c:483
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9204,13 +10702,29 @@ msgstr ""
 "'%s'\n"
 "du serveur distant, mais cette référence n'a pas été récupérée."
 
-#: builtin/pull.c:841
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "--verify-signatures est ignoré pour un rebasage"
+
+#: 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: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:870
+#: 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"
@@ -9221,7 +10735,7 @@ msgstr ""
 "avance rapide de votre copie de travail\n"
 "depuis le commit %s."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9239,11 +10753,11 @@ msgstr ""
 "$ git reset --hard\n"
 "pour régénérer."
 
-#: builtin/pull.c:890
+#: 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:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Impossible de rebaser sur de multiples branches."
 
@@ -9422,12 +10936,12 @@ msgstr "Poussée vers %s\n"
 msgid "failed to push some refs to '%s'"
 msgstr "impossible de pousser des références vers '%s'"
 
-#: builtin/push.c:365
+#: builtin/push.c:366
 #, c-format
 msgid "bad repository '%s'"
 msgstr "mauvais dépôt '%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 "
@@ -9449,104 +10963,118 @@ msgstr ""
 "\n"
 "    git push <nom>\n"
 
-#: builtin/push.c:381
+#: builtin/push.c:385
 msgid "--all and --tags are incompatible"
 msgstr "--all et --tags sont incompatibles"
 
-#: builtin/push.c:382
+#: builtin/push.c:386
 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:387
+#: builtin/push.c:391
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror et --tags sont incompatibles"
 
-#: builtin/push.c:388
+#: builtin/push.c:392
 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:393
+#: builtin/push.c:397
 msgid "--all and --mirror are incompatible"
 msgstr "--all et --mirror sont incompatibles"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "repository"
 msgstr "dépôt"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
+#: builtin/push.c:516 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "pousser toutes les références"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
+#: builtin/push.c:517 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "refléter toutes les références"
 
-#: builtin/push.c:509
+#: builtin/push.c:519
 msgid "delete refs"
 msgstr "supprimer les références"
 
-#: builtin/push.c:510
+#: builtin/push.c:520
 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:513 builtin/send-pack.c:164
+#: builtin/push.c:523 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "forcer les mises à jour"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
+#: builtin/push.c:525 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "nom de référence>:<attendu"
 
-#: 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 "exiger que l'ancienne valeur de la référence soit à cette valeur"
 
-#: builtin/push.c:519
+#: builtin/push.c:529
 msgid "control recursive pushing of submodules"
 msgstr "contrôler la poussée récursive des sous-modules"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
+#: builtin/push.c:531 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "utiliser un empaquetage léger"
 
-#: 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 "recevoir le programme d'empaquetage"
 
-#: builtin/push.c:524
+#: builtin/push.c:534
 msgid "set upstream for git pull/status"
 msgstr "définir la branche amont pour git pull/status"
 
-#: builtin/push.c:527
+#: builtin/push.c:537
 msgid "prune locally removed refs"
 msgstr "éliminer les références locales supprimées"
 
-#: builtin/push.c:529
+#: builtin/push.c:539
 msgid "bypass pre-push hook"
 msgstr "éviter d'utiliser le crochet pre-push"
 
-#: builtin/push.c:530
+#: builtin/push.c:540
 msgid "push missing but relevant tags"
 msgstr "pousser les étiquettes manquantes mais pertinentes"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
+#: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "signer la poussée avec 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 "demande une transaction atomique sur le serveur distant"
 
-#: builtin/push.c:549
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "spécifique au serveur"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "option à transmettre"
+
+#: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete est incompatible avec --all, --mirror et --tags"
 
-#: builtin/push.c:551
+#: builtin/push.c:562
 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
+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
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
@@ -9622,6 +11150,68 @@ msgstr "sauter l'application du filtre d'extraction creuse"
 msgid "debug unpack-trees"
 msgstr "déboguer unpack-trees"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <répertoire-git>"
+
+#: 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 ""
+"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: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 ""
+"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:1883
+msgid "quiet"
+msgstr "quiet"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Vous devez spécifier un répertoire."
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9773,12 +11363,12 @@ msgstr ""
 "spécifier les branches à suivre n'a de sens qu'avec des miroirs de "
 "rapatriement"
 
-#: builtin/remote.c:190 builtin/remote.c:633
+#: builtin/remote.c:190 builtin/remote.c:629
 #, c-format
 msgid "remote %s already exists."
 msgstr "la distante %s existe déjà."
 
-#: 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' n'est pas un nom valide de distante"
@@ -9803,17 +11393,17 @@ msgstr "(correspond)"
 msgid "(delete)"
 msgstr "(supprimer)"
 
-#: 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 "Distante inconnue : %s"
 
-#: builtin/remote.c:643
+#: builtin/remote.c:639
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Impossible de renommer la section de configuration '%s' en '%s'"
 
-#: builtin/remote.c:663
+#: builtin/remote.c:659
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9824,17 +11414,17 @@ msgstr ""
 "\t%s\n"
 "\tVeuillez mettre à jour la configuration manuellement si nécessaire."
 
-#: builtin/remote.c:699
+#: builtin/remote.c:695
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "échec de suppression de '%s'"
 
-#: builtin/remote.c:733
+#: builtin/remote.c:729
 #, c-format
 msgid "creating '%s' failed"
 msgstr "échec de création de '%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:"
@@ -9849,125 +11439,137 @@ msgstr[1] ""
 "supprimées ;\n"
 "pour les supprimer, utilisez :"
 
-#: builtin/remote.c:810
+#: builtin/remote.c:806
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Impossible de supprimer la section de configuration '%s'"
 
-#: builtin/remote.c:911
+#: builtin/remote.c:907
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
 msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)"
 
-#: builtin/remote.c:914
+#: builtin/remote.c:910
 msgid " tracked"
 msgstr " suivi"
 
-#: builtin/remote.c:916
+#: builtin/remote.c:912
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " dépassé (utilisez 'git remote prune' pour supprimer)"
 
-#: 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 invalide ; ne peut pas rebaser sur plus d'une branche"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "rebase de manière interactive sur la distante %s"
 
-#: builtin/remote.c:971
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "rebase sur la distante %s"
+
+#: builtin/remote.c:967
 #, c-format
 msgid " merges with remote %s"
 msgstr " fusionne avec la distante %s"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    et avec la distante"
-
-#: builtin/remote.c:974
+#: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
 msgstr "fusionne avec la distante %s"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   et avec la distante"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    et avec la distante %s\n"
 
-#: builtin/remote.c:1021
+#: builtin/remote.c:1016
 msgid "create"
 msgstr "créer"
 
-#: builtin/remote.c:1024
+#: builtin/remote.c:1019
 msgid "delete"
 msgstr "supprimer"
 
-#: builtin/remote.c:1028
+#: builtin/remote.c:1023
 msgid "up to date"
 msgstr "à jour"
 
-#: builtin/remote.c:1031
+#: builtin/remote.c:1026
 msgid "fast-forwardable"
 msgstr "peut être mis à jour en avance rapide"
 
-#: builtin/remote.c:1034
+#: builtin/remote.c:1029
 msgid "local out of date"
 msgstr "le local n'est pas à jour"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1036
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s force vers %-*s (%s)"
 
-#: builtin/remote.c:1044
+#: builtin/remote.c:1039
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s pousse vers %-*s (%s)"
 
-#: builtin/remote.c:1048
+#: builtin/remote.c:1043
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s force vers %s"
 
-#: builtin/remote.c:1051
+#: builtin/remote.c:1046
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s pousse vers %s"
 
-#: builtin/remote.c:1119
+#: builtin/remote.c:1114
 msgid "do not query remotes"
 msgstr "ne pas interroger les distantes"
 
-#: builtin/remote.c:1146
+#: builtin/remote.c:1141
 #, c-format
 msgid "* remote %s"
 msgstr "* distante %s"
 
-#: builtin/remote.c:1147
+#: builtin/remote.c:1142
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  URL de rapatriement : %s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(pas d'URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  URL push : %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Branche HEAD : %s"
 
-#: builtin/remote.c:1167
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(non demandé)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(inconnu)"
+
+#: builtin/remote.c:1164
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
@@ -9975,238 +11577,251 @@ msgstr ""
 "  Branche HEAD (la HEAD distante est ambiguë, peut être l'une des "
 "suivantes) :\n"
 
-#: builtin/remote.c:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Branche distante :%s"
 msgstr[1] "  Branches distantes :%s"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (statut non demandé)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 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:1199
+#: builtin/remote.c:1196
 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:1206
+#: 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] "  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:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "supprimer refs/remotes/<nom>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Impossible de déterminer la HEAD distante"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 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:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Impossible de supprimer %s"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Référence non valide : %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Impossible de paramétrer %s"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s se retrouvera en suspens !"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s se retrouve en suspens !"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "Élimination de %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL : %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [serait éliminé] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [éliminé] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "éliminer les distants après le rapatriement"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Pas de serveur remote '%s'"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "ajouter une branche"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "pas de serveur distant spécifié"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 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:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "retourner toutes les URLs"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "aucune URL configurée pour le dépôt distant '%s'"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "manipuler les URLs push"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "ajouter une URL"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "supprimer des URLs"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete n'a aucun sens"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Motif d'URL ancien invalide : %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Pas d'URL trouvée : %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Pas de suppression de toutes les URLs non-push"
 
-#: builtin/remote.c:1595
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "être verbeux : doit être placé avant une sous-commande"
 
+#: builtin/remote.c:1622
+#, 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:159
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "empaqueter tout dans un seul paquet"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "identique à -a et transformer les objets inaccessibles en suspens"
 
-#: builtin/repack.c:164
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "supprimer les paquets redondants et lancer git-prune-packed"
 
-#: builtin/repack.c:166
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passer --no-reuse-delta à git-pack-objects"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passer --no-reuse-object à git-pack-objects"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "ne pas lancer git update-server-info"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "passer --local à git-pack-objects"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "écrire un index en bitmap"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "date approximative"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:178
 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:179
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr "avec -a, repaquétiser les objets inaccessibles"
+
+#: builtin/repack.c:182
 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:180 builtin/repack.c:184
+#: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "octets"
 
-#: builtin/repack.c:181
+#: builtin/repack.c:184
 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:183
+#: builtin/repack.c:186
 msgid "limits the maximum delta depth"
 msgstr "limite la profondeur maximale des deltas"
 
-#: builtin/repack.c:185
+#: builtin/repack.c:188
 msgid "maximum size of each packfile"
 msgstr "taille maximum de chaque fichier paquet"
 
-#: builtin/repack.c:187
+#: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
 
-#: builtin/repack.c:197
+#: builtin/repack.c:200
 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:381
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable et -A sont incompatibles"
+
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
-msgid "removing '%s' failed"
-msgstr "la suppression de '%s' a échoué"
+msgid "failed to remove '%s'"
+msgstr "échec de la suppression de '%s'"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
@@ -10310,8 +11925,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>...]"
@@ -10433,27 +12048,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:350
+#: 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:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<options>] -- [<arguments>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
 msgstr "garder le `--` passé en argument"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 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:396
 msgid "output in stuck long form"
 msgstr "sortie en forme longue fixée"
 
-#: 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"
@@ -10525,31 +12140,27 @@ msgstr "option"
 msgid "option for merge strategy"
 msgstr "option pour la stratégie de fusion"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:100
 msgid "append commit name"
 msgstr "ajouter le nom de validation"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:102
 msgid "preserve initially empty commits"
 msgstr "préserver les validations vides initialement"
 
-#: builtin/revert.c:107
+#: builtin/revert.c:103
 msgid "allow commits with empty messages"
 msgstr "autoriser les validations avec des messages vides"
 
-#: builtin/revert.c:108
+#: builtin/revert.c:104
 msgid "keep redundant, empty commits"
 msgstr "garder les validations redondantes, vides"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "erreur du programme"
-
-#: builtin/revert.c:197
+#: builtin/revert.c:192
 msgid "revert failed"
 msgstr "revert a échoué"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "le picorage a échoué"
 
@@ -10642,12 +12253,6 @@ msgstr "autoriser la suppression récursive"
 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:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Veuillez indexer vos modifications de .gitmodules ou remisez-les pour "
-"continuer"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10729,72 +12334,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: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 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:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "aucune référence correspond à %s"
+
+#: builtin/show-branch.c:639
 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:641
 msgid "show remote-tracking branches"
 msgstr "afficher les branches de suivi distantes"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "couleur '*!+-' correspondant à la branche"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 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:647
 msgid "synonym to more=-1"
 msgstr "synonyme de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "supprimer les chaînes de nommage"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "inclure la branche courante"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 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:654
 msgid "show possible merge bases"
 msgstr "afficher les bases possibles de fusion"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 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:658
 msgid "show commits in topological order"
 msgstr "afficher les validations dans l'ordre topologique"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 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:663
 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:665
 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:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 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:703
+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:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "aucune branche spécifiée, et HEAD est invalide"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "--reflog requiert un nom de branche"
+
+#: 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 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:737
+#, c-format
+msgid "no such ref %s"
+msgstr "référence inexistante %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] "impossible de gérer plus de %d révision."
+msgstr[1] "impossible de gérer plus de %d révisions."
+
+#: builtin/show-branch.c:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' n'est pas une référence valide."
+
+#: builtin/show-branch.c:836
+#, 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 | --"
@@ -10809,11 +12470,11 @@ msgstr "git show-ref --exclude-existing[=<motif>]"
 
 #: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
-msgstr "afficher seulement les étiquettes (peut être combiné avec des têtes)"
+msgstr "afficher seulement les étiquettes (peut être combiné avec heads)"
 
 #: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
-msgstr "afficher seulement les têtes (peut être combiné avec des étiquettes)"
+msgstr "afficher seulement les têtes (peut être combiné avec tags)"
 
 #: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
@@ -10862,86 +12523,231 @@ 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:73 builtin/submodule--helper.c:161
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr "Référence inexistante : %s"
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Nom de référence complet attendu, %s obtenu"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "impossible de supprimer un composant de l'URL '%s'"
+
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "ancre alternative pour les chemins relatifs"
 
-#: builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<chemin>] [<chemin>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, 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:369
+#, 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:373
+#, 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:383
+#, 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:390
+#, 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:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Supprimer la sortie lors de l'initialisation d'un sous-module"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<chemin>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper <nom> <chemin>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, 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:164
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, 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:563
+#, 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:570
+#, 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:593
 msgid "where the new submodule will be cloned to"
 msgstr "emplacement où le sous-module sera cloné"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "nom du nouveau sous-module"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "URL depuis laquelle cloner le sous-module"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "profondeur de l'historique des clones superficiels"
 
-#: builtin/submodule--helper.c:182
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "forcer l'affichage de la progression du clonage"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<chemin>] [--quiet] [--reference "
-"<dépôt>] [--name <nom>] [--url <url>][--depth <profondeur>] [--] "
-"[<chemin>...]"
+"<dépôt>] [--name <nom>] [--depth <profondeur>]  --url <url> --path <chemin>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "impossible de créer le répertoire '%s'"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, 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:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "impossible d'ouvrir le fichier '%s'"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "impossible de fermer le fichier %s"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, 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:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "Le chemin de sous-module '%s' n'est pas initialisé"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Vous voudriez sûrement utiliser 'update --init' ?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "Sous-module non fusionné %s non traité"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "Sous-module '%s' non traité"
+
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Impossible de cloner '%s'. Réessai prévu"
+
+#: builtin/submodule--helper.c:924
+#, 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:945
+msgid "path into the working tree"
+msgstr "chemin dans la copie de travail"
+
+#: builtin/submodule--helper.c:948
+msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
-"fatal : la sous-commande submodule--helper doit être appelée avec une sous-"
-"commande"
+"chemin dans la copie de travail, traversant les frontières de sous-modules"
 
-#: builtin/submodule--helper.c:274
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "valeurs possibles : rebase, merge, checkout ou none"
+
+#: builtin/submodule--helper.c:956
+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:959
+msgid "parallel jobs"
+msgstr "jobs parallèles"
+
+#: builtin/submodule--helper.c:961
+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:962
+msgid "don't print cloning progress"
+msgstr "ne pas afficher la progression du clonage"
+
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<chemin>] [<chemin>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "valeur invalide pour la mise à jour du paramètre"
+
+#: 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 ""
+"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:1100
+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:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "fatal : '%s' n'est pas une sous-commande valide de submodule--helper"
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "'%s' n'est pas une sous-commande valide de submodule--helper"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
@@ -10996,27 +12802,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nométiquette>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "nom d'étiquette trop long : %.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "étiquette '%s' non trouvée."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Étiquette '%s' supprimée (elle était sur %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "impossible de vérifier l'étiquette '%s'"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -11029,7 +12830,7 @@ msgstr ""
 "  %s\n"
 "Les lignes commençant par '%c' seront ignorées.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -11161,26 +12962,26 @@ msgstr "les options --merged et --no-merged ne sont autorisées qu'avec -l"
 msgid "only one -F or -m option is allowed."
 msgstr "une seule option -F ou -m est autorisée."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "trop de paramètres"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' n'est pas un nom d'étiquette valide."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "l'étiquette '%s' existe déjà"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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"
 
@@ -11251,143 +13052,151 @@ 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 [<options>] [--] [<fichier>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 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:922
 msgid "refresh: ignore submodules"
 msgstr "rafraîchir : ignorer les sous-modules"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "ne pas ignorer les nouveaux fichiers"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 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:929
 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:931
 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:934
 msgid "refresh stat information"
 msgstr "rafraîchir l'information de stat"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 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:942
 msgid "<mode>,<object>,<path>"
 msgstr "<mode>, <objet>, <chemin>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "ajouter l'élément spécifié dans l'index"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: 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"
-
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "marquer les fichiers comme \"non changeants\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "mettre à zéro le bit supposé-non-modifié"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "marquer les fichiers comme \"index seulement\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 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:964
 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:966
 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:968
 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:970
 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:974
 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:978
 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:982
 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:986
 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:989
 msgid "report actions to standard output"
 msgstr "afficher les actions sur la sortie standard"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 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:995
 msgid "write index in this format"
 msgstr "écrire l'index dans ce format"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "activer ou désactiver l'index divisé"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "activer ou désactiver le cache de non-suivis"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 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:1003
 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:1119
+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:1123
 msgid "Untracked cache disabled"
 msgstr "Le cache non suivi est désactivé"
 
-#: 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 est réglé à false ; supprimez-le ou changez-le si vous "
+"souhaitez vraiment activer le cache des fichiers non-suivis"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "Le cache non suivi est activé pour '%s'"
@@ -11438,7 +13247,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:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "afficher les messages bruts de gpg"
 
@@ -11458,7 +13267,7 @@ msgstr "afficher seulement les statistiques"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <étiquette>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "afficher le contenu de l'étiquette"
 
@@ -11467,83 +13276,115 @@ msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<options>] <chemin> [<branche>]"
 
 #: builtin/worktree.c:16
-msgid "git worktree prune [<options>]"
+msgid "git worktree list [<options>]"
 msgstr "git worktree prune [<options>]"
 
 #: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<options>] <chemin>"
+
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<options>]"
 
-#: builtin/worktree.c:39
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <chemin>"
+
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Suppression de worktrees/%s : répertoire invalide"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, 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:50
+#: builtin/worktree.c:53
 #, 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:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Suppression de worktrees/%s : fichier gitdir invalide"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, 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:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "échec de la suppression de %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' existe déjà"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "impossible de créer le répertoire de '%s'"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Préparation de %s (identifiant %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 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:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "créer une nouvelle branche"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "créer ou réinitialiser une branche"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "détacher la HEAD au commit nommé"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "remplissage de la nouvelle copie de travail"
+
+#: builtin/worktree.c:337
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B et --detach sont mutuellement exclusifs"
 
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "raison du vérouillage"
+
+#: builtin/worktree.c:482 builtin/worktree.c:515
+#, 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
+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
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "'%s' est déjà verrouillé, car '%s'"
+
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "'%s' est déjà verrouillé"
+
+#: builtin/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "'%s' n'est pas verrouillé"
+
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr "git write-tree [--missing-ok] [--prefix=<préfixe>/]"
@@ -11560,7 +13401,42 @@ msgstr "écrire l'objet arbre pour un sous-répertoire <préfixe>"
 msgid "only useful for debugging"
 msgstr "seulement utile pour le débogage"
 
-#: credential-cache--daemon.c:262
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<options>] <répertoire>"
+
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "quitter après un unique échange requête/réponse"
+
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "Sortir immédiatement après l'annonce initiale des références"
+
+#: upload-pack.c:1032
+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:1034
+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"
 
@@ -11574,7 +13450,11 @@ 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:321
+#: http.c:342
+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:351
 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"
 
@@ -11694,49 +13574,49 @@ 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"
 
-#: rerere.h:38
+#: rerere.h:40
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "met à jour l'index avec les résolutions de conflit réutilisées si possible"
 
-#: git-bisect.sh:55
+#: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
 msgstr "Vous devez démarrer avec \"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 "Souhaitez-vous que je le fasse pour vous [Y/n] ? "
 
-#: git-bisect.sh:122
+#: git-bisect.sh:121
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "option inconnue : '$arg'"
 
-#: git-bisect.sh:126
+#: git-bisect.sh:125
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' ne semble être une révision valide"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:154
 msgid "Bad HEAD - I need a HEAD"
 msgstr "Mauvaise HEAD - j'ai besoin d'une HEAD"
 
-#: git-bisect.sh:168
+#: git-bisect.sh:167
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
@@ -11744,27 +13624,28 @@ msgstr ""
 "L'extraction de '$start_head' a échoué. Essayez 'git bisect reset <branche-"
 "valide>'."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "refus de bissecter sur un arbre 'cg-seeked'"
 
-#: git-bisect.sh:182
+#: git-bisect.sh:181
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "Mauvaise HEAD - référence symbolique douteuse"
 
-#: git-bisect.sh:234
+#: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Mauvais argument pour bisect_write : $state"
 
-#: git-bisect.sh:263
+#: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Mauvaise révision en entrée : $arg"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Veuillez appeler 'bisect_state' avec au moins un argument."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Mauvaise révision en entrée : $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
@@ -11904,17 +13785,57 @@ msgstr ""
 msgid "no terms defined"
 msgstr "aucun terme défini"
 
-#: git-bisect.sh:653
+#: 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 ""
+"argument invalide $arg pour 'git bisect terms'.\n"
+"Les options supportées sont : --term-good|--term-old et --term-bad|--term-"
+"new."
+
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr ""
+"Erreur : vos modifications locales aux fichiers suivants seraient écrasées "
+"par la fusion"
+
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "La fusion automatique a échoué."
+
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "L'Octopus ne devrait pas arriver."
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Impossible de trouver un commit commun avec $pretty_name"
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Déjà à jour avec $pretty_name"
+
+#: git-merge-octopus.sh:89
 #, sh-format
-msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
-msgstr ""
-"argument invalide $arg pour 'git bisect terms'.\n"
-"Les options supportées sont : --term-good|--term-old et --term-bad|--term-"
-"new."
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Mise à jour en avance rapide sur $pretty_name"
 
-#: git-rebase.sh:57
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "Essai de fusion simple avec $pretty_name"
+
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr "La fusion simple a échoué, essai avec la fusion automatique."
+
+#: 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"
@@ -11926,16 +13847,21 @@ msgstr ""
 "Pour extraire la branche d'origine et stopper le rebasage, lancez \"git "
 "rebase --abort\"."
 
-#: git-rebase.sh:165
+#: git-rebase.sh:156 git-rebase.sh:395
+#, 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:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Impossible de stocker $stash_sha1"
 
-#: git-rebase.sh:169
+#: git-rebase.sh:171
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -11945,33 +13871,29 @@ msgstr ""
 "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:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Le crochet pre-rebase a refusé de rebaser."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 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:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "L'option --exec doit être utilisée avec l'option --interactive"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Pas de rebasage en cours ?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 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:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Impossible de lire HEAD"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11979,12 +13901,7 @@ msgstr ""
 "Vous devez éditer tous les conflits de fusion et\n"
 "les marquer comme résolus avec git add"
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Impossible de revenir à $head_name"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -12006,98 +13923,102 @@ msgstr ""
 "chose\n"
 "d'important ici."
 
-#: git-rebase.sh:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "invalide $upstream_name en amont"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, 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:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, 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:504
+#: git-rebase.sh:501
 #, 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:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal : pas de branche : $branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Autoremisage impossible"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Autoremisage créé : $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Veuillez les valider ou les remiser."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "La branche courante $branch_name est à jour."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, 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:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Changements de $mb sur $onto :"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 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:623
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
 
-#: git-stash.sh:51
+#: git-stash.sh:50
 msgid "git stash clear with parameters is unimplemented"
 msgstr "git stash clear avec des paramètres n'est pas implémenté"
 
-#: git-stash.sh:74
+#: git-stash.sh:73
 msgid "You do not have the initial commit yet"
 msgstr "Vous n'avez pas encore la validation initiale"
 
-#: git-stash.sh:89
+#: git-stash.sh:88
 msgid "Cannot save the current index state"
 msgstr "Impossible de sauver l'état courant de l'index"
 
-#: git-stash.sh:124 git-stash.sh:137
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Impossible de sauver les fichiers non-suivis"
+
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Impossible de sauver l'état courant de la copie de travail"
 
-#: git-stash.sh:141
+#: git-stash.sh:140
 msgid "No changes selected"
 msgstr "Aucun changement sélectionné"
 
-#: git-stash.sh:144
+#: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
 msgstr "Impossible de supprimer l'index temporaire (ne peut pas se produire)"
 
-#: git-stash.sh:157
+#: git-stash.sh:156
 msgid "Cannot record working tree state"
 msgstr "Impossible d'enregistrer l'état de la copie de travail"
 
-#: git-stash.sh:189
+#: git-stash.sh:188
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Impossible de mettre à jour $ref_stash avec $w_commit"
@@ -12112,7 +14033,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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -12121,115 +14042,128 @@ msgstr ""
 "erreur: option inconnue pour 'stash save': $option\n"
 "        Pour fournir un message, utilisez 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 ""
+"Impossible d'utiliser --patch et --include-untracked ou --all en même temps"
+
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Pas de modifications locales à sauver"
 
-#: git-stash.sh:264
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Impossible d'initialiser le remisage"
 
-#: git-stash.sh:268
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Impossible de sauver le statut courant"
 
-#: git-stash.sh:286
+#: git-stash.sh:268
+#, 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
 msgid "Cannot remove worktree changes"
 msgstr "Impossible de supprimer les changements de la copie de travail"
 
-#: git-stash.sh:405
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "option inconnue : $opt"
 
-#: git-stash.sh:415
+#: git-stash.sh:416
 msgid "No stash found."
 msgstr "Pas de remisage trouvé."
 
-#: git-stash.sh:422
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Trop de révisions spécifiées : $REV"
 
-#: git-stash.sh:428
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference n'est pas une référence valide"
 
-#: git-stash.sh:456
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
 msgstr "'$args' n'est pas une validation de type remisage"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' n'est pas une référence de remisage"
 
-#: git-stash.sh:475
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "impossible de rafraîchir l'index"
 
-#: git-stash.sh:479
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
 msgstr "Impossible d'appliquer un remisage en cours de fusion"
 
-#: git-stash.sh:487
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflits dans l'index. Essayez sans --index."
 
-#: git-stash.sh:489
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Impossible de sauvegarder l'arbre d'index"
 
-#: git-stash.sh:523
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Impossible de restaurer les fichiers non-suivis depuis le remisage"
+
+#: git-stash.sh:533
 msgid "Cannot unstage modified files"
 msgstr "Impossible de désindexer les fichiers modifiés"
 
-#: git-stash.sh:538
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "L'index n'a pas été sorti de remise."
 
-#: git-stash.sh:561
+#: git-stash.sh:562
+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:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "${REV} supprimé ($s)"
 
-#: git-stash.sh:562
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Impossible de supprimer l'élément de stash"
 
-#: git-stash.sh:570
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Aucune branche spécifiée"
 
-#: git-stash.sh:642
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "impossible de supprimer un composant de l'URL '$remoteurl'"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 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:291
+#: git-submodule.sh:194
 #, 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 ./|../"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existe déjà dans l'index"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -12240,271 +14174,1001 @@ msgstr ""
 "$sm_path\n"
 "Utilisez -f si vous voulez vraiment l'ajouter."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, 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:332
+#: git-submodule.sh:235
 #, 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:340
+#: git-submodule.sh:243
 #, 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:342
+#: git-submodule.sh:245
+#, 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 ""
+"Si vous voulez réutiliser ce répertoire local git au lieu de le recloner "
+"depuis\n"
+"  $realrepo\n"
+"utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
+"correct\n"
+"ou si ceci n'est pas clair, choisissez un autre nom avec l'option '--name'."
+
+#: git-submodule.sh:251
+#, 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:263
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Impossible d'extraire le sous-module '$sm_path'"
+
+#: git-submodule.sh:268
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "Échec d'ajout du sous-module '$sm_path'"
+
+#: git-submodule.sh:277
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "Échec d'enregistrement du sous-module '$sm_path'"
+
+#: git-submodule.sh:324
+#, sh-format
+msgid "Entering '$displaypath'"
+msgstr "Entrée dans '$displaypath'"
+
+#: git-submodule.sh:344
+#, 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:415
+#, sh-format
+msgid "pathspec and --all are incompatible"
+msgstr "un spécificateur de chemin et --all sont incompatibles"
+
+#: git-submodule.sh:420
+#, 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: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 ""
+"La copie de travail du sous-module '$displaypath' contient un répertoire ."
+"git\n"
+"(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
+"historique)"
+
+#: git-submodule.sh:448
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr ""
+"La copie de travail du sous-module '$displaypath' contient des modifications "
+"locales ; utilisez '-f' pour les annuler"
+
+#: git-submodule.sh:451
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "Répertoire '$displaypath' nettoyé"
+
+#: git-submodule.sh:452
+#, 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:455
+#, 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:464
+#, 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:617
+#, 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:627
+#, 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:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr ""
+"Impossible de trouver la révision courante ${remote_name}/${branch} dans le "
+"chemin de sous-module '$sm_path'"
+
+#: git-submodule.sh:650
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
+
+#: 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 ""
+"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:663
+#, 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:664
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
+
+#: git-submodule.sh:668
+#, 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:669
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
+
+#: git-submodule.sh:674
+#, 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:675
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
+
+#: git-submodule.sh:680
+#, 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:681
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Chemin de sous-module '$displaypath' : '$command $sha1'"
+
+#: git-submodule.sh:712
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
+
+#: git-submodule.sh:820
+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:872
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "mode $mod_dst inattendu"
+
+#: git-submodule.sh:892
+#, 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:895
+#, 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:898
+#, 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:1045
+#, 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:1112
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
+
+#: git-parse-remote.sh:89
+#, sh-format
+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
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Rebasage ($new_count/$total)"
+
+#: 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"
+msgstr ""
+"\n"
+"Commandes :\n"
+" p, pick = picorer le commit\n"
+" r, reword = picorer le commit, mais reformuler son message\n"
+" e, edit = picorer le commit, mais s'arrêter pour le modifier\n"
+" s, squash = prendre le commit, mais le fusionner avec le précédent\n"
+" f, fixup = comme \"squash\", mais en éliminant son message\n"
+" x, exec = lancer la commande (reste de la ligne) dans un shell\n"
+" d, drop = supprimer le commit\n"
+"\n"
+"Vous pouvez réordonner ces lignes ; elles sont exécutées de haut en bas.\n"
+
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"Ne supprimez aucune ligne. Utilisez 'drop' explicitement pour supprimer un "
+"commit.\n"
+
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Si vous éliminez une ligne ici, LE COMMIT CORRESPONDANT SERA PERDU.\n"
+
+#: git-rebase--interactive.sh:202
+#, 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 ""
+"Vous pouvez corriger le commit maintenant, avec\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"après avoir réalisé vos modifications, lancez\n"
+"\n"
+"\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:227
+#, 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
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Nom de commit invalide : $sha1"
+
+#: git-rebase--interactive.sh:308
+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
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Avance rapide sur $sha1"
+
+#: git-rebase--interactive.sh:362
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "Avance rapide impossible sur $sha1"
+
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Impossible de déplacer HEAD sur $first_parent"
+
+#: git-rebase--interactive.sh:376
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Refus d'écraser un commit de fusion: $sha1"
+
+#: git-rebase--interactive.sh:390
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "Erreur lors de la réapplication de la fusion $sha1"
+
+#: git-rebase--interactive.sh:398
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "Impossible de picorer $sha1"
+
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "Ceci est le ${n}ième message de validation :"
+
+#: git-rebase--interactive.sh:412
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "Le message de validation ${n} sera ignoré :"
+
+#: 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] "Ceci est la combinaison de $count commit."
+msgstr[1] "Ceci est la combinaison de $count commits."
+
+#: git-rebase--interactive.sh:431
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "Impossible d'écrire $fixup_msg"
+
+#: git-rebase--interactive.sh:434
+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
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "Impossible d'appliquer $sha1... $rest"
+
+#: git-rebase--interactive.sh:549
+#, 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 ""
+"Impossible de corriger le commit après avoir réussi à picorer $sha1... "
+"$rest\n"
+"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
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Arrêté à $sha1_abbrev... $rest"
+
+#: git-rebase--interactive.sh:579
 #, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
-"Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
-"nouveau depuis"
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "'$squash_style' impossible avec le commit précédent"
 
-#: git-submodule.sh:344
+#: git-rebase--interactive.sh:621
 #, sh-format
+msgid "Executing: $rest"
+msgstr "Exécution : $rest"
+
+#: git-rebase--interactive.sh:629
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "L'exécution a échoué : $rest"
+
+#: git-rebase--interactive.sh:631
+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
 msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
-"correct"
+"Vous pouvez corriger le problème, puis lancer\n"
+"\n"
+"git rebase --continue"
 
-#: git-submodule.sh:345
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:646
 #, sh-format
 msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
+"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 ""
-"ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
-"l'option '--name'."
+"L'exécution a réussi : $rest\n"
+"mais a laissé des modifications dans l'index ou la copie de travail\n"
+"Validez ou remisez vos modification, puis lancez\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-submodule.sh:347
+#: git-rebase--interactive.sh:657
 #, 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'."
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Commande inconnue : $command $sha1 $rest"
 
-#: git-submodule.sh:359
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Impossible d'extraire le sous-module '$sm_path'"
+#: git-rebase--interactive.sh:658
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Veuillez corriger ceci en utilisant 'git rebase --edit-todo'."
 
-#: git-submodule.sh:364
+#: git-rebase--interactive.sh:693
 #, sh-format
-msgid "Failed to add submodule '$sm_path'"
-msgstr "Échec d'ajout du sous-module '$sm_path'"
+msgid "Successfully rebased and updated $head_name."
+msgstr "Rebasage et mise à jour de $head_name avec succès."
 
-#: git-submodule.sh:373
-#, sh-format
-msgid "Failed to register submodule '$sm_path'"
-msgstr "Échec d'enregistrement du sous-module '$sm_path'"
+#: git-rebase--interactive.sh:740
+msgid "Could not skip unnecessary pick commands"
+msgstr "Impossible d'éviter les commandes de picorage non nécessaires"
 
-#: git-submodule.sh:417
+#: git-rebase--interactive.sh:898
 #, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Entrée dans '$prefix$displaypath'"
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
+msgstr ""
+"Attention : le SHA-1 manque ou n'est pas un commit dans la ligne suivante :\n"
+" - $line"
 
-#: git-submodule.sh:437
+#: git-rebase--interactive.sh:931
 #, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
 msgstr ""
-"Arrêt sur '$prefix$displaypath' ; le script a retourné un statut non nul."
+"Attention : la commande n'est pas reconnue dans le ligne suivante :\n"
+" - $line"
 
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "Impossible de détacher HEAD"
+
+#: git-rebase--interactive.sh:1008
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
-"URL non trouvée pour le chemin de sous-module '$displaypath' dans .gitmodules"
+"Attention : certains commits ont pu être accidentellement supprimés.\n"
+"Commits supprimés (du plus jeune au plus vieux) :"
 
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
+#: 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."
 msgstr ""
-"Échec d'enregistrement de l'URL pour le chemin de sous-module '$displaypath'"
+"Pour éviter ce message, utilisez \"drop\" pour supprimer explicitement un "
+"commit.\n"
+"\n"
+"Utilisez 'git config rebase.missingCommitsCheck' pour changer le niveau "
+"d'avertissements.\n"
+"Les comportements disponibles sont : ignore, warn, error."
 
-#: git-submodule.sh:494
+#: git-rebase--interactive.sh:1027
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'"
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr ""
+"Paramètre non reconnu $check_level pour l'option rebase.missingCommitsCheck. "
+"Ignoré."
 
-#: git-submodule.sh:511
-#, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
+#: git-rebase--interactive.sh:1044
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
 msgstr ""
-"Échec d'enregistrement du mode de mise à jour pour le chemin de sous-module "
-"'$displaypath'"
+"Vous pouvez corriger ceci avec 'git rebase --edit-todo' puis lancez 'git "
+"rebase --continue'."
+
+#: git-rebase--interactive.sh:1045
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "Ou bien vous pouvez abandonner le rebasage avec 'git rebase --abort'."
 
-#: git-submodule.sh:549
+#: git-rebase--interactive.sh:1069
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Impossible de supprimer CHERRY_PICK_HEAD"
+
+#: git-rebase--interactive.sh:1074
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
+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 ""
-"Utilisez '.' si vous voulez vraiment réinitialiser tous les sous-modules"
+"Vous avez des modifications indexées dans votre copie de travail.\n"
+"Si ces modifications devaient être ajoutées\n"
+"dans le commit précédent, lancez :\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Si elles devaient aller dans un nouveau commit, lancez :\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"Dans les deux cas, une fois fini, continuez avec :\n"
+"\n"
+"  git rebase --continue\n"
 
-#: git-submodule.sh:566
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
+#: git-rebase--interactive.sh:1091
+msgid "Error trying to find the author identity to amend commit"
 msgstr ""
-"La copie de travail du sous-module '$displaypath' contient un répertoire .git"
+"Erreur lors de la recherche de l'identité de l'auteur pour corriger le commit"
 
-#: git-submodule.sh:567
-#, sh-format
+#: git-rebase--interactive.sh:1096
 msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
-"historique)"
+"Vous avez des modifications non validées dans votre copie de travail.\n"
+"Veuillez les valider d'abord, puis relancer 'git rebase --continue'."
 
-#: git-submodule.sh:573
-#, sh-format
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+msgid "Could not commit staged changes."
+msgstr "impossible de valider les modifications indexées."
+
+#: git-rebase--interactive.sh:1129
 msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
+"\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 ""
-"La copie de travail du sous-module '$displaypath' contient des modifications "
-"locales ; utilisez '-f' pour les annuler"
+"\n"
+"Vous êtes en train d'éditer le fichier todo d'un rebasage interactif en "
+"cours.\n"
+"Pour continuer le rebasage après édition, lancez :\n"
+"    git rebase --continue\n"
+"\n"
 
-#: git-submodule.sh:576
-#, sh-format
-msgid "Cleared directory '$displaypath'"
-msgstr "Répertoire '$displaypath' nettoyé"
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "Impossible de lancer l'éditeur"
 
-#: git-submodule.sh:577
+#: git-rebase--interactive.sh:1150
 #, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
-msgstr ""
-"Impossible de supprimer la copie de travail du sous-module '$displaypath'"
+msgid "Could not checkout $switch_to"
+msgstr "Impossible d'extraire $switch_to"
 
-#: git-submodule.sh:580
-#, sh-format
-msgid "Could not create empty submodule directory '$displaypath'"
-msgstr "Impossible de créer le répertoire vide du sous-module '$displaypath'"
+#: git-rebase--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "Pas de HEAD ?"
 
-#: git-submodule.sh:589
+#: git-rebase--interactive.sh:1156
 #, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
-msgstr ""
-"Le sous-module '$name' ($url) n'est pas enregistré pour le chemin "
-"'$displaypath'"
+msgid "Could not create temporary $state_dir"
+msgstr "Impossible de créer un répertoire temporaire $state_dir"
+
+#: git-rebase--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "Impossible de marquer comme interactif"
+
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+msgid "Could not init rewritten commits"
+msgstr "Impossible d'initialiser les commits réécrits"
 
-#: git-submodule.sh:723
+#: git-rebase--interactive.sh:1273
 #, 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:1278
 msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
 msgstr ""
-"Chemin de sous-module '$displaypath' non initialisé\n"
-"Peut-être souhaitez-vous utiliser 'update --init' ?"
+"\n"
+"Cependant, si vous effacez tout, le rebasage sera annulé.\n"
+"\n"
 
-#: git-submodule.sh:736
-#, 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-rebase--interactive.sh:1285
+msgid "Note that empty commits are commented out"
+msgstr "Veuillez noter que les commits vides sont en commentaire"
 
-#: git-submodule.sh:745
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'"
+msgid "usage: $dashless $USAGE"
+msgstr "usage : $dashless $USAGE"
 
-#: git-submodule.sh:768
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"Impossible de se placer dans le répertoire $cdup, la racine de la copie de "
+"travail"
 
-#: git-submodule.sh:788
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr "fatal : $program_name ne peut pas être utilisé sans copie de travail."
+
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "Impossible de rebaser : vous avez des modifications non indexées."
+
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
-"Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'"
+"Impossible de réécrire les branches : vous avez des modifications non "
+"indexées."
 
-#: git-submodule.sh:789
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
+#: 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-submodule.sh:793
+#: git-sh-setup.sh:229
 #, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgid "Cannot $action: You have unstaged changes."
+msgstr "$action est impossible : vous avez des modifications non indexées."
+
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
-"Impossible de rebaser '$sha1' dans le chemin de sous-module '$displaypath'"
+"Impossible de rebaser : votre index contient des modifications non validées."
 
-#: git-submodule.sh:794
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
+#: 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-submodule.sh:799
+#: git-sh-setup.sh:248
 #, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
-"Impossible de fusionner '$sha1' dans le chemin de sous-module '$displaypath'"
+"$action est impossible : votre index contient des modifications non validées."
 
-#: git-submodule.sh:800
-#, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "De plus, votre index contient des modifications non validées."
 
-#: git-submodule.sh:805
-#, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
-"L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
-"'$prefix$sm_path'"
+"Vous devez lancer cette commande depuis la racine de votre copie de travail."
 
-#: git-submodule.sh:806
-#, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Impossible de déterminer le chemin absolu du répertoire git"
 
-#: git-submodule.sh:836
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
-msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
+#~ msgid "Could not write to %s"
+#~ msgstr "Impossible d'écrire dans %s"
 
-#: git-submodule.sh:944
-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"
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Erreur lors de l'emballage de %s."
 
-#: git-submodule.sh:996
-#, sh-format
-msgid "unexpected mode $mod_dst"
-msgstr "mode $mod_dst inattendu"
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "Vos modifications locales seraient écrasées par cherry-pick."
 
-#: git-submodule.sh:1016
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_src"
-msgstr "  Attention : $display_name ne contient pas la validation $sha1_src"
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Impossible d'annuler un commit pendant l'annulation d'un commit."
 
-#: git-submodule.sh:1019
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
-msgstr "  Attention : $display_name ne contient pas la validation $sha1_dst"
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "Impossible de picorer pendant un autre picorage."
 
-#: git-submodule.sh:1022
-#, 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"
+#~ msgid "Could not parse line %d."
+#~ msgstr "Impossible d'analyser la ligne %d."
 
-#: git-submodule.sh:1047
-msgid "blob"
-msgstr "blob"
+#~ msgid "Could not open %s"
+#~ msgstr "Impossible d'ouvrir %s"
 
-#: git-submodule.sh:1165
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
+#~ msgid "Could not read %s."
+#~ msgstr "Impossible de lire %s."
 
-#: git-submodule.sh:1229
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
+#~ 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 :"
+
+#~ msgid "This is the 3rd commit message:"
+#~ msgstr "Ceci est le troisième message de validation :"
+
+#~ msgid "This is the 4th commit message:"
+#~ msgstr "Ceci est le quatrième message de validation :"
+
+#~ msgid "This is the 5th commit message:"
+#~ msgstr "Ceci est le cinquième message de validation :"
+
+#~ msgid "This is the 6th commit message:"
+#~ msgstr "Ceci est le sixième message de validation :"
+
+#~ msgid "This is the 7th commit message:"
+#~ msgstr "Ceci est le septième message de validation :"
+
+#~ msgid "This is the 8th commit message:"
+#~ msgstr "Ceci est le huitième message de validation :"
+
+#~ msgid "This is the 9th commit message:"
+#~ msgstr "Ceci est le neuvième message de validation :"
+
+#~ msgid "This is the 10th commit message:"
+#~ msgstr "Ceci est le dixième message de validation :"
+
+#~ msgid "This is the ${n}th commit message:"
+#~ msgstr "Ceci est le ${n}ième message de validation :"
+
+#~ msgid "This is the ${n}st commit message:"
+#~ msgstr "Ceci est le ${n}ième message de validation :"
+
+#~ msgid "This is the ${n}nd commit message:"
+#~ msgstr "Ceci est le ${n}ième message de validation :"
+
+#~ msgid "This is the ${n}rd commit message:"
+#~ msgstr "Ceci est le ${n}ième message de validation :"
+
+#~ msgid "The 1st commit message will be skipped:"
+#~ msgstr "Le premier message de validation sera ignoré :"
+
+#~ msgid "The 2nd commit message will be skipped:"
+#~ msgstr "Le deuxième message de validation sera ignoré :"
+
+#~ msgid "The 3rd commit message will be skipped:"
+#~ msgstr "Le troisième message de validation sera ignoré :"
+
+#~ msgid "The 4th commit message will be skipped:"
+#~ msgstr "Le quatrième message de validation sera ignoré :"
+
+#~ msgid "The 5th commit message will be skipped:"
+#~ msgstr "Le cinquième message de validation sera ignoré :"
+
+#~ msgid "The 6th commit message will be skipped:"
+#~ msgstr "Le sixième message de validation sera ignoré :"
+
+#~ msgid "The 7th commit message will be skipped:"
+#~ msgstr "Le septième message de validation sera ignoré :"
+
+#~ msgid "The 8th commit message will be skipped:"
+#~ msgstr "Le huitième message de validation sera ignoré :"
+
+#~ msgid "The 9th commit message will be skipped:"
+#~ msgstr "Le neuvième message de validation sera ignoré :"
+
+#~ msgid "The 10th commit message will be skipped:"
+#~ msgstr "Le dixième message de validation sera ignoré :"
+
+#~ msgid "The ${n}th commit message will be skipped:"
+#~ msgstr "le ${n}ième message de validation sera ignoré :"
+
+#~ msgid "The ${n}st commit message will be skipped:"
+#~ msgstr "Le message de validation ${n} sera ignoré :"
+
+#~ msgid "The ${n}nd commit message will be skipped:"
+#~ msgstr "Le message de validation ${n} sera ignoré :"
+
+#~ msgid "The ${n}rd commit message will be skipped:"
+#~ msgstr "Le message de validation ${n} sera ignoré :"
+
+#~ msgid "could not run gpg."
+#~ msgstr "impossible de lancer gpg."
+
+#~ msgid "gpg did not accept the data"
+#~ msgstr "gpg n'a pas accepté les données"
+
+#~ msgid "unsupported object type in the tree"
+#~ msgstr "type d'objet non supporté dans l'arbre"
+
+#~ msgid "Fatal merge failure, shouldn't happen."
+#~ msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
+
+#~ msgid "Unprocessed path??? %s"
+#~ msgstr "Chemin non traité ??? %s"
+
+#~ msgid "Error wrapping up %s"
+#~ msgstr "Erreur à l'emballage de %s"
+
+#~ msgid "Cannot %s during a %s"
+#~ msgstr "Impossible de %s pendant un %s"
+
+#~ msgid "Can't cherry-pick into empty head"
+#~ msgstr "Impossible de picorer vers une HEAD vide"
+
+#~ msgid "could not open %s for writing"
+#~ msgstr "Impossible d'ouvrir '%s' en écriture"
+
+#~ msgid "bug: unhandled unmerged status %x"
+#~ msgstr "bogue : état de non-fusion non géré %x"
+
+#~ 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"
+
+#~ msgid "corrupt index file"
+#~ msgstr "fichier d'index corrompu"
+
+#~ msgid "detach the HEAD at named commit"
+#~ msgstr "détacher la HEAD à la validation nommée"
+
+#~ msgid "Checking connectivity... "
+#~ msgstr "Vérification de la connectivité... "
+
+#~ msgid "  (unable to update local ref)"
+#~ msgstr "  (impossible de mettre à jour la référence locale)"
+
+#~ msgid "Reinitialized existing"
+#~ msgstr "existant réinitialisé"
+
+#~ msgid "Initialized empty"
+#~ msgstr "vide initialisé"
+
+#~ msgid " shared"
+#~ msgstr " partagé"
+
+#~ msgid "Verify that the named commit has a valid GPG signature"
+#~ msgstr "Vérifier que la validation a une signature GPG valide"
+
+#~ msgid "Writing SQUASH_MSG"
+#~ msgstr "Écriture de SQUASH_MSG"
+
+#~ msgid "Finishing SQUASH_MSG"
+#~ msgstr "Finition de SQUASH_MSG"
+
+#~ msgid "   and with remote"
+#~ msgstr "   et avec la distante"
+
+#~ msgid "removing '%s' failed"
+#~ msgstr "la suppression de '%s' a échoué"
+
+#~ msgid "program error"
+#~ msgstr "erreur du programme"
+
+#~ msgid "Please call 'bisect_state' with at least one argument."
+#~ msgstr "Veuillez appeler 'bisect_state' avec au moins un argument."
+
+#~ msgid ""
+#~ "If you want to reuse this local git directory instead of cloning again "
+#~ "from"
+#~ msgstr ""
+#~ "Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
+#~ "nouveau depuis"
+
+#~ msgid ""
+#~ "use the '--force' option. If the local git directory is not the correct "
+#~ "repo"
+#~ msgstr ""
+#~ "utilisez l'option '--force'. Si le répertoire local git n'est pas le "
+#~ "dépôt correct"
+
+#~ msgid ""
+#~ "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'."
+
+#~ msgid "Submodule work tree '$displaypath' contains a .git directory"
+#~ msgstr ""
+#~ "La copie de travail du sous-module '$displaypath' contient un répertoire ."
+#~ "git"
+
+#~ msgid ""
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout "
+#~ "son historique)"
+
+#~ msgid "'%s': %s"
+#~ msgstr "'%s' : %s"
+
+#~ 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"
+
+#~ msgid "    git branch --set-upstream-to %s\n"
+#~ msgstr "    git branch --set-upstream-to %s\n"
+
+#~ msgid "cannot open %s: %s\n"
+#~ msgstr "impossible d'ouvrir %s : %s\n"
+
+#~ msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+#~ msgstr ""
+#~ "Veuillez indexer vos modifications de .gitmodules ou remisez-les pour "
+#~ "continuer"
+
+#~ msgid "could not verify the tag '%s'"
+#~ msgstr "impossible de vérifier l'étiquette '%s'"
+
+#~ msgid "failed to remove: %s"
+#~ msgstr "échec de la suppression de %s"
+
+#~ msgid "The --exec option must be used with the --interactive option"
+#~ msgstr "L'option --exec doit être utilisée avec l'option --interactive"
+
+#~ msgid ""
+#~ "Submodule path '$displaypath' not initialized\n"
+#~ "Maybe you want to use 'update --init'?"
+#~ msgstr ""
+#~ "Chemin de sous-module '$displaypath' non initialisé\n"
+#~ "Peut-être souhaitez-vous utiliser 'update --init' ?"
 
 #~ msgid "Forward-port local commits to the updated upstream head"
 #~ msgstr ""
@@ -12578,9 +15242,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ msgid "Could not append '%s'"
 #~ msgstr "Impossible d'ajouter '%s'"
 
-#~ msgid "Could not set '%s'"
-#~ msgstr "Impossible de définir '%s'"
-
 #~ msgid "Missing author: %s"
 #~ msgstr "Auteur manquant : %s"
 
@@ -12663,9 +15324,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ msgid "-b and -B are mutually exclusive"
 #~ msgstr "-b et -B sont mutuellement exclusifs"
 
-#~ msgid "You need to set your committer info first"
-#~ msgstr "Vous devez d'abord définir vos informations de validateur"
-
 #~ msgid ""
 #~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
 #~ "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
@@ -12712,10 +15370,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ "add/rm <fichier>'\n"
 #~ "si nécessaire pour marquer comme résolu et valider."
 
-#~ msgid "Pull is not possible because you have unmerged files."
-#~ msgstr ""
-#~ "Le pull n'est pas possible car vous avez des fichiers non fusionnés."
-
 #~ msgid "no branch specified"
 #~ msgstr "aucune branche spécifiée"
 
@@ -12767,9 +15421,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ msgid "Failed to lock HEAD during fast_forward_to"
 #~ msgstr "Échec du verrouillage de HEAD pendant l'avance rapide"
 
-#~ msgid "invalid commit: %s"
-#~ msgstr "commit invalide : %s"
-
 #~ msgid "cannot lock HEAD ref"
 #~ msgstr "impossible de verrouiller la référence HEAD"
 
@@ -12922,13 +15573,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "les chemins en entrée sont terminés par le caractère nul"
 
-#~ msgid ""
-#~ "The following untracked files would NOT be saved but need to be removed "
-#~ "by stash save:"
-#~ msgstr ""
-#~ "Les fichiers suivants non suivis ne seront PAS sauvés mais doivent être "
-#~ "supprimés par le remisage :"
-
 #~ msgid ""
 #~ "Aborting. Consider using either the --force or --include-untracked option."
 #~ msgstr "Abandon. Utilisez l'option --force ou --include-untracked."
index 72ef798cdea886c7fae5c0476a33a1506da5b4b7..e4e29ebfd8ce4495fcab8895133c7ce103be0e18 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-03-16 00:16+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+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"
@@ -23,11603 +23,13638 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr ""
 
-#: advice.c:88
-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."
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
 msgstr ""
 
-#: advice.c:101 builtin/merge.c:1226
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
 msgstr ""
 
-#: advice.c:103
-msgid "Please, commit your changes before merging."
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
 msgstr ""
 
-#: advice.c:104
-msgid "Exiting because of unfinished merge."
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
 msgstr ""
 
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
 msgstr ""
 
-#: archive.c:13
-msgid "git archive --list"
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
 msgstr ""
 
-#: archive.c:14
+#: advice.c:101
 msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+"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 ""
 
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
 msgstr ""
 
-#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
-#, c-format
-msgid "pathspec '%s' did not match any files"
+#: advice.c:114 builtin/merge.c:1181
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
-#: archive.c:429
-msgid "fmt"
+#: advice.c:116
+msgid "Please, commit your changes before merging."
 msgstr ""
 
-#: archive.c:429
-msgid "archive format"
+#: advice.c:117
+msgid "Exiting because of unfinished merge."
 msgstr ""
 
-#: archive.c:430 builtin/log.c:1232
-msgid "prefix"
+#: advice.c:123
+#, c-format
+msgid ""
+"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 ""
 
-#: archive.c:431
-msgid "prepend prefix to each pathname in the archive"
+#: apply.c:57
+#, c-format
+msgid "unrecognized whitespace option '%s'"
 msgstr ""
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
 msgstr ""
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
 msgstr ""
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
 msgstr ""
 
-#: archive.c:436
-msgid "report archived files on stderr"
+#: apply.c:130
+msgid "--3way outside a repository"
 msgstr ""
 
-#: archive.c:437
-msgid "store only"
+#: apply.c:141
+msgid "--index outside a repository"
 msgstr ""
 
-#: archive.c:438
-msgid "compress faster"
+#: apply.c:144
+msgid "--cached outside a repository"
 msgstr ""
 
-#: archive.c:446
-msgid "compress better"
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 
-#: archive.c:449
-msgid "list supported archive formats"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
 msgstr ""
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
+#: apply.c:938
+#, c-format
+msgid "unable to find filename in patch at line %d"
 msgstr ""
 
-#: archive.c:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
+#: apply.c:977
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
+#: apply.c:983
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
+#: apply.c:984
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
+#: apply.c:990
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 
-#: branch.c:53
+#: apply.c:1488
 #, 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 "recount: unexpected line: %.*s"
 msgstr ""
 
-#: branch.c:67
+#: apply.c:1557
 #, c-format
-msgid "Not setting branch %s as its own upstream."
+msgid "patch fragment without header at line %d: %.*s"
 msgstr ""
 
-#: branch.c:93
+#: apply.c:1577
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
-msgstr ""
+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] ""
 
-#: branch.c:94
+#: apply.c:1589
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
+msgid "git diff header lacks filename information (line %d)"
 msgstr ""
 
-#: branch.c:98
-#, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
+#: apply.c:1759
+msgid "new file depends on old contents"
 msgstr ""
 
-#: branch.c:99
-#, c-format
-msgid "Branch %s set up to track local branch %s."
+#: apply.c:1761
+msgid "deleted file still has contents"
 msgstr ""
 
-#: branch.c:104
+#: apply.c:1795
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
+msgid "corrupt patch at line %d"
 msgstr ""
 
-#: branch.c:105
+#: apply.c:1832
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
+msgid "new file %s depends on old contents"
 msgstr ""
 
-#: branch.c:109
+#: apply.c:1834
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
+msgid "deleted file %s still has contents"
 msgstr ""
 
-#: branch.c:110
+#: apply.c:1837
 #, c-format
-msgid "Branch %s set up to track local ref %s."
+msgid "** warning: file %s becomes empty but is not deleted"
 msgstr ""
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
+#: apply.c:1984
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
-#: branch.c:156
+#: apply.c:2021
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
+msgid "unrecognized binary patch at line %d"
 msgstr ""
 
-#: branch.c:185
+#: apply.c:2182
 #, c-format
-msgid "'%s' is not a valid branch name."
+msgid "patch with only garbage at line %d"
 msgstr ""
 
-#: branch.c:190
+#: apply.c:2274
 #, c-format
-msgid "A branch named '%s' already exists."
+msgid "unable to read symlink %s"
 msgstr ""
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
+#: apply.c:2278
+#, c-format
+msgid "unable to open or read %s"
 msgstr ""
 
-#: branch.c:218
+#: apply.c:2931
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid "invalid start of line: '%c'"
 msgstr ""
 
-#: branch.c:220
+#: apply.c:3050
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
+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:3062
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 
-#: 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."
+"while searching for:\n"
+"%.*s"
 msgstr ""
 
-#: branch.c:266
+#: apply.c:3090
 #, c-format
-msgid "Not a valid object name: '%s'."
+msgid "missing binary patch data for '%s'"
 msgstr ""
 
-#: branch.c:286
+#: apply.c:3098
 #, c-format
-msgid "Ambiguous object name: '%s'."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
 
-#: branch.c:291
+#: apply.c:3144
 #, c-format
-msgid "Not a valid branch point: '%s'."
+msgid "cannot apply binary patch to '%s' without full index line"
 msgstr ""
 
-#: branch.c:344
+#: apply.c:3154
 #, c-format
-msgid "'%s' is already checked out at '%s'"
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
 msgstr ""
 
-#: bundle.c:34
+#: apply.c:3162
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
+msgid "the patch applies to an empty '%s' but it is not empty"
 msgstr ""
 
-#: bundle.c:61
+#: apply.c:3180
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
+msgid "the necessary postimage %s for '%s' cannot be read"
 msgstr ""
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3193
 #, c-format
-msgid "could not open '%s'"
+msgid "binary patch does not apply to '%s'"
 msgstr ""
 
-#: bundle.c:139
-msgid "Repository lacks these prerequisite commits:"
+#: apply.c:3199
+#, c-format
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 
-#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
+#: apply.c:3220
+#, c-format
+msgid "patch failed: %s:%ld"
 msgstr ""
 
-#: bundle.c:185
+#: apply.c:3342
 #, 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 "cannot checkout %s"
 msgstr ""
 
-#: bundle.c:194
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-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"
+msgid "failed to read %s"
 msgstr ""
 
-#: bundle.c:264
-msgid "pack-objects died"
+#: apply.c:3398
+#, c-format
+msgid "reading from '%s' beyond a symbolic link"
 msgstr ""
 
-#: bundle.c:304
-msgid "rev-list died"
+#: apply.c:3427 apply.c:3667
+#, c-format
+msgid "path %s has been renamed/deleted"
 msgstr ""
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
+msgid "%s: does not exist in index"
 msgstr ""
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
+msgid "%s: does not match index"
 msgstr ""
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
 msgstr ""
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
+msgid "Falling back to three-way merge...\n"
 msgstr ""
 
-#: bundle.c:480
-msgid "index-pack died"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
 msgstr ""
 
-#: color.c:275
+#: apply.c:3589
 #, c-format
-msgid "invalid color value: %.*s"
+msgid "Failed to fall back on three-way merge...\n"
 msgstr ""
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
+msgid "Applied patch to '%s' with conflicts.\n"
 msgstr ""
 
-#: commit.c:42
+#: apply.c:3608
 #, c-format
-msgid "%s %s is not a commit!"
+msgid "Applied patch to '%s' cleanly.\n"
 msgstr ""
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
+#: 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"
+msgid "%s: wrong type"
 msgstr ""
 
-#: config.c:593
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
+msgid "%s has type %o, expected %o"
 msgstr ""
 
-#: config.c:595
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
+msgid "invalid path '%s'"
 msgstr ""
 
-#: config.c:680
+#: apply.c:3917
 #, c-format
-msgid "failed to expand user dir in: '%s'"
+msgid "%s: already exists in index"
 msgstr ""
 
-#: config.c:758 config.c:769
+#: apply.c:3920
 #, c-format
-msgid "bad zlib compression level %d"
+msgid "%s: already exists in working directory"
 msgstr ""
 
-#: config.c:891
+#: apply.c:3940
 #, c-format
-msgid "invalid mode for object creation: %s"
+msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr ""
 
-#: config.c:1220
-msgid "unable to parse command-line config"
+#: apply.c:3945
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
+#: apply.c:3965
+#, c-format
+msgid "affected file '%s' is beyond a symbolic link"
 msgstr ""
 
-#: config.c:1629
+#: apply.c:3969
 #, c-format
-msgid "unable to parse '%s' from command-line config"
+msgid "%s: patch does not apply"
 msgstr ""
 
-#: config.c:1631
+#: apply.c:3984
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
+msgid "Checking patch %s..."
 msgstr ""
 
-#: config.c:1690
+#: apply.c:4075
 #, c-format
-msgid "%s has multiple values"
+msgid "sha1 information is lacking or useless for submodule %s"
 msgstr ""
 
-#: config.c:2226
+#: apply.c:4082
 #, c-format
-msgid "Could not set '%s' to '%s'"
+msgid "mode change for %s, which is not in current HEAD"
 msgstr ""
 
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
+#: apply.c:4085
+#, c-format
+msgid "sha1 information is lacking or useless (%s)."
 msgstr ""
 
-#: connected.c:89
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "failed write to rev-list: %s"
+msgid "make_cache_entry failed for path '%s'"
 msgstr ""
 
-#: connected.c:97
+#: apply.c:4094
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
+msgid "could not add %s to temporary index"
 msgstr ""
 
-#: date.c:95
-msgid "in the future"
+#: apply.c:4104
+#, c-format
+msgid "could not write temporary index to %s"
 msgstr ""
 
-#: date.c:101
+#: apply.c:4242
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to remove %s from index"
+msgstr ""
 
-#: date.c:108
+#: apply.c:4277
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "corrupt patch for submodule %s"
+msgstr ""
 
-#: date.c:115
+#: apply.c:4283
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to stat newly created file '%s'"
+msgstr ""
 
-#: date.c:122
+#: apply.c:4291
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
 
-#: date.c:128
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to add cache entry for %s"
+msgstr ""
 
-#: date.c:135
+#: apply.c:4338
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "failed to write to '%s'"
+msgstr ""
 
-#: date.c:146
+#: apply.c:4342
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] ""
-msgstr[1] ""
+msgid "closing file '%s'"
+msgstr ""
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4412
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] ""
-msgstr[1] ""
+msgid "unable to write file '%s' mode %o"
+msgstr ""
 
-#: date.c:154 date.c:159
+#: apply.c:4510
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
+msgid "Applied patch %s cleanly."
+msgstr ""
+
+#: apply.c:4518
+msgid "internal error"
+msgstr ""
+
+#: apply.c:4521
+#, c-format
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] ""
 msgstr[1] ""
 
-#: diffcore-order.c:24
+#: apply.c:4532
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
+msgid "truncating .rej filename to %.*s.rej"
 msgstr ""
 
-#: diff.c:115
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgid "cannot open %s"
 msgstr ""
 
-#: diff.c:120
+#: apply.c:4554
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
+msgid "Hunk #%d applied cleanly."
 msgstr ""
 
-#: diff.c:215
+#: apply.c:4558
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgid "Rejected hunk #%d."
 msgstr ""
 
-#: diff.c:267
+#: apply.c:4668
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
+msgid "Skipped patch '%s'."
 msgstr ""
 
-#: diff.c:2997
-#, c-format
-msgid "external diff died, stopping at %s"
+#: apply.c:4676
+msgid "unrecognized input"
 msgstr ""
 
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
+#: apply.c:4695
+msgid "unable to read index file"
 msgstr ""
 
-#: diff.c:3556
+#: apply.c:4833
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
+msgid "can't open patch '%s': %s"
 msgstr ""
 
-#: diff.c:3570
+#: apply.c:4858
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr ""
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] ""
+msgstr[1] ""
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr ""
+#: apply.c:4864 apply.c:4879
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] ""
+msgstr[1] ""
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr ""
+#: apply.c:4872
+#, c-format
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] ""
+msgstr[1] ""
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
 msgstr ""
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
+#: 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 ""
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
 msgstr ""
 
-#: gpg-interface.c:222
-#, c-format
-msgid "could not create temporary file '%s': %s"
+#: apply.c:4923
+msgid "apply changes matching the given path"
 msgstr ""
 
-#: gpg-interface.c:225
-#, c-format
-msgid "failed writing detached signature to '%s': %s"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
 msgstr ""
 
-#: grep.c:1718
-#, c-format
-msgid "'%s': unable to read %s"
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 
-#: grep.c:1735
-#, c-format
-msgid "'%s': %s"
+#: apply.c:4929
+msgid "ignore additions made by the patch"
 msgstr ""
 
-#: grep.c:1746
-#, c-format
-msgid "'%s': short read %s"
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
 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?"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
 msgstr ""
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
 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'"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
 msgstr ""
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
 msgstr ""
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
 msgstr ""
 
-#: merge.c:41
-msgid "failed to read the cache"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
 msgstr ""
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
 msgstr ""
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
 msgstr ""
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
 msgstr ""
 
-#: merge-recursive.c:270
-msgid "error building trees"
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
 msgstr ""
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
+#: apply.c:4967
+msgid "apply the patch in reverse"
 msgstr ""
 
-#: merge-recursive.c:700
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
+#: apply.c:4969
+msgid "don't expect at least one line of context"
 msgstr ""
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 
-#: merge-recursive.c:725
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
+#: apply.c:4973
+msgid "allow overlapping hunks"
 msgstr ""
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
+#: 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 ""
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 
-#: merge-recursive.c:790 builtin/clone.c:374
-#, c-format
-msgid "failed to open '%s'"
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
 msgstr ""
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
 msgstr ""
 
-#: merge-recursive.c:801
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
 msgstr ""
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
+#: archive.c:13
+msgid "git archive --list"
 msgstr ""
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: 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."
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
 msgstr ""
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+msgid "pathspec '%s' did not match any files"
 msgstr ""
 
-#: merge-recursive.c:1094
-msgid "rename"
+#: archive.c:429
+msgid "fmt"
 msgstr ""
 
-#: merge-recursive.c:1094
-msgid "renamed"
+#: archive.c:429
+msgid "archive format"
 msgstr ""
 
-#: merge-recursive.c:1150
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
 msgstr ""
 
-#: merge-recursive.c:1172
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
 msgstr ""
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
+#: 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 ""
 
-#: merge-recursive.c:1231
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
 msgstr ""
 
-#: merge-recursive.c:1261
-#, c-format
-msgid "Renaming %s to %s and %s to %s instead"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
 msgstr ""
 
-#: merge-recursive.c:1460
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+#: archive.c:436
+msgid "report archived files on stderr"
 msgstr ""
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
+#: archive.c:437
+msgid "store only"
 msgstr ""
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
+#: archive.c:438
+msgid "compress faster"
 msgstr ""
 
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
+#: archive.c:446
+msgid "compress better"
 msgstr ""
 
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
+#: archive.c:449
+msgid "list supported archive formats"
 msgstr ""
 
-#: merge-recursive.c:1581
-msgid "modify"
+#: 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 ""
 
-#: merge-recursive.c:1581
-msgid "modified"
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
 msgstr ""
 
-#: merge-recursive.c:1591
-msgid "content"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
 msgstr ""
 
-#: merge-recursive.c:1598
-msgid "add/add"
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
 msgstr ""
 
-#: merge-recursive.c:1632
-#, c-format
-msgid "Skipped %s (merged same as existing)"
+#: archive.c:461
+msgid "Unexpected option --remote"
 msgstr ""
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
 msgstr ""
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
+#: archive.c:465
+msgid "Unexpected option --output"
 msgstr ""
 
-#: merge-recursive.c:1651
+#: archive.c:487
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
+msgid "Unknown archive format '%s'"
 msgstr ""
 
-#: merge-recursive.c:1737
+#: archive.c:494
 #, c-format
-msgid "Removing %s"
+msgid "Argument not supported for format '%s': -%d"
 msgstr ""
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:1768
-msgid "directory/file"
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
 
-#: merge-recursive.c:1773
+#: bisect.c:441
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgid "Could not open file '%s'"
 msgstr ""
 
-#: merge-recursive.c:1783
+#: bisect.c:446
 #, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
+msgid "Badly quoted content in file '%s': %s"
 msgstr ""
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr ""
-
-#: merge-recursive.c:1828
+#: bisect.c:655
 #, c-format
-msgid "merging of trees %s and %s failed"
+msgid "We cannot bisect more!\n"
 msgstr ""
 
-#: merge-recursive.c:1858
+#: bisect.c:708
 #, c-format
-msgid "Unprocessed path??? %s"
+msgid "Not a valid commit name %s"
 msgstr ""
 
-#: merge-recursive.c:1906
-msgid "Merging:"
+#: 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 ""
 
-#: merge-recursive.c:1919
+#: bisect.c:737
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
 msgstr ""
 
-#: merge-recursive.c:2013
+#: bisect.c:742
 #, c-format
-msgid "Could not parse object '%s'"
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
 msgstr ""
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
+#: 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 ""
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
+#: 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 ""
 
-#: notes-utils.c:100
+#: bisect.c:798
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
+msgid "Bisecting: a merge base must be tested\n"
 msgstr ""
 
-#: notes-utils.c:110
+#: bisect.c:849
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgid "a %s revision is needed"
 msgstr ""
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "Bad %s value: '%s'"
+msgid "could not create file '%s'"
 msgstr ""
 
-#: object.c:242
+#: bisect.c:917
 #, c-format
-msgid "unable to parse object: %s"
+msgid "could not read file '%s'"
 msgstr ""
 
-#: parse-options.c:570
-msgid "..."
+#: bisect.c:947
+msgid "reading bisect refs failed"
 msgstr ""
 
-#: parse-options.c:588
+#: bisect.c:967
 #, c-format
-msgid "usage: %s"
+msgid "%s was both %s and %s\n"
 msgstr ""
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: bisect.c:975
 #, c-format
-msgid "   or: %s"
+msgid ""
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
 
-#: parse-options.c:595
+#: bisect.c:994
 #, c-format
-msgid "    %s"
-msgstr ""
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] ""
+msgstr[1] ""
 
-#: parse-options.c:629
-msgid "-NUM"
-msgstr ""
+#. 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] ""
+msgstr[1] ""
 
-#: parse-options-cb.c:108
+#: branch.c:53
 #, c-format
-msgid "malformed object name '%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 ""
 
-#: path.c:752
+#: branch.c:67
 #, c-format
-msgid "Could not make %s writable by group"
+msgid "Not setting branch %s as its own upstream."
 msgstr ""
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
 msgstr ""
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+#: branch.c:94
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
 msgstr ""
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
 msgstr ""
 
-#: pathspec.c:183
+#: branch.c:99
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgid "Branch %s set up to track local branch %s."
 msgstr ""
 
-#: pathspec.c:187
+#: branch.c:104
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgid "Branch %s set up to track remote ref %s by rebasing."
 msgstr ""
 
-#: pathspec.c:205
+#: branch.c:105
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgid "Branch %s set up to track remote ref %s."
 msgstr ""
 
-#: pathspec.c:230
+#: branch.c:109
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
 
-#: pathspec.c:241
+#: branch.c:110
 #, c-format
-msgid "%s: '%s' is outside repository"
+msgid "Branch %s set up to track local ref %s."
 msgstr ""
 
-#: pathspec.c:291
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
 msgstr ""
 
-#: pathspec.c:353
+#: branch.c:156
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
+msgid "Not tracking: ambiguous information for ref %s"
 msgstr ""
 
-#: pathspec.c:433
+#: branch.c:185
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
+msgid "'%s' is not a valid branch name."
 msgstr ""
 
-#: pathspec.c:442
-msgid ""
-"There is nothing to exclude from by :(exclude) patterns.\n"
-"Perhaps you forgot to add either ':/' or '.' ?"
+#: branch.c:190
+#, c-format
+msgid "A branch named '%s' already exists."
 msgstr ""
 
-#: pretty.c:969
-msgid "unable to parse --pretty format"
+#: branch.c:198
+msgid "Cannot force update the current branch."
 msgstr ""
 
-#: progress.c:235
-msgid "done"
+#: branch.c:218
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
 msgstr ""
 
-#: read-cache.c:1281
+#: branch.c:220
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+msgid "the requested upstream branch '%s' does not exist"
 msgstr ""
 
-#: read-cache.c:1291
-#, c-format
+#: branch.c:222
 msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+"\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 ""
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: branch.c:265
 #, c-format
-msgid "Could not open '%s' for writing"
+msgid "Not a valid object name: '%s'."
 msgstr ""
 
-#: refs/files-backend.c:2374
+#: branch.c:285
 #, c-format
-msgid "could not delete reference %s: %s"
+msgid "Ambiguous object name: '%s'."
 msgstr ""
 
-#: refs/files-backend.c:2377
+#: branch.c:290
 #, c-format
-msgid "could not delete references: %s"
+msgid "Not a valid branch point: '%s'."
 msgstr ""
 
-#: refs/files-backend.c:2386
+#: branch.c:344
 #, c-format
-msgid "could not remove reference %s"
+msgid "'%s' is already checked out at '%s'"
 msgstr ""
 
-#: ref-filter.c:55
+#: branch.c:363
 #, c-format
-msgid "expected format: %%(color:<color>)"
+msgid "HEAD of working tree %s is not updated"
 msgstr ""
 
-#: ref-filter.c:57
+#: bundle.c:34
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
+msgid "'%s' does not look like a v2 bundle file"
 msgstr ""
 
-#: ref-filter.c:71
+#: bundle.c:61
 #, c-format
-msgid "unrecognized format: %%(%s)"
+msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: ref-filter.c:77
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "%%(body) does not take arguments"
+msgid "could not open '%s'"
 msgstr ""
 
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: ref-filter.c:101
-#, c-format
-msgid "positive value expected contents:lines=%s"
+#: 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 ""
 
-#: ref-filter.c:103
+#: bundle.c:185
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
+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."
 msgstr ""
 
-#: ref-filter.c:113
+#: bundle.c:194
 #, c-format
-msgid "unrecognized %%(objectname) argument: %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 ""
 
-#: ref-filter.c:135
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
+#: bundle.c:264
+msgid "pack-objects died"
 msgstr ""
 
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
+#: bundle.c:304
+msgid "rev-list died"
 msgstr ""
 
-#: ref-filter.c:151
+#: bundle.c:353
 #, c-format
-msgid "unrecognized width:%s"
+msgid "ref '%s' is excluded by the rev-list options"
 msgstr ""
 
-#: ref-filter.c:157
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
+msgid "unrecognized argument: %s"
 msgstr ""
 
-#: ref-filter.c:161
-#, c-format
-msgid "positive width expected with the %%(align) atom"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
 msgstr ""
 
-#: ref-filter.c:244
+#: bundle.c:463
 #, c-format
-msgid "malformed field name: %.*s"
+msgid "cannot create '%s'"
 msgstr ""
 
-#: ref-filter.c:270
+#: bundle.c:491
+msgid "index-pack died"
+msgstr ""
+
+#: color.c:290
 #, c-format
-msgid "unknown field name: %.*s"
+msgid "invalid color value: %.*s"
 msgstr ""
 
-#: ref-filter.c:372
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
+msgid "could not parse %s"
 msgstr ""
 
-#: ref-filter.c:424
+#: commit.c:42
 #, c-format
-msgid "malformed format string %s"
+msgid "%s %s is not a commit!"
 msgstr ""
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
+#: commit.c:1514
+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 ""
 
-#: ref-filter.c:883
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr ""
+
+#: config.c:516
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
+msgid "bad config line %d in blob %s"
 msgstr ""
 
-#: ref-filter.c:1046
+#: config.c:520
 #, c-format
-msgid "unknown %.*s format %s"
+msgid "bad config line %d in file %s"
 msgstr ""
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: config.c:524
 #, c-format
-msgid "missing object %s for %s"
+msgid "bad config line %d in standard input"
 msgstr ""
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: config.c:528
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
+msgid "bad config line %d in submodule-blob %s"
 msgstr ""
 
-#: ref-filter.c:1311
+#: config.c:532
 #, c-format
-msgid "malformed object at '%s'"
+msgid "bad config line %d in command line %s"
 msgstr ""
 
-#: ref-filter.c:1373
+#: config.c:536
 #, c-format
-msgid "ignoring ref with broken name %s"
+msgid "bad config line %d in %s"
 msgstr ""
 
-#: ref-filter.c:1378
+#: config.c:655
+msgid "out of range"
+msgstr ""
+
+#: config.c:655
+msgid "invalid unit"
+msgstr ""
+
+#: config.c:661
 #, c-format
-msgid "ignoring broken ref %s"
+msgid "bad numeric config value '%s' for '%s': %s"
 msgstr ""
 
-#: ref-filter.c:1651
+#: config.c:666
 #, c-format
-msgid "format: %%(end) atom missing"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
 msgstr ""
 
-#: ref-filter.c:1705
+#: config.c:669
 #, c-format
-msgid "malformed object name %s"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
 msgstr ""
 
-#: remote.c:745
+#: config.c:672
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
 msgstr ""
 
-#: remote.c:749
+#: config.c:675
 #, c-format
-msgid "%s usually tracks %s, not %s"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr ""
 
-#: remote.c:753
+#: config.c:678
 #, c-format
-msgid "%s tracks both %s and %s"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
 msgstr ""
 
-#: remote.c:761
-msgid "Internal error"
+#: config.c:681
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
 msgstr ""
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
+#: config.c:768
+#, c-format
+msgid "failed to expand user dir in: '%s'"
 msgstr ""
 
-#: remote.c:1686
+#: config.c:852 config.c:863
 #, c-format
-msgid "no such branch: '%s'"
+msgid "bad zlib compression level %d"
 msgstr ""
 
-#: remote.c:1689
+#: config.c:978
 #, c-format
-msgid "no upstream configured for branch '%s'"
+msgid "invalid mode for object creation: %s"
 msgstr ""
 
-#: remote.c:1695
+#: 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 "upstream branch '%s' not stored as a remote-tracking branch"
+msgid "unable to parse '%s' from command-line config"
 msgstr ""
 
-#: remote.c:1710
+#: config.c:1718
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgid "bad config variable '%s' in file '%s' at line %d"
 msgstr ""
 
-#: remote.c:1725
+#: config.c:1777
 #, c-format
-msgid "branch '%s' has no remote for pushing"
+msgid "%s has multiple values"
 msgstr ""
 
-#: remote.c:1736
+#: config.c:2311
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
+msgid "could not set '%s' to '%s'"
 msgstr ""
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
 msgstr ""
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
 msgstr ""
 
-#: remote.c:2073
+#: 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 ""
+
+#: 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 ""
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr ""
+
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr ""
+
+#: convert.c:201
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgid ""
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
 msgstr ""
 
-#: remote.c:2080
+#: convert.c:211
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
+msgid ""
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
 
-#: remote.c:2084
+#: convert.c:215
 #, 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"
+msgid "LF would be replaced by CRLF in %s"
+msgstr ""
+
+#: date.c:97
+msgid "in the future"
+msgstr ""
+
+#: date.c:103
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
+#: date.c:110
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: remote.c:2093
+#: date.c:117
 #, 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"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: remote.c:2104
+#: date.c:130
 #, 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"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
 msgstr[0] ""
 msgstr[1] ""
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] ""
+msgstr[1] ""
 
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr ""
+#: 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] ""
 
-#: revision.c:2134
+#: date.c:156 date.c:161
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
+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 ""
 
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
 msgstr ""
 
-#: run-command.c:92
-msgid "open /dev/null failed"
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
 msgstr ""
 
-#: run-command.c:94
+#: diff.c:124
 #, c-format
-msgid "dup2(%d,%d) failed"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
 msgstr ""
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
+#: diff.c:283
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
 
-#: send-pack.c:406
+#: diff.c:346
+#, c-format
 msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
 msgstr ""
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
+#: diff.c:3087
+#, c-format
+msgid "external diff died, stopping at %s"
 msgstr ""
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 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'"
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
 msgstr ""
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: diff.c:3665
 #, c-format
-msgid "Could not write to %s"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
 msgstr ""
 
-#: sequencer.c:193
+#: diff.c:3679
 #, c-format
-msgid "Error wrapping up %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
 msgstr ""
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
 msgstr ""
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
+#: diff.c:4706
+#, c-format
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
 msgstr ""
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
-#, c-format
-msgid "%s: Unable to write new index file"
+#: dir.c:1866
+msgid "failed to get kernel name and information"
 msgstr ""
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
 msgstr ""
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
 msgstr ""
 
-#: sequencer.c:390
-#, c-format
-msgid "Could not parse commit %s\n"
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
 msgstr ""
 
-#: sequencer.c:395
+#: fetch-pack.c:243
 #, c-format
-msgid "Could not parse parent commit %s\n"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
 msgstr ""
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr ""
 
-#: sequencer.c:479
+#: fetch-pack.c:381
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
+msgid "invalid shallow line: %s"
 msgstr ""
 
-#: sequencer.c:487
+#: fetch-pack.c:387
 #, c-format
-msgid "Commit %s does not have parent %d"
+msgid "invalid unshallow line: %s"
 msgstr ""
 
-#: sequencer.c:491
+#: fetch-pack.c:389
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
+msgid "object not found: %s"
 msgstr ""
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: fetch-pack.c:392
 #, c-format
-msgid "%s: cannot parse parent commit %s"
+msgid "error in object: %s"
 msgstr ""
 
-#: sequencer.c:508
+#: fetch-pack.c:394
 #, c-format
-msgid "Cannot get commit message for %s"
+msgid "no shallow found: %s"
 msgstr ""
 
-#: sequencer.c:594
+#: fetch-pack.c:397
 #, c-format
-msgid "could not revert %s... %s"
+msgid "expected shallow/unshallow, got %s"
 msgstr ""
 
-#: sequencer.c:595
+#: fetch-pack.c:436
 #, c-format
-msgid "could not apply %s... %s"
+msgid "got %s %d %s"
 msgstr ""
 
-#: sequencer.c:630
-msgid "empty commit set passed"
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
 msgstr ""
 
-#: sequencer.c:638
-#, c-format
-msgid "git %s: failed to read the index"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr ""
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
 msgstr ""
 
-#: sequencer.c:642
+#: fetch-pack.c:505
 #, c-format
-msgid "git %s: failed to refresh the index"
+msgid "got %s (%d) %s"
 msgstr ""
 
-#: sequencer.c:702
+#: fetch-pack.c:551
 #, c-format
-msgid "Cannot %s during a %s"
+msgid "Marking %s as complete"
 msgstr ""
 
-#: sequencer.c:724
+#: fetch-pack.c:697
 #, c-format
-msgid "Could not parse line %d."
+msgid "already have %s (%s)"
 msgstr ""
 
-#: sequencer.c:729
-msgid "No commits parsed."
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr ""
 
-#: sequencer.c:741
-#, c-format
-msgid "Could not open %s"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
 msgstr ""
 
-#: sequencer.c:745
+#: fetch-pack.c:799
 #, c-format
-msgid "Could not read %s."
+msgid "fetch-pack: unable to fork off %s"
 msgstr ""
 
-#: sequencer.c:752
+#: fetch-pack.c:815
 #, c-format
-msgid "Unusable instruction sheet: %s"
+msgid "%s failed"
 msgstr ""
 
-#: sequencer.c:782
-#, c-format
-msgid "Invalid key: %s"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
 msgstr ""
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
 msgstr ""
 
-#: sequencer.c:795
-#, c-format
-msgid "Malformed options sheet: %s"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
 msgstr ""
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
 msgstr ""
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
 msgstr ""
 
-#: sequencer.c:819
-#, c-format
-msgid "Could not create sequencer directory %s"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
 msgstr ""
 
-#: sequencer.c:835 sequencer.c:917
-#, c-format
-msgid "Error wrapping up %s."
+#: fetch-pack.c:865
+msgid "Server supports side-band"
 msgstr ""
 
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
 msgstr ""
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
 msgstr ""
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
 msgstr ""
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: fetch-pack.c:890
 #, c-format
-msgid "cannot open %s: %s"
+msgid "Server version is %.*s"
 msgstr ""
 
-#: sequencer.c:881
-#, c-format
-msgid "cannot read %s: %s"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
 msgstr ""
 
-#: sequencer.c:882
-msgid "unexpected end of file"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
 msgstr ""
 
-#: sequencer.c:888
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
 msgstr ""
 
-#: sequencer.c:910
-#, c-format
-msgid "Could not format %s."
+#: fetch-pack.c:913
+msgid "no common commits"
 msgstr ""
 
-#: sequencer.c:1055
-#, c-format
-msgid "%s: can't cherry-pick a %s"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
 msgstr ""
 
-#: sequencer.c:1058
-#, c-format
-msgid "%s: bad revision"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
 msgstr ""
 
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
 msgstr ""
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
 msgstr ""
 
-#: setup.c:246
+#: gpg-interface.c:217
 #, c-format
-msgid "failed to read %s"
+msgid "failed writing detached signature to '%s'"
 msgstr ""
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
+#: grep.c:1782
+#, c-format
+msgid "'%s': unable to read %s"
 msgstr ""
 
-#: sha1_file.c:2459
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
+msgid "failed to stat '%s'"
 msgstr ""
 
-#: sha1_file.c:2463
+#: grep.c:1810
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
+msgid "'%s': short read"
 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\""
+#: help.c:203
+#, c-format
+msgid "available git commands in '%s'"
 msgstr ""
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
 msgstr ""
 
-#: submodule.c:66 submodule.c:100
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
 msgstr ""
 
-#: submodule.c:74
+#: help.c:306
 #, c-format
-msgid "Could not update .gitmodules entry %s"
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
 
-#: submodule.c:107
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
 msgstr ""
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
+#: help.c:383
+#, 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 ""
 
-#: trailer.c:237
+#: help.c:388
 #, c-format
-msgid "running trailer command '%s' failed"
+msgid "in %0.1f seconds automatically..."
 msgstr ""
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: help.c:395
 #, c-format
-msgid "unknown value '%s' for key '%s'"
+msgid "git: '%s' is not a git command. See 'git --help'."
 msgstr ""
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: help.c:461
 #, c-format
-msgid "more than one %s"
+msgid "%s: %s - %s"
+msgstr ""
+
+#: 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 ""
 
-#: trailer.c:582
+#: lockfile.c:152
 #, c-format
-msgid "empty trailer token in 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 ""
 
-#: trailer.c:702
+#: lockfile.c:160
 #, c-format
-msgid "could not read input file '%s'"
+msgid "Unable to create '%s.lock': %s"
 msgstr ""
 
-#: trailer.c:705
-msgid "could not read from stdin"
+#: merge.c:41
+msgid "failed to read the cache"
 msgstr ""
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
+#: 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 ""
 
-#: trailer.c:859
-#, c-format
-msgid "file %s is not a regular file"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
 msgstr ""
 
-#: trailer.c:861
+#: merge-recursive.c:231
 #, c-format
-msgid "file %s is not writable by user"
+msgid "addinfo_cache failed for path '%s'"
 msgstr ""
 
-#: trailer.c:873
-msgid "could not open temporary file"
+#: merge-recursive.c:301
+msgid "error building trees"
 msgstr ""
 
-#: trailer.c:912
+#: merge-recursive.c:720
 #, c-format
-msgid "could not rename temporary file to %s"
+msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: transport-helper.c:1041
+#: merge-recursive.c:731
 #, c-format
-msgid "Could not read ref %s"
+msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
-#: unpack-trees.c:203
-msgid "Checking out files"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
+#: merge-recursive.c:754
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "invalid %XX escape sequence"
+msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
+#: merge-recursive.c:798
+#, c-format
+msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
+#: merge-recursive.c:822
+#, c-format
+msgid "failed to open '%s': %s"
 msgstr ""
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
+#: merge-recursive.c:833
+#, c-format
+msgid "failed to symlink '%s': %s"
 msgstr ""
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
+#: merge-recursive.c:838
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
 msgstr ""
 
-#: wrapper.c:222 wrapper.c:381
+#: merge-recursive.c:982
 #, c-format
-msgid "could not open '%s' for reading and writing"
+msgid "Unable to add %s to database"
 msgstr ""
 
-#: wrapper.c:224 wrapper.c:383
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
-msgid "could not open '%s' for writing"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "could not open '%s' for reading"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
 msgstr ""
 
-#: wrapper.c:611
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr ""
+
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr ""
+
+#: merge-recursive.c:1200
 #, c-format
-msgid "unable to access '%s': %s"
+msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: wrapper.c:632
+#: merge-recursive.c:1225
 #, c-format
-msgid "unable to access '%s'"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
 msgstr ""
 
-#: wrapper.c:667
+#: merge-recursive.c:1292
 #, c-format
-msgid "could not open %s for writing"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: wrapper.c:678 builtin/am.c:410
+#: merge-recursive.c:1325
 #, c-format
-msgid "could not write to %s"
+msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: wrapper.c:684
+#: merge-recursive.c:1531
 #, c-format
-msgid "could not close %s"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
 msgstr ""
 
-#: wt-status.c:176 wt-status.c:203
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgid "Adding as %s instead"
 msgstr ""
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
 msgstr ""
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
+#: merge-recursive.c:1613
+#, c-format
+msgid "object %s is not a blob"
 msgstr ""
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: merge-recursive.c:1666
+msgid "modify"
 msgstr ""
 
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
+#: merge-recursive.c:1666
+msgid "modified"
 msgstr ""
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
+#: merge-recursive.c:1676
+msgid "content"
 msgstr ""
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
+#: merge-recursive.c:1683
+msgid "add/add"
 msgstr ""
 
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
+#: merge-recursive.c:1718
+#, c-format
+msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: wt-status.c:221
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+#: merge-recursive.c:1732
+#, c-format
+msgid "Auto-merging %s"
 msgstr ""
 
-#: wt-status.c:222
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
 msgstr ""
 
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: merge-recursive.c:1737
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: wt-status.c:236
+#: merge-recursive.c:1831
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid "Removing %s"
 msgstr ""
 
-#: wt-status.c:251
-msgid "both deleted:"
+#: merge-recursive.c:1857
+msgid "file/directory"
 msgstr ""
 
-#: wt-status.c:253
-msgid "added by us:"
+#: merge-recursive.c:1863
+msgid "directory/file"
 msgstr ""
 
-#: wt-status.c:255
-msgid "deleted by them:"
+#: merge-recursive.c:1868
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: wt-status.c:257
-msgid "added by them:"
+#: merge-recursive.c:1877
+#, c-format
+msgid "Adding %s"
 msgstr ""
 
-#: wt-status.c:259
-msgid "deleted by us:"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
 msgstr ""
 
-#: wt-status.c:261
-msgid "both added:"
+#: merge-recursive.c:1923
+#, c-format
+msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: wt-status.c:263
-msgid "both modified:"
+#: merge-recursive.c:2006
+msgid "Merging:"
 msgstr ""
 
-#: wt-status.c:265
+#: merge-recursive.c:2019
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr ""
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] ""
+msgstr[1] ""
 
-#: wt-status.c:273
-msgid "new file:"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
 msgstr ""
 
-#: wt-status.c:275
-msgid "copied:"
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
 msgstr ""
 
-#: wt-status.c:277
-msgid "deleted:"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
 msgstr ""
 
-#: wt-status.c:279
-msgid "modified:"
+#: 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 ""
 
-#: wt-status.c:281
-msgid "renamed:"
+#: notes-merge.c:280
+#, c-format
+msgid "You have not concluded your notes merge (%s exists)."
 msgstr ""
 
-#: wt-status.c:283
-msgid "typechange:"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
 msgstr ""
 
-#: wt-status.c:285
-msgid "unknown:"
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
 msgstr ""
 
-#: wt-status.c:287
-msgid "unmerged:"
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
 msgstr ""
 
-#: wt-status.c:369
-msgid "new commits, "
+#. 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 ""
 
-#: wt-status.c:371
-msgid "modified content, "
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
 msgstr ""
 
-#: wt-status.c:373
-msgid "untracked content, "
+#: parse-options.c:572
+msgid "..."
 msgstr ""
 
-#: wt-status.c:390
+#: parse-options.c:590
 #, c-format
-msgid "bug: unhandled diff status %c"
+msgid "usage: %s"
 msgstr ""
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
+#, c-format
+msgid "   or: %s"
 msgstr ""
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
 msgstr ""
 
-#: wt-status.c:837
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+#: parse-options.c:631
+msgid "-NUM"
 msgstr ""
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
 msgstr ""
 
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
+#: path.c:826
+#, c-format
+msgid "Could not make %s writable by group"
 msgstr ""
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
 msgstr ""
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
 msgstr ""
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr ""
-
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr ""
-
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr ""
-
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr ""
-
-#: wt-status.c:1105
-msgid "No commands done."
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
 msgstr ""
 
-#: wt-status.c:1108
+#: pathspec.c:187
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr ""
 
-#: wt-status.c:1119
+#: pathspec.c:205
 #, c-format
-msgid "  (see more in file %s)"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
 msgstr ""
 
-#: wt-status.c:1124
-msgid "No commands remaining."
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
 msgstr ""
 
-#: wt-status.c:1127
+#: pathspec.c:241
 #, 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:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgid "%s: '%s' is outside repository"
 msgstr ""
 
-#: wt-status.c:1148
+#: pathspec.c:291
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
+msgid "Pathspec '%s' is in submodule '%.*s'"
 msgstr ""
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
 msgstr ""
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
+#: pathspec.c:408
+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:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
+#: pathspec.c:440
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
 msgstr ""
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
+#: pathspec.c:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 msgstr ""
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
 msgstr ""
 
-#: wt-status.c:1181
+#: read-cache.c:1315
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
 
-#: wt-status.c:1193
+#: read-cache.c:1325
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr ""
-
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr ""
-
-#: wt-status.c:1203
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
 
-#: wt-status.c:1213
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid "You are currently cherry-picking commit %s."
+msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+#: refs/files-backend.c:2481
+#, c-format
+msgid "could not delete reference %s: %s"
 msgstr ""
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: refs/files-backend.c:2484
+#, c-format
+msgid "could not delete references: %s"
 msgstr ""
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
 msgstr ""
 
-#: wt-status.c:1232
+#: ref-filter.c:55
 #, c-format
-msgid "You are currently reverting commit %s."
+msgid "expected format: %%(color:<color>)"
 msgstr ""
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
 msgstr ""
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
 msgstr ""
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
 msgstr ""
 
-#: wt-status.c:1253
+#: ref-filter.c:84
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
+msgid "%%(subject) does not take arguments"
 msgstr ""
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
+#: ref-filter.c:101
+#, c-format
+msgid "positive value expected contents:lines=%s"
 msgstr ""
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
+#: ref-filter.c:103
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
 msgstr ""
 
-#: wt-status.c:1438
-msgid "On branch "
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
 msgstr ""
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
+#: ref-filter.c:135
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
 msgstr ""
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
 msgstr ""
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
+#: ref-filter.c:151
+#, c-format
+msgid "unrecognized width:%s"
 msgstr ""
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
 msgstr ""
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
+#: ref-filter.c:161
+#, c-format
+msgid "positive width expected with the %%(align) atom"
 msgstr ""
 
-#: wt-status.c:1474
-msgid "Initial commit"
+#: ref-filter.c:244
+#, c-format
+msgid "malformed field name: %.*s"
 msgstr ""
 
-#: wt-status.c:1488
-msgid "Untracked files"
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
 msgstr ""
 
-#: wt-status.c:1490
-msgid "Ignored files"
+#: ref-filter.c:372
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
 msgstr ""
 
-#: wt-status.c:1494
+#: ref-filter.c:424
 #, 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')."
+msgid "malformed format string %s"
 msgstr ""
 
-#: wt-status.c:1500
-#, c-format
-msgid "Untracked files not listed%s"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
 msgstr ""
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
+#: ref-filter.c:883
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
 msgstr ""
 
-#: wt-status.c:1508
-msgid "No changes"
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
 msgstr ""
 
-#: wt-status.c:1513
+#: ref-filter.c:1066 ref-filter.c:1097
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgid "missing object %s for %s"
 msgstr ""
 
-#: wt-status.c:1516
+#: ref-filter.c:1069 ref-filter.c:1100
 #, c-format
-msgid "no changes added to commit\n"
+msgid "parse_object_buffer failed on %s for %s"
 msgstr ""
 
-#: wt-status.c:1519
+#: ref-filter.c:1311
 #, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+msgid "malformed object at '%s'"
 msgstr ""
 
-#: wt-status.c:1522
+#: ref-filter.c:1373
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+msgid "ignoring ref with broken name %s"
 msgstr ""
 
-#: wt-status.c:1525
+#: ref-filter.c:1378
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid "ignoring broken ref %s"
 msgstr ""
 
-#: wt-status.c:1528 wt-status.c:1533
+#: ref-filter.c:1633
 #, c-format
-msgid "nothing to commit\n"
+msgid "format: %%(end) atom missing"
 msgstr ""
 
-#: wt-status.c:1531
+#: ref-filter.c:1687
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid "malformed object name %s"
 msgstr ""
 
-#: wt-status.c:1535
+#: remote.c:746
 #, c-format
-msgid "nothing to commit, working directory clean\n"
+msgid "Cannot fetch both %s and %s to %s"
 msgstr ""
 
-#: wt-status.c:1642
-msgid "Initial commit on "
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
 msgstr ""
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
+#: remote.c:754
+#, c-format
+msgid "%s tracks both %s and %s"
 msgstr ""
 
-#: wt-status.c:1675
-msgid "gone"
+#: remote.c:762
+msgid "Internal error"
 msgstr ""
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
 msgstr ""
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
+#: remote.c:1686
+#, c-format
+msgid "no such branch: '%s'"
 msgstr ""
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: remote.c:1689
 #, c-format
-msgid "failed to unlink '%s'"
+msgid "no upstream configured for branch '%s'"
 msgstr ""
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
+#: remote.c:1695
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 
-#: builtin/add.c:65
+#: remote.c:1710
 #, c-format
-msgid "unexpected diff status %c"
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
 msgstr ""
 
-#: builtin/add.c:80
+#: remote.c:1736
 #, c-format
-msgid "remove '%s'\n"
+msgid "push refspecs for '%s' do not include '%s'"
 msgstr ""
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
 msgstr ""
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
 msgstr ""
 
-#: builtin/add.c:205
+#: remote.c:2073
 #, c-format
-msgid "Could not open '%s' for writing."
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
 msgstr ""
 
-#: builtin/add.c:209
-msgid "Could not write patch"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr ""
 
-#: builtin/add.c:212
-msgid "editing patch failed"
+#: remote.c:2080
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
 msgstr ""
 
-#: builtin/add.c:215
+#: remote.c:2084
 #, c-format
-msgid "Could not stat '%s'"
-msgstr ""
+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] ""
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
 msgstr ""
 
-#: builtin/add.c:222
+#: remote.c:2093
 #, c-format
-msgid "Could not apply '%s'"
-msgstr ""
-
-#: builtin/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr ""
+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] ""
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
 msgstr ""
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr ""
+#: remote.c:2104
+#, 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] ""
 
-#: builtin/add.c:252
-msgid "interactive picking"
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
 msgstr ""
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
 msgstr ""
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
+#: revision.c:2161
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
 msgstr ""
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
 msgstr ""
 
-#: builtin/add.c:256
-msgid "update tracked files"
+#: run-command.c:106
+msgid "open /dev/null failed"
 msgstr ""
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
+#: run-command.c:108
+#, c-format
+msgid "dup2(%d,%d) failed"
 msgstr ""
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
 msgstr ""
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
 msgstr ""
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
 msgstr ""
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
 msgstr ""
 
-#: builtin/add.c:287
-#, c-format
-msgid "Use -f if you really want to add them.\n"
+#: sequencer.c:171
+msgid "revert"
 msgstr ""
 
-#: builtin/add.c:294
-msgid "adding files failed"
+#: sequencer.c:171
+msgid "cherry-pick"
 msgstr ""
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
+#: sequencer.c:228
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
+#: sequencer.c:231
+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:352
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "Nothing specified, nothing added.\n"
+msgid "could not lock '%s'"
 msgstr ""
 
-#: builtin/add.c:353
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
+msgid "could not write to '%s'"
 msgstr ""
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
 msgstr ""
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
 msgstr ""
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
 msgid "could not read '%s'"
 msgstr ""
 
-#: builtin/am.c:430
-msgid "could not parse author script"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
 msgstr ""
 
-#: builtin/am.c:507
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
 msgstr ""
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: sequencer.c:324
 #, c-format
-msgid "Malformed input line: '%s'."
+msgid "%s: fast-forward"
 msgstr ""
 
-#: builtin/am.c:585 builtin/notes.c:315
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
+msgid "%s: Unable to write new index file"
 msgstr ""
 
-#: builtin/am.c:611
-msgid "fseek failed"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
 msgstr ""
 
-#: builtin/am.c:772 builtin/am.c:860
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr ""
+
+#: sequencer.c:483
 #, c-format
-msgid "could not open '%s' for reading: %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 ""
 
-#: builtin/am.c:779
+#: sequencer.c:567
 #, c-format
-msgid "could not open '%s' for writing: %s"
+msgid "could not parse commit %s\n"
 msgstr ""
 
-#: builtin/am.c:788
+#: sequencer.c:572
 #, c-format
-msgid "could not parse patch '%s'"
+msgid "could not parse parent commit %s\n"
 msgstr ""
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
+#: sequencer.c:656
+msgid "your index file is unmerged."
 msgstr ""
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
+#: sequencer.c:675
+#, c-format
+msgid "commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
 msgstr ""
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
+#: sequencer.c:687
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: sequencer.c:705
 #, c-format
-msgid "failed to create directory '%s'"
+msgid "cannot get commit message for %s"
 msgstr ""
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
 msgstr ""
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr ""
+
+#: sequencer.c:833
+msgid "empty commit set passed"
 msgstr ""
 
-#: builtin/am.c:1188
+#: sequencer.c:843
 #, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
+msgid "git %s: failed to read the index"
 msgstr ""
 
-#: builtin/am.c:1189
+#: sequencer.c:850
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: builtin/am.c:1190
+#: sequencer.c:944
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgid "invalid line %d: %.*s"
 msgstr ""
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
+#: sequencer.c:950
+msgid "no commits parsed."
 msgstr ""
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: sequencer.c:966
 #, c-format
-msgid "invalid ident line: %s"
+msgid "could not read '%s'."
 msgstr ""
 
-#: builtin/am.c:1429
+#: sequencer.c:972
 #, c-format
-msgid "unable to parse commit %s"
+msgid "unusable instruction sheet: '%s'"
 msgstr ""
 
-#: builtin/am.c:1631
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
 msgstr ""
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
 msgstr ""
 
-#: builtin/am.c:1652
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
 msgstr ""
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
 msgstr ""
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
 msgstr ""
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
 msgstr ""
 
-#: builtin/am.c:1749 builtin/am.c:1753
-#, c-format
-msgid "cannot resume: %s does not exist."
+#: sequencer.c:1120
+msgid "could not lock HEAD"
 msgstr ""
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
 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:1784
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: builtin/am.c:1834
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/am.c:1869 builtin/am.c:1941
+#: sequencer.c:1177
 #, c-format
-msgid "Applying: %.*s"
+msgid "cannot read '%s': %s"
 msgstr ""
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
+#: sequencer.c:1178
+msgid "unexpected end of file"
 msgstr ""
 
-#: builtin/am.c:1893
+#: sequencer.c:1184
 #, c-format
-msgid "Patch failed at %s %.*s"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#: builtin/am.c:1899
+#: sequencer.c:1354
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
+msgid "%s: can't cherry-pick a %s"
 msgstr ""
 
-#: builtin/am.c:1944
-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:1358
+#, c-format
+msgid "%s: bad revision"
 msgstr ""
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
 msgstr ""
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: setup.c:160
 #, c-format
-msgid "Could not parse object '%s'."
+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:2111
-msgid "failed to clean index"
+#: 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 ""
 
-#: builtin/am.c:2145
+#: setup.c:223
+#, c-format
 msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+"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:2206
+#: setup.c:468
 #, c-format
-msgid "Invalid value for --patch-format: %s"
+msgid "Expected git repo version <= %d, found %d"
 msgstr ""
 
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+#: setup.c:476
+msgid "unknown repository extensions found:"
 msgstr ""
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
 msgstr ""
 
-#: builtin/am.c:2246
-msgid "run interactively"
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
 msgstr ""
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
+#: setup.c:845
+msgid "Unable to read current working directory"
 msgstr ""
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
+#: 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 ""
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
 msgstr ""
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
+#: 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 ""
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
 msgstr ""
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
 msgstr ""
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
 msgstr ""
 
-#: builtin/am.c:2264
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
 msgstr ""
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
 msgstr ""
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
+#: sha1_file.c:2592
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr ""
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
 msgstr ""
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
 msgstr ""
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
+#: sha1_name.c:418
+msgid "The candidates are:"
 msgstr ""
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
+#: 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 ""
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
 msgstr ""
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
 msgstr ""
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
 msgstr ""
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
 msgstr ""
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
 msgstr ""
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
 msgstr ""
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
 msgstr ""
 
-#: builtin/am.c:2313
-msgid "restore the original branch and abort the patching operation."
+#: 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 ""
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr ""
-
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr ""
-
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr ""
-
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
 msgstr ""
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
 msgstr ""
 
-#: builtin/am.c:2340
-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."
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
 msgstr ""
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
+#: trailer.c:698
+msgid "could not read from stdin"
 msgstr ""
 
-#: builtin/am.c:2362
+#: trailer.c:929 builtin/am.c:44
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
+msgid "could not stat %s"
 msgstr ""
 
-#: builtin/am.c:2386
+#: trailer.c:931
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+msgid "file %s is not a regular file"
 msgstr ""
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
 msgstr ""
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
+#: trailer.c:945
+msgid "could not open temporary file"
 msgstr ""
 
-#: builtin/apply.c:111
+#: trailer.c:983
 #, c-format
-msgid "unrecognized whitespace option '%s'"
+msgid "could not rename temporary file to %s"
 msgstr ""
 
-#: builtin/apply.c:126
+#: transport.c:62
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
 msgstr ""
 
-#: builtin/apply.c:818
+#: transport.c:151
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
+msgid "transport: invalid depth option '%s'"
 msgstr ""
 
-#: builtin/apply.c:827
+#: transport.c:817
 #, c-format
-msgid "regexec returned %d for input: %s"
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
 
-#: builtin/apply.c:908
+#: transport.c:821
 #, c-format
-msgid "unable to find filename in patch at line %d"
+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:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+#: transport.c:829
+msgid "Aborting."
 msgstr ""
 
-#: builtin/apply.c:944
+#: transport-helper.c:1075
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid "Could not read ref %s"
 msgstr ""
 
-#: builtin/apply.c:945
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+#: tree-walk.c:31
+msgid "too-short tree object"
 msgstr ""
 
-#: builtin/apply.c:952
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
 msgstr ""
 
-#: builtin/apply.c:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
 msgstr ""
 
-#: builtin/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
+#: tree-walk.c:113
+msgid "too-short tree file"
 msgstr ""
 
-#: builtin/apply.c:1489
+#: unpack-trees.c:64
 #, 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] ""
-
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
+"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:1657
-msgid "deleted file still has contents"
-msgstr ""
-
-#: builtin/apply.c:1683
+#: unpack-trees.c:66
 #, c-format
-msgid "corrupt patch at line %d"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:1719
+#: unpack-trees.c:69
 #, c-format
-msgid "new file %s depends on old contents"
+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:1721
+#: unpack-trees.c:71
 #, c-format
-msgid "deleted file %s still has contents"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:1724
+#: unpack-trees.c:74
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
+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:1870
+#: unpack-trees.c:76
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
+msgid ""
+"Your local changes to the following files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:1899
+#: unpack-trees.c:81
 #, c-format
-msgid "unrecognized binary patch at line %d"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:2050
+#: unpack-trees.c:85
 #, c-format
-msgid "patch with only garbage at line %d"
+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:2140
+#: unpack-trees.c:87
 #, c-format
-msgid "unable to read symlink %s"
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:2144
+#: unpack-trees.c:90
 #, c-format
-msgid "unable to open or read %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:2777
+#: unpack-trees.c:92
 #, c-format
-msgid "invalid start of line: '%c'"
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:2896
-#, 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] ""
-
-#: builtin/apply.c:2908
+#: unpack-trees.c:95
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+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:2914
+#: unpack-trees.c:97
 #, c-format
 msgid ""
-"while searching for:\n"
-"%.*s"
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:2934
+#: unpack-trees.c:102
 #, c-format
-msgid "missing binary patch data for '%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:3035
+#: unpack-trees.c:104
 #, c-format
-msgid "binary patch does not apply to '%s'"
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3041
+#: unpack-trees.c:107
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %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:3062
+#: unpack-trees.c:109
 #, c-format
-msgid "patch failed: %s:%ld"
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3186
+#: unpack-trees.c:112
 #, c-format
-msgid "cannot checkout %s"
+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:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: unpack-trees.c:114
 #, c-format
-msgid "read of %s failed"
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
 msgstr ""
 
-#: builtin/apply.c:3239
+#: unpack-trees.c:121
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
 msgstr ""
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
+#: unpack-trees.c:124
 #, c-format
-msgid "path %s has been renamed/deleted"
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: unpack-trees.c:126
 #, c-format
-msgid "%s: does not exist in index"
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: unpack-trees.c:128
 #, c-format
-msgid "%s: %s"
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: unpack-trees.c:205
 #, c-format
-msgid "%s: does not match index"
+msgid "Aborting\n"
 msgstr ""
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
+#: unpack-trees.c:237
+msgid "Checking out files"
 msgstr ""
 
-#: builtin/apply.c:3528
-#, c-format
-msgid "%s: wrong type"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
 msgstr ""
 
-#: builtin/apply.c:3530
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "%s has type %o, expected %o"
+msgid "invalid %XX escape sequence"
 msgstr ""
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
-#, c-format
-msgid "invalid path '%s'"
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
 msgstr ""
 
-#: builtin/apply.c:3746
-#, c-format
-msgid "%s: already exists in index"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
 msgstr ""
 
-#: builtin/apply.c:3749
-#, c-format
-msgid "%s: already exists in working directory"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
 msgstr ""
 
-#: builtin/apply.c:3769
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
 msgstr ""
 
-#: builtin/apply.c:3774
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
 msgstr ""
 
-#: builtin/apply.c:3794
+#: worktree.c:282
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
+msgid "failed to read '%s'"
 msgstr ""
 
-#: builtin/apply.c:3798
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "%s: patch does not apply"
+msgid "could not open '%s' for reading and writing"
 msgstr ""
 
-#: builtin/apply.c:3812
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "Checking patch %s..."
+msgid "could not open '%s' for writing"
 msgstr ""
 
-#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#: 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 "make_cache_entry failed for path '%s'"
+msgid "could not open '%s' for reading"
 msgstr ""
 
-#: builtin/apply.c:4048
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "unable to remove %s from index"
+msgid "unable to access '%s'"
 msgstr ""
 
-#: builtin/apply.c:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
+#: wrapper.c:634
+msgid "unable to get current working directory"
 msgstr ""
 
-#: builtin/apply.c:4081
+#: wrapper.c:658
 #, c-format
-msgid "unable to stat newly created file '%s'"
+msgid "could not write to %s"
 msgstr ""
 
-#: builtin/apply.c:4086
+#: wrapper.c:660
 #, c-format
-msgid "unable to create backing store for newly created file %s"
+msgid "could not close %s"
 msgstr ""
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
-#, c-format
-msgid "unable to add cache entry for %s"
+#: wt-status.c:151
+msgid "Unmerged paths:"
 msgstr ""
 
-#: builtin/apply.c:4122
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "closing file '%s'"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
 msgstr ""
 
-#: builtin/apply.c:4171
-#, c-format
-msgid "unable to write file '%s' mode %o"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
 msgstr ""
 
-#: builtin/apply.c:4258
-#, c-format
-msgid "Applied patch %s cleanly."
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4266
-msgid "internal error"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4269
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/apply.c:4279
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
 msgstr ""
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
 msgstr ""
 
-#: builtin/apply.c:4303
-#, c-format
-msgid "Rejected hunk #%d."
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
 msgstr ""
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4507
-msgid "don't apply changes matching the given path"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
 msgstr ""
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
+#: wt-status.c:238
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
 msgstr ""
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
+#: wt-status.c:253
+msgid "both deleted:"
 msgstr ""
 
-#: builtin/apply.c:4518
-msgid "instead of applying the patch, output diffstat for the input"
+#: wt-status.c:255
+msgid "added by us:"
 msgstr ""
 
-#: builtin/apply.c:4522
-msgid "show number of added and deleted lines in decimal notation"
+#: wt-status.c:257
+msgid "deleted by them:"
 msgstr ""
 
-#: builtin/apply.c:4524
-msgid "instead of applying the patch, output a summary for the input"
+#: wt-status.c:259
+msgid "added by them:"
 msgstr ""
 
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, see if the patch is applicable"
+#: wt-status.c:261
+msgid "deleted by us:"
 msgstr ""
 
-#: builtin/apply.c:4528
-msgid "make sure the patch is applicable to the current index"
+#: wt-status.c:263
+msgid "both added:"
 msgstr ""
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
+#: wt-status.c:265
+msgid "both modified:"
 msgstr ""
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
+#: wt-status.c:275
+msgid "new file:"
 msgstr ""
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
+#: wt-status.c:277
+msgid "copied:"
 msgstr ""
 
-#: builtin/apply.c:4536
-msgid "attempt three-way merge if a patch does not apply"
+#: wt-status.c:279
+msgid "deleted:"
 msgstr ""
 
-#: builtin/apply.c:4538
-msgid "build a temporary index based on embedded index information"
+#: wt-status.c:281
+msgid "modified:"
 msgstr ""
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
+#: wt-status.c:283
+msgid "renamed:"
 msgstr ""
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
+#: wt-status.c:285
+msgid "typechange:"
 msgstr ""
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
+#: wt-status.c:287
+msgid "unknown:"
 msgstr ""
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
+#: wt-status.c:289
+msgid "unmerged:"
 msgstr ""
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
+#: wt-status.c:371
+msgid "new commits, "
 msgstr ""
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
+#: wt-status.c:373
+msgid "modified content, "
 msgstr ""
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: wt-status.c:375
+msgid "untracked content, "
 msgstr ""
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
 msgstr ""
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
 msgstr ""
 
-#: builtin/apply.c:4566
-msgid "do not trust the line counts in the hunk headers"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
 msgstr ""
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
 msgstr ""
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
 msgstr ""
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
 msgstr ""
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
 msgstr ""
 
-#: builtin/apply.c:4621
-#, c-format
-msgid "can't open patch '%s'"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
 msgstr ""
 
-#: builtin/apply.c:4635
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr ""
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr ""
 
-#: builtin/archive.c:17
-#, c-format
-msgid "could not create archive file '%s'"
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
 msgstr ""
 
-#: builtin/archive.c:20
-msgid "could not redirect output"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
 msgstr ""
 
-#: builtin/archive.c:37
-msgid "git archive: Remote with no URL"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
 msgstr ""
 
-#: builtin/archive.c:58
-msgid "git archive: expected ACK/NAK, got EOF"
+#: wt-status.c:1172
+msgid "No commands done."
 msgstr ""
 
-#: builtin/archive.c:61
+#: wt-status.c:1175
 #, c-format
-msgid "git archive: NACK %s"
-msgstr ""
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/archive.c:63
+#: wt-status.c:1186
 #, c-format
-msgid "remote error: %s"
+msgid "  (see more in file %s)"
 msgstr ""
 
-#: builtin/archive.c:64
-msgid "git archive: protocol error"
+#: wt-status.c:1191
+msgid "No commands remaining."
 msgstr ""
 
-#: builtin/archive.c:68
-msgid "git archive: expected a flush"
+#: wt-status.c:1194
+#, 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:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
 msgstr ""
 
-#: builtin/bisect--helper.c:7
-msgid "git bisect--helper --next-all [--no-checkout]"
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/bisect--helper.c:17
-msgid "perform 'git bisect next'"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
 msgstr ""
 
-#: builtin/bisect--helper.c:19
-msgid "update BISECT_HEAD instead of checking out the current commit"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
 msgstr ""
 
-#: builtin/blame.c:33
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
 msgstr ""
 
-#: builtin/blame.c:38
-msgid "<rev-opts> are documented in git-rev-list(1)"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
 msgstr ""
 
-#: builtin/blame.c:1782
-msgid "Blaming lines"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2530
-msgid "Show blame entries as we find them, incrementally"
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/blame.c:2531
-msgid "Show blank SHA-1 for boundary commits (Default: off)"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
 msgstr ""
 
-#: builtin/blame.c:2532
-msgid "Do not treat root commits as boundaries (Default: off)"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2533
-msgid "Show work cost statistics"
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 msgstr ""
 
-#: builtin/blame.c:2534
-msgid "Force progress reporting"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
 msgstr ""
 
-#: builtin/blame.c:2535
-msgid "Show output score for blame entries"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
 msgstr ""
 
-#: builtin/blame.c:2536
-msgid "Show original filename (Default: auto)"
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
 
-#: builtin/blame.c:2537
-msgid "Show original linenumber (Default: off)"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
 msgstr ""
 
-#: builtin/blame.c:2538
-msgid "Show in a format designed for machine consumption"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2539
-msgid "Show porcelain format with per-line commit information"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2540
-msgid "Use the same output mode as git-annotate (Default: off)"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
 
-#: builtin/blame.c:2541
-msgid "Show raw timestamp (Default: off)"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
 msgstr ""
 
-#: builtin/blame.c:2542
-msgid "Show long commit SHA1 (Default: off)"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2543
-msgid "Suppress author name and timestamp (Default: off)"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
 
-#: builtin/blame.c:2544
-msgid "Show author email instead of name (Default: off)"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
 msgstr ""
 
-#: builtin/blame.c:2545
-msgid "Ignore whitespace differences"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
 msgstr ""
 
-#: builtin/blame.c:2546
-msgid "Spend extra cycles to find better match"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
 msgstr ""
 
-#: builtin/blame.c:2547
-msgid "Use revisions from <file> instead of calling git-rev-list"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
 msgstr ""
 
-#: builtin/blame.c:2548
-msgid "Use <file>'s contents as the final image"
+#: wt-status.c:1524
+msgid "On branch "
 msgstr ""
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
-msgid "score"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
 msgstr ""
 
-#: builtin/blame.c:2549
-msgid "Find line copies within and across files"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
 msgstr ""
 
-#: builtin/blame.c:2550
-msgid "Find line movements within and across files"
+#: wt-status.c:1537
+msgid "HEAD detached at "
 msgstr ""
 
-#: builtin/blame.c:2551
-msgid "n,m"
+#: wt-status.c:1539
+msgid "HEAD detached from "
 msgstr ""
 
-#: builtin/blame.c:2551
-msgid "Process only line range n,m, counting from 1"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
 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:2640
-msgid "4 years, 11 months ago"
+#: wt-status.c:1560
+msgid "Initial commit"
 msgstr ""
 
-#: builtin/branch.c:25
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+#: wt-status.c:1574
+msgid "Untracked files"
 msgstr ""
 
-#: builtin/branch.c:26
-msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+#: wt-status.c:1576
+msgid "Ignored files"
 msgstr ""
 
-#: builtin/branch.c:27
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+#: 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 ""
 
-#: builtin/branch.c:28
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
 msgstr ""
 
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--points-at]"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
 msgstr ""
 
-#: builtin/branch.c:142
-#, c-format
-msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
+#: wt-status.c:1594
+msgid "No changes"
 msgstr ""
 
-#: builtin/branch.c:146
+#: wt-status.c:1599
 #, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 
-#: builtin/branch.c:160
+#: wt-status.c:1602
 #, c-format
-msgid "Couldn't look up commit object for '%s'"
+msgid "no changes added to commit\n"
 msgstr ""
 
-#: builtin/branch.c:164
+#: wt-status.c:1605
 #, 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/branch.c:177
-msgid "Update of config-file failed"
-msgstr ""
-
-#: builtin/branch.c:205
-msgid "cannot use -a with -d"
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
 
-#: builtin/branch.c:211
-msgid "Couldn't look up commit object for HEAD"
+#: wt-status.c:1608
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 
-#: builtin/branch.c:219
+#: wt-status.c:1611
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 
-#: builtin/branch.c:235
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "remote-tracking branch '%s' not found."
+msgid "nothing to commit\n"
 msgstr ""
 
-#: builtin/branch.c:236
+#: wt-status.c:1617
 #, c-format
-msgid "branch '%s' not found."
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 
-#: builtin/branch.c:251
+#: wt-status.c:1621
 #, c-format
-msgid "Error deleting remote-tracking branch '%s'"
+msgid "nothing to commit, working tree clean\n"
 msgstr ""
 
-#: builtin/branch.c:252
-#, c-format
-msgid "Error deleting branch '%s'"
+#: wt-status.c:1728
+msgid "Initial commit on "
 msgstr ""
 
-#: builtin/branch.c:259
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
 msgstr ""
 
-#: builtin/branch.c:260
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
+#: wt-status.c:1761
+msgid "gone"
 msgstr ""
 
-#: builtin/branch.c:303
-#, c-format
-msgid "[%s: gone]"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
 msgstr ""
 
-#: builtin/branch.c:308
-#, c-format
-msgid "[%s]"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
 msgstr ""
 
-#: builtin/branch.c:313
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "[%s: behind %d]"
+msgid "cannot %s: You have unstaged changes."
 msgstr ""
 
-#: builtin/branch.c:315
-#, c-format
-msgid "[behind %d]"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
 msgstr ""
 
-#: builtin/branch.c:319
+#: wt-status.c:2278
 #, c-format
-msgid "[%s: ahead %d]"
+msgid "cannot %s: Your index contains uncommitted changes."
 msgstr ""
 
-#: builtin/branch.c:321
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "[ahead %d]"
+msgid "failed to unlink '%s'"
 msgstr ""
 
-#: builtin/branch.c:324
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/branch.c:327
+#: builtin/add.c:80
 #, c-format
-msgid "[ahead %d, behind %d]"
+msgid "unexpected diff status %c"
 msgstr ""
 
-#: builtin/branch.c:340
-msgid " **** invalid ref ****"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
 msgstr ""
 
-#: builtin/branch.c:366
+#: builtin/add.c:95
 #, c-format
-msgid "(no branch, rebasing %s)"
+msgid "remove '%s'\n"
 msgstr ""
 
-#: builtin/branch.c:369
-#, c-format
-msgid "(no branch, bisect started on %s)"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/branch.c:375
-#, c-format
-msgid "(HEAD detached at %s)"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
 msgstr ""
 
-#: builtin/branch.c:378
+#: builtin/add.c:220
 #, c-format
-msgid "(HEAD detached from %s)"
+msgid "Could not open '%s' for writing."
 msgstr ""
 
-#: builtin/branch.c:382
-msgid "(no branch)"
+#: builtin/add.c:224
+msgid "Could not write patch"
 msgstr ""
 
-#: builtin/branch.c:524
-msgid "cannot rename the current branch while not on any."
+#: builtin/add.c:227
+msgid "editing patch failed"
 msgstr ""
 
-#: builtin/branch.c:534
+#: builtin/add.c:230
 #, c-format
-msgid "Invalid branch name: '%s'"
+msgid "Could not stat '%s'"
 msgstr ""
 
-#: builtin/branch.c:549
-msgid "Branch rename failed"
-msgstr ""
-
-#: builtin/branch.c:553
-#, c-format
-msgid "Renamed a misnamed branch '%s' away"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
 msgstr ""
 
-#: builtin/branch.c:557
+#: builtin/add.c:237
 #, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
+msgid "Could not apply '%s'"
 msgstr ""
 
-#: builtin/branch.c:564
-msgid "Branch is renamed, but update of config-file failed"
+#: builtin/add.c:247
+msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/branch.c:586
-#, c-format
-msgid "could not write branch description template: %s"
+#: 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/branch.c:615
-msgid "Generic options"
+#: builtin/add.c:269
+msgid "interactive picking"
 msgstr ""
 
-#: builtin/branch.c:617
-msgid "show hash and subject, give twice for upstream branch"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
 msgstr ""
 
-#: builtin/branch.c:618
-msgid "suppress informational messages"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
 msgstr ""
 
-#: builtin/branch.c:619
-msgid "set up tracking mode (see git-pull(1))"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
 msgstr ""
 
-#: builtin/branch.c:621
-msgid "change upstream info"
+#: builtin/add.c:273
+msgid "update tracked files"
 msgstr ""
 
-#: builtin/branch.c:625
-msgid "use colored output"
+#: builtin/add.c:274
+msgid "record only the fact that the path will be added later"
 msgstr ""
 
-#: builtin/branch.c:626
-msgid "act on remote-tracking branches"
+#: builtin/add.c:275
+msgid "add changes from all tracked and untracked files"
 msgstr ""
 
-#: builtin/branch.c:628 builtin/branch.c:629
-msgid "print only branches that contain the commit"
+#: builtin/add.c:278
+msgid "ignore paths removed in the working tree (same as --no-all)"
 msgstr ""
 
-#: builtin/branch.c:632
-msgid "Specific git-branch actions:"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
 msgstr ""
 
-#: builtin/branch.c:633
-msgid "list both remote-tracking and local branches"
+#: builtin/add.c:281
+msgid "just skip files which cannot be added because of errors"
 msgstr ""
 
-#: builtin/branch.c:635
-msgid "delete fully merged branch"
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
 msgstr ""
 
-#: builtin/branch.c:636
-msgid "delete branch (even if not merged)"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
 msgstr ""
 
-#: builtin/branch.c:637
-msgid "move/rename a branch and its reflog"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
 msgstr ""
 
-#: builtin/branch.c:638
-msgid "move/rename a branch, even if target exists"
+#: builtin/add.c:305
+#, c-format
+msgid "Use -f if you really want to add them.\n"
 msgstr ""
 
-#: builtin/branch.c:639
-msgid "list branch names"
+#: builtin/add.c:312
+msgid "adding files failed"
 msgstr ""
 
-#: builtin/branch.c:640
-msgid "create the branch's reflog"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
 msgstr ""
 
-#: builtin/branch.c:642
-msgid "edit the description for the branch"
+#: builtin/add.c:355
+msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/branch.c:643
-msgid "force creation, move/rename, deletion"
+#: builtin/add.c:359
+#, c-format
+msgid "--chmod param '%s' must be either -x or +x"
 msgstr ""
 
-#: builtin/branch.c:644
-msgid "print only branches that are merged"
+#: builtin/add.c:374
+#, c-format
+msgid "Nothing specified, nothing added.\n"
 msgstr ""
 
-#: builtin/branch.c:645
-msgid "print only branches that are not merged"
+#: builtin/add.c:375
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/branch.c:646
-msgid "list branches in columns"
+#: 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/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
-msgid "key"
+#: builtin/am.c:414
+msgid "could not parse author script"
 msgstr ""
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
-msgid "field name to sort on"
+#: builtin/am.c:491
+#, c-format
+msgid "'%s' was deleted by the applypatch-msg hook"
 msgstr ""
 
-#: builtin/branch.c:650 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"
+#: builtin/am.c:532
+#, c-format
+msgid "Malformed input line: '%s'."
 msgstr ""
 
-#: builtin/branch.c:651
-msgid "print only branches of the object"
+#: builtin/am.c:569
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/branch.c:669
-msgid "Failed to resolve HEAD as a valid ref."
+#: builtin/am.c:595
+msgid "fseek failed"
 msgstr ""
 
-#: builtin/branch.c:673 builtin/clone.c:705
-msgid "HEAD not found below refs/heads!"
+#: builtin/am.c:775
+#, c-format
+msgid "could not parse patch '%s'"
 msgstr ""
 
-#: builtin/branch.c:693
-msgid "--column and --verbose are incompatible"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
 msgstr ""
 
-#: builtin/branch.c:704 builtin/branch.c:746
-msgid "branch name required"
+#: builtin/am.c:887
+msgid "invalid timestamp"
 msgstr ""
 
-#: builtin/branch.c:722
-msgid "Cannot give description to detached HEAD"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
 msgstr ""
 
-#: builtin/branch.c:727
-msgid "cannot edit description of more than one branch"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
 msgstr ""
 
-#: builtin/branch.c:734
-#, c-format
-msgid "No commit on branch '%s' yet."
+#: builtin/am.c:984
+msgid "Patch format detection failed."
 msgstr ""
 
-#: builtin/branch.c:737
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "No branch named '%s'."
+msgid "failed to create directory '%s'"
 msgstr ""
 
-#: builtin/branch.c:752
-msgid "too many branches for a rename operation"
+#: builtin/am.c:993
+msgid "Failed to split patches."
 msgstr ""
 
-#: builtin/branch.c:757
-msgid "too many branches to set new upstream"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
 msgstr ""
 
-#: builtin/branch.c:761
+#: builtin/am.c:1176
 #, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
+msgid "When you have resolved this problem, run \"%s --continue\"."
 msgstr ""
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/am.c:1177
 #, c-format
-msgid "no such branch '%s'"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 msgstr ""
 
-#: builtin/branch.c:768
+#: builtin/am.c:1178
 #, c-format
-msgid "branch '%s' does not exist"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
 
-#: builtin/branch.c:780
-msgid "too many branches to unset upstream"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
 msgstr ""
 
-#: builtin/branch.c:784
-msgid "could not unset upstream of HEAD when it does not point to any branch."
+#: builtin/am.c:1390 builtin/log.c:1550
+#, c-format
+msgid "invalid ident line: %s"
 msgstr ""
 
-#: builtin/branch.c:790
+#: builtin/am.c:1417
 #, c-format
-msgid "Branch '%s' has no upstream information"
+msgid "unable to parse commit %s"
 msgstr ""
 
-#: builtin/branch.c:804
-msgid "it does not make sense to create 'HEAD' manually"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
 
-#: builtin/branch.c:810
-msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
 msgstr ""
 
-#: builtin/branch.c:813
-#, c-format
+#: builtin/am.c:1631
 msgid ""
-"The --set-upstream flag is deprecated and will be removed. Consider using --"
-"track or --set-upstream-to\n"
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
 msgstr ""
 
-#: builtin/branch.c:830
-#, c-format
-msgid ""
-"\n"
-"If you wanted to make '%s' track '%s', do this:\n"
-"\n"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
 msgstr ""
 
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/bundle.c:51
-#, c-format
-msgid "%s is okay\n"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
 msgstr ""
 
-#: builtin/bundle.c:64
-msgid "Need a repository to create a bundle."
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/bundle.c:68
-msgid "Need a repository to unbundle."
+#: builtin/am.c:1739 builtin/am.c:1743
+#, c-format
+msgid "cannot resume: %s does not exist."
 msgstr ""
 
-#: builtin/cat-file.c:428
-msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
 
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
 msgstr ""
 
-#: builtin/cat-file.c:466
-msgid "<type> can be one of: blob, tree, commit, tag"
+#. 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 ""
 
-#: builtin/cat-file.c:467
-msgid "show object type"
+#: builtin/am.c:1824
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
 msgstr ""
 
-#: builtin/cat-file.c:468
-msgid "show object size"
+#: builtin/am.c:1861 builtin/am.c:1933
+#, c-format
+msgid "Applying: %.*s"
 msgstr ""
 
-#: builtin/cat-file.c:470
-msgid "exit with zero when there's no error"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
 msgstr ""
 
-#: builtin/cat-file.c:471
-msgid "pretty-print object's content"
+#: builtin/am.c:1885
+#, c-format
+msgid "Patch failed at %s %.*s"
 msgstr ""
 
-#: builtin/cat-file.c:473
-msgid "for blob objects, run textconv on object's content"
+#: builtin/am.c:1891
+#, c-format
+msgid "The copy of the patch that failed is found in: %s"
 msgstr ""
 
-#: builtin/cat-file.c:475
-msgid "allow -s and -t to work with broken/corrupt objects"
+#: 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 ""
 
-#: builtin/cat-file.c:476
-msgid "buffer --batch output"
+#: builtin/am.c:1943
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
 msgstr ""
 
-#: builtin/cat-file.c:478
-msgid "show info and content of objects fed from the standard input"
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
 msgstr ""
 
-#: builtin/cat-file.c:481
-msgid "show info about objects fed from the standard input"
+#: builtin/am.c:2103
+msgid "failed to clean index"
 msgstr ""
 
-#: builtin/cat-file.c:484
-msgid "follow in-tree symlinks (used with --batch or --batch-check)"
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
 msgstr ""
 
-#: builtin/cat-file.c:486
-msgid "show all objects with --batch or --batch-check"
+#: builtin/am.c:2200
+#, c-format
+msgid "Invalid value for --patch-format: %s"
 msgstr ""
 
-#: builtin/check-attr.c:11
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
 msgstr ""
 
-#: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
 msgstr ""
 
-#: builtin/check-attr.c:19
-msgid "report all attributes set on file"
+#: builtin/am.c:2240
+msgid "run interactively"
 msgstr ""
 
-#: builtin/check-attr.c:20
-msgid "use .gitattributes only from the index"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
 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:2244
+msgid "allow fall back on 3way merging if needed"
 msgstr ""
 
-#: builtin/check-attr.c:23 builtin/check-ignore.c:24
-msgid "terminate input and output records by a NUL character"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
 msgstr ""
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
-msgid "suppress progress reporting"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
 msgstr ""
 
-#: builtin/check-ignore.c:26
-msgid "show non-matching input paths"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
 msgstr ""
 
-#: builtin/check-ignore.c:28
-msgid "ignore index when checking"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
 msgstr ""
 
-#: builtin/check-ignore.c:154
-msgid "cannot specify pathnames with --stdin"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
 msgstr ""
 
-#: builtin/check-ignore.c:157
-msgid "-z only makes sense with --stdin"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
 msgstr ""
 
-#: builtin/check-ignore.c:159
-msgid "no path specified"
+#: builtin/am.c:2258
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
 msgstr ""
 
-#: builtin/check-ignore.c:163
-msgid "--quiet is only valid with a single pathname"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
 
-#: builtin/check-ignore.c:165
-msgid "cannot have both --quiet and --verbose"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
 msgstr ""
 
-#: builtin/check-ignore.c:168
-msgid "--non-matching is only valid with --verbose"
+#: 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 ""
 
-#: builtin/check-mailmap.c:8
-msgid "git check-mailmap [<options>] <contact>..."
+#: 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 ""
 
-#: builtin/check-mailmap.c:13
-msgid "also read contacts from stdin"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
 msgstr ""
 
-#: builtin/check-mailmap.c:24
-#, c-format
-msgid "unable to parse contact: %s"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
 msgstr ""
 
-#: builtin/check-mailmap.c:47
-msgid "no contacts specified"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
 msgstr ""
 
-#: builtin/checkout-index.c:127
-msgid "git checkout-index [<options>] [--] [<file>...]"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
 msgstr ""
 
-#: builtin/checkout-index.c:144
-msgid "stage should be between 1 and 3 or all"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
 msgstr ""
 
-#: builtin/checkout-index.c:160
-msgid "check out all files in the index"
+#: builtin/am.c:2304
+msgid "skip the current patch"
 msgstr ""
 
-#: builtin/checkout-index.c:161
-msgid "force overwrite of existing files"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
 msgstr ""
 
-#: builtin/checkout-index.c:163
-msgid "no warning for existing files and files not in index"
+#: builtin/am.c:2311
+msgid "lie about committer date"
 msgstr ""
 
-#: builtin/checkout-index.c:165
-msgid "don't checkout new files"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
 msgstr ""
 
-#: builtin/checkout-index.c:167
-msgid "update stat information in the index file"
+#: 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 ""
 
-#: builtin/checkout-index.c:171
-msgid "read list of paths from the standard input"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
 msgstr ""
 
-#: builtin/checkout-index.c:173
-msgid "write the content to temporary files"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
 msgstr ""
 
-#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
-msgid "string"
+#: 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 ""
 
-#: builtin/checkout-index.c:175
-msgid "when creating files, prepend <string>"
+#: builtin/am.c:2341
+msgid "failed to read the index"
 msgstr ""
 
-#: builtin/checkout-index.c:177
-msgid "copy out the files from named stage"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
 msgstr ""
 
-#: builtin/checkout.c:25
-msgid "git checkout [<options>] <branch>"
+#: builtin/am.c:2380
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
 msgstr ""
 
-#: builtin/checkout.c:26
-msgid "git checkout [<options>] [<branch>] -- <file>..."
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
 msgstr ""
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
-#, c-format
-msgid "path '%s' does not have our version"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
 msgstr ""
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/archive.c:17
 #, c-format
-msgid "path '%s' does not have their version"
+msgid "could not create archive file '%s'"
 msgstr ""
 
-#: builtin/checkout.c:152
-#, c-format
-msgid "path '%s' does not have all necessary versions"
+#: builtin/archive.c:20
+msgid "could not redirect output"
 msgstr ""
 
-#: builtin/checkout.c:196
-#, c-format
-msgid "path '%s' does not have necessary versions"
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
 msgstr ""
 
-#: builtin/checkout.c:213
-#, c-format
-msgid "path '%s': cannot merge"
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
 msgstr ""
 
-#: builtin/checkout.c:230
+#: builtin/archive.c:61
 #, c-format
-msgid "Unable to add merge result for '%s'"
+msgid "git archive: NACK %s"
 msgstr ""
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: builtin/archive.c:63
 #, c-format
-msgid "'%s' cannot be used with updating paths"
+msgid "remote error: %s"
 msgstr ""
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
-#, c-format
-msgid "'%s' cannot be used with %s"
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
 msgstr ""
 
-#: builtin/checkout.c:269
-#, c-format
-msgid "Cannot update paths and switch to branch '%s' at the same time."
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
 msgstr ""
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
 msgstr ""
 
-#: builtin/checkout.c:340 builtin/checkout.c:347
-#, c-format
-msgid "path '%s' is unmerged"
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
 msgstr ""
 
-#: builtin/checkout.c:496
-msgid "you need to resolve your current index first"
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr ""
 
-#: builtin/checkout.c:623
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
+#: builtin/blame.c:33
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
 msgstr ""
 
-#: builtin/checkout.c:661
-msgid "HEAD is now at"
+#: builtin/blame.c:38
+msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr ""
 
-#: builtin/checkout.c:665 builtin/clone.c:659
-msgid "unable to update HEAD"
+#: builtin/blame.c:1781
+msgid "Blaming lines"
 msgstr ""
 
-#: builtin/checkout.c:669
-#, c-format
-msgid "Reset branch '%s'\n"
+#: builtin/blame.c:2577
+msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 
-#: builtin/checkout.c:672
-#, c-format
-msgid "Already on '%s'\n"
+#: builtin/blame.c:2578
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:676
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
+#: builtin/blame.c:2579
+msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
-#, c-format
-msgid "Switched to a new branch '%s'\n"
+#: builtin/blame.c:2580
+msgid "Show work cost statistics"
 msgstr ""
 
-#: builtin/checkout.c:680
-#, c-format
-msgid "Switched to branch '%s'\n"
+#: builtin/blame.c:2581
+msgid "Force progress reporting"
 msgstr ""
 
-#: builtin/checkout.c:732
-#, c-format
-msgid " ... and %d more.\n"
+#: builtin/blame.c:2582
+msgid "Show output score for blame entries"
 msgstr ""
 
-#: builtin/checkout.c:738
-#, 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] ""
-
-#: builtin/checkout.c:757
-#, 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/blame.c:2583
+msgid "Show original filename (Default: auto)"
+msgstr ""
 
-#: builtin/checkout.c:793
-msgid "internal error in revision walk"
+#: builtin/blame.c:2584
+msgid "Show original linenumber (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:797
-msgid "Previous HEAD position was"
+#: builtin/blame.c:2585
+msgid "Show in a format designed for machine consumption"
 msgstr ""
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
-msgid "You are on a branch yet to be born"
+#: builtin/blame.c:2586
+msgid "Show porcelain format with per-line commit information"
 msgstr ""
 
-#: builtin/checkout.c:969
-#, c-format
-msgid "only one reference expected, %d given."
+#: builtin/blame.c:2587
+msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
-#, c-format
-msgid "invalid reference: %s"
+#: builtin/blame.c:2588
+msgid "Show raw timestamp (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1038
-#, c-format
-msgid "reference is not a tree: %s"
+#: builtin/blame.c:2589
+msgid "Show long commit SHA1 (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1077
-msgid "paths cannot be used with switching branches"
+#: builtin/blame.c:2590
+msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
-#, c-format
-msgid "'%s' cannot be used with switching branches"
+#: builtin/blame.c:2591
+msgid "Show author email instead of name (Default: off)"
 msgstr ""
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
-#, c-format
-msgid "'%s' cannot be used with '%s'"
+#: builtin/blame.c:2592
+msgid "Ignore whitespace differences"
 msgstr ""
 
-#: builtin/checkout.c:1104
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
 msgstr ""
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
-msgid "branch"
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
 msgstr ""
 
-#: builtin/checkout.c:1138
-msgid "create and checkout a new branch"
+#: builtin/blame.c:2602
+msgid "Spend extra cycles to find better match"
 msgstr ""
 
-#: builtin/checkout.c:1140
-msgid "create/reset and checkout a branch"
+#: builtin/blame.c:2603
+msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
 
-#: builtin/checkout.c:1141
-msgid "create reflog for new branch"
+#: builtin/blame.c:2604
+msgid "Use <file>'s contents as the final image"
 msgstr ""
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
+#: builtin/blame.c:2605 builtin/blame.c:2606
+msgid "score"
 msgstr ""
 
-#: builtin/checkout.c:1143
-msgid "set upstream info for new branch"
+#: builtin/blame.c:2605
+msgid "Find line copies within and across files"
 msgstr ""
 
-#: builtin/checkout.c:1145
-msgid "new-branch"
+#: builtin/blame.c:2606
+msgid "Find line movements within and across files"
 msgstr ""
 
-#: builtin/checkout.c:1145
-msgid "new unparented branch"
+#: builtin/blame.c:2607
+msgid "n,m"
 msgstr ""
 
-#: builtin/checkout.c:1146
-msgid "checkout our version for unmerged files"
+#: builtin/blame.c:2607
+msgid "Process only line range n,m, counting from 1"
 msgstr ""
 
-#: builtin/checkout.c:1148
-msgid "checkout their version for unmerged files"
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
 msgstr ""
 
-#: builtin/checkout.c:1150
-msgid "force checkout (throw away local modifications)"
+#. 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:2700
+msgid "4 years, 11 months ago"
 msgstr ""
 
-#: builtin/checkout.c:1151
-msgid "perform a 3-way merge with the new branch"
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
 msgstr ""
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
-msgid "update ignored files (default)"
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
 msgstr ""
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
-msgid "style"
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
 msgstr ""
 
-#: builtin/checkout.c:1154
-msgid "conflict style (merge or diff3)"
+#: builtin/blame.c:2832
+msgid ""
+"--reverse --first-parent together require range along first-parent chain"
 msgstr ""
 
-#: builtin/checkout.c:1157
-msgid "do not limit pathspecs to sparse entries only"
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
 msgstr ""
 
-#: builtin/checkout.c:1159
-msgid "second guess 'git checkout <no-such-branch>'"
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
 msgstr ""
 
-#: builtin/checkout.c:1161
-msgid "do not check if another worktree is holding the given ref"
+#: builtin/blame.c:2873
+#, c-format
+msgid "file %s has only %lu line"
+msgid_plural "file %s has only %lu lines"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr ""
 
-#: builtin/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 builtin/push.c:526
-#: builtin/send-pack.c:168
-msgid "force progress reporting"
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr ""
 
-#: builtin/checkout.c:1193
-msgid "-b, -B and --orphan are mutually exclusive"
+#: builtin/branch.c:28
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr ""
 
-#: builtin/checkout.c:1210
-msgid "--track needs a branch name"
+#: builtin/branch.c:29
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr ""
 
-#: builtin/checkout.c:1215
-msgid "Missing branch name; try -b"
+#: builtin/branch.c:30
+msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr ""
 
-#: builtin/checkout.c:1251
-msgid "invalid path specification"
+#: builtin/branch.c:143
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
 msgstr ""
 
-#: builtin/checkout.c:1258
+#: builtin/branch.c:147
 #, 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?"
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
 msgstr ""
 
-#: builtin/checkout.c:1263
+#: builtin/branch.c:161
 #, c-format
-msgid "git checkout: --detach does not take a path argument '%s'"
+msgid "Couldn't look up commit object for '%s'"
 msgstr ""
 
-#: builtin/checkout.c:1267
+#: builtin/branch.c:165
+#, c-format
 msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
+"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:25
-msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+#: builtin/branch.c:178
+msgid "Update of config-file failed"
 msgstr ""
 
-#: builtin/clean.c:29
-#, c-format
-msgid "Removing %s\n"
+#: builtin/branch.c:206
+msgid "cannot use -a with -d"
 msgstr ""
 
-#: builtin/clean.c:30
-#, c-format
-msgid "Would remove %s\n"
+#: builtin/branch.c:212
+msgid "Couldn't look up commit object for HEAD"
 msgstr ""
 
-#: builtin/clean.c:31
+#: builtin/branch.c:226
 #, c-format
-msgid "Skipping repository %s\n"
+msgid "Cannot delete branch '%s' checked out at '%s'"
 msgstr ""
 
-#: builtin/clean.c:32
+#: builtin/branch.c:241
 #, c-format
-msgid "Would skip repository %s\n"
+msgid "remote-tracking branch '%s' not found."
 msgstr ""
 
-#: builtin/clean.c:33
+#: builtin/branch.c:242
 #, c-format
-msgid "failed to remove %s"
+msgid "branch '%s' not found."
 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"
+#: builtin/branch.c:257
+#, c-format
+msgid "Error deleting remote-tracking branch '%s'"
 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/branch.c:258
+#, c-format
+msgid "Error deleting branch '%s'"
 msgstr ""
 
-#: builtin/clean.c:511
+#: builtin/branch.c:265
 #, c-format
-msgid "Huh (%s)?"
+msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/clean.c:653
+#: builtin/branch.c:266
 #, c-format
-msgid "Input ignore patterns>> "
+msgid "Deleted branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/clean.c:690
+#: builtin/branch.c:312
 #, c-format
-msgid "WARNING: Cannot find items matched by: %s"
+msgid "[%s: gone]"
 msgstr ""
 
-#: builtin/clean.c:711
-msgid "Select items to delete"
+#: builtin/branch.c:317
+#, c-format
+msgid "[%s]"
 msgstr ""
 
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/branch.c:322
 #, c-format
-msgid "Remove %s [y/N]? "
+msgid "[%s: behind %d]"
 msgstr ""
 
-#: builtin/clean.c:777
-msgid "Bye."
+#: builtin/branch.c:324
+#, c-format
+msgid "[behind %d]"
 msgstr ""
 
-#: 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:328
+#, c-format
+msgid "[%s: ahead %d]"
 msgstr ""
 
-#: builtin/clean.c:812
-msgid "*** Commands ***"
+#: builtin/branch.c:330
+#, c-format
+msgid "[ahead %d]"
 msgstr ""
 
-#: builtin/clean.c:813
-msgid "What now"
+#: builtin/branch.c:333
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/clean.c:821
-msgid "Would remove the following item:"
-msgid_plural "Would remove the following items:"
-msgstr[0] ""
-msgstr[1] ""
+#: builtin/branch.c:336
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr ""
 
-#: builtin/clean.c:838
-msgid "No more files to clean, exiting."
+#: builtin/branch.c:349
+msgid " **** invalid ref ****"
 msgstr ""
 
-#: builtin/clean.c:869
-msgid "do not print names of files removed"
+#: builtin/branch.c:375
+#, c-format
+msgid "(no branch, rebasing %s)"
 msgstr ""
 
-#: builtin/clean.c:871
-msgid "force"
+#: builtin/branch.c:378
+#, c-format
+msgid "(no branch, bisect started on %s)"
 msgstr ""
 
-#: builtin/clean.c:872
-msgid "interactive cleaning"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached at " in wt-status.c
+#: builtin/branch.c:384
+#, c-format
+msgid "(HEAD detached at %s)"
 msgstr ""
 
-#: builtin/clean.c:874
-msgid "remove whole directories"
+#. TRANSLATORS: make sure this matches
+#. "HEAD detached from " in wt-status.c
+#: builtin/branch.c:389
+#, c-format
+msgid "(HEAD detached from %s)"
 msgstr ""
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 builtin/show-ref.c:182
-msgid "pattern"
+#: builtin/branch.c:393
+msgid "(no branch)"
 msgstr ""
 
-#: builtin/clean.c:876
-msgid "add <pattern> to ignore rules"
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
 msgstr ""
 
-#: builtin/clean.c:877
-msgid "remove ignored files, too"
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
 msgstr ""
 
-#: builtin/clean.c:879
-msgid "remove only ignored files"
+#: builtin/branch.c:563
+msgid "cannot rename the current branch while not on any."
 msgstr ""
 
-#: builtin/clean.c:897
-msgid "-x and -X cannot be used together"
+#: builtin/branch.c:573
+#, c-format
+msgid "Invalid branch name: '%s'"
 msgstr ""
 
-#: builtin/clean.c:901
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
+#: builtin/branch.c:590
+msgid "Branch rename failed"
 msgstr ""
 
-#: builtin/clean.c:904
-msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
+#: builtin/branch.c:594
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
 msgstr ""
 
-#: builtin/clone.c:37
-msgid "git clone [<options>] [--] <repo> [<dir>]"
+#: builtin/branch.c:597
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr ""
 
-#: builtin/clone.c:60
-msgid "don't create a checkout"
+#: builtin/branch.c:604
+msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
-msgid "create a bare repository"
+#: 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 ""
 
-#: builtin/clone.c:65
-msgid "create a mirror repository (implies bare)"
+#: builtin/branch.c:651
+msgid "Generic options"
 msgstr ""
 
-#: builtin/clone.c:67
-msgid "to clone from a local repository"
+#: builtin/branch.c:653
+msgid "show hash and subject, give twice for upstream branch"
 msgstr ""
 
-#: builtin/clone.c:69
-msgid "don't use local hardlinks, always copy"
+#: builtin/branch.c:654
+msgid "suppress informational messages"
 msgstr ""
 
-#: builtin/clone.c:71
-msgid "setup as shared repository"
+#: builtin/branch.c:655
+msgid "set up tracking mode (see git-pull(1))"
 msgstr ""
 
-#: builtin/clone.c:73 builtin/clone.c:75
-msgid "initialize submodules in the clone"
+#: builtin/branch.c:657
+msgid "change upstream info"
 msgstr ""
 
-#: builtin/clone.c:76 builtin/init-db.c:466
-msgid "template-directory"
+#: builtin/branch.c:659
+msgid "upstream"
 msgstr ""
 
-#: builtin/clone.c:77 builtin/init-db.c:467
-msgid "directory from which templates will be used"
+#: builtin/branch.c:659
+msgid "change the upstream info"
 msgstr ""
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
-msgid "reference repository"
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
 msgstr ""
 
-#: builtin/clone.c:81
-msgid "use --reference only while cloning"
+#: builtin/branch.c:661
+msgid "use colored output"
 msgstr ""
 
-#: builtin/clone.c:82 builtin/column.c:26 builtin/merge-file.c:44
-msgid "name"
+#: builtin/branch.c:662
+msgid "act on remote-tracking branches"
 msgstr ""
 
-#: builtin/clone.c:83
-msgid "use <name> instead of 'origin' to track upstream"
+#: builtin/branch.c:664 builtin/branch.c:665
+msgid "print only branches that contain the commit"
 msgstr ""
 
-#: builtin/clone.c:85
-msgid "checkout <branch> instead of the remote's HEAD"
+#: builtin/branch.c:668
+msgid "Specific git-branch actions:"
 msgstr ""
 
-#: builtin/clone.c:87
-msgid "path to git-upload-pack on the remote"
+#: builtin/branch.c:669
+msgid "list both remote-tracking and local branches"
 msgstr ""
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
-msgid "depth"
+#: builtin/branch.c:671
+msgid "delete fully merged branch"
 msgstr ""
 
-#: builtin/clone.c:89
-msgid "create a shallow clone of that depth"
+#: builtin/branch.c:672
+msgid "delete branch (even if not merged)"
 msgstr ""
 
-#: builtin/clone.c:91
-msgid "clone only one branch, HEAD or --branch"
+#: builtin/branch.c:673
+msgid "move/rename a branch and its reflog"
 msgstr ""
 
-#: builtin/clone.c:92 builtin/init-db.c:475
-msgid "gitdir"
+#: builtin/branch.c:674
+msgid "move/rename a branch, even if target exists"
 msgstr ""
 
-#: builtin/clone.c:93 builtin/init-db.c:476
-msgid "separate git dir from working tree"
+#: builtin/branch.c:675
+msgid "list branch names"
 msgstr ""
 
-#: builtin/clone.c:94
-msgid "key=value"
+#: builtin/branch.c:676
+msgid "create the branch's reflog"
 msgstr ""
 
-#: builtin/clone.c:95
-msgid "set config inside the new repository"
+#: builtin/branch.c:678
+msgid "edit the description for the branch"
 msgstr ""
 
-#: builtin/clone.c:96 builtin/fetch.c:131 builtin/push.c:536
-msgid "use IPv4 addresses only"
+#: builtin/branch.c:679
+msgid "force creation, move/rename, deletion"
 msgstr ""
 
-#: builtin/clone.c:98 builtin/fetch.c:133 builtin/push.c:538
-msgid "use IPv6 addresses only"
+#: builtin/branch.c:680
+msgid "print only branches that are merged"
 msgstr ""
 
-#: builtin/clone.c:239
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
+#: builtin/branch.c:681
+msgid "print only branches that are not merged"
 msgstr ""
 
-#: builtin/clone.c:305
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
+#: builtin/branch.c:682
+msgid "list branches in columns"
 msgstr ""
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
 msgstr ""
 
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
 msgstr ""
 
-#: builtin/clone.c:315
-#, c-format
-msgid "reference repository '%s' is grafted"
+#: 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 ""
 
-#: builtin/clone.c:380 builtin/diff.c:84
-#, c-format
-msgid "failed to stat '%s'"
+#: builtin/branch.c:687
+msgid "print only branches of the object"
 msgstr ""
 
-#: builtin/clone.c:382
-#, c-format
-msgid "%s exists and is not a directory"
+#: builtin/branch.c:705
+msgid "Failed to resolve HEAD as a valid ref."
 msgstr ""
 
-#: builtin/clone.c:396
-#, c-format
-msgid "failed to stat %s\n"
+#: builtin/branch.c:709 builtin/clone.c:706
+msgid "HEAD not found below refs/heads!"
 msgstr ""
 
-#: builtin/clone.c:418
-#, c-format
-msgid "failed to create link '%s'"
+#: builtin/branch.c:729
+msgid "--column and --verbose are incompatible"
 msgstr ""
 
-#: builtin/clone.c:422
-#, c-format
-msgid "failed to copy file to '%s'"
+#: builtin/branch.c:740 builtin/branch.c:782
+msgid "branch name required"
 msgstr ""
 
-#: builtin/clone.c:447 builtin/clone.c:631
-#, c-format
-msgid "done.\n"
+#: builtin/branch.c:758
+msgid "Cannot give description to detached HEAD"
 msgstr ""
 
-#: builtin/clone.c:459
-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:763
+msgid "cannot edit description of more than one branch"
 msgstr ""
 
-#: builtin/clone.c:536
+#: builtin/branch.c:770
 #, c-format
-msgid "Could not find remote branch %s to clone."
+msgid "No commit on branch '%s' yet."
 msgstr ""
 
-#: builtin/clone.c:626
+#: builtin/branch.c:773
 #, c-format
-msgid "Checking connectivity... "
+msgid "No branch named '%s'."
 msgstr ""
 
-#: builtin/clone.c:629
-msgid "remote did not send all necessary objects"
+#: builtin/branch.c:788
+msgid "too many branches for a rename operation"
 msgstr ""
 
-#: builtin/clone.c:647
+#: builtin/branch.c:793
+msgid "too many branches to set new upstream"
+msgstr ""
+
+#: builtin/branch.c:797
 #, c-format
-msgid "unable to update %s"
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
 
-#: builtin/clone.c:696
-msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#, c-format
+msgid "no such branch '%s'"
 msgstr ""
 
-#: builtin/clone.c:727
-msgid "unable to checkout working tree"
+#: builtin/branch.c:804
+#, c-format
+msgid "branch '%s' does not exist"
 msgstr ""
 
-#: builtin/clone.c:753
-msgid "unable to write parameters to config file"
+#: builtin/branch.c:816
+msgid "too many branches to unset upstream"
 msgstr ""
 
-#: builtin/clone.c:816
-msgid "cannot repack to clean up"
+#: builtin/branch.c:820
+msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 
-#: builtin/clone.c:818
-msgid "cannot unlink temporary alternates file"
+#: builtin/branch.c:826
+#, c-format
+msgid "Branch '%s' has no upstream information"
 msgstr ""
 
-#: builtin/clone.c:850
-msgid "Too many arguments."
+#: builtin/branch.c:840
+msgid "it does not make sense to create 'HEAD' manually"
 msgstr ""
 
-#: builtin/clone.c:854
-msgid "You must specify a repository to clone."
+#: builtin/branch.c:846
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 
-#: builtin/clone.c:865
+#: builtin/branch.c:849
 #, c-format
-msgid "--bare and --origin %s options are incompatible."
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
 msgstr ""
 
-#: builtin/clone.c:868
-msgid "--bare and --separate-git-dir are incompatible."
+#: builtin/branch.c:866
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
 msgstr ""
 
-#: builtin/clone.c:881
+#: builtin/bundle.c:51
 #, c-format
-msgid "repository '%s' does not exist"
+msgid "%s is okay\n"
 msgstr ""
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
-#, c-format
-msgid "depth %s is not a positive number"
+#: builtin/bundle.c:64
+msgid "Need a repository to create a bundle."
 msgstr ""
 
-#: builtin/clone.c:897
-#, c-format
-msgid "destination path '%s' already exists and is not an empty directory."
+#: builtin/bundle.c:68
+msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/clone.c:907
-#, c-format
-msgid "working tree '%s' already exists."
+#: 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/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
-#, c-format
-msgid "could not create leading directories of '%s'"
+#: builtin/cat-file.c:514
+msgid ""
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 msgstr ""
 
-#: builtin/clone.c:925
-#, c-format
-msgid "could not create work tree dir '%s'"
+#: builtin/cat-file.c:551
+msgid "<type> can be one of: blob, tree, commit, tag"
 msgstr ""
 
-#: builtin/clone.c:943
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
+#: builtin/cat-file.c:552
+msgid "show object type"
 msgstr ""
 
-#: builtin/clone.c:945
-#, c-format
-msgid "Cloning into '%s'...\n"
+#: builtin/cat-file.c:553
+msgid "show object size"
 msgstr ""
 
-#: builtin/clone.c:984
-msgid "--depth is ignored in local clones; use file:// instead."
+#: builtin/cat-file.c:555
+msgid "exit with zero when there's no error"
 msgstr ""
 
-#: builtin/clone.c:987
-msgid "source repository is shallow, ignoring --local"
+#: builtin/cat-file.c:556
+msgid "pretty-print object's content"
 msgstr ""
 
-#: builtin/clone.c:992
-msgid "--local is ignored"
+#: builtin/cat-file.c:558
+msgid "for blob objects, run textconv on object's content"
 msgstr ""
 
-#: builtin/clone.c:996
-#, c-format
-msgid "Don't know how to clone %s"
+#: builtin/cat-file.c:560
+msgid "for blob objects, run filters on object's content"
 msgstr ""
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
 msgstr ""
 
-#: builtin/clone.c:1056
-msgid "You appear to have cloned an empty repository."
+#: builtin/cat-file.c:562
+msgid "use a specific path for --textconv/--filters"
 msgstr ""
 
-#: builtin/column.c:9
-msgid "git column [<options>]"
+#: builtin/cat-file.c:564
+msgid "allow -s and -t to work with broken/corrupt objects"
 msgstr ""
 
-#: builtin/column.c:26
-msgid "lookup config vars"
+#: builtin/cat-file.c:565
+msgid "buffer --batch output"
 msgstr ""
 
-#: builtin/column.c:27 builtin/column.c:28
-msgid "layout to use"
+#: builtin/cat-file.c:567
+msgid "show info and content of objects fed from the standard input"
 msgstr ""
 
-#: builtin/column.c:29
-msgid "Maximum width"
+#: builtin/cat-file.c:570
+msgid "show info about objects fed from the standard input"
 msgstr ""
 
-#: builtin/column.c:30
-msgid "Padding space on left border"
+#: builtin/cat-file.c:573
+msgid "follow in-tree symlinks (used with --batch or --batch-check)"
 msgstr ""
 
-#: builtin/column.c:31
-msgid "Padding space on right border"
+#: builtin/cat-file.c:575
+msgid "show all objects with --batch or --batch-check"
 msgstr ""
 
-#: builtin/column.c:32
-msgid "Padding space between columns"
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
 msgstr ""
 
-#: builtin/column.c:51
-msgid "--command must be the first argument"
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 msgstr ""
 
-#: builtin/commit.c:38
-msgid "git commit [<options>] [--] <pathspec>..."
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
 msgstr ""
 
-#: builtin/commit.c:43
-msgid "git status [<options>] [--] <pathspec>..."
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
 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/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:98
+msgid "read file names from stdin"
 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/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
 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/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
+msgid "suppress progress reporting"
 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/check-ignore.c:26
+msgid "show non-matching input paths"
 msgstr ""
 
-#: builtin/commit.c:85
-msgid "Otherwise, please use 'git reset'\n"
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
 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/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
 msgstr ""
 
-#: builtin/commit.c:305
-msgid "failed to unpack HEAD tree object"
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
 msgstr ""
 
-#: builtin/commit.c:346
-msgid "unable to create temporary index"
+#: builtin/check-ignore.c:159
+msgid "no path specified"
 msgstr ""
 
-#: builtin/commit.c:352
-msgid "interactive add failed"
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
 msgstr ""
 
-#: builtin/commit.c:365
-msgid "unable to update temporary index"
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
 msgstr ""
 
-#: builtin/commit.c:367
-msgid "Failed to update main cache tree"
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
 msgstr ""
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
-msgid "unable to write new_index file"
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
 msgstr ""
 
-#: builtin/commit.c:445
-msgid "cannot do a partial commit during a merge."
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
 msgstr ""
 
-#: builtin/commit.c:447
-msgid "cannot do a partial commit during a cherry-pick."
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
 msgstr ""
 
-#: builtin/commit.c:456
-msgid "cannot read the index"
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
 msgstr ""
 
-#: builtin/commit.c:475
-msgid "unable to write temporary index file"
+#: builtin/checkout-index.c:127
+msgid "git checkout-index [<options>] [--] [<file>...]"
 msgstr ""
 
-#: builtin/commit.c:580
-#, c-format
-msgid "commit '%s' lacks author header"
+#: builtin/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
 msgstr ""
 
-#: builtin/commit.c:582
-#, c-format
-msgid "commit '%s' has malformed author line"
+#: builtin/checkout-index.c:160
+msgid "check out all files in the index"
 msgstr ""
 
-#: builtin/commit.c:601
-msgid "malformed --author parameter"
+#: builtin/checkout-index.c:161
+msgid "force overwrite of existing files"
 msgstr ""
 
-#: builtin/commit.c:609
-#, c-format
-msgid "invalid date format: %s"
+#: builtin/checkout-index.c:163
+msgid "no warning for existing files and files not in index"
 msgstr ""
 
-#: builtin/commit.c:653
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
+#: builtin/checkout-index.c:165
+msgid "don't checkout new files"
 msgstr ""
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
-#, c-format
-msgid "could not lookup commit %s"
+#: builtin/checkout-index.c:167
+msgid "update stat information in the index file"
 msgstr ""
 
-#: builtin/commit.c:702 builtin/shortlog.c:285
-#, c-format
-msgid "(reading log message from standard input)\n"
+#: builtin/checkout-index.c:171
+msgid "read list of paths from the standard input"
 msgstr ""
 
-#: builtin/commit.c:704
-msgid "could not read log from standard input"
+#: builtin/checkout-index.c:173
+msgid "write the content to temporary files"
 msgstr ""
 
-#: builtin/commit.c:708
-#, c-format
-msgid "could not read log file '%s'"
+#: builtin/checkout-index.c:174 builtin/column.c:30
+#: 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 ""
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
+#: builtin/checkout-index.c:175
+msgid "when creating files, prepend <string>"
 msgstr ""
 
-#: builtin/commit.c:734
-msgid "could not read SQUASH_MSG"
+#: builtin/checkout-index.c:177
+msgid "copy out the files from named stage"
 msgstr ""
 
-#: builtin/commit.c:785
-msgid "could not write commit template"
+#: builtin/checkout.c:25
+msgid "git checkout [<options>] <branch>"
+msgstr ""
+
+#: builtin/checkout.c:26
+msgid "git checkout [<options>] [<branch>] -- <file>..."
 msgstr ""
 
-#: builtin/commit.c:803
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, 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 "path '%s' does not have our version"
 msgstr ""
 
-#: builtin/commit.c:808
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, 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"
+msgid "path '%s' does not have their version"
 msgstr ""
 
-#: builtin/commit.c:821
+#: builtin/checkout.c:152
 #, 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"
+msgid "path '%s' does not have all necessary versions"
 msgstr ""
 
-#: builtin/commit.c:828
+#: builtin/checkout.c:196
 #, 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"
+msgid "path '%s' does not have necessary versions"
 msgstr ""
 
-#: builtin/commit.c:848
+#: builtin/checkout.c:213
 #, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
+msgid "path '%s': cannot merge"
 msgstr ""
 
-#: builtin/commit.c:856
+#: builtin/checkout.c:230
 #, c-format
-msgid "%sDate:      %s"
+msgid "Unable to add merge result for '%s'"
 msgstr ""
 
-#: builtin/commit.c:863
+#: builtin/checkout.c:250 builtin/checkout.c:253 builtin/checkout.c:256
+#: builtin/checkout.c:259
 #, c-format
-msgid "%sCommitter: %.*s <%.*s>"
+msgid "'%s' cannot be used with updating paths"
 msgstr ""
 
-#: builtin/commit.c:881
-msgid "Cannot read index"
+#: builtin/checkout.c:262 builtin/checkout.c:265
+#, c-format
+msgid "'%s' cannot be used with %s"
 msgstr ""
 
-#: builtin/commit.c:938
-msgid "Error building trees"
+#: builtin/checkout.c:268
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr ""
 
-#: builtin/commit.c:953 builtin/tag.c:266
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
-msgid "Please supply the message using either -m or -F option.\n"
+msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/commit.c:1055
-#, c-format
-msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+#: builtin/checkout.c:494
+msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
+#: builtin/checkout.c:624
 #, c-format
-msgid "Invalid untracked files mode '%s'"
+msgid "Can not do reflog for '%s': %s\n"
 msgstr ""
 
-#: builtin/commit.c:1107
-msgid "--long and -z are incompatible"
+#: builtin/checkout.c:663
+msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/commit.c:1137
-msgid "Using both --reset-author and --author does not make sense"
+#: builtin/checkout.c:667 builtin/clone.c:660
+msgid "unable to update HEAD"
 msgstr ""
 
-#: builtin/commit.c:1146
-msgid "You have nothing to amend."
+#: builtin/checkout.c:671
+#, c-format
+msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1149
-msgid "You are in the middle of a merge -- cannot amend."
+#: builtin/checkout.c:674
+#, c-format
+msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1151
-msgid "You are in the middle of a cherry-pick -- cannot amend."
+#: builtin/checkout.c:678
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1154
-msgid "Options --squash and --fixup cannot be used together"
+#: builtin/checkout.c:680 builtin/checkout.c:1069
+#, c-format
+msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1164
-msgid "Only one of -c/-C/-F/--fixup can be used."
+#: builtin/checkout.c:682
+#, c-format
+msgid "Switched to branch '%s'\n"
 msgstr ""
 
-#: builtin/commit.c:1166
-msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+#: builtin/checkout.c:733
+#, c-format
+msgid " ... and %d more.\n"
 msgstr ""
 
-#: builtin/commit.c:1174
-msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr ""
+#: builtin/checkout.c:739
+#, 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] ""
 
-#: builtin/commit.c:1191
-msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
-msgstr ""
+#: 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"
+"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/commit.c:1193
-msgid "No paths with --include/--only does not make sense."
+#: builtin/checkout.c:794
+msgid "internal error in revision walk"
 msgstr ""
 
-#: builtin/commit.c:1195
-msgid "Clever... amending the last one with dirty index."
+#: builtin/checkout.c:798
+msgid "Previous HEAD position was"
 msgstr ""
 
-#: builtin/commit.c:1197
-msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+#: builtin/checkout.c:825 builtin/checkout.c:1064
+msgid "You are on a branch yet to be born"
 msgstr ""
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/checkout.c:970
 #, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#: builtin/commit.c:1214
-msgid "Paths with -a does not make sense."
+msgid "only one reference expected, %d given."
 msgstr ""
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
-msgid "show status concisely"
+#: builtin/checkout.c:1010 builtin/worktree.c:214
+#, c-format
+msgid "invalid reference: %s"
 msgstr ""
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
-msgid "show branch information"
+#: builtin/checkout.c:1039
+#, c-format
+msgid "reference is not a tree: %s"
 msgstr ""
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
-msgid "machine-readable output"
+#: builtin/checkout.c:1078
+msgid "paths cannot be used with switching branches"
 msgstr ""
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
-msgid "show status in long format (default)"
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
+#, c-format
+msgid "'%s' cannot be used with switching branches"
 msgstr ""
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
-msgid "terminate entries with NUL"
+#: 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 ""
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
-msgid "mode"
+#: builtin/checkout.c:1105
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
 msgstr ""
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+#: 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/commit.c:1340
-msgid "show ignored files"
+#: builtin/checkout.c:1139
+msgid "create and checkout a new branch"
 msgstr ""
 
-#: builtin/commit.c:1341 parse-options.h:155
-msgid "when"
+#: builtin/checkout.c:1141
+msgid "create/reset and checkout a branch"
 msgstr ""
 
-#: builtin/commit.c:1342
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
+#: builtin/checkout.c:1142
+msgid "create reflog for new branch"
 msgstr ""
 
-#: builtin/commit.c:1344
-msgid "list untracked files in columns"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
 msgstr ""
 
-#: builtin/commit.c:1430
-msgid "couldn't look up newly created commit"
+#: builtin/checkout.c:1144
+msgid "set upstream info for new branch"
 msgstr ""
 
-#: builtin/commit.c:1432
-msgid "could not parse newly created commit"
+#: builtin/checkout.c:1146
+msgid "new-branch"
 msgstr ""
 
-#: builtin/commit.c:1477
-msgid "detached HEAD"
+#: builtin/checkout.c:1146
+msgid "new unparented branch"
 msgstr ""
 
-#: builtin/commit.c:1480
-msgid " (root-commit)"
+#: builtin/checkout.c:1147
+msgid "checkout our version for unmerged files"
 msgstr ""
 
-#: builtin/commit.c:1575
-msgid "suppress summary after successful commit"
+#: builtin/checkout.c:1149
+msgid "checkout their version for unmerged files"
 msgstr ""
 
-#: builtin/commit.c:1576
-msgid "show diff in commit message template"
+#: builtin/checkout.c:1151
+msgid "force checkout (throw away local modifications)"
 msgstr ""
 
-#: builtin/commit.c:1578
-msgid "Commit message options"
+#: builtin/checkout.c:1152
+msgid "perform a 3-way merge with the new branch"
 msgstr ""
 
-#: builtin/commit.c:1579 builtin/tag.c:351
-msgid "read message from file"
+#: builtin/checkout.c:1153 builtin/merge.c:231
+msgid "update ignored files (default)"
 msgstr ""
 
-#: builtin/commit.c:1580
-msgid "author"
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
+msgid "style"
 msgstr ""
 
-#: builtin/commit.c:1580
-msgid "override author for commit"
+#: builtin/checkout.c:1155
+msgid "conflict style (merge or diff3)"
 msgstr ""
 
-#: builtin/commit.c:1581 builtin/gc.c:326
-msgid "date"
+#: builtin/checkout.c:1158
+msgid "do not limit pathspecs to sparse entries only"
 msgstr ""
 
-#: builtin/commit.c:1581
-msgid "override date for commit"
+#: builtin/checkout.c:1160
+msgid "second guess 'git checkout <no-such-branch>'"
 msgstr ""
 
-#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
-msgid "message"
+#: builtin/checkout.c:1162
+msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 
-#: builtin/commit.c:1582
-msgid "commit message"
+#: 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/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
-msgid "commit"
+#: builtin/checkout.c:1194
+msgid "-b, -B and --orphan are mutually exclusive"
 msgstr ""
 
-#: builtin/commit.c:1583
-msgid "reuse and edit message from specified commit"
+#: builtin/checkout.c:1211
+msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/commit.c:1584
-msgid "reuse message from specified commit"
+#: builtin/checkout.c:1216
+msgid "Missing branch name; try -b"
 msgstr ""
 
-#: builtin/commit.c:1585
-msgid "use autosquash formatted message to fixup specified commit"
+#: builtin/checkout.c:1252
+msgid "invalid path specification"
 msgstr ""
 
-#: builtin/commit.c:1586
-msgid "use autosquash formatted message to squash specified commit"
+#: 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 ""
 
-#: builtin/commit.c:1587
-msgid "the commit is authored by me now (used with -C/-c/--amend)"
+#: builtin/checkout.c:1264
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr ""
 
-#: builtin/commit.c:1588 builtin/log.c:1219 builtin/revert.c:86
-msgid "add Signed-off-by:"
+#: builtin/checkout.c:1268
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
 msgstr ""
 
-#: builtin/commit.c:1589
-msgid "use specified template file"
+#: builtin/clean.c:25
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
 msgstr ""
 
-#: builtin/commit.c:1590
-msgid "force edit of commit"
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
 msgstr ""
 
-#: builtin/commit.c:1591
-msgid "default"
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
 msgstr ""
 
-#: builtin/commit.c:1591 builtin/tag.c:354
-msgid "how to strip spaces and #comments from message"
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
 msgstr ""
 
-#: builtin/commit.c:1592
-msgid "include status in commit message template"
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
 msgstr ""
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
-#: builtin/revert.c:93
-msgid "GPG sign commit"
+#: builtin/clean.c:33
+#, c-format
+msgid "failed to remove %s"
 msgstr ""
 
-#: builtin/commit.c:1597
-msgid "Commit contents options"
+#: 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 ""
 
-#: builtin/commit.c:1598
-msgid "commit all changed files"
+#: 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"
 msgstr ""
 
-#: builtin/commit.c:1599
-msgid "add specified files to index for commit"
+#: builtin/clean.c:511
+#, c-format
+msgid "Huh (%s)?"
 msgstr ""
 
-#: builtin/commit.c:1600
-msgid "interactively add files"
+#: builtin/clean.c:653
+#, c-format
+msgid "Input ignore patterns>> "
 msgstr ""
 
-#: builtin/commit.c:1601
-msgid "interactively add changes"
+#: builtin/clean.c:690
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
 msgstr ""
 
-#: builtin/commit.c:1602
-msgid "commit only specified files"
+#: builtin/clean.c:711
+msgid "Select items to delete"
 msgstr ""
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:752
+#, c-format
+msgid "Remove %s [y/N]? "
 msgstr ""
 
-#: builtin/commit.c:1604
-msgid "show what would be committed"
+#: builtin/clean.c:777
+msgid "Bye."
 msgstr ""
 
-#: builtin/commit.c:1615
-msgid "amend previous commit"
+#: 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 ""
 
-#: builtin/commit.c:1616
-msgid "bypass post-rewrite hook"
+#: builtin/clean.c:812
+msgid "*** Commands ***"
 msgstr ""
 
-#: builtin/commit.c:1621
-msgid "ok to record an empty change"
+#: builtin/clean.c:813
+msgid "What now"
 msgstr ""
 
-#: builtin/commit.c:1623
-msgid "ok to record a change with an empty message"
-msgstr ""
-
-#: builtin/commit.c:1652
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: builtin/commit.c:1698
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
-
-#: builtin/commit.c:1705
-msgid "could not read MERGE_MODE"
-msgstr ""
-
-#: builtin/commit.c:1724
-#, c-format
-msgid "could not read commit message: %s"
-msgstr ""
+#: builtin/clean.c:821
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/commit.c:1735
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
+#: builtin/clean.c:838
+msgid "No more files to clean, exiting."
 msgstr ""
 
-#: builtin/commit.c:1740
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
+#: builtin/clean.c:869
+msgid "do not print names of files removed"
 msgstr ""
 
-#: builtin/commit.c:1788
-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:871
+msgid "force"
 msgstr ""
 
-#: builtin/config.c:9
-msgid "git config [<options>]"
+#: builtin/clean.c:872
+msgid "interactive cleaning"
 msgstr ""
 
-#: builtin/config.c:56
-msgid "Config file location"
+#: builtin/clean.c:874
+msgid "remove whole directories"
 msgstr ""
 
-#: builtin/config.c:57
-msgid "use global config file"
+#: 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 ""
 
-#: builtin/config.c:58
-msgid "use system config file"
+#: builtin/clean.c:876
+msgid "add <pattern> to ignore rules"
 msgstr ""
 
-#: builtin/config.c:59
-msgid "use repository config file"
+#: builtin/clean.c:877
+msgid "remove ignored files, too"
 msgstr ""
 
-#: builtin/config.c:60
-msgid "use given config file"
+#: builtin/clean.c:879
+msgid "remove only ignored files"
 msgstr ""
 
-#: builtin/config.c:61
-msgid "blob-id"
+#: builtin/clean.c:897
+msgid "-x and -X cannot be used together"
 msgstr ""
 
-#: builtin/config.c:61
-msgid "read config from given blob object"
+#: builtin/clean.c:901
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
 msgstr ""
 
-#: builtin/config.c:62
-msgid "Action"
+#: builtin/clean.c:904
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
 msgstr ""
 
-#: builtin/config.c:63
-msgid "get value: name [value-regex]"
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr ""
 
-#: builtin/config.c:64
-msgid "get all values: key [value-regex]"
+#: builtin/clone.c:65
+msgid "don't create a checkout"
 msgstr ""
 
-#: builtin/config.c:65
-msgid "get values for regexp: name-regex [value-regex]"
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
+msgid "create a bare repository"
 msgstr ""
 
-#: builtin/config.c:66
-msgid "get value specific for the URL: section[.var] URL"
+#: builtin/clone.c:70
+msgid "create a mirror repository (implies bare)"
 msgstr ""
 
-#: builtin/config.c:67
-msgid "replace all matching variables: name value [value_regex]"
+#: builtin/clone.c:72
+msgid "to clone from a local repository"
 msgstr ""
 
-#: builtin/config.c:68
-msgid "add a new variable: name value"
+#: builtin/clone.c:74
+msgid "don't use local hardlinks, always copy"
 msgstr ""
 
-#: builtin/config.c:69
-msgid "remove a variable: name [value-regex]"
+#: builtin/clone.c:76
+msgid "setup as shared repository"
 msgstr ""
 
-#: builtin/config.c:70
-msgid "remove all matches: name [value-regex]"
+#: builtin/clone.c:78 builtin/clone.c:80
+msgid "initialize submodules in the clone"
 msgstr ""
 
-#: builtin/config.c:71
-msgid "rename section: old-name new-name"
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
 msgstr ""
 
-#: builtin/config.c:72
-msgid "remove a section: name"
+#: builtin/clone.c:83 builtin/init-db.c:475
+msgid "template-directory"
 msgstr ""
 
-#: builtin/config.c:73
-msgid "list all"
+#: builtin/clone.c:84 builtin/init-db.c:476
+msgid "directory from which templates will be used"
 msgstr ""
 
-#: builtin/config.c:74
-msgid "open an editor"
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
+msgid "reference repository"
 msgstr ""
 
-#: builtin/config.c:75
-msgid "find the color configured: slot [default]"
+#: builtin/clone.c:90
+msgid "use --reference only while cloning"
 msgstr ""
 
-#: builtin/config.c:76
-msgid "find the color setting: slot [stdout-is-tty]"
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
 msgstr ""
 
-#: builtin/config.c:77
-msgid "Type"
+#: builtin/clone.c:92
+msgid "use <name> instead of 'origin' to track upstream"
 msgstr ""
 
-#: builtin/config.c:78
-msgid "value is \"true\" or \"false\""
+#: builtin/clone.c:94
+msgid "checkout <branch> instead of the remote's HEAD"
 msgstr ""
 
-#: builtin/config.c:79
-msgid "value is decimal number"
+#: builtin/clone.c:96
+msgid "path to git-upload-pack on the remote"
 msgstr ""
 
-#: builtin/config.c:80
-msgid "value is --bool or --int"
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
+msgid "depth"
 msgstr ""
 
-#: builtin/config.c:81
-msgid "value is a path (file or directory name)"
+#: builtin/clone.c:98
+msgid "create a shallow clone of that depth"
 msgstr ""
 
-#: builtin/config.c:82
-msgid "Other"
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
 msgstr ""
 
-#: builtin/config.c:83
-msgid "terminate values with NUL byte"
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
 msgstr ""
 
-#: builtin/config.c:84
-msgid "show variable names only"
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
 msgstr ""
 
-#: builtin/config.c:85
-msgid "respect include directives on lookup"
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
 msgstr ""
 
-#: builtin/config.c:86
-msgid "show origin of config (file, standard input, blob, command line)"
+#: builtin/clone.c:104
+msgid "clone only one branch, HEAD or --branch"
 msgstr ""
 
-#: builtin/config.c:328
-msgid "unable to parse default color value"
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
 msgstr ""
 
-#: builtin/config.c:469
-#, 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:107 builtin/init-db.c:484
+msgid "gitdir"
 msgstr ""
 
-#: builtin/config.c:611
-#, c-format
-msgid "cannot create configuration file %s"
+#: builtin/clone.c:108 builtin/init-db.c:485
+msgid "separate git dir from working tree"
 msgstr ""
 
-#: builtin/count-objects.c:77
-msgid "git count-objects [-v] [-H | --human-readable]"
+#: builtin/clone.c:109
+msgid "key=value"
 msgstr ""
 
-#: builtin/count-objects.c:87
-msgid "print sizes in human readable format"
+#: builtin/clone.c:110
+msgid "set config inside the new repository"
 msgstr ""
 
-#: builtin/describe.c:17
-msgid "git describe [<options>] [<commit-ish>...]"
+#: builtin/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
+msgid "use IPv4 addresses only"
 msgstr ""
 
-#: builtin/describe.c:18
-msgid "git describe [<options>] --dirty"
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
+msgid "use IPv6 addresses only"
 msgstr ""
 
-#: builtin/describe.c:217
-#, c-format
-msgid "annotated tag %s not available"
+#: builtin/clone.c:250
+msgid ""
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
 msgstr ""
 
-#: builtin/describe.c:221
+#: builtin/clone.c:303
 #, c-format
-msgid "annotated tag %s has no embedded name"
+msgid "info: Could not add alternate for '%s': %s\n"
 msgstr ""
 
-#: builtin/describe.c:223
+#: builtin/clone.c:375
 #, c-format
-msgid "tag '%s' is really '%s' here"
+msgid "failed to open '%s'"
 msgstr ""
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/clone.c:383
 #, c-format
-msgid "Not a valid object name %s"
+msgid "%s exists and is not a directory"
 msgstr ""
 
-#: builtin/describe.c:253
+#: builtin/clone.c:397
 #, c-format
-msgid "%s is not a valid '%s' object"
+msgid "failed to stat %s\n"
 msgstr ""
 
-#: builtin/describe.c:270
+#: builtin/clone.c:419
 #, c-format
-msgid "no tag exactly matches '%s'"
+msgid "failed to create link '%s'"
 msgstr ""
 
-#: builtin/describe.c:272
+#: builtin/clone.c:423
 #, c-format
-msgid "searching to describe %s\n"
+msgid "failed to copy file to '%s'"
 msgstr ""
 
-#: builtin/describe.c:319
+#: builtin/clone.c:448
 #, c-format
-msgid "finished search at %s\n"
+msgid "done.\n"
 msgstr ""
 
-#: builtin/describe.c:346
-#, c-format
+#: builtin/clone.c:460
 msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
+"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:350
+#: builtin/clone.c:537
 #, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
+msgid "Could not find remote branch %s to clone."
 msgstr ""
 
-#: builtin/describe.c:371
-#, c-format
-msgid "traversed %lu commits\n"
+#: builtin/clone.c:632
+msgid "remote did not send all necessary objects"
 msgstr ""
 
-#: builtin/describe.c:374
+#: builtin/clone.c:648
 #, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
+msgid "unable to update %s"
 msgstr ""
 
-#: builtin/describe.c:396
-msgid "find the tag that comes after the commit"
+#: builtin/clone.c:697
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
 
-#: builtin/describe.c:397
-msgid "debug search strategy on stderr"
+#: builtin/clone.c:728
+msgid "unable to checkout working tree"
 msgstr ""
 
-#: builtin/describe.c:398
-msgid "use any ref"
+#: builtin/clone.c:768
+msgid "unable to write parameters to config file"
 msgstr ""
 
-#: builtin/describe.c:399
-msgid "use any tag, even unannotated"
+#: builtin/clone.c:831
+msgid "cannot repack to clean up"
 msgstr ""
 
-#: builtin/describe.c:400
-msgid "always use long format"
+#: builtin/clone.c:833
+msgid "cannot unlink temporary alternates file"
 msgstr ""
 
-#: builtin/describe.c:401
-msgid "only follow first parent"
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
+msgid "Too many arguments."
 msgstr ""
 
-#: builtin/describe.c:404
-msgid "only output exact matches"
+#: builtin/clone.c:870
+msgid "You must specify a repository to clone."
 msgstr ""
 
-#: builtin/describe.c:406
-msgid "consider <n> most recent tags (default: 10)"
+#: builtin/clone.c:883
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
 msgstr ""
 
-#: builtin/describe.c:408
-msgid "only consider tags matching <pattern>"
+#: builtin/clone.c:886
+msgid "--bare and --separate-git-dir are incompatible."
 msgstr ""
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
-msgid "show abbreviated commit object as fallback"
+#: builtin/clone.c:899
+#, c-format
+msgid "repository '%s' does not exist"
 msgstr ""
 
-#: builtin/describe.c:411
-msgid "mark"
+#: builtin/clone.c:905 builtin/fetch.c:1338
+#, c-format
+msgid "depth %s is not a positive number"
 msgstr ""
 
-#: builtin/describe.c:412
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+#: builtin/clone.c:915
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
 msgstr ""
 
-#: builtin/describe.c:430
-msgid "--long is incompatible with --abbrev=0"
+#: builtin/clone.c:925
+#, c-format
+msgid "working tree '%s' already exists."
 msgstr ""
 
-#: builtin/describe.c:456
-msgid "No names found, cannot describe anything."
-msgstr ""
-
-#: builtin/describe.c:476
-msgid "--dirty is incompatible with commit-ishes"
-msgstr ""
-
-#: builtin/diff.c:86
-#, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr ""
-
-#: builtin/diff.c:237
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
+#: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
-msgid "invalid option: %s"
-msgstr ""
-
-#: builtin/diff.c:358
-msgid "Not a git repository"
+msgid "could not create leading directories of '%s'"
 msgstr ""
 
-#: builtin/diff.c:401
+#: builtin/clone.c:943
 #, c-format
-msgid "invalid object '%s' given."
+msgid "could not create work tree dir '%s'"
 msgstr ""
 
-#: builtin/diff.c:410
+#: builtin/clone.c:955
 #, c-format
-msgid "more than two blobs given: '%s'"
+msgid "Cloning into bare repository '%s'...\n"
 msgstr ""
 
-#: builtin/diff.c:417
+#: builtin/clone.c:957
 #, c-format
-msgid "unhandled object '%s' given."
-msgstr ""
-
-#: builtin/fast-export.c:25
-msgid "git fast-export [rev-list-opts]"
-msgstr ""
-
-#: builtin/fast-export.c:980
-msgid "show progress after <n> objects"
-msgstr ""
-
-#: builtin/fast-export.c:982
-msgid "select handling of signed tags"
+msgid "Cloning into '%s'...\n"
 msgstr ""
 
-#: builtin/fast-export.c:985
-msgid "select handling of tags that tag filtered objects"
+#: builtin/clone.c:963
+msgid ""
+"clone --recursive is not compatible with both --reference and --reference-if-"
+"able"
 msgstr ""
 
-#: builtin/fast-export.c:988
-msgid "Dump marks to this file"
+#: builtin/clone.c:1019
+msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/fast-export.c:990
-msgid "Import marks from this file"
+#: builtin/clone.c:1021
+msgid "--shallow-since 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:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr ""
 
-#: builtin/fast-export.c:994
-msgid "Output full tree for each commit"
+#: builtin/clone.c:1026
+msgid "source repository is shallow, ignoring --local"
 msgstr ""
 
-#: builtin/fast-export.c:996
-msgid "Use the done feature to terminate the stream"
+#: builtin/clone.c:1031
+msgid "--local is ignored"
 msgstr ""
 
-#: builtin/fast-export.c:997
-msgid "Skip output of blob data"
+#: builtin/clone.c:1035
+#, c-format
+msgid "Don't know how to clone %s"
 msgstr ""
 
-#: builtin/fast-export.c:998
-msgid "refspec"
+#: builtin/clone.c:1090 builtin/clone.c:1098
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
 msgstr ""
 
-#: builtin/fast-export.c:999
-msgid "Apply refspec to exported refs"
+#: builtin/clone.c:1101
+msgid "You appear to have cloned an empty repository."
 msgstr ""
 
-#: builtin/fast-export.c:1000
-msgid "anonymize output"
+#: builtin/column.c:9
+msgid "git column [<options>]"
 msgstr ""
 
-#: builtin/fetch.c:20
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+#: builtin/column.c:26
+msgid "lookup config vars"
 msgstr ""
 
-#: builtin/fetch.c:21
-msgid "git fetch [<options>] <group>"
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
 msgstr ""
 
-#: builtin/fetch.c:22
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+#: builtin/column.c:29
+msgid "Maximum width"
 msgstr ""
 
-#: builtin/fetch.c:23
-msgid "git fetch --all [<options>]"
+#: builtin/column.c:30
+msgid "Padding space on left border"
 msgstr ""
 
-#: builtin/fetch.c:92 builtin/pull.c:166
-msgid "fetch from all remotes"
+#: builtin/column.c:31
+msgid "Padding space on right border"
 msgstr ""
 
-#: builtin/fetch.c:94 builtin/pull.c:169
-msgid "append to .git/FETCH_HEAD instead of overwriting"
+#: builtin/column.c:32
+msgid "Padding space between columns"
 msgstr ""
 
-#: builtin/fetch.c:96 builtin/pull.c:172
-msgid "path to upload pack on remote end"
+#: builtin/column.c:51
+msgid "--command must be the first argument"
 msgstr ""
 
-#: builtin/fetch.c:97 builtin/pull.c:174
-msgid "force overwrite of local branch"
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/fetch.c:99
-msgid "fetch from multiple remotes"
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
 msgstr ""
 
-#: builtin/fetch.c:101 builtin/pull.c:176
-msgid "fetch all tags and associated objects"
+#: 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:103
-msgid "do not fetch all tags (--no-tags)"
+#: 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:105
-msgid "number of submodules fetched in parallel"
+#: 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:107 builtin/pull.c:179
-msgid "prune remote-tracking branches no longer on remote"
+#: 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:108 builtin/pull.c:182
-msgid "on-demand"
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
 msgstr ""
 
-#: builtin/fetch.c:109 builtin/pull.c:183
-msgid "control recursive fetching of submodules"
+#: 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:113 builtin/pull.c:191
-msgid "keep downloaded pack"
+#: builtin/commit.c:318
+msgid "failed to unpack HEAD tree object"
 msgstr ""
 
-#: builtin/fetch.c:115
-msgid "allow updating of HEAD ref"
+#: builtin/commit.c:359
+msgid "unable to create temporary index"
 msgstr ""
 
-#: builtin/fetch.c:118 builtin/pull.c:194
-msgid "deepen history of shallow clone"
+#: builtin/commit.c:365
+msgid "interactive add failed"
 msgstr ""
 
-#: builtin/fetch.c:120 builtin/pull.c:197
-msgid "convert to a complete repository"
+#: builtin/commit.c:378
+msgid "unable to update temporary index"
 msgstr ""
 
-#: builtin/fetch.c:122 builtin/log.c:1236
-msgid "dir"
+#: builtin/commit.c:380
+msgid "Failed to update main cache tree"
 msgstr ""
 
-#: builtin/fetch.c:123
-msgid "prepend this to submodule path output"
+#: builtin/commit.c:404 builtin/commit.c:427 builtin/commit.c:476
+msgid "unable to write new_index file"
 msgstr ""
 
-#: builtin/fetch.c:126
-msgid "default mode for recursion"
+#: builtin/commit.c:458
+msgid "cannot do a partial commit during a merge."
 msgstr ""
 
-#: builtin/fetch.c:128 builtin/pull.c:200
-msgid "accept refs that update .git/shallow"
+#: builtin/commit.c:460
+msgid "cannot do a partial commit during a cherry-pick."
 msgstr ""
 
-#: builtin/fetch.c:129 builtin/pull.c:202
-msgid "refmap"
+#: builtin/commit.c:469
+msgid "cannot read the index"
 msgstr ""
 
-#: builtin/fetch.c:130 builtin/pull.c:203
-msgid "specify fetch refmap"
+#: builtin/commit.c:488
+msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/fetch.c:386
-msgid "Couldn't find remote ref HEAD"
+#: builtin/commit.c:582
+#, c-format
+msgid "commit '%s' lacks author header"
 msgstr ""
 
-#: builtin/fetch.c:466
+#: builtin/commit.c:584
 #, c-format
-msgid "object %s not found"
+msgid "commit '%s' has malformed author line"
 msgstr ""
 
-#: builtin/fetch.c:471
-msgid "[up to date]"
+#: builtin/commit.c:603
+msgid "malformed --author parameter"
 msgstr ""
 
-#: builtin/fetch.c:485
+#: builtin/commit.c:611
 #, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr ""
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
-msgid "[rejected]"
+msgid "invalid date format: %s"
 msgstr ""
 
-#: builtin/fetch.c:497
-msgid "[tag update]"
+#: 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:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
+#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1096
+#, c-format
+msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/fetch.c:517
-msgid "[new tag]"
+#: builtin/commit.c:704 builtin/shortlog.c:286
+#, c-format
+msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/fetch.c:520
-msgid "[new branch]"
+#: builtin/commit.c:706
+msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/fetch.c:523
-msgid "[new ref]"
+#: builtin/commit.c:710
+#, c-format
+msgid "could not read log file '%s'"
 msgstr ""
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
+#: builtin/commit.c:737 builtin/commit.c:745
+msgid "could not read SQUASH_MSG"
 msgstr ""
 
-#: builtin/fetch.c:569
-msgid "forced update"
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
 msgstr ""
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
+#: builtin/commit.c:796
+msgid "could not write commit template"
 msgstr ""
 
-#: builtin/fetch.c:610 builtin/fetch.c:851
+#: builtin/commit.c:814
 #, c-format
-msgid "cannot open %s: %s\n"
+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:619
+#: 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:637
+#: 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:724 builtin/fetch.c:816
+#: 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:735
+#: 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:787
+#: builtin/commit.c:867
 #, c-format
-msgid "   (%s will become dangling)"
+msgid "%sDate:      %s"
 msgstr ""
 
-#: builtin/fetch.c:788
+#: builtin/commit.c:874
 #, c-format
-msgid "   (%s has become dangling)"
+msgid "%sCommitter: %.*s <%.*s>"
 msgstr ""
 
-#: builtin/fetch.c:820
-msgid "[deleted]"
+#: builtin/commit.c:892
+msgid "Cannot read index"
 msgstr ""
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
-msgid "(none)"
+#: builtin/commit.c:954
+msgid "Error building trees"
 msgstr ""
 
-#: builtin/fetch.c:841
+#: builtin/commit.c:969 builtin/tag.c:266
 #, 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:860
+#: 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:863
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
-msgid "Option \"%s\" is ignored for %s\n"
+msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/fetch.c:920
-#, 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:1080
-#, 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:1082 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:1100
-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:1123
-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:1165
-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:1167
-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:1187
-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:1189
-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:1200
-#, 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:1208
-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 "Clever... amending the last one with dirty index."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:667
-msgid "populate log with at most <n> entries from shortlog"
+#: builtin/commit.c:1214
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:670
-msgid "alias for --log (deprecated)"
+#: builtin/commit.c:1226 builtin/tag.c:474
+#, c-format
+msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:673
-msgid "text"
+#: builtin/commit.c:1231
+msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:674
-msgid "use <text> as start of message"
+#: builtin/commit.c:1341 builtin/commit.c:1617
+msgid "show status concisely"
 msgstr ""
 
-#: builtin/fmt-merge-msg.c:675
-msgid "file to read from"
+#: builtin/commit.c:1343 builtin/commit.c:1619
+msgid "show branch information"
 msgstr ""
 
-#: builtin/for-each-ref.c:9
-msgid "git for-each-ref [<options>] [<pattern>]"
+#: builtin/commit.c:1345
+msgid "version"
 msgstr ""
 
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [--points-at <object>]"
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
+msgid "machine-readable output"
 msgstr ""
 
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+#: builtin/commit.c:1348 builtin/commit.c:1623
+msgid "show status in long format (default)"
 msgstr ""
 
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
+#: builtin/commit.c:1351 builtin/commit.c:1626
+msgid "terminate entries with NUL"
 msgstr ""
 
-#: builtin/for-each-ref.c:27
-msgid "quote placeholders suitably for shells"
+#: 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/for-each-ref.c:29
-msgid "quote placeholders suitably for perl"
+#: builtin/commit.c:1354 builtin/commit.c:1629
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
 msgstr ""
 
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for python"
+#: builtin/commit.c:1357
+msgid "show ignored files"
 msgstr ""
 
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for Tcl"
+#: builtin/commit.c:1358 parse-options.h:155
+msgid "when"
 msgstr ""
 
-#: builtin/for-each-ref.c:36
-msgid "show only <n> matched refs"
+#: builtin/commit.c:1359
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
 msgstr ""
 
-#: builtin/for-each-ref.c:37 builtin/tag.c:372
-msgid "format to use for the output"
+#: builtin/commit.c:1361
+msgid "list untracked files in columns"
 msgstr ""
 
-#: builtin/for-each-ref.c:41
-msgid "print only refs which points at the given object"
+#: builtin/commit.c:1437
+msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/for-each-ref.c:43
-msgid "print only refs that are merged"
+#: builtin/commit.c:1439
+msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/for-each-ref.c:44
-msgid "print only refs that are not merged"
+#: builtin/commit.c:1484
+msgid "detached HEAD"
 msgstr ""
 
-#: builtin/for-each-ref.c:45
-msgid "print only refs which contain the commit"
+#: builtin/commit.c:1487
+msgid " (root-commit)"
 msgstr ""
 
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
+#: builtin/commit.c:1587
+msgid "suppress summary after successful commit"
 msgstr ""
 
-#: builtin/fsck.c:486
-msgid "Checking object directories"
+#: builtin/commit.c:1588
+msgid "show diff in commit message template"
 msgstr ""
 
-#: builtin/fsck.c:553
-msgid "git fsck [<options>] [<object>...]"
+#: builtin/commit.c:1590
+msgid "Commit message options"
 msgstr ""
 
-#: builtin/fsck.c:559
-msgid "show unreachable objects"
+#: builtin/commit.c:1591 builtin/tag.c:351
+msgid "read message from file"
 msgstr ""
 
-#: builtin/fsck.c:560
-msgid "show dangling objects"
+#: builtin/commit.c:1592
+msgid "author"
 msgstr ""
 
-#: builtin/fsck.c:561
-msgid "report tags"
+#: builtin/commit.c:1592
+msgid "override author for commit"
 msgstr ""
 
-#: builtin/fsck.c:562
-msgid "report root nodes"
+#: builtin/commit.c:1593 builtin/gc.c:326
+msgid "date"
 msgstr ""
 
-#: builtin/fsck.c:563
-msgid "make index objects head nodes"
+#: builtin/commit.c:1593
+msgid "override date for commit"
 msgstr ""
 
-#: builtin/fsck.c:564
-msgid "make reflogs head nodes (default)"
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
+msgid "message"
 msgstr ""
 
-#: builtin/fsck.c:565
-msgid "also consider packs and alternate objects"
+#: builtin/commit.c:1594
+msgid "commit message"
 msgstr ""
 
-#: builtin/fsck.c:566
-msgid "check only connectivity"
+#: 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/fsck.c:567
-msgid "enable more strict checking"
+#: builtin/commit.c:1595
+msgid "reuse and edit message from specified commit"
 msgstr ""
 
-#: builtin/fsck.c:569
-msgid "write dangling objects in .git/lost-found"
+#: builtin/commit.c:1596
+msgid "reuse message from specified commit"
 msgstr ""
 
-#: builtin/fsck.c:570 builtin/prune.c:107
-msgid "show progress"
+#: builtin/commit.c:1597
+msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 
-#: builtin/fsck.c:631
-msgid "Checking objects"
+#: builtin/commit.c:1598
+msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 
-#: builtin/gc.c:25
-msgid "git gc [<options>]"
+#: builtin/commit.c:1599
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr ""
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
+msgid "add Signed-off-by:"
 msgstr ""
 
-#: builtin/gc.c:139
-#, c-format
-msgid "insanely long object directory %.*s"
+#: builtin/commit.c:1601
+msgid "use specified template file"
 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:1602
+msgid "force edit of commit"
 msgstr ""
 
-#: builtin/gc.c:327
-msgid "prune unreferenced objects"
+#: builtin/commit.c:1603
+msgid "default"
 msgstr ""
 
-#: builtin/gc.c:329
-msgid "be more thorough (increased runtime)"
+#: builtin/commit.c:1603 builtin/tag.c:354
+msgid "how to strip spaces and #comments from message"
 msgstr ""
 
-#: builtin/gc.c:330
-msgid "enable auto-gc mode"
+#: builtin/commit.c:1604
+msgid "include status in commit message template"
 msgstr ""
 
-#: builtin/gc.c:331
-msgid "force running gc even if there may be another gc running"
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
+#: builtin/revert.c:93
+msgid "GPG sign commit"
 msgstr ""
 
-#: builtin/gc.c:373
-#, c-format
-msgid "Auto packing the repository in background for optimum performance.\n"
+#: builtin/commit.c:1609
+msgid "Commit contents options"
 msgstr ""
 
-#: builtin/gc.c:375
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
+#: builtin/commit.c:1610
+msgid "commit all changed files"
 msgstr ""
 
-#: builtin/gc.c:376
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
+#: builtin/commit.c:1611
+msgid "add specified files to index for commit"
 msgstr ""
 
-#: builtin/gc.c:397
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+#: builtin/commit.c:1612
+msgid "interactively add files"
 msgstr ""
 
-#: builtin/gc.c:441
-msgid ""
-"There are too many unreachable loose objects; run 'git prune' to remove them."
+#: builtin/commit.c:1613
+msgid "interactively add changes"
 msgstr ""
 
-#: builtin/grep.c:23
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+#: builtin/commit.c:1614
+msgid "commit only specified files"
 msgstr ""
 
-#: builtin/grep.c:219
-#, c-format
-msgid "grep: failed to create thread: %s"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
 msgstr ""
 
-#: builtin/grep.c:277
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
+#: builtin/commit.c:1616
+msgid "show what would be committed"
 msgstr ""
 
-#: builtin/grep.c:452 builtin/grep.c:487
-#, c-format
-msgid "unable to read tree (%s)"
+#: builtin/commit.c:1627
+msgid "amend previous commit"
 msgstr ""
 
-#: builtin/grep.c:502
-#, c-format
-msgid "unable to grep from object of type %s"
+#: builtin/commit.c:1628
+msgid "bypass post-rewrite hook"
 msgstr ""
 
-#: builtin/grep.c:558
-#, c-format
-msgid "switch `%c' expects a numerical value"
+#: builtin/commit.c:1633
+msgid "ok to record an empty change"
 msgstr ""
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
+#: builtin/commit.c:1635
+msgid "ok to record a change with an empty message"
 msgstr ""
 
-#: builtin/grep.c:644
-msgid "search in index instead of in the work tree"
+#: builtin/commit.c:1664
+msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/grep.c:646
-msgid "find in contents not managed by git"
+#: builtin/commit.c:1712
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/grep.c:648
-msgid "search in both tracked and untracked files"
+#: builtin/commit.c:1719
+msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/grep.c:650
-msgid "ignore files specified via '.gitignore'"
+#: builtin/commit.c:1738
+#, c-format
+msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/grep.c:653
-msgid "show non-matching lines"
+#: builtin/commit.c:1749
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/grep.c:655
-msgid "case insensitive matching"
+#: builtin/commit.c:1754
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/grep.c:657
-msgid "match patterns only at word boundaries"
+#: 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"
+"not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 
-#: builtin/grep.c:659
-msgid "process binary files as text"
+#: builtin/config.c:9
+msgid "git config [<options>]"
 msgstr ""
 
-#: builtin/grep.c:661
-msgid "don't match patterns in binary files"
+#: builtin/config.c:55
+msgid "Config file location"
 msgstr ""
 
-#: builtin/grep.c:664
-msgid "process binary files with textconv filters"
+#: builtin/config.c:56
+msgid "use global config file"
 msgstr ""
 
-#: builtin/grep.c:666
-msgid "descend at most <depth> levels"
+#: builtin/config.c:57
+msgid "use system config file"
 msgstr ""
 
-#: builtin/grep.c:670
-msgid "use extended POSIX regular expressions"
+#: builtin/config.c:58
+msgid "use repository config file"
 msgstr ""
 
-#: builtin/grep.c:673
-msgid "use basic POSIX regular expressions (default)"
+#: builtin/config.c:59
+msgid "use given config file"
 msgstr ""
 
-#: builtin/grep.c:676
-msgid "interpret patterns as fixed strings"
+#: builtin/config.c:60
+msgid "blob-id"
 msgstr ""
 
-#: builtin/grep.c:679
-msgid "use Perl-compatible regular expressions"
+#: builtin/config.c:60
+msgid "read config from given blob object"
 msgstr ""
 
-#: builtin/grep.c:682
-msgid "show line numbers"
+#: builtin/config.c:61
+msgid "Action"
 msgstr ""
 
-#: builtin/grep.c:683
-msgid "don't show filenames"
+#: builtin/config.c:62
+msgid "get value: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:684
-msgid "show filenames"
-msgstr ""
-
-#: builtin/grep.c:686
-msgid "show filenames relative to top directory"
+#: builtin/config.c:63
+msgid "get all values: key [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:688
-msgid "show only filenames instead of matching lines"
+#: builtin/config.c:64
+msgid "get values for regexp: name-regex [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:690
-msgid "synonym for --files-with-matches"
+#: builtin/config.c:65
+msgid "get value specific for the URL: section[.var] URL"
 msgstr ""
 
-#: builtin/grep.c:693
-msgid "show only the names of files without match"
+#: builtin/config.c:66
+msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 
-#: builtin/grep.c:695
-msgid "print NUL after filenames"
+#: builtin/config.c:67
+msgid "add a new variable: name value"
 msgstr ""
 
-#: builtin/grep.c:697
-msgid "show the number of matches instead of matching lines"
+#: builtin/config.c:68
+msgid "remove a variable: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:698
-msgid "highlight matches"
+#: builtin/config.c:69
+msgid "remove all matches: name [value-regex]"
 msgstr ""
 
-#: builtin/grep.c:700
-msgid "print empty line between matches from different files"
+#: builtin/config.c:70
+msgid "rename section: old-name new-name"
 msgstr ""
 
-#: builtin/grep.c:702
-msgid "show filename only once above matches from same file"
+#: builtin/config.c:71
+msgid "remove a section: name"
 msgstr ""
 
-#: builtin/grep.c:705
-msgid "show <n> context lines before and after matches"
+#: builtin/config.c:72
+msgid "list all"
 msgstr ""
 
-#: builtin/grep.c:708
-msgid "show <n> context lines before matches"
+#: builtin/config.c:73
+msgid "open an editor"
 msgstr ""
 
-#: builtin/grep.c:710
-msgid "show <n> context lines after matches"
+#: builtin/config.c:74
+msgid "find the color configured: slot [default]"
 msgstr ""
 
-#: builtin/grep.c:712
-msgid "use <n> worker threads"
+#: builtin/config.c:75
+msgid "find the color setting: slot [stdout-is-tty]"
 msgstr ""
 
-#: builtin/grep.c:713
-msgid "shortcut for -C NUM"
+#: builtin/config.c:76
+msgid "Type"
 msgstr ""
 
-#: builtin/grep.c:716
-msgid "show a line with the function name before matches"
+#: builtin/config.c:77
+msgid "value is \"true\" or \"false\""
 msgstr ""
 
-#: builtin/grep.c:718
-msgid "show the surrounding function"
+#: builtin/config.c:78
+msgid "value is decimal number"
 msgstr ""
 
-#: builtin/grep.c:721
-msgid "read patterns from file"
+#: builtin/config.c:79
+msgid "value is --bool or --int"
 msgstr ""
 
-#: builtin/grep.c:723
-msgid "match <pattern>"
+#: builtin/config.c:80
+msgid "value is a path (file or directory name)"
 msgstr ""
 
-#: builtin/grep.c:725
-msgid "combine patterns specified with -e"
+#: builtin/config.c:81
+msgid "Other"
 msgstr ""
 
-#: builtin/grep.c:737
-msgid "indicate hit with exit status without output"
+#: builtin/config.c:82
+msgid "terminate values with NUL byte"
 msgstr ""
 
-#: builtin/grep.c:739
-msgid "show only matches from files that match all patterns"
+#: builtin/config.c:83
+msgid "show variable names only"
 msgstr ""
 
-#: builtin/grep.c:741
-msgid "show parse tree for grep expression"
+#: builtin/config.c:84
+msgid "respect include directives on lookup"
 msgstr ""
 
-#: builtin/grep.c:745
-msgid "pager"
+#: builtin/config.c:85
+msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 
-#: builtin/grep.c:745
-msgid "show matching files in the pager"
+#: builtin/config.c:327
+msgid "unable to parse default color value"
 msgstr ""
 
-#: builtin/grep.c:748
-msgid "allow calling of grep(1) (ignored by this build)"
+#: 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"
 msgstr ""
 
-#: builtin/grep.c:811
-msgid "no pattern given."
+#: builtin/config.c:613
+#, c-format
+msgid "cannot create configuration file %s"
 msgstr ""
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/config.c:625
 #, c-format
-msgid "invalid number of threads specified (%d)"
+msgid ""
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
 msgstr ""
 
-#: builtin/grep.c:873
-msgid "--open-files-in-pager only works on the worktree"
+#: builtin/count-objects.c:86
+msgid "git count-objects [-v] [-H | --human-readable]"
 msgstr ""
 
-#: builtin/grep.c:899
-msgid "--cached or --untracked cannot be used with --no-index."
+#: builtin/count-objects.c:96
+msgid "print sizes in human readable format"
 msgstr ""
 
-#: builtin/grep.c:904
-msgid "--no-index or --untracked cannot be used with revs."
+#: builtin/describe.c:17
+msgid "git describe [<options>] [<commit-ish>...]"
 msgstr ""
 
-#: builtin/grep.c:907
-msgid "--[no-]exclude-standard cannot be used for tracked contents."
+#: builtin/describe.c:18
+msgid "git describe [<options>] --dirty"
 msgstr ""
 
-#: builtin/grep.c:915
-msgid "both --cached and trees are given."
+#: builtin/describe.c:217
+#, 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:221
+#, 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:223
+#, c-format
+msgid "tag '%s' is really '%s' here"
 msgstr ""
 
-#: builtin/hash-object.c:93
-msgid "type"
+#: builtin/describe.c:250 builtin/log.c:480
+#, c-format
+msgid "Not a valid object name %s"
 msgstr ""
 
-#: builtin/hash-object.c:93
-msgid "object type"
+#: builtin/describe.c:253
+#, 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:270
+#, c-format
+msgid "no tag exactly matches '%s'"
 msgstr ""
 
-#: builtin/hash-object.c:96
-msgid "read the object from stdin"
+#: builtin/describe.c:272
+#, c-format
+msgid "searching to describe %s\n"
 msgstr ""
 
-#: builtin/hash-object.c:98
-msgid "store file as is without filters"
+#: builtin/describe.c:319
+#, c-format
+msgid "finished search at %s\n"
 msgstr ""
 
-#: builtin/hash-object.c:99
+#: builtin/describe.c:346
+#, c-format
 msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
 msgstr ""
 
-#: builtin/hash-object.c:100
-msgid "process file as it were from this path"
+#: builtin/describe.c:350
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
 msgstr ""
 
-#: builtin/help.c:41
-msgid "print all available commands"
+#: builtin/describe.c:371
+#, c-format
+msgid "traversed %lu commits\n"
 msgstr ""
 
-#: builtin/help.c:42
-msgid "print list of useful guides"
+#: builtin/describe.c:374
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
 msgstr ""
 
-#: builtin/help.c:43
-msgid "show man page"
+#: builtin/describe.c:396
+msgid "find the tag that comes after the commit"
 msgstr ""
 
-#: builtin/help.c:44
-msgid "show manual in web browser"
+#: builtin/describe.c:397
+msgid "debug search strategy on stderr"
 msgstr ""
 
-#: builtin/help.c:46
-msgid "show info page"
+#: builtin/describe.c:398
+msgid "use any ref"
 msgstr ""
 
-#: builtin/help.c:52
-msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+#: builtin/describe.c:399
+msgid "use any tag, even unannotated"
 msgstr ""
 
-#: builtin/help.c:64
-#, c-format
-msgid "unrecognized help format '%s'"
+#: builtin/describe.c:400
+msgid "always use long format"
 msgstr ""
 
-#: builtin/help.c:91
-msgid "Failed to start emacsclient."
+#: builtin/describe.c:401
+msgid "only follow first parent"
 msgstr ""
 
-#: builtin/help.c:104
-msgid "Failed to parse emacsclient version."
+#: builtin/describe.c:404
+msgid "only output exact matches"
 msgstr ""
 
-#: builtin/help.c:112
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
+#: builtin/describe.c:406
+msgid "consider <n> most recent tags (default: 10)"
 msgstr ""
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
-#, c-format
-msgid "failed to exec '%s': %s"
+#: builtin/describe.c:408
+msgid "only consider tags matching <pattern>"
 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:410 builtin/name-rev.c:320
+msgid "show abbreviated commit object as fallback"
 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:411
+msgid "mark"
 msgstr ""
 
-#: builtin/help.c:334
-#, c-format
-msgid "'%s': unknown man viewer."
+#: builtin/describe.c:412
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
 msgstr ""
 
-#: builtin/help.c:351
-msgid "no man viewer handled the request"
+#: builtin/describe.c:430
+msgid "--long is incompatible with --abbrev=0"
 msgstr ""
 
-#: builtin/help.c:359
-msgid "no info viewer handled the request"
+#: builtin/describe.c:456
+msgid "No names found, cannot describe anything."
 msgstr ""
 
-#: builtin/help.c:408
-msgid "Defining attributes per path"
+#: builtin/describe.c:476
+msgid "--dirty is incompatible with commit-ishes"
 msgstr ""
 
-#: builtin/help.c:409
-msgid "Everyday Git With 20 Commands Or So"
+#: builtin/diff.c:86
+#, c-format
+msgid "'%s': not a regular file or symlink"
 msgstr ""
 
-#: builtin/help.c:410
-msgid "A Git glossary"
+#: builtin/diff.c:237
+#, c-format
+msgid "invalid option: %s"
 msgstr ""
 
-#: builtin/help.c:411
-msgid "Specifies intentionally untracked files to ignore"
+#: builtin/diff.c:361
+msgid "Not a git repository"
 msgstr ""
 
-#: builtin/help.c:412
-msgid "Defining submodule properties"
+#: builtin/diff.c:404
+#, c-format
+msgid "invalid object '%s' given."
 msgstr ""
 
-#: builtin/help.c:413
-msgid "Specifying revisions and ranges for Git"
+#: builtin/diff.c:413
+#, c-format
+msgid "more than two blobs given: '%s'"
 msgstr ""
 
-#: builtin/help.c:414
-msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+#: builtin/diff.c:420
+#, c-format
+msgid "unhandled object '%s' given."
 msgstr ""
 
-#: builtin/help.c:415
-msgid "An overview of recommended workflows with Git"
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
 msgstr ""
 
-#: builtin/help.c:427
-msgid "The common Git guides are:\n"
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
 msgstr ""
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
 msgstr ""
 
-#: builtin/help.c:481
-#, c-format
-msgid "`git %s' is aliased to `%s'"
-msgstr ""
-
-#: builtin/index-pack.c:152
-#, c-format
-msgid "unable to open %s"
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
 msgstr ""
 
-#: builtin/index-pack.c:202
-#, c-format
-msgid "object type mismatch at %s"
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
 msgstr ""
 
-#: builtin/index-pack.c:222
-#, c-format
-msgid "did not receive expected object %s"
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
 msgstr ""
 
-#: builtin/index-pack.c:225
-#, c-format
-msgid "object %s: expected type %s, found %s"
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
 msgstr ""
 
-#: builtin/index-pack.c:267
-#, c-format
-msgid "cannot fill %d byte"
-msgid_plural "cannot fill %d bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:277
-msgid "early EOF"
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
 msgstr ""
 
-#: builtin/index-pack.c:278
-msgid "read error on input"
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
 msgstr ""
 
-#: builtin/index-pack.c:290
-msgid "used more bytes than were available"
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
 msgstr ""
 
-#: builtin/index-pack.c:297
-msgid "pack too large for current definition of off_t"
+#: builtin/fast-export.c:998
+msgid "refspec"
 msgstr ""
 
-#: builtin/index-pack.c:313
-#, c-format
-msgid "unable to create '%s'"
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
 msgstr ""
 
-#: builtin/index-pack.c:318
-#, c-format
-msgid "cannot open packfile '%s'"
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
 msgstr ""
 
-#: builtin/index-pack.c:332
-msgid "pack signature mismatch"
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 
-#: builtin/index-pack.c:334
-#, c-format
-msgid "pack version %<PRIu32> unsupported"
+#: builtin/fetch.c:22
+msgid "git fetch [<options>] <group>"
 msgstr ""
 
-#: builtin/index-pack.c:352
-#, c-format
-msgid "pack has bad object at offset %lu: %s"
+#: builtin/fetch.c:23
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr ""
 
-#: builtin/index-pack.c:473
-#, c-format
-msgid "inflate returned %d"
+#: builtin/fetch.c:24
+msgid "git fetch --all [<options>]"
 msgstr ""
 
-#: builtin/index-pack.c:522
-msgid "offset value overflow for delta base object"
+#: builtin/fetch.c:95 builtin/pull.c:175
+msgid "fetch from all remotes"
 msgstr ""
 
-#: builtin/index-pack.c:530
-msgid "delta base offset is out of bound"
+#: builtin/fetch.c:97 builtin/pull.c:178
+msgid "append to .git/FETCH_HEAD instead of overwriting"
 msgstr ""
 
-#: builtin/index-pack.c:538
-#, c-format
-msgid "unknown object type %d"
+#: builtin/fetch.c:99 builtin/pull.c:181
+msgid "path to upload pack on remote end"
 msgstr ""
 
-#: builtin/index-pack.c:569
-msgid "cannot pread pack file"
+#: builtin/fetch.c:100 builtin/pull.c:183
+msgid "force overwrite of local branch"
 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] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:597
-msgid "serious inflate inconsistency"
+#: builtin/fetch.c:102
+msgid "fetch from multiple remotes"
 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
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
+#: builtin/fetch.c:104 builtin/pull.c:185
+msgid "fetch all tags and associated objects"
 msgstr ""
 
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
-#, c-format
-msgid "unable to read %s"
+#: builtin/fetch.c:106
+msgid "do not fetch all tags (--no-tags)"
 msgstr ""
 
-#: builtin/index-pack.c:812
-#, c-format
-msgid "cannot read existing object %s"
+#: builtin/fetch.c:108
+msgid "number of submodules fetched in parallel"
 msgstr ""
 
-#: builtin/index-pack.c:826
-#, c-format
-msgid "invalid blob object %s"
+#: builtin/fetch.c:110 builtin/pull.c:188
+msgid "prune remote-tracking branches no longer on remote"
 msgstr ""
 
-#: builtin/index-pack.c:840
-#, c-format
-msgid "invalid %s"
+#: builtin/fetch.c:111 builtin/pull.c:191
+msgid "on-demand"
 msgstr ""
 
-#: builtin/index-pack.c:843
-msgid "Error in object"
+#: builtin/fetch.c:112 builtin/pull.c:192
+msgid "control recursive fetching of submodules"
 msgstr ""
 
-#: builtin/index-pack.c:845
-#, c-format
-msgid "Not all child objects of %s are reachable"
+#: builtin/fetch.c:116 builtin/pull.c:200
+msgid "keep downloaded pack"
 msgstr ""
 
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
-msgid "failed to apply delta"
+#: builtin/fetch.c:118
+msgid "allow updating of HEAD ref"
 msgstr ""
 
-#: builtin/index-pack.c:1118
-msgid "Receiving objects"
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
+msgid "deepen history of shallow clone"
 msgstr ""
 
-#: builtin/index-pack.c:1118
-msgid "Indexing objects"
+#: builtin/fetch.c:123
+msgid "deepen history of shallow repository based on time"
 msgstr ""
 
-#: builtin/index-pack.c:1150
-msgid "pack is corrupted (SHA1 mismatch)"
+#: builtin/fetch.c:129 builtin/pull.c:206
+msgid "convert to a complete repository"
 msgstr ""
 
-#: builtin/index-pack.c:1155
-msgid "cannot fstat packfile"
+#: builtin/fetch.c:131 builtin/log.c:1433
+msgid "dir"
 msgstr ""
 
-#: builtin/index-pack.c:1158
-msgid "pack has junk at the end"
+#: builtin/fetch.c:132
+msgid "prepend this to submodule path output"
 msgstr ""
 
-#: builtin/index-pack.c:1169
-msgid "confusion beyond insanity in parse_pack_objects()"
+#: builtin/fetch.c:135
+msgid "default mode for recursion"
 msgstr ""
 
-#: builtin/index-pack.c:1194
-msgid "Resolving deltas"
+#: builtin/fetch.c:137 builtin/pull.c:209
+msgid "accept refs that update .git/shallow"
 msgstr ""
 
-#: builtin/index-pack.c:1205
-#, c-format
-msgid "unable to create thread: %s"
+#: builtin/fetch.c:138 builtin/pull.c:211
+msgid "refmap"
 msgstr ""
 
-#: builtin/index-pack.c:1247
-msgid "confusion beyond insanity"
+#: builtin/fetch.c:139 builtin/pull.c:212
+msgid "specify fetch refmap"
 msgstr ""
 
-#: builtin/index-pack.c:1253
-#, c-format
-msgid "completed with %d local objects"
+#: builtin/fetch.c:398
+msgid "Couldn't find remote ref HEAD"
 msgstr ""
 
-#: builtin/index-pack.c:1263
+#: builtin/fetch.c:514
 #, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgid "configuration fetch.output contains invalid value %s"
 msgstr ""
 
-#: builtin/index-pack.c:1267
+#: builtin/fetch.c:607
 #, c-format
-msgid "pack has %d unresolved delta"
-msgid_plural "pack has %d unresolved deltas"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1291
-#, c-format
-msgid "unable to deflate appended object (%d)"
+msgid "object %s not found"
 msgstr ""
 
-#: builtin/index-pack.c:1367
-#, c-format
-msgid "local object %s is corrupt"
+#: builtin/fetch.c:611
+msgid "[up to date]"
 msgstr ""
 
-#: builtin/index-pack.c:1391
-msgid "error while closing pack file"
+#: builtin/fetch.c:624 builtin/fetch.c:704
+msgid "[rejected]"
 msgstr ""
 
-#: builtin/index-pack.c:1404
-#, c-format
-msgid "cannot write keep file '%s'"
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
 msgstr ""
 
-#: builtin/index-pack.c:1412
-#, c-format
-msgid "cannot close written keep file '%s'"
+#: builtin/fetch.c:634
+msgid "[tag update]"
 msgstr ""
 
-#: builtin/index-pack.c:1425
-msgid "cannot store pack file"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
 msgstr ""
 
-#: builtin/index-pack.c:1436
-msgid "cannot store index file"
+#: builtin/fetch.c:654
+msgid "[new tag]"
 msgstr ""
 
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
+#: builtin/fetch.c:657
+msgid "[new branch]"
 msgstr ""
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
-#, c-format
-msgid "no threads support, ignoring %s"
+#: builtin/fetch.c:660
+msgid "[new ref]"
 msgstr ""
 
-#: builtin/index-pack.c:1538
-#, c-format
-msgid "Cannot open existing pack file '%s'"
+#: builtin/fetch.c:699
+msgid "forced update"
 msgstr ""
 
-#: builtin/index-pack.c:1540
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
 msgstr ""
 
-#: builtin/index-pack.c:1587
-#, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1594
+#: builtin/fetch.c:749
 #, c-format
-msgid "chain length = %d: %lu object"
-msgid_plural "chain length = %d: %lu objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/index-pack.c:1624
-msgid "Cannot come back to cwd"
+msgid "%s did not send all necessary objects\n"
 msgstr ""
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: builtin/fetch.c:769
 #, c-format
-msgid "bad %s"
-msgstr ""
-
-#: builtin/index-pack.c:1709
-msgid "--fix-thin cannot be used without --stdin"
+msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr ""
-
-#: builtin/index-pack.c:1730
-msgid "--verify with no packfile name given"
+msgid "From %.*s\n"
 msgstr ""
 
-#: builtin/init-db.c:55
+#: builtin/fetch.c:867
 #, c-format
-msgid "cannot stat '%s'"
+msgid ""
+"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:61
+#: builtin/fetch.c:922
 #, c-format
-msgid "cannot stat template '%s'"
+msgid "   (%s will become dangling)"
 msgstr ""
 
-#: builtin/init-db.c:66
+#: builtin/fetch.c:923
 #, c-format
-msgid "cannot opendir '%s'"
+msgid "   (%s has become dangling)"
 msgstr ""
 
-#: builtin/init-db.c:77
-#, c-format
-msgid "cannot readlink '%s'"
+#: builtin/fetch.c:955
+msgid "[deleted]"
 msgstr ""
 
-#: builtin/init-db.c:79
-#, c-format
-msgid "cannot symlink '%s' '%s'"
+#: builtin/fetch.c:956 builtin/remote.c:1020
+msgid "(none)"
 msgstr ""
 
-#: builtin/init-db.c:85
+#: builtin/fetch.c:979
 #, c-format
-msgid "cannot copy '%s' to '%s'"
+msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 
-#: builtin/init-db.c:89
+#: builtin/fetch.c:998
 #, c-format
-msgid "ignoring template %s"
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr ""
 
-#: builtin/init-db.c:118
+#: builtin/fetch.c:1001
 #, c-format
-msgid "templates not found %s"
+msgid "Option \"%s\" is ignored for %s\n"
 msgstr ""
 
-#: builtin/init-db.c:131
+#: builtin/fetch.c:1077
 #, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
+msgid "Don't know how to fetch from %s"
 msgstr ""
 
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/fetch.c:1237
 #, c-format
-msgid "%s already exists"
+msgid "Fetching %s\n"
 msgstr ""
 
-#: builtin/init-db.c:340
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
-msgid "unable to handle file type %d"
+msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/init-db.c:343
-#, c-format
-msgid "unable to move %s to %s"
+#: 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 ""
 
-#. 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:399
-#, c-format
-msgid "%s%s Git repository in %s%s\n"
+#: builtin/fetch.c:1280
+msgid "You need to specify a tag name."
 msgstr ""
 
-#: builtin/init-db.c:400
-msgid "Reinitialized existing"
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
 msgstr ""
 
-#: builtin/init-db.c:400
-msgid "Initialized empty"
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
 msgstr ""
 
-#: builtin/init-db.c:401
-msgid " shared"
+#: builtin/fetch.c:1329
+msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 
-#: builtin/init-db.c:448
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
+#: builtin/fetch.c:1331
+msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 
-#: builtin/init-db.c:471
-msgid "permissions"
+#: builtin/fetch.c:1353
+msgid "fetch --all does not take a repository argument"
 msgstr ""
 
-#: builtin/init-db.c:472
-msgid "specify that the git repository is to be shared amongst several users"
+#: builtin/fetch.c:1355
+msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/fetch.c:1366
 #, c-format
-msgid "cannot mkdir %s"
+msgid "No such remote or remote group: %s"
 msgstr ""
 
-#: builtin/init-db.c:515
-#, c-format
-msgid "cannot chdir to %s"
+#: builtin/fetch.c:1374
+msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 
-#: builtin/init-db.c:536
-#, c-format
+#: builtin/fmt-merge-msg.c:14
 msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
+"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
 msgstr ""
 
-#: builtin/init-db.c:564
-#, c-format
-msgid "Cannot access work tree '%s'"
+#: builtin/fmt-merge-msg.c:663
+msgid "populate log with at most <n> entries from shortlog"
 msgstr ""
 
-#: builtin/interpret-trailers.c:15
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
+#: builtin/fmt-merge-msg.c:666
+msgid "alias for --log (deprecated)"
 msgstr ""
 
-#: builtin/interpret-trailers.c:26
-msgid "edit files in place"
+#: builtin/fmt-merge-msg.c:669
+msgid "text"
 msgstr ""
 
-#: builtin/interpret-trailers.c:27
-msgid "trim empty trailers"
+#: builtin/fmt-merge-msg.c:670
+msgid "use <text> as start of message"
 msgstr ""
 
-#: builtin/interpret-trailers.c:28
-msgid "trailer"
+#: builtin/fmt-merge-msg.c:671
+msgid "file to read from"
 msgstr ""
 
-#: builtin/interpret-trailers.c:29
-msgid "trailer(s) to add"
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
 msgstr ""
 
-#: builtin/interpret-trailers.c:42
-msgid "no input file given for in-place editing"
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
 msgstr ""
 
-#: builtin/log.c:43
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
 msgstr ""
 
-#: builtin/log.c:44
-msgid "git show [<options>] <object>..."
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
 msgstr ""
 
-#: builtin/log.c:83
-#, c-format
-msgid "invalid --decorate option: %s"
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
 msgstr ""
 
-#: builtin/log.c:131
-msgid "suppress diff output"
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
 msgstr ""
 
-#: builtin/log.c:132
-msgid "show source"
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
 msgstr ""
 
-#: builtin/log.c:133
-msgid "Use mail map file"
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
 msgstr ""
 
-#: builtin/log.c:134
-msgid "decorate options"
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
 msgstr ""
 
-#: builtin/log.c:137
-msgid "Process line range n,m in file, counting from 1"
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
+msgid "format to use for the output"
 msgstr ""
 
-#: builtin/log.c:233
-#, c-format
-msgid "Final output: %d %s\n"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
 msgstr ""
 
-#: builtin/log.c:465
-#, c-format
-msgid "git show %s: bad file"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
 msgstr ""
 
-#: builtin/log.c:479 builtin/log.c:572
-#, c-format
-msgid "Could not read object %s"
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
 msgstr ""
 
-#: builtin/log.c:596
-#, c-format
-msgid "Unknown type: %d"
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
 msgstr ""
 
-#: builtin/log.c:715
-msgid "format.headers without value"
+#: builtin/fsck.c:519
+msgid "Checking object directories"
 msgstr ""
 
-#: builtin/log.c:801
-msgid "name of output directory is too long"
+#: builtin/fsck.c:588
+msgid "git fsck [<options>] [<object>...]"
 msgstr ""
 
-#: builtin/log.c:816
-#, c-format
-msgid "Cannot open patch file %s"
+#: builtin/fsck.c:594
+msgid "show unreachable objects"
 msgstr ""
 
-#: builtin/log.c:830
-msgid "Need exactly one range."
+#: builtin/fsck.c:595
+msgid "show dangling objects"
 msgstr ""
 
-#: builtin/log.c:840
-msgid "Not a range."
+#: builtin/fsck.c:596
+msgid "report tags"
 msgstr ""
 
-#: builtin/log.c:946
-msgid "Cover letter needs email format"
+#: builtin/fsck.c:597
+msgid "report root nodes"
 msgstr ""
 
-#: builtin/log.c:1025
-#, c-format
-msgid "insane in-reply-to: %s"
+#: builtin/fsck.c:598
+msgid "make index objects head nodes"
 msgstr ""
 
-#: builtin/log.c:1053
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
+#: builtin/fsck.c:599
+msgid "make reflogs head nodes (default)"
 msgstr ""
 
-#: builtin/log.c:1098
-msgid "Two output directories?"
+#: builtin/fsck.c:600
+msgid "also consider packs and alternate objects"
 msgstr ""
 
-#: builtin/log.c:1214
-msgid "use [PATCH n/m] even with a single patch"
+#: builtin/fsck.c:601
+msgid "check only connectivity"
 msgstr ""
 
-#: builtin/log.c:1217
-msgid "use [PATCH] even with multiple patches"
+#: builtin/fsck.c:602
+msgid "enable more strict checking"
 msgstr ""
 
-#: builtin/log.c:1221
-msgid "print patches to standard out"
+#: builtin/fsck.c:604
+msgid "write dangling objects in .git/lost-found"
 msgstr ""
 
-#: builtin/log.c:1223
-msgid "generate a cover letter"
+#: builtin/fsck.c:605 builtin/prune.c:107
+msgid "show progress"
 msgstr ""
 
-#: builtin/log.c:1225
-msgid "use simple number sequence for output file names"
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
 msgstr ""
 
-#: builtin/log.c:1226
-msgid "sfx"
+#: builtin/fsck.c:665
+msgid "Checking objects"
 msgstr ""
 
-#: builtin/log.c:1227
-msgid "use <sfx> instead of '.patch'"
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
 msgstr ""
 
-#: builtin/log.c:1229
-msgid "start numbering patches at <n> instead of 1"
+#: builtin/gc.c:72
+#, c-format
+msgid "Invalid %s: '%s'"
 msgstr ""
 
-#: builtin/log.c:1231
-msgid "mark the series as Nth re-roll"
+#: builtin/gc.c:139
+#, c-format
+msgid "insanely long object directory %.*s"
 msgstr ""
 
-#: builtin/log.c:1233
-msgid "Use [<prefix>] instead of [PATCH]"
+#: 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"
 msgstr ""
 
-#: builtin/log.c:1236
-msgid "store resulting files in <dir>"
+#: builtin/gc.c:327
+msgid "prune unreferenced objects"
 msgstr ""
 
-#: builtin/log.c:1239
-msgid "don't strip/add [PATCH]"
+#: builtin/gc.c:329
+msgid "be more thorough (increased runtime)"
 msgstr ""
 
-#: builtin/log.c:1242
-msgid "don't output binary diffs"
+#: builtin/gc.c:330
+msgid "enable auto-gc mode"
 msgstr ""
 
-#: builtin/log.c:1244
-msgid "output all-zero hash in From header"
+#: builtin/gc.c:331
+msgid "force running gc even if there may be another gc running"
 msgstr ""
 
-#: builtin/log.c:1246
-msgid "don't include a patch matching a commit upstream"
+#: builtin/gc.c:373
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
 msgstr ""
 
-#: builtin/log.c:1248
-msgid "show patch format instead of default (patch + stat)"
+#: builtin/gc.c:375
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
 msgstr ""
 
-#: builtin/log.c:1250
-msgid "Messaging"
+#: builtin/gc.c:376
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
 msgstr ""
 
-#: builtin/log.c:1251
-msgid "header"
+#: builtin/gc.c:397
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
 msgstr ""
 
-#: builtin/log.c:1252
-msgid "add email header"
+#: builtin/gc.c:441
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 
-#: builtin/log.c:1253 builtin/log.c:1255
-msgid "email"
+#: builtin/grep.c:23
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
 msgstr ""
 
-#: builtin/log.c:1253
-msgid "add To: header"
+#: builtin/grep.c:219
+#, c-format
+msgid "grep: failed to create thread: %s"
 msgstr ""
 
-#: builtin/log.c:1255
-msgid "add Cc: header"
+#: builtin/grep.c:277
+#, c-format
+msgid "invalid number of threads specified (%d) for %s"
 msgstr ""
 
-#: builtin/log.c:1257
-msgid "ident"
+#: builtin/grep.c:453 builtin/grep.c:488
+#, c-format
+msgid "unable to read tree (%s)"
 msgstr ""
 
-#: builtin/log.c:1258
-msgid "set From address to <ident> (or committer ident if absent)"
+#: builtin/grep.c:503
+#, c-format
+msgid "unable to grep from object of type %s"
 msgstr ""
 
-#: builtin/log.c:1260
-msgid "message-id"
+#: builtin/grep.c:561
+#, c-format
+msgid "switch `%c' expects a numerical value"
 msgstr ""
 
-#: builtin/log.c:1261
-msgid "make first mail a reply to <message-id>"
+#: builtin/grep.c:647
+msgid "search in index instead of in the work tree"
 msgstr ""
 
-#: builtin/log.c:1262 builtin/log.c:1265
-msgid "boundary"
+#: builtin/grep.c:649
+msgid "find in contents not managed by git"
 msgstr ""
 
-#: builtin/log.c:1263
-msgid "attach the patch"
+#: builtin/grep.c:651
+msgid "search in both tracked and untracked files"
 msgstr ""
 
-#: builtin/log.c:1266
-msgid "inline the patch"
+#: builtin/grep.c:653
+msgid "ignore files specified via '.gitignore'"
 msgstr ""
 
-#: builtin/log.c:1270
-msgid "enable message threading, styles: shallow, deep"
+#: builtin/grep.c:656
+msgid "show non-matching lines"
 msgstr ""
 
-#: builtin/log.c:1272
-msgid "signature"
+#: builtin/grep.c:658
+msgid "case insensitive matching"
 msgstr ""
 
-#: builtin/log.c:1273
-msgid "add a signature"
+#: builtin/grep.c:660
+msgid "match patterns only at word boundaries"
 msgstr ""
 
-#: builtin/log.c:1275
-msgid "add a signature from a file"
+#: builtin/grep.c:662
+msgid "process binary files as text"
 msgstr ""
 
-#: builtin/log.c:1276
-msgid "don't print the patch filenames"
+#: builtin/grep.c:664
+msgid "don't match patterns in binary files"
 msgstr ""
 
-#: builtin/log.c:1365
-msgid "-n and -k are mutually exclusive."
+#: builtin/grep.c:667
+msgid "process binary files with textconv filters"
 msgstr ""
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
+#: builtin/grep.c:669
+msgid "descend at most <depth> levels"
 msgstr ""
 
-#: builtin/log.c:1375
-msgid "--name-only does not make sense"
+#: builtin/grep.c:673
+msgid "use extended POSIX regular expressions"
 msgstr ""
 
-#: builtin/log.c:1377
-msgid "--name-status does not make sense"
+#: builtin/grep.c:676
+msgid "use basic POSIX regular expressions (default)"
 msgstr ""
 
-#: builtin/log.c:1379
-msgid "--check does not make sense"
+#: builtin/grep.c:679
+msgid "interpret patterns as fixed strings"
 msgstr ""
 
-#: builtin/log.c:1407
-msgid "standard output, or directory, which one?"
+#: builtin/grep.c:682
+msgid "use Perl-compatible regular expressions"
 msgstr ""
 
-#: builtin/log.c:1409
-#, c-format
-msgid "Could not create directory '%s'"
+#: builtin/grep.c:685
+msgid "show line numbers"
 msgstr ""
 
-#: builtin/log.c:1506
-#, c-format
-msgid "unable to read signature file '%s'"
+#: builtin/grep.c:686
+msgid "don't show filenames"
 msgstr ""
 
-#: builtin/log.c:1569
-msgid "Failed to create output files"
+#: builtin/grep.c:687
+msgid "show filenames"
 msgstr ""
 
-#: builtin/log.c:1617
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+#: builtin/grep.c:689
+msgid "show filenames relative to top directory"
 msgstr ""
 
-#: builtin/log.c:1671
-#, c-format
-msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+#: builtin/grep.c:691
+msgid "show only filenames instead of matching lines"
 msgstr ""
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
+#: builtin/grep.c:693
+msgid "synonym for --files-with-matches"
 msgstr ""
 
-#: builtin/ls-files.c:378
-msgid "git ls-files [<options>] [<file>...]"
+#: builtin/grep.c:696
+msgid "show only the names of files without match"
 msgstr ""
 
-#: builtin/ls-files.c:427
-msgid "identify the file status with tags"
+#: builtin/grep.c:698
+msgid "print NUL after filenames"
 msgstr ""
 
-#: builtin/ls-files.c:429
-msgid "use lowercase letters for 'assume unchanged' files"
+#: builtin/grep.c:700
+msgid "show the number of matches instead of matching lines"
 msgstr ""
 
-#: builtin/ls-files.c:431
-msgid "show cached files in the output (default)"
+#: builtin/grep.c:701
+msgid "highlight matches"
 msgstr ""
 
-#: builtin/ls-files.c:433
-msgid "show deleted files in the output"
+#: builtin/grep.c:703
+msgid "print empty line between matches from different files"
 msgstr ""
 
-#: builtin/ls-files.c:435
-msgid "show modified files in the output"
+#: builtin/grep.c:705
+msgid "show filename only once above matches from same file"
 msgstr ""
 
-#: builtin/ls-files.c:437
-msgid "show other files in the output"
+#: builtin/grep.c:708
+msgid "show <n> context lines before and after matches"
 msgstr ""
 
-#: builtin/ls-files.c:439
-msgid "show ignored files in the output"
+#: builtin/grep.c:711
+msgid "show <n> context lines before matches"
 msgstr ""
 
-#: builtin/ls-files.c:442
-msgid "show staged contents' object name in the output"
+#: builtin/grep.c:713
+msgid "show <n> context lines after matches"
 msgstr ""
 
-#: builtin/ls-files.c:444
-msgid "show files on the filesystem that need to be removed"
+#: builtin/grep.c:715
+msgid "use <n> worker threads"
 msgstr ""
 
-#: builtin/ls-files.c:446
-msgid "show 'other' directories' names only"
+#: builtin/grep.c:716
+msgid "shortcut for -C NUM"
 msgstr ""
 
-#: builtin/ls-files.c:448
-msgid "show line endings of files"
+#: builtin/grep.c:719
+msgid "show a line with the function name before matches"
 msgstr ""
 
-#: builtin/ls-files.c:450
-msgid "don't show empty directories"
+#: builtin/grep.c:721
+msgid "show the surrounding function"
 msgstr ""
 
-#: builtin/ls-files.c:453
-msgid "show unmerged files in the output"
+#: builtin/grep.c:724
+msgid "read patterns from file"
 msgstr ""
 
-#: builtin/ls-files.c:455
-msgid "show resolve-undo information"
+#: builtin/grep.c:726
+msgid "match <pattern>"
 msgstr ""
 
-#: builtin/ls-files.c:457
-msgid "skip files matching pattern"
+#: builtin/grep.c:728
+msgid "combine patterns specified with -e"
 msgstr ""
 
-#: builtin/ls-files.c:460
-msgid "exclude patterns are read from <file>"
+#: builtin/grep.c:740
+msgid "indicate hit with exit status without output"
 msgstr ""
 
-#: builtin/ls-files.c:463
-msgid "read additional per-directory exclude patterns in <file>"
+#: builtin/grep.c:742
+msgid "show only matches from files that match all patterns"
 msgstr ""
 
-#: builtin/ls-files.c:465
-msgid "add the standard git exclusions"
+#: builtin/grep.c:744
+msgid "show parse tree for grep expression"
 msgstr ""
 
-#: builtin/ls-files.c:468
-msgid "make the output relative to the project top directory"
+#: builtin/grep.c:748
+msgid "pager"
 msgstr ""
 
-#: builtin/ls-files.c:471
-msgid "if any <file> is not in the index, treat this as an error"
+#: builtin/grep.c:748
+msgid "show matching files in the pager"
 msgstr ""
 
-#: builtin/ls-files.c:472
-msgid "tree-ish"
+#: builtin/grep.c:751
+msgid "allow calling of grep(1) (ignored by this build)"
 msgstr ""
 
-#: builtin/ls-files.c:473
-msgid "pretend that paths removed since <tree-ish> are still present"
+#: builtin/grep.c:814
+msgid "no pattern given."
 msgstr ""
 
-#: builtin/ls-files.c:475
-msgid "show debugging data"
+#: builtin/grep.c:846 builtin/index-pack.c:1480
+#, c-format
+msgid "invalid number of threads specified (%d)"
 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:876
+msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/ls-remote.c:50
-msgid "do not print remote URL"
+#: builtin/grep.c:902
+msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
-msgid "exec"
+#: builtin/grep.c:907
+msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
-msgid "path of git-upload-pack on the remote host"
+#: builtin/grep.c:910
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/ls-remote.c:56
-msgid "limit to tags"
+#: builtin/grep.c:918
+msgid "both --cached and trees are given."
 msgstr ""
 
-#: builtin/ls-remote.c:57
-msgid "limit to heads"
+#: builtin/hash-object.c:81
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
 msgstr ""
 
-#: builtin/ls-remote.c:58
-msgid "do not show peeled tags"
+#: builtin/hash-object.c:82
+msgid "git hash-object  --stdin-paths"
 msgstr ""
 
-#: builtin/ls-remote.c:60
-msgid "take url.<base>.insteadOf into account"
+#: builtin/hash-object.c:94
+msgid "type"
 msgstr ""
 
-#: builtin/ls-remote.c:62
-msgid "exit with exit code 2 if no matching refs are found"
+#: builtin/hash-object.c:94
+msgid "object type"
 msgstr ""
 
-#: builtin/ls-remote.c:64
-msgid "show underlying ref in addition to the object pointed by it"
+#: builtin/hash-object.c:95
+msgid "write the object into the object database"
 msgstr ""
 
-#: builtin/ls-tree.c:28
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+#: builtin/hash-object.c:97
+msgid "read the object from stdin"
 msgstr ""
 
-#: builtin/ls-tree.c:128
-msgid "only show trees"
+#: builtin/hash-object.c:99
+msgid "store file as is without filters"
 msgstr ""
 
-#: builtin/ls-tree.c:130
-msgid "recurse into subtrees"
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
 
-#: builtin/ls-tree.c:132
-msgid "show trees when recursing"
+#: builtin/hash-object.c:101
+msgid "process file as it were from this path"
 msgstr ""
 
-#: builtin/ls-tree.c:135
-msgid "terminate entries with NUL byte"
+#: builtin/help.c:42
+msgid "print all available commands"
 msgstr ""
 
-#: builtin/ls-tree.c:136
-msgid "include object size"
+#: builtin/help.c:43
+msgid "exclude guides"
 msgstr ""
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
-msgid "list only filenames"
+#: builtin/help.c:44
+msgid "print list of useful guides"
 msgstr ""
 
-#: builtin/ls-tree.c:143
-msgid "use full path names"
+#: builtin/help.c:45
+msgid "show man page"
 msgstr ""
 
-#: builtin/ls-tree.c:145
-msgid "list entire tree; not just current directory (implies --full-name)"
+#: builtin/help.c:46
+msgid "show manual in web browser"
 msgstr ""
 
-#: builtin/merge.c:45
-msgid "git merge [<options>] [<commit>...]"
+#: builtin/help.c:48
+msgid "show info page"
 msgstr ""
 
-#: builtin/merge.c:46
-msgid "git merge [<options>] <msg> HEAD <commit>"
+#: builtin/help.c:54
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
 msgstr ""
 
-#: builtin/merge.c:47
-msgid "git merge --abort"
+#: builtin/help.c:66
+#, c-format
+msgid "unrecognized help format '%s'"
 msgstr ""
 
-#: builtin/merge.c:100
-msgid "switch `m' requires a value"
+#: builtin/help.c:93
+msgid "Failed to start emacsclient."
 msgstr ""
 
-#: builtin/merge.c:137
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
+#: builtin/help.c:106
+msgid "Failed to parse emacsclient version."
 msgstr ""
 
-#: builtin/merge.c:138
+#: builtin/help.c:114
 #, c-format
-msgid "Available strategies are:"
+msgid "emacsclient version '%d' too old (< 22)."
 msgstr ""
 
-#: builtin/merge.c:143
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
-msgid "Available custom strategies are:"
-msgstr ""
-
-#: builtin/merge.c:193 builtin/pull.c:123
-msgid "do not show a diffstat at the end of the merge"
+msgid "failed to exec '%s'"
 msgstr ""
 
-#: builtin/merge.c:196 builtin/pull.c:126
-msgid "show a diffstat at the end of the merge"
+#: builtin/help.c:207
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 
-#: builtin/merge.c:197 builtin/pull.c:129
-msgid "(synonym to --stat)"
+#: builtin/help.c:219
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
 msgstr ""
 
-#: builtin/merge.c:199 builtin/pull.c:132
-msgid "add (at most <n>) entries from shortlog to merge commit message"
+#: builtin/help.c:336
+#, c-format
+msgid "'%s': unknown man viewer."
 msgstr ""
 
-#: builtin/merge.c:202 builtin/pull.c:135
-msgid "create a single commit instead of doing a merge"
+#: builtin/help.c:353
+msgid "no man viewer handled the request"
 msgstr ""
 
-#: builtin/merge.c:204 builtin/pull.c:138
-msgid "perform a commit if the merge succeeds (default)"
+#: builtin/help.c:361
+msgid "no info viewer handled the request"
 msgstr ""
 
-#: builtin/merge.c:206 builtin/pull.c:141
-msgid "edit message before committing"
+#: builtin/help.c:403
+msgid "Defining attributes per path"
 msgstr ""
 
-#: builtin/merge.c:207
-msgid "allow fast-forward (default)"
+#: builtin/help.c:404
+msgid "Everyday Git With 20 Commands Or So"
 msgstr ""
 
-#: builtin/merge.c:209 builtin/pull.c:147
-msgid "abort if fast-forward is not possible"
+#: builtin/help.c:405
+msgid "A Git glossary"
 msgstr ""
 
-#: builtin/merge.c:213
-msgid "Verify that the named commit has a valid GPG signature"
+#: builtin/help.c:406
+msgid "Specifies intentionally untracked files to ignore"
 msgstr ""
 
-#: builtin/merge.c:214 builtin/notes.c:770 builtin/pull.c:152
-#: builtin/revert.c:89
-msgid "strategy"
+#: builtin/help.c:407
+msgid "Defining submodule properties"
 msgstr ""
 
-#: builtin/merge.c:215 builtin/pull.c:153
-msgid "merge strategy to use"
+#: builtin/help.c:408
+msgid "Specifying revisions and ranges for Git"
 msgstr ""
 
-#: builtin/merge.c:216 builtin/pull.c:156
-msgid "option=value"
+#: builtin/help.c:409
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
 msgstr ""
 
-#: builtin/merge.c:217 builtin/pull.c:157
-msgid "option for selected merge strategy"
+#: builtin/help.c:410
+msgid "An overview of recommended workflows with Git"
 msgstr ""
 
-#: builtin/merge.c:219
-msgid "merge commit message (for a non-fast-forward merge)"
+#: builtin/help.c:422
+msgid "The common Git guides are:\n"
 msgstr ""
 
-#: builtin/merge.c:223
-msgid "abort the current in-progress merge"
+#: builtin/help.c:440
+#, c-format
+msgid "`git %s' is aliased to `%s'"
 msgstr ""
 
-#: builtin/merge.c:251
-msgid "could not run stash."
+#: builtin/help.c:462 builtin/help.c:479
+#, c-format
+msgid "usage: %s%s"
 msgstr ""
 
-#: builtin/merge.c:256
-msgid "stash failed"
+#: builtin/index-pack.c:154
+#, c-format
+msgid "unable to open %s"
 msgstr ""
 
-#: builtin/merge.c:261
+#: builtin/index-pack.c:204
 #, c-format
-msgid "not a valid object: %s"
+msgid "object type mismatch at %s"
 msgstr ""
 
-#: builtin/merge.c:280 builtin/merge.c:297
-msgid "read-tree failed"
+#: builtin/index-pack.c:224
+#, c-format
+msgid "did not receive expected object %s"
 msgstr ""
 
-#: builtin/merge.c:327
-msgid " (nothing to squash)"
+#: builtin/index-pack.c:227
+#, c-format
+msgid "object %s: expected type %s, found %s"
 msgstr ""
 
-#: builtin/merge.c:340
+#: builtin/index-pack.c:269
 #, c-format
-msgid "Squash commit -- not updating HEAD\n"
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:279
+msgid "early EOF"
 msgstr ""
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
+#: builtin/index-pack.c:280
+msgid "read error on input"
 msgstr ""
 
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
+#: builtin/index-pack.c:292
+msgid "used more bytes than were available"
 msgstr ""
 
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
+#: builtin/index-pack.c:299
+msgid "pack too large for current definition of off_t"
 msgstr ""
 
-#: builtin/merge.c:397
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
+#: builtin/index-pack.c:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
 msgstr ""
 
-#: builtin/merge.c:448
+#: builtin/index-pack.c:317
 #, c-format
-msgid "'%s' does not point to a commit"
+msgid "unable to create '%s'"
 msgstr ""
 
-#: builtin/merge.c:538
+#: builtin/index-pack.c:322
 #, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
+msgid "cannot open packfile '%s'"
 msgstr ""
 
-#: builtin/merge.c:657
-msgid "Not handling anything other than two heads merge."
+#: builtin/index-pack.c:336
+msgid "pack signature mismatch"
 msgstr ""
 
-#: builtin/merge.c:671
+#: builtin/index-pack.c:338
 #, c-format
-msgid "Unknown option for merge-recursive: -X%s"
+msgid "pack version %<PRIu32> unsupported"
 msgstr ""
 
-#: builtin/merge.c:684
+#: builtin/index-pack.c:356
 #, c-format
-msgid "unable to write %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
 msgstr ""
 
-#: builtin/merge.c:773
+#: builtin/index-pack.c:478
 #, c-format
-msgid "Could not read from '%s'"
+msgid "inflate returned %d"
 msgstr ""
 
-#: builtin/merge.c:782
-#, c-format
-msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+#: builtin/index-pack.c:527
+msgid "offset value overflow for delta base object"
+msgstr ""
+
+#: builtin/index-pack.c:535
+msgid "delta base offset is out of bound"
 msgstr ""
 
-#: builtin/merge.c:788
+#: builtin/index-pack.c:543
 #, 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"
+msgid "unknown object type %d"
 msgstr ""
 
-#: builtin/merge.c:812
-msgid "Empty commit message."
+#: builtin/index-pack.c:574
+msgid "cannot pread pack file"
 msgstr ""
 
-#: builtin/merge.c:824
+#: builtin/index-pack.c:576
 #, c-format
-msgid "Wonderful.\n"
+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:602
+msgid "serious inflate inconsistency"
 msgstr ""
 
-#: builtin/merge.c:879
+#: 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 "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr ""
 
-#: builtin/merge.c:895
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, c-format
-msgid "'%s' is not a commit"
+msgid "unable to read %s"
 msgstr ""
 
-#: builtin/merge.c:936
-msgid "No current branch."
+#: builtin/index-pack.c:817
+#, c-format
+msgid "cannot read existing object %s"
 msgstr ""
 
-#: builtin/merge.c:938
-msgid "No remote for the current branch."
+#: builtin/index-pack.c:831
+#, c-format
+msgid "invalid blob object %s"
 msgstr ""
 
-#: builtin/merge.c:940
-msgid "No default upstream defined for the current branch."
+#: builtin/index-pack.c:845
+#, c-format
+msgid "invalid %s"
 msgstr ""
 
-#: builtin/merge.c:945
-#, c-format
-msgid "No remote-tracking branch for %s from %s"
+#: builtin/index-pack.c:848
+msgid "Error in object"
 msgstr ""
 
-#: builtin/merge.c:1080
+#: builtin/index-pack.c:850
 #, c-format
-msgid "could not close '%s'"
+msgid "Not all child objects of %s are reachable"
 msgstr ""
 
-#: builtin/merge.c:1207
-msgid "There is no merge to abort (MERGE_HEAD missing)."
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
+msgid "failed to apply delta"
 msgstr ""
 
-#: builtin/merge.c:1223
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
+#: builtin/index-pack.c:1123
+msgid "Receiving objects"
 msgstr ""
 
-#: builtin/merge.c:1230
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
+#: builtin/index-pack.c:1123
+msgid "Indexing objects"
 msgstr ""
 
-#: builtin/merge.c:1233
-msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+#: builtin/index-pack.c:1155
+msgid "pack is corrupted (SHA1 mismatch)"
 msgstr ""
 
-#: builtin/merge.c:1242
-msgid "You cannot combine --squash with --no-ff."
+#: builtin/index-pack.c:1160
+msgid "cannot fstat packfile"
 msgstr ""
 
-#: builtin/merge.c:1250
-msgid "No commit specified and merge.defaultToUpstream not set."
+#: builtin/index-pack.c:1163
+msgid "pack has junk at the end"
 msgstr ""
 
-#: builtin/merge.c:1267
-msgid "Squash commit into empty head not supported yet"
+#: builtin/index-pack.c:1174
+msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr ""
 
-#: builtin/merge.c:1269
-msgid "Non-fast-forward commit does not make sense into an empty head"
+#: builtin/index-pack.c:1197
+msgid "Resolving deltas"
 msgstr ""
 
-#: builtin/merge.c:1275
+#: builtin/index-pack.c:1208
 #, c-format
-msgid "%s - not something we can merge"
+msgid "unable to create thread: %s"
 msgstr ""
 
-#: builtin/merge.c:1277
-msgid "Can merge only exactly one commit into empty head"
+#: builtin/index-pack.c:1250
+msgid "confusion beyond insanity"
 msgstr ""
 
-#: builtin/merge.c:1332
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge.c:1335
+#: builtin/index-pack.c:1268
 #, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr ""
 
-#: builtin/merge.c:1338
+#: builtin/index-pack.c:1272
 #, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] ""
+msgstr[1] ""
 
-#: builtin/merge.c:1341
+#: builtin/index-pack.c:1296
 #, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
+msgid "unable to deflate appended object (%d)"
 msgstr ""
 
-#: builtin/merge.c:1424
+#: builtin/index-pack.c:1372
 #, c-format
-msgid "Updating %s..%s\n"
+msgid "local object %s is corrupt"
 msgstr ""
 
-#: builtin/merge.c:1461
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
+#: builtin/index-pack.c:1396
+msgid "error while closing pack file"
 msgstr ""
 
-#: builtin/merge.c:1468
+#: builtin/index-pack.c:1409
 #, c-format
-msgid "Nope.\n"
+msgid "cannot write keep file '%s'"
 msgstr ""
 
-#: builtin/merge.c:1500
-msgid "Not possible to fast-forward, aborting."
+#: builtin/index-pack.c:1417
+#, c-format
+msgid "cannot close written keep file '%s'"
 msgstr ""
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
-#, c-format
-msgid "Rewinding the tree to pristine...\n"
+#: builtin/index-pack.c:1430
+msgid "cannot store pack file"
 msgstr ""
 
-#: builtin/merge.c:1527
-#, c-format
-msgid "Trying merge strategy %s...\n"
+#: builtin/index-pack.c:1441
+msgid "cannot store index file"
 msgstr ""
 
-#: builtin/merge.c:1593
+#: builtin/index-pack.c:1474
 #, c-format
-msgid "No merge strategy handled the merge.\n"
+msgid "bad pack.indexversion=%<PRIu32>"
 msgstr ""
 
-#: builtin/merge.c:1595
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
-msgid "Merge with strategy %s failed.\n"
+msgid "no threads support, ignoring %s"
 msgstr ""
 
-#: builtin/merge.c:1604
+#: builtin/index-pack.c:1542
 #, c-format
-msgid "Using the %s to prepare resolving by hand.\n"
+msgid "Cannot open existing pack file '%s'"
 msgstr ""
 
-#: builtin/merge.c:1616
+#: builtin/index-pack.c:1544
 #, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
+msgid "Cannot open existing pack idx file for '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:29
-msgid "git merge-base [-a | --all] <commit> <commit>..."
+#: builtin/index-pack.c:1591
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: 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/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
 msgstr ""
 
-#: builtin/merge-base.c:30
-msgid "git merge-base [-a | --all] --octopus <commit>..."
+#: 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 ""
 
-#: builtin/merge-base.c:31
-msgid "git merge-base --independent <commit>..."
+#: builtin/index-pack.c:1732
+msgid "--fix-thin cannot be used without --stdin"
 msgstr ""
 
-#: builtin/merge-base.c:32
-msgid "git merge-base --is-ancestor <commit> <commit>"
+#: builtin/index-pack.c:1740
+msgid "--verify with no packfile name given"
 msgstr ""
 
-#: builtin/merge-base.c:33
-msgid "git merge-base --fork-point <ref> [<commit>]"
+#: builtin/init-db.c:54
+#, c-format
+msgid "cannot stat '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:214
-msgid "output all common ancestors"
+#: builtin/init-db.c:60
+#, c-format
+msgid "cannot stat template '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:216
-msgid "find ancestors for a single n-way merge"
+#: builtin/init-db.c:65
+#, c-format
+msgid "cannot opendir '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:218
-msgid "list revs not reachable from others"
+#: builtin/init-db.c:76
+#, c-format
+msgid "cannot readlink '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:220
-msgid "is the first one ancestor of the other?"
+#: builtin/init-db.c:78
+#, c-format
+msgid "cannot symlink '%s' '%s'"
 msgstr ""
 
-#: builtin/merge-base.c:222
-msgid "find where <commit> forked from reflog of <ref>"
+#: builtin/init-db.c:84
+#, c-format
+msgid "cannot copy '%s' to '%s'"
 msgstr ""
 
-#: builtin/merge-file.c:8
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
+#: builtin/init-db.c:88
+#, c-format
+msgid "ignoring template %s"
 msgstr ""
 
-#: builtin/merge-file.c:33
-msgid "send results to standard output"
+#: builtin/init-db.c:119
+#, c-format
+msgid "templates not found %s"
 msgstr ""
 
-#: builtin/merge-file.c:34
-msgid "use a diff3 based merge"
+#: builtin/init-db.c:134
+#, c-format
+msgid "not copying templates from '%s': %s"
 msgstr ""
 
-#: builtin/merge-file.c:35
-msgid "for conflicts, use our version"
+#: builtin/init-db.c:327
+#, c-format
+msgid "unable to handle file type %d"
 msgstr ""
 
-#: builtin/merge-file.c:37
-msgid "for conflicts, use their version"
+#: builtin/init-db.c:330
+#, c-format
+msgid "unable to move %s to %s"
 msgstr ""
 
-#: builtin/merge-file.c:39
-msgid "for conflicts, use a union version"
+#: builtin/init-db.c:347 builtin/init-db.c:350
+#, c-format
+msgid "%s already exists"
 msgstr ""
 
-#: builtin/merge-file.c:42
-msgid "for conflicts, use this marker size"
+#: builtin/init-db.c:403
+#, c-format
+msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/merge-file.c:43
-msgid "do not warn about conflicts"
+#: builtin/init-db.c:404
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/merge-file.c:45
-msgid "set labels for file1/orig-file/file2"
+#: builtin/init-db.c:408
+#, c-format
+msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/mktree.c:65
-msgid "git mktree [-z] [--missing] [--batch]"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
 msgstr ""
 
-#: builtin/mktree.c:152
-msgid "input is NUL terminated"
+#: builtin/init-db.c:457
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
 msgstr ""
 
-#: builtin/mktree.c:153 builtin/write-tree.c:24
-msgid "allow missing objects"
+#: builtin/init-db.c:480
+msgid "permissions"
 msgstr ""
 
-#: builtin/mktree.c:154
-msgid "allow creation of more than one tree"
+#: builtin/init-db.c:481
+msgid "specify that the git repository is to be shared amongst several users"
 msgstr ""
 
-#: builtin/mv.c:15
-msgid "git mv [<options>] <source>... <destination>"
+#: builtin/init-db.c:515 builtin/init-db.c:520
+#, c-format
+msgid "cannot mkdir %s"
 msgstr ""
 
-#: builtin/mv.c:70
+#: builtin/init-db.c:524
 #, c-format
-msgid "Directory %s is in index and no submodule?"
+msgid "cannot chdir to %s"
 msgstr ""
 
-#: builtin/mv.c:72
-msgid "Please stage your changes to .gitmodules or stash them to proceed"
+#: builtin/init-db.c:545
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
 msgstr ""
 
-#: builtin/mv.c:90
+#: builtin/init-db.c:573
 #, c-format
-msgid "%.*s is in index"
+msgid "Cannot access work tree '%s'"
 msgstr ""
 
-#: builtin/mv.c:112
-msgid "force move/rename even if target exists"
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
 msgstr ""
 
-#: builtin/mv.c:113
-msgid "skip move/rename errors"
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
 msgstr ""
 
-#: builtin/mv.c:152
-#, c-format
-msgid "destination '%s' is not a directory"
+#: builtin/interpret-trailers.c:27
+msgid "trim empty trailers"
 msgstr ""
 
-#: builtin/mv.c:163
-#, c-format
-msgid "Checking rename of '%s' to '%s'\n"
+#: builtin/interpret-trailers.c:28
+msgid "trailer"
 msgstr ""
 
-#: builtin/mv.c:167
-msgid "bad source"
+#: builtin/interpret-trailers.c:29
+msgid "trailer(s) to add"
 msgstr ""
 
-#: builtin/mv.c:170
-msgid "can not move directory into itself"
+#: builtin/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
 msgstr ""
 
-#: builtin/mv.c:173
-msgid "cannot move directory over file"
+#: builtin/log.c:44
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr ""
 
-#: builtin/mv.c:182
-msgid "source directory is empty"
+#: builtin/log.c:45
+msgid "git show [<options>] <object>..."
 msgstr ""
 
-#: builtin/mv.c:207
-msgid "not under version control"
+#: builtin/log.c:84
+#, c-format
+msgid "invalid --decorate option: %s"
 msgstr ""
 
-#: builtin/mv.c:210
-msgid "destination exists"
+#: builtin/log.c:139
+msgid "suppress diff output"
 msgstr ""
 
-#: builtin/mv.c:218
-#, c-format
-msgid "overwriting '%s'"
+#: builtin/log.c:140
+msgid "show source"
 msgstr ""
 
-#: builtin/mv.c:221
-msgid "Cannot overwrite"
+#: builtin/log.c:141
+msgid "Use mail map file"
 msgstr ""
 
-#: builtin/mv.c:224
-msgid "multiple sources for the same target"
+#: builtin/log.c:142
+msgid "decorate options"
 msgstr ""
 
-#: builtin/mv.c:226
-msgid "destination directory does not exist"
+#: builtin/log.c:145
+msgid "Process line range n,m in file, counting from 1"
 msgstr ""
 
-#: builtin/mv.c:233
+#: builtin/log.c:241
 #, c-format
-msgid "%s, source=%s, destination=%s"
+msgid "Final output: %d %s\n"
 msgstr ""
 
-#: builtin/mv.c:254
+#: builtin/log.c:486
 #, c-format
-msgid "Renaming %s to %s\n"
+msgid "git show %s: bad file"
 msgstr ""
 
-#: builtin/mv.c:257 builtin/remote.c:714 builtin/repack.c:365
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
-msgid "renaming '%s' failed"
+msgid "Could not read object %s"
 msgstr ""
 
-#: builtin/name-rev.c:251
-msgid "git name-rev [<options>] <commit>..."
+#: builtin/log.c:618
+#, c-format
+msgid "Unknown type: %d"
 msgstr ""
 
-#: builtin/name-rev.c:252
-msgid "git name-rev [<options>] --all"
+#: builtin/log.c:739
+msgid "format.headers without value"
 msgstr ""
 
-#: builtin/name-rev.c:253
-msgid "git name-rev [<options>] --stdin"
+#: builtin/log.c:839
+msgid "name of output directory is too long"
 msgstr ""
 
-#: builtin/name-rev.c:305
-msgid "print only names (no SHA-1)"
+#: builtin/log.c:854
+#, c-format
+msgid "Cannot open patch file %s"
 msgstr ""
 
-#: builtin/name-rev.c:306
-msgid "only use tags to name the commits"
+#: builtin/log.c:868
+msgid "Need exactly one range."
 msgstr ""
 
-#: builtin/name-rev.c:308
-msgid "only use refs matching <pattern>"
+#: builtin/log.c:878
+msgid "Not a range."
 msgstr ""
 
-#: builtin/name-rev.c:310
-msgid "list all commits reachable from all refs"
+#: builtin/log.c:984
+msgid "Cover letter needs email format"
 msgstr ""
 
-#: builtin/name-rev.c:311
-msgid "read from stdin"
+#: builtin/log.c:1063
+#, c-format
+msgid "insane in-reply-to: %s"
 msgstr ""
 
-#: builtin/name-rev.c:312
-msgid "allow to print `undefined` names (default)"
+#: builtin/log.c:1091
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr ""
 
-#: builtin/name-rev.c:318
-msgid "dereference tags in the input (internal use)"
+#: builtin/log.c:1141
+msgid "Two output directories?"
 msgstr ""
 
-#: builtin/notes.c:25
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
 msgstr ""
 
-#: builtin/notes.c:26
-msgid ""
-"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
-"| (-c | -C) <object>] [<object>]"
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
 msgstr ""
 
-#: builtin/notes.c:27
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+#: builtin/log.c:1263
+msgid "Could not find exact merge base."
 msgstr ""
 
-#: builtin/notes.c:28
+#: builtin/log.c:1267
 msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
+"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:29
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+#: builtin/log.c:1287
+msgid "Failed to find exact merge base"
 msgstr ""
 
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] show [<object>]"
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
 msgstr ""
 
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
 msgstr ""
 
-#: builtin/notes.c:32
-msgid "git notes merge --commit [-v | -q]"
+#: builtin/log.c:1351
+msgid "cannot get patch id"
 msgstr ""
 
-#: builtin/notes.c:33
-msgid "git notes merge --abort [-v | -q]"
+#: builtin/log.c:1408
+msgid "use [PATCH n/m] even with a single patch"
 msgstr ""
 
-#: builtin/notes.c:34
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+#: builtin/log.c:1411
+msgid "use [PATCH] even with multiple patches"
 msgstr ""
 
-#: builtin/notes.c:35
-msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+#: builtin/log.c:1415
+msgid "print patches to standard out"
 msgstr ""
 
-#: builtin/notes.c:36
-msgid "git notes [--ref <notes-ref>] get-ref"
+#: builtin/log.c:1417
+msgid "generate a cover letter"
 msgstr ""
 
-#: builtin/notes.c:41
-msgid "git notes [list [<object>]]"
+#: builtin/log.c:1419
+msgid "use simple number sequence for output file names"
 msgstr ""
 
-#: builtin/notes.c:46
-msgid "git notes add [<options>] [<object>]"
+#: builtin/log.c:1420
+msgid "sfx"
 msgstr ""
 
-#: builtin/notes.c:51
-msgid "git notes copy [<options>] <from-object> <to-object>"
+#: builtin/log.c:1421
+msgid "use <sfx> instead of '.patch'"
 msgstr ""
 
-#: builtin/notes.c:52
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
+#: builtin/log.c:1423
+msgid "start numbering patches at <n> instead of 1"
 msgstr ""
 
-#: builtin/notes.c:57
-msgid "git notes append [<options>] [<object>]"
+#: builtin/log.c:1425
+msgid "mark the series as Nth re-roll"
 msgstr ""
 
-#: builtin/notes.c:62
-msgid "git notes edit [<object>]"
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:67
-msgid "git notes show [<object>]"
+#: builtin/log.c:1430
+msgid "Use [<prefix>] instead of [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:72
-msgid "git notes merge [<options>] <notes-ref>"
+#: builtin/log.c:1433
+msgid "store resulting files in <dir>"
 msgstr ""
 
-#: builtin/notes.c:73
-msgid "git notes merge --commit [<options>]"
+#: builtin/log.c:1436
+msgid "don't strip/add [PATCH]"
 msgstr ""
 
-#: builtin/notes.c:74
-msgid "git notes merge --abort [<options>]"
+#: builtin/log.c:1439
+msgid "don't output binary diffs"
 msgstr ""
 
-#: builtin/notes.c:79
-msgid "git notes remove [<object>]"
+#: builtin/log.c:1441
+msgid "output all-zero hash in From header"
 msgstr ""
 
-#: builtin/notes.c:84
-msgid "git notes prune [<options>]"
+#: builtin/log.c:1443
+msgid "don't include a patch matching a commit upstream"
 msgstr ""
 
-#: builtin/notes.c:89
-msgid "git notes get-ref"
+#: builtin/log.c:1445
+msgid "show patch format instead of default (patch + stat)"
 msgstr ""
 
-#: builtin/notes.c:147
-#, c-format
-msgid "unable to start 'show' for object '%s'"
+#: builtin/log.c:1447
+msgid "Messaging"
 msgstr ""
 
-#: builtin/notes.c:151
-msgid "could not read 'show' output"
+#: builtin/log.c:1448
+msgid "header"
 msgstr ""
 
-#: builtin/notes.c:159
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
+#: builtin/log.c:1449
+msgid "add email header"
 msgstr ""
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
+#: builtin/log.c:1450 builtin/log.c:1452
+msgid "email"
 msgstr ""
 
-#: builtin/notes.c:193
-msgid "Please supply the note contents using either -m or -F option"
+#: builtin/log.c:1450
+msgid "add To: header"
 msgstr ""
 
-#: builtin/notes.c:202
-msgid "unable to write note object"
+#: builtin/log.c:1452
+msgid "add Cc: header"
 msgstr ""
 
-#: builtin/notes.c:204
-#, c-format
-msgid "The note contents have been left in %s"
+#: builtin/log.c:1454
+msgid "ident"
 msgstr ""
 
-#: builtin/notes.c:232 builtin/tag.c:440
-#, c-format
-msgid "cannot read '%s'"
+#: builtin/log.c:1455
+msgid "set From address to <ident> (or committer ident if absent)"
 msgstr ""
 
-#: builtin/notes.c:234 builtin/tag.c:443
-#, c-format
-msgid "could not open or read '%s'"
+#: builtin/log.c:1457
+msgid "message-id"
 msgstr ""
 
-#: 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:880 builtin/tag.c:456
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
+#: builtin/log.c:1458
+msgid "make first mail a reply to <message-id>"
 msgstr ""
 
-#: builtin/notes.c:256
-#, c-format
-msgid "Failed to read object '%s'."
+#: builtin/log.c:1459 builtin/log.c:1462
+msgid "boundary"
 msgstr ""
 
-#: builtin/notes.c:260
-#, c-format
-msgid "Cannot read note data from non-blob object '%s'."
+#: builtin/log.c:1460
+msgid "attach the patch"
 msgstr ""
 
-#: 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:945
-msgid "too many parameters"
+#: builtin/log.c:1463
+msgid "inline the patch"
 msgstr ""
 
-#: builtin/notes.c:375 builtin/notes.c:662
-#, c-format
-msgid "No note found for object %s."
+#: builtin/log.c:1467
+msgid "enable message threading, styles: shallow, deep"
 msgstr ""
 
-#: builtin/notes.c:396 builtin/notes.c:559
-msgid "note contents as a string"
+#: builtin/log.c:1469
+msgid "signature"
 msgstr ""
 
-#: builtin/notes.c:399 builtin/notes.c:562
-msgid "note contents in a file"
+#: builtin/log.c:1470
+msgid "add a signature"
 msgstr ""
 
-#: builtin/notes.c:402 builtin/notes.c:565
-msgid "reuse and edit specified note object"
+#: builtin/log.c:1471
+msgid "base-commit"
 msgstr ""
 
-#: builtin/notes.c:405 builtin/notes.c:568
-msgid "reuse specified note object"
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
 msgstr ""
 
-#: builtin/notes.c:408 builtin/notes.c:571
-msgid "allow storing empty note"
+#: builtin/log.c:1474
+msgid "add a signature from a file"
 msgstr ""
 
-#: builtin/notes.c:409 builtin/notes.c:480
-msgid "replace existing notes"
+#: builtin/log.c:1475
+msgid "don't print the patch filenames"
 msgstr ""
 
-#: builtin/notes.c:434
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+#: builtin/log.c:1565
+msgid "-n and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/notes.c:449 builtin/notes.c:528
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:885
-#, c-format
-msgid "Removing note for object %s\n"
+#: builtin/log.c:1575
+msgid "--name-only does not make sense"
 msgstr ""
 
-#: builtin/notes.c:481
-msgid "read objects from stdin"
+#: builtin/log.c:1577
+msgid "--name-status does not make sense"
 msgstr ""
 
-#: builtin/notes.c:483
-msgid "load rewriting config for <command> (implies --stdin)"
+#: builtin/log.c:1579
+msgid "--check does not make sense"
 msgstr ""
 
-#: builtin/notes.c:501
-msgid "too few parameters"
+#: builtin/log.c:1609
+msgid "standard output, or directory, which one?"
 msgstr ""
 
-#: builtin/notes.c:522
+#: builtin/log.c:1611
 #, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+msgid "Could not create directory '%s'"
 msgstr ""
 
-#: builtin/notes.c:534
+#: builtin/log.c:1705
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
+msgid "unable to read signature file '%s'"
 msgstr ""
 
-#: builtin/notes.c:586
-#, 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:1777
+msgid "Failed to create output files"
 msgstr ""
 
-#: builtin/notes.c:767
-msgid "General options"
+#: builtin/log.c:1826
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr ""
 
-#: builtin/notes.c:769
-msgid "Merge options"
+#: builtin/log.c:1880
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
 
-#: builtin/notes.c:771
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
+#: builtin/ls-files.c:458
+msgid "git ls-files [<options>] [<file>...]"
 msgstr ""
 
-#: builtin/notes.c:773
-msgid "Committing unmerged notes"
+#: builtin/ls-files.c:507
+msgid "identify the file status with tags"
 msgstr ""
 
-#: builtin/notes.c:775
-msgid "finalize notes merge by committing unmerged notes"
+#: builtin/ls-files.c:509
+msgid "use lowercase letters for 'assume unchanged' files"
 msgstr ""
 
-#: builtin/notes.c:777
-msgid "Aborting notes merge resolution"
+#: builtin/ls-files.c:511
+msgid "show cached files in the output (default)"
 msgstr ""
 
-#: builtin/notes.c:779
-msgid "abort notes merge"
+#: builtin/ls-files.c:513
+msgid "show deleted files in the output"
 msgstr ""
 
-#: builtin/notes.c:856
-#, c-format
-msgid "A notes merge into %s is already in-progress at %s"
+#: builtin/ls-files.c:515
+msgid "show modified files in the output"
 msgstr ""
 
-#: builtin/notes.c:883
-#, c-format
-msgid "Object %s has no note\n"
+#: builtin/ls-files.c:517
+msgid "show other files in the output"
 msgstr ""
 
-#: builtin/notes.c:895
-msgid "attempt to remove non-existent note is not an error"
+#: builtin/ls-files.c:519
+msgid "show ignored files in the output"
 msgstr ""
 
-#: builtin/notes.c:898
-msgid "read object names from the standard input"
+#: builtin/ls-files.c:522
+msgid "show staged contents' object name in the output"
 msgstr ""
 
-#: builtin/notes.c:979
-msgid "notes-ref"
+#: builtin/ls-files.c:524
+msgid "show files on the filesystem that need to be removed"
 msgstr ""
 
-#: builtin/notes.c:980
-msgid "use notes from <notes-ref>"
+#: builtin/ls-files.c:526
+msgid "show 'other' directories' names only"
 msgstr ""
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
-#, c-format
-msgid "Unknown subcommand: %s"
+#: builtin/ls-files.c:528
+msgid "show line endings of files"
 msgstr ""
 
-#: builtin/pack-objects.c:28
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+#: builtin/ls-files.c:530
+msgid "don't show empty directories"
 msgstr ""
 
-#: builtin/pack-objects.c:29
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+#: builtin/ls-files.c:533
+msgid "show unmerged files in the output"
 msgstr ""
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
-#, c-format
-msgid "deflate error (%d)"
+#: builtin/ls-files.c:535
+msgid "show resolve-undo information"
 msgstr ""
 
-#: builtin/pack-objects.c:772
-msgid "Writing objects"
+#: builtin/ls-files.c:537
+msgid "skip files matching pattern"
 msgstr ""
 
-#: builtin/pack-objects.c:1012
-msgid "disabling bitmap writing, as some objects are not being packed"
+#: builtin/ls-files.c:540
+msgid "exclude patterns are read from <file>"
 msgstr ""
 
-#: builtin/pack-objects.c:2172
-msgid "Compressing objects"
+#: builtin/ls-files.c:543
+msgid "read additional per-directory exclude patterns in <file>"
 msgstr ""
 
-#: builtin/pack-objects.c:2558
-#, c-format
-msgid "unsupported index version %s"
+#: builtin/ls-files.c:545
+msgid "add the standard git exclusions"
 msgstr ""
 
-#: builtin/pack-objects.c:2562
-#, c-format
-msgid "bad index version '%s'"
+#: builtin/ls-files.c:548
+msgid "make the output relative to the project top directory"
 msgstr ""
 
-#: builtin/pack-objects.c:2592
-msgid "do not show progress meter"
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
 msgstr ""
 
-#: builtin/pack-objects.c:2594
-msgid "show progress meter"
+#: builtin/ls-files.c:553
+msgid "if any <file> is not in the index, treat this as an error"
 msgstr ""
 
-#: builtin/pack-objects.c:2596
-msgid "show progress meter during object writing phase"
+#: builtin/ls-files.c:554
+msgid "tree-ish"
 msgstr ""
 
-#: builtin/pack-objects.c:2599
-msgid "similar to --all-progress when progress meter is shown"
+#: builtin/ls-files.c:555
+msgid "pretend that paths removed since <tree-ish> are still present"
 msgstr ""
 
-#: builtin/pack-objects.c:2600
-msgid "version[,offset]"
+#: builtin/ls-files.c:557
+msgid "show debugging data"
 msgstr ""
 
-#: builtin/pack-objects.c:2601
-msgid "write the pack index file in the specified idx format version"
+#: 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:2604
-msgid "maximum size of each output pack file"
+#: builtin/ls-remote.c:50
+msgid "do not print remote URL"
 msgstr ""
 
-#: builtin/pack-objects.c:2606
-msgid "ignore borrowed objects from alternate object store"
+#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+msgid "exec"
 msgstr ""
 
-#: builtin/pack-objects.c:2608
-msgid "ignore packed objects"
+#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+msgid "path of git-upload-pack on the remote host"
 msgstr ""
 
-#: builtin/pack-objects.c:2610
-msgid "limit pack window by objects"
+#: builtin/ls-remote.c:56
+msgid "limit to tags"
 msgstr ""
 
-#: builtin/pack-objects.c:2612
-msgid "limit pack window by memory in addition to object limit"
+#: builtin/ls-remote.c:57
+msgid "limit to heads"
 msgstr ""
 
-#: builtin/pack-objects.c:2614
-msgid "maximum length of delta chain allowed in the resulting pack"
+#: builtin/ls-remote.c:58
+msgid "do not show peeled tags"
 msgstr ""
 
-#: builtin/pack-objects.c:2616
-msgid "reuse existing deltas"
+#: builtin/ls-remote.c:60
+msgid "take url.<base>.insteadOf into account"
 msgstr ""
 
-#: builtin/pack-objects.c:2618
-msgid "reuse existing objects"
+#: builtin/ls-remote.c:62
+msgid "exit with exit code 2 if no matching refs are found"
 msgstr ""
 
-#: builtin/pack-objects.c:2620
-msgid "use OFS_DELTA objects"
+#: builtin/ls-remote.c:64
+msgid "show underlying ref in addition to the object pointed by it"
 msgstr ""
 
-#: builtin/pack-objects.c:2622
-msgid "use threads when searching for best delta matches"
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
 msgstr ""
 
-#: builtin/pack-objects.c:2624
-msgid "do not create an empty pack output"
+#: builtin/ls-tree.c:128
+msgid "only show trees"
 msgstr ""
 
-#: builtin/pack-objects.c:2626
-msgid "read revision arguments from standard input"
+#: builtin/ls-tree.c:130
+msgid "recurse into subtrees"
 msgstr ""
 
-#: builtin/pack-objects.c:2628
-msgid "limit the objects to those that are not yet packed"
+#: builtin/ls-tree.c:132
+msgid "show trees when recursing"
 msgstr ""
 
-#: builtin/pack-objects.c:2631
-msgid "include objects reachable from any reference"
+#: builtin/ls-tree.c:135
+msgid "terminate entries with NUL byte"
 msgstr ""
 
-#: builtin/pack-objects.c:2634
-msgid "include objects referred by reflog entries"
+#: builtin/ls-tree.c:136
+msgid "include object size"
 msgstr ""
 
-#: builtin/pack-objects.c:2637
-msgid "include objects referred to by the index"
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+msgid "list only filenames"
 msgstr ""
 
-#: builtin/pack-objects.c:2640
-msgid "output pack to stdout"
+#: builtin/ls-tree.c:143
+msgid "use full path names"
 msgstr ""
 
-#: builtin/pack-objects.c:2642
-msgid "include tag objects that refer to objects to be packed"
+#: builtin/ls-tree.c:145
+msgid "list entire tree; not just current directory (implies --full-name)"
 msgstr ""
 
-#: builtin/pack-objects.c:2644
-msgid "keep unreachable objects"
+#: builtin/merge.c:46
+msgid "git merge [<options>] [<commit>...]"
 msgstr ""
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
+#: builtin/merge.c:47
+msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr ""
 
-#: builtin/pack-objects.c:2646
-msgid "unpack unreachable objects newer than <time>"
+#: builtin/merge.c:48
+msgid "git merge --abort"
 msgstr ""
 
-#: builtin/pack-objects.c:2649
-msgid "create thin packs"
+#: builtin/merge.c:102
+msgid "switch `m' requires a value"
 msgstr ""
 
-#: builtin/pack-objects.c:2651
-msgid "create packs suitable for shallow fetches"
+#: builtin/merge.c:139
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
 msgstr ""
 
-#: builtin/pack-objects.c:2653
-msgid "ignore packs that have companion .keep file"
+#: builtin/merge.c:140
+#, c-format
+msgid "Available strategies are:"
 msgstr ""
 
-#: builtin/pack-objects.c:2655
-msgid "pack compression level"
+#: builtin/merge.c:145
+#, c-format
+msgid "Available custom strategies are:"
 msgstr ""
 
-#: builtin/pack-objects.c:2657
-msgid "do not hide commits by grafts"
+#: builtin/merge.c:195 builtin/pull.c:127
+msgid "do not show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/pack-objects.c:2659
-msgid "use a bitmap index if available to speed up counting objects"
+#: builtin/merge.c:198 builtin/pull.c:130
+msgid "show a diffstat at the end of the merge"
 msgstr ""
 
-#: builtin/pack-objects.c:2661
-msgid "write a bitmap index together with the pack index"
+#: builtin/merge.c:199 builtin/pull.c:133
+msgid "(synonym to --stat)"
 msgstr ""
 
-#: builtin/pack-objects.c:2752
-msgid "Counting objects"
-msgstr ""
-
-#: builtin/pack-refs.c:6
-msgid "git pack-refs [<options>]"
-msgstr ""
-
-#: builtin/pack-refs.c:14
-msgid "pack everything"
+#: builtin/merge.c:201 builtin/pull.c:136
+msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr ""
 
-#: builtin/pack-refs.c:15
-msgid "prune loose refs (default)"
+#: builtin/merge.c:204 builtin/pull.c:139
+msgid "create a single commit instead of doing a merge"
 msgstr ""
 
-#: builtin/prune-packed.c:7
-msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+#: builtin/merge.c:206 builtin/pull.c:142
+msgid "perform a commit if the merge succeeds (default)"
 msgstr ""
 
-#: builtin/prune-packed.c:40
-msgid "Removing duplicate objects"
+#: builtin/merge.c:208 builtin/pull.c:145
+msgid "edit message before committing"
 msgstr ""
 
-#: builtin/prune.c:11
-msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+#: builtin/merge.c:209
+msgid "allow fast-forward (default)"
 msgstr ""
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
+#: builtin/merge.c:211 builtin/pull.c:151
+msgid "abort if fast-forward is not possible"
 msgstr ""
 
-#: builtin/prune.c:106 builtin/worktree.c:125
-msgid "report pruned objects"
+#: builtin/merge.c:215 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
 msgstr ""
 
-#: builtin/prune.c:109 builtin/worktree.c:127
-msgid "expire objects older than <time>"
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
+#: builtin/revert.c:89
+msgid "strategy"
 msgstr ""
 
-#: builtin/prune.c:123
-msgid "cannot prune in a precious-objects repo"
+#: builtin/merge.c:217 builtin/pull.c:159
+msgid "merge strategy to use"
 msgstr ""
 
-#: builtin/pull.c:72
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
+#: builtin/merge.c:218 builtin/pull.c:162
+msgid "option=value"
 msgstr ""
 
-#: builtin/pull.c:117
-msgid "Options related to merging"
+#: builtin/merge.c:219 builtin/pull.c:163
+msgid "option for selected merge strategy"
 msgstr ""
 
-#: builtin/pull.c:120
-msgid "incorporate changes by rebasing rather than merging"
+#: builtin/merge.c:221
+msgid "merge commit message (for a non-fast-forward merge)"
 msgstr ""
 
-#: builtin/pull.c:144 builtin/revert.c:105
-msgid "allow fast-forward"
+#: builtin/merge.c:225
+msgid "abort the current in-progress merge"
 msgstr ""
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
 msgstr ""
 
-#: builtin/pull.c:164
-msgid "Options related to fetching"
+#: builtin/merge.c:255
+msgid "could not run stash."
 msgstr ""
 
-#: builtin/pull.c:186
-msgid "number of submodules pulled in parallel"
+#: builtin/merge.c:260
+msgid "stash failed"
 msgstr ""
 
-#: builtin/pull.c:275
+#: builtin/merge.c:265
 #, c-format
-msgid "Invalid value for pull.ff: %s"
-msgstr ""
-
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
+msgid "not a valid object: %s"
 msgstr ""
 
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+#: builtin/merge.c:284 builtin/merge.c:301
+msgid "read-tree failed"
 msgstr ""
 
-#: builtin/pull.c:443
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
+#: builtin/merge.c:331
+msgid " (nothing to squash)"
 msgstr ""
 
-#: builtin/pull.c:445
-msgid ""
-"There are no candidates for merging among the refs that you just fetched."
+#: builtin/merge.c:342
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
 msgstr ""
 
-#: builtin/pull.c:446
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
+#: builtin/merge.c:392
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
 msgstr ""
 
-#: builtin/pull.c:449
+#: builtin/merge.c:443
 #, 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."
+msgid "'%s' does not point to a commit"
 msgstr ""
 
-#: builtin/pull.c:454
-msgid "You are not currently on a branch."
+#: builtin/merge.c:533
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr ""
 
-#: builtin/pull.c:456 builtin/pull.c:471
-msgid "Please specify which branch you want to rebase against."
+#: builtin/merge.c:652
+msgid "Not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/pull.c:458 builtin/pull.c:473
-msgid "Please specify which branch you want to merge with."
+#: builtin/merge.c:666
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/pull.c:459 builtin/pull.c:474
-msgid "See git-pull(1) for details."
+#: builtin/merge.c:681
+#, c-format
+msgid "unable to write %s"
 msgstr ""
 
-#: builtin/pull.c:469
-msgid "There is no tracking information for the current branch."
+#: builtin/merge.c:733
+#, c-format
+msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/pull.c:478
+#: builtin/merge.c:742
 #, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/pull.c:483
+#: builtin/merge.c:748
 #, c-format
 msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
+"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/pull.c:841
-msgid "Updating an unborn branch with changes added to the index."
+#: builtin/merge.c:772
+msgid "Empty commit message."
 msgstr ""
 
-#: builtin/pull.c:870
+#: builtin/merge.c:792
 #, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
+msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/pull.c:875
+#: builtin/merge.c:847
 #, 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 "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/pull.c:890
-msgid "Cannot merge multiple branches into empty head."
+#: builtin/merge.c:863
+#, c-format
+msgid "'%s' is not a commit"
 msgstr ""
 
-#: builtin/pull.c:894
-msgid "Cannot rebase onto multiple branches."
+#: builtin/merge.c:904
+msgid "No current branch."
 msgstr ""
 
-#: builtin/push.c:16
-msgid "git push [<options>] [<repository> [<refspec>...]]"
+#: builtin/merge.c:906
+msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/push.c:89
-msgid "tag shorthand without <tag>"
+#: builtin/merge.c:908
+msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/push.c:99
-msgid "--delete only accepts plain target ref names"
+#: builtin/merge.c:913
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/push.c:143
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
 msgstr ""
 
-#: builtin/push.c:146
+#: builtin/merge.c:1034
 #, 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 "could not close '%s'"
 msgstr ""
 
-#: builtin/push.c:161
+#: builtin/merge.c:1061
 #, 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 "not something we can merge in %s: %s"
 msgstr ""
 
-#: 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"
+#: builtin/merge.c:1095
+msgid "not something we can merge"
 msgstr ""
 
-#: builtin/push.c:183
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
+#: builtin/merge.c:1162
+msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/push.c:186
-#, c-format
+#: builtin/merge.c:1178
 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."
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
 msgstr ""
 
-#: builtin/push.c:242
+#: builtin/merge.c:1185
 msgid ""
-"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
 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:1188
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 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:1197
+msgid "You cannot combine --squash with --no-ff."
 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:1205
+msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/push.c:268
-msgid "Updates were rejected because the tag already exists in the remote."
+#: builtin/merge.c:1222
+msgid "Squash commit into empty head not supported yet"
 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:1224
+msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/push.c:331
+#: builtin/merge.c:1229
 #, c-format
-msgid "Pushing to %s\n"
+msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/push.c:335
-#, c-format
-msgid "failed to push some refs to '%s'"
+#: builtin/merge.c:1231
+msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/push.c:365
+#: builtin/merge.c:1287
 #, c-format
-msgid "bad repository '%s'"
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 
-#: builtin/push.c:366
-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:1290
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
 
-#: builtin/push.c:381
-msgid "--all and --tags are incompatible"
+#: builtin/merge.c:1293
+#, c-format
+msgid "Commit %s does not have a GPG signature."
 msgstr ""
 
-#: builtin/push.c:382
-msgid "--all can't be combined with refspecs"
+#: builtin/merge.c:1296
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
 msgstr ""
 
-#: builtin/push.c:387
-msgid "--mirror and --tags are incompatible"
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
 msgstr ""
 
-#: builtin/push.c:388
-msgid "--mirror can't be combined with refspecs"
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
 msgstr ""
 
-#: builtin/push.c:393
-msgid "--all and --mirror are incompatible"
+#: builtin/merge.c:1377
+#, c-format
+msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/push.c:505
-msgid "repository"
+#: builtin/merge.c:1418
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/push.c:506 builtin/send-pack.c:161
-msgid "push all refs"
+#: builtin/merge.c:1425
+#, c-format
+msgid "Nope.\n"
 msgstr ""
 
-#: builtin/push.c:507 builtin/send-pack.c:163
-msgid "mirror all refs"
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
 msgstr ""
 
-#: builtin/push.c:509
-msgid "delete refs"
+#: builtin/merge.c:1456
+msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/push.c:510
-msgid "push tags (can't be used with --all or --mirror)"
+#: builtin/merge.c:1479 builtin/merge.c:1558
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/push.c:513 builtin/send-pack.c:164
-msgid "force updates"
+#: builtin/merge.c:1483
+#, c-format
+msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/push.c:515 builtin/send-pack.c:175
-msgid "refname>:<expect"
+#: builtin/merge.c:1549
+#, c-format
+msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/push.c:516 builtin/send-pack.c:176
-msgid "require old value of ref to be at this value"
+#: builtin/merge.c:1551
+#, c-format
+msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/push.c:519
-msgid "control recursive pushing of submodules"
+#: builtin/merge.c:1560
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/push.c:521 builtin/send-pack.c:169
-msgid "use thin pack"
+#: builtin/merge.c:1572
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 
-#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
-msgid "receive pack program"
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
 msgstr ""
 
-#: builtin/push.c:524
-msgid "set upstream for git pull/status"
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
 msgstr ""
 
-#: builtin/push.c:527
-msgid "prune locally removed refs"
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
 msgstr ""
 
-#: builtin/push.c:529
-msgid "bypass pre-push hook"
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
 msgstr ""
 
-#: builtin/push.c:530
-msgid "push missing but relevant tags"
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
 msgstr ""
 
-#: builtin/push.c:533 builtin/send-pack.c:166
-msgid "GPG sign the push"
+#: builtin/merge-base.c:217
+msgid "output all common ancestors"
 msgstr ""
 
-#: builtin/push.c:535 builtin/send-pack.c:170
-msgid "request atomic transaction on remote side"
+#: builtin/merge-base.c:219
+msgid "find ancestors for a single n-way merge"
 msgstr ""
 
-#: builtin/push.c:549
-msgid "--delete is incompatible with --all, --mirror and --tags"
+#: builtin/merge-base.c:221
+msgid "list revs not reachable from others"
 msgstr ""
 
-#: builtin/push.c:551
-msgid "--delete doesn't make sense without any refs"
+#: builtin/merge-base.c:223
+msgid "is the first one ancestor of the other?"
 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-base.c:225
+msgid "find where <commit> forked from reflog of <ref>"
 msgstr ""
 
-#: builtin/read-tree.c:110
-msgid "write resulting index to <file>"
+#: 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:113
-msgid "only empty the index"
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
 msgstr ""
 
-#: builtin/read-tree.c:115
-msgid "Merging"
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
 msgstr ""
 
-#: builtin/read-tree.c:117
-msgid "perform a merge in addition to a read"
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
 msgstr ""
 
-#: builtin/read-tree.c:119
-msgid "3-way merge if no file level merging required"
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
 msgstr ""
 
-#: builtin/read-tree.c:121
-msgid "3-way merge in presence of adds and removes"
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
 msgstr ""
 
-#: builtin/read-tree.c:123
-msgid "same as -m, but discard unmerged entries"
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
 msgstr ""
 
-#: builtin/read-tree.c:124
-msgid "<subdirectory>/"
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
 msgstr ""
 
-#: builtin/read-tree.c:125
-msgid "read the tree into the index under <subdirectory>/"
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig-file/file2"
 msgstr ""
 
-#: builtin/read-tree.c:128
-msgid "update working tree with merge result"
+#: builtin/merge-recursive.c:45
+#, c-format
+msgid "unknown option %s"
 msgstr ""
 
-#: builtin/read-tree.c:130
-msgid "gitignore"
+#: builtin/merge-recursive.c:51
+#, c-format
+msgid "could not parse object '%s'"
 msgstr ""
 
-#: builtin/read-tree.c:131
-msgid "allow explicitly ignored files to be overwritten"
-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/read-tree.c:134
-msgid "don't check the working tree after merging"
+#: builtin/merge-recursive.c:63
+msgid "not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/read-tree.c:135
-msgid "don't update the index or the work tree"
+#: builtin/merge-recursive.c:69 builtin/merge-recursive.c:71
+#, c-format
+msgid "could not resolve ref '%s'"
 msgstr ""
 
-#: builtin/read-tree.c:137
-msgid "skip applying sparse checkout filter"
+#: builtin/merge-recursive.c:77
+#, c-format
+msgid "Merging %s with %s\n"
 msgstr ""
 
-#: builtin/read-tree.c:139
-msgid "debug unpack-trees"
+#: builtin/mktree.c:65
+msgid "git mktree [-z] [--missing] [--batch]"
 msgstr ""
 
-#: builtin/reflog.c:423
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
+#: builtin/mktree.c:152
+msgid "input is NUL terminated"
 msgstr ""
 
-#: builtin/reflog.c:540 builtin/reflog.c:545
-#, c-format
-msgid "'%s' is not a valid timestamp"
+#: builtin/mktree.c:153 builtin/write-tree.c:24
+msgid "allow missing objects"
 msgstr ""
 
-#: builtin/remote.c:12
-msgid "git remote [-v | --verbose]"
+#: builtin/mktree.c:154
+msgid "allow creation of more than one tree"
 msgstr ""
 
-#: builtin/remote.c:13
-msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
+#: builtin/mv.c:15
+msgid "git mv [<options>] <source>... <destination>"
 msgstr ""
 
-#: builtin/remote.c:14 builtin/remote.c:34
-msgid "git remote rename <old> <new>"
+#: builtin/mv.c:70
+#, c-format
+msgid "Directory %s is in index and no submodule?"
 msgstr ""
 
-#: builtin/remote.c:15 builtin/remote.c:39
-msgid "git remote remove <name>"
+#: builtin/mv.c:72 builtin/rm.c:317
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
 
-#: builtin/remote.c:16 builtin/remote.c:44
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+#: builtin/mv.c:90
+#, c-format
+msgid "%.*s is in index"
 msgstr ""
 
-#: builtin/remote.c:17
-msgid "git remote [-v | --verbose] show [-n] <name>"
+#: builtin/mv.c:112
+msgid "force move/rename even if target exists"
 msgstr ""
 
-#: builtin/remote.c:18
-msgid "git remote prune [-n | --dry-run] <name>"
+#: builtin/mv.c:113
+msgid "skip move/rename errors"
 msgstr ""
 
-#: builtin/remote.c:19
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+#: builtin/mv.c:155
+#, c-format
+msgid "destination '%s' is not a directory"
 msgstr ""
 
-#: builtin/remote.c:20
-msgid "git remote set-branches [--add] <name> <branch>..."
+#: builtin/mv.c:166
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
 msgstr ""
 
-#: builtin/remote.c:21 builtin/remote.c:70
-msgid "git remote get-url [--push] [--all] <name>"
+#: builtin/mv.c:170
+msgid "bad source"
 msgstr ""
 
-#: builtin/remote.c:22 builtin/remote.c:75
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+#: builtin/mv.c:173
+msgid "can not move directory into itself"
 msgstr ""
 
-#: builtin/remote.c:23 builtin/remote.c:76
-msgid "git remote set-url --add <name> <newurl>"
+#: builtin/mv.c:176
+msgid "cannot move directory over file"
 msgstr ""
 
-#: builtin/remote.c:24 builtin/remote.c:77
-msgid "git remote set-url --delete <name> <url>"
+#: builtin/mv.c:185
+msgid "source directory is empty"
 msgstr ""
 
-#: builtin/remote.c:29
-msgid "git remote add [<options>] <name> <url>"
+#: builtin/mv.c:210
+msgid "not under version control"
 msgstr ""
 
-#: builtin/remote.c:49
-msgid "git remote set-branches <name> <branch>..."
+#: builtin/mv.c:213
+msgid "destination exists"
 msgstr ""
 
-#: builtin/remote.c:50
-msgid "git remote set-branches --add <name> <branch>..."
+#: builtin/mv.c:221
+#, c-format
+msgid "overwriting '%s'"
 msgstr ""
 
-#: builtin/remote.c:55
-msgid "git remote show [<options>] <name>"
+#: builtin/mv.c:224
+msgid "Cannot overwrite"
 msgstr ""
 
-#: builtin/remote.c:60
-msgid "git remote prune [<options>] <name>"
+#: builtin/mv.c:227
+msgid "multiple sources for the same target"
 msgstr ""
 
-#: builtin/remote.c:65
-msgid "git remote update [<options>] [<group> | <remote>]..."
+#: builtin/mv.c:229
+msgid "destination directory does not exist"
 msgstr ""
 
-#: builtin/remote.c:94
+#: builtin/mv.c:236
 #, c-format
-msgid "Updating %s"
+msgid "%s, source=%s, destination=%s"
 msgstr ""
 
-#: builtin/remote.c:126
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
+#: builtin/mv.c:257
+#, c-format
+msgid "Renaming %s to %s\n"
 msgstr ""
 
-#: builtin/remote.c:143
+#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
 #, c-format
-msgid "unknown mirror argument: %s"
+msgid "renaming '%s' failed"
 msgstr ""
 
-#: builtin/remote.c:159
-msgid "fetch the remote branches"
+#: builtin/name-rev.c:257
+msgid "git name-rev [<options>] <commit>..."
 msgstr ""
 
-#: builtin/remote.c:161
-msgid "import all tags and associated objects when fetching"
+#: builtin/name-rev.c:258
+msgid "git name-rev [<options>] --all"
 msgstr ""
 
-#: builtin/remote.c:164
-msgid "or do not fetch any tag at all (--no-tags)"
+#: builtin/name-rev.c:259
+msgid "git name-rev [<options>] --stdin"
 msgstr ""
 
-#: builtin/remote.c:166
-msgid "branch(es) to track"
+#: builtin/name-rev.c:311
+msgid "print only names (no SHA-1)"
 msgstr ""
 
-#: builtin/remote.c:167
-msgid "master branch"
+#: builtin/name-rev.c:312
+msgid "only use tags to name the commits"
 msgstr ""
 
-#: builtin/remote.c:168
-msgid "push|fetch"
+#: builtin/name-rev.c:314
+msgid "only use refs matching <pattern>"
 msgstr ""
 
-#: builtin/remote.c:169
-msgid "set up remote as a mirror to push to or fetch from"
+#: builtin/name-rev.c:316
+msgid "list all commits reachable from all refs"
 msgstr ""
 
-#: builtin/remote.c:181
-msgid "specifying a master branch makes no sense with --mirror"
+#: builtin/name-rev.c:317
+msgid "read from stdin"
 msgstr ""
 
-#: builtin/remote.c:183
-msgid "specifying branches to track makes sense only with fetch mirrors"
+#: builtin/name-rev.c:318
+msgid "allow to print `undefined` names (default)"
 msgstr ""
 
-#: builtin/remote.c:190 builtin/remote.c:633
-#, c-format
-msgid "remote %s already exists."
+#: builtin/name-rev.c:324
+msgid "dereference tags in the input (internal use)"
 msgstr ""
 
-#: builtin/remote.c:194 builtin/remote.c:637
-#, c-format
-msgid "'%s' is not a valid remote name"
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
 msgstr ""
 
-#: builtin/remote.c:234
-#, c-format
-msgid "Could not setup master '%s'"
+#: 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:336
-#, c-format
-msgid "Could not get fetch map for refspec %s"
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
 msgstr ""
 
-#: builtin/remote.c:437 builtin/remote.c:445
-msgid "(matching)"
+#: 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:449
-msgid "(delete)"
-msgstr ""
-
-#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
-#, c-format
-msgid "No such remote: %s"
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:643
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
 msgstr ""
 
-#: builtin/remote.c:663
-#, c-format
+#: builtin/notes.c:31
 msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
 msgstr ""
 
-#: builtin/remote.c:699
-#, c-format
-msgid "deleting '%s' failed"
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
 msgstr ""
 
-#: builtin/remote.c:733
-#, c-format
-msgid "creating '%s' failed"
+#: builtin/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
 msgstr ""
 
-#: builtin/remote.c:796
-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/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+msgstr ""
 
-#: builtin/remote.c:810
-#, c-format
-msgid "Could not remove config section '%s'"
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
 msgstr ""
 
-#: builtin/remote.c:911
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
 msgstr ""
 
-#: builtin/remote.c:914
-msgid " tracked"
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
 msgstr ""
 
-#: builtin/remote.c:916
-msgid " stale (use 'git remote prune' to remove)"
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:918
-msgid " ???"
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
 msgstr ""
 
-#: builtin/remote.c:959
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
 msgstr ""
 
-#: builtin/remote.c:967
-#, c-format
-msgid "rebases interactively onto remote %s"
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
 msgstr ""
 
-#: builtin/remote.c:971
-#, c-format
-msgid " merges with remote %s"
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
 msgstr ""
 
-#: builtin/remote.c:972
-msgid "    and with remote"
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
 msgstr ""
 
-#: builtin/remote.c:974
-#, c-format
-msgid "merges with remote %s"
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
 msgstr ""
 
-#: builtin/remote.c:975
-msgid "   and with remote"
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
 msgstr ""
 
-#: builtin/remote.c:1021
-msgid "create"
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
 msgstr ""
 
-#: builtin/remote.c:1024
-msgid "delete"
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
 msgstr ""
 
-#: builtin/remote.c:1028
-msgid "up to date"
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
 msgstr ""
 
-#: builtin/remote.c:1031
-msgid "fast-forwardable"
+#: builtin/notes.c:89
+msgid "git notes get-ref"
 msgstr ""
 
-#: builtin/remote.c:1034
-msgid "local out of date"
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
 msgstr ""
 
-#: builtin/remote.c:1041
+#: builtin/notes.c:147
 #, c-format
-msgid "    %-*s forces to %-*s (%s)"
+msgid "unable to start 'show' for object '%s'"
 msgstr ""
 
-#: builtin/remote.c:1044
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
 msgstr ""
 
-#: builtin/remote.c:1048
+#: builtin/notes.c:159
 #, c-format
-msgid "    %-*s forces to %s"
+msgid "failed to finish 'show' for object '%s'"
 msgstr ""
 
-#: builtin/remote.c:1051
-#, c-format
-msgid "    %-*s pushes to %s"
+#: builtin/notes.c:194
+msgid "please supply the note contents using either -m or -F option"
 msgstr ""
 
-#: builtin/remote.c:1119
-msgid "do not query remotes"
+#: builtin/notes.c:203
+msgid "unable to write note object"
 msgstr ""
 
-#: builtin/remote.c:1146
+#: builtin/notes.c:205
 #, c-format
-msgid "* remote %s"
+msgid "the note contents have been left in %s"
 msgstr ""
 
-#: builtin/remote.c:1147
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
-msgid "  Fetch URL: %s"
+msgid "cannot read '%s'"
 msgstr ""
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
-msgid "(no URL)"
+#: builtin/notes.c:235 builtin/tag.c:442
+#, c-format
+msgid "could not open or read '%s'"
 msgstr ""
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#: 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 "  Push  URL: %s"
+msgid "failed to resolve '%s' as a valid ref."
 msgstr ""
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/notes.c:257
 #, c-format
-msgid "  HEAD branch: %s"
+msgid "failed to read object '%s'."
 msgstr ""
 
-#: builtin/remote.c:1167
+#: builtin/notes.c:261
 #, c-format
-msgid ""
-"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgid "cannot read note data from non-blob object '%s'."
 msgstr ""
 
-#: builtin/remote.c:1179
+#: builtin/notes.c:301
 #, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1182 builtin/remote.c:1209
-msgid " (status not queried)"
+msgid "malformed input line: '%s'."
 msgstr ""
 
-#: builtin/remote.c:1191
-msgid "  Local branch configured for 'git pull':"
-msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
-
-#: builtin/remote.c:1199
-msgid "  Local refs will be mirrored by 'git push'"
+#: builtin/notes.c:316
+#, c-format
+msgid "failed to copy notes from '%s' to '%s'"
 msgstr ""
 
-#: builtin/remote.c:1206
+#. TRANSLATORS: the first %s will be replaced by a
+#. git notes command: 'add', 'merge', 'remove', etc.
+#: builtin/notes.c:345
 #, c-format
-msgid "  Local ref configured for 'git push'%s:"
-msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr ""
 
-#: builtin/remote.c:1227
-msgid "set refs/remotes/<name>/HEAD according to remote"
+#: 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/remote.c:1229
-msgid "delete refs/remotes/<name>/HEAD"
+#: builtin/notes.c:378 builtin/notes.c:665
+#, c-format
+msgid "no note found for object %s."
 msgstr ""
 
-#: builtin/remote.c:1244
-msgid "Cannot determine remote HEAD"
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "note contents as a string"
 msgstr ""
 
-#: builtin/remote.c:1246
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "note contents in a file"
 msgstr ""
 
-#: builtin/remote.c:1256
-#, c-format
-msgid "Could not delete %s"
+#: builtin/notes.c:405 builtin/notes.c:568
+msgid "reuse and edit specified note object"
 msgstr ""
 
-#: builtin/remote.c:1264
-#, c-format
-msgid "Not a valid ref: %s"
+#: builtin/notes.c:408 builtin/notes.c:571
+msgid "reuse specified note object"
 msgstr ""
 
-#: builtin/remote.c:1266
-#, c-format
-msgid "Could not setup %s"
+#: builtin/notes.c:411 builtin/notes.c:574
+msgid "allow storing empty note"
 msgstr ""
 
-#: builtin/remote.c:1284
-#, c-format
-msgid " %s will become dangling!"
+#: builtin/notes.c:412 builtin/notes.c:483
+msgid "replace existing notes"
 msgstr ""
 
-#: builtin/remote.c:1285
+#: builtin/notes.c:437
 #, c-format
-msgid " %s has become dangling!"
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
 msgstr ""
 
-#: builtin/remote.c:1295
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
-msgid "Pruning %s"
+msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
-#: builtin/remote.c:1296
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
-msgid "URL: %s"
+msgid "Removing note for object %s\n"
 msgstr ""
 
-#: builtin/remote.c:1312
-#, c-format
-msgid " * [would prune] %s"
+#: builtin/notes.c:484
+msgid "read objects from stdin"
 msgstr ""
 
-#: builtin/remote.c:1315
-#, c-format
-msgid " * [pruned] %s"
+#: builtin/notes.c:486
+msgid "load rewriting config for <command> (implies --stdin)"
 msgstr ""
 
-#: builtin/remote.c:1360
-msgid "prune remotes after fetching"
+#: builtin/notes.c:504
+msgid "too few parameters"
 msgstr ""
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/notes.c:525
 #, c-format
-msgid "No such remote '%s'"
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
 msgstr ""
 
-#: builtin/remote.c:1439
-msgid "add branch"
+#: builtin/notes.c:537
+#, c-format
+msgid "missing notes on source object %s. Cannot copy."
 msgstr ""
 
-#: builtin/remote.c:1446
-msgid "no remote specified"
+#: 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:1463
-msgid "query push URLs rather than fetch URLs"
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
 msgstr ""
 
-#: builtin/remote.c:1465
-msgid "return all URLs"
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
 msgstr ""
 
-#: builtin/remote.c:1493
-#, c-format
-msgid "no URLs configured for remote '%s'"
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
 msgstr ""
 
-#: builtin/remote.c:1519
-msgid "manipulate push URLs"
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
 msgstr ""
 
-#: builtin/remote.c:1521
-msgid "add URL"
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
 msgstr ""
 
-#: builtin/remote.c:1523
-msgid "delete URLs"
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
 msgstr ""
 
-#: builtin/remote.c:1530
-msgid "--add --delete doesn't make sense"
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
 msgstr ""
 
-#: builtin/remote.c:1571
-#, c-format
-msgid "Invalid old URL pattern: %s"
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
 msgstr ""
 
-#: builtin/remote.c:1579
+#: builtin/notes.c:755
 #, c-format
-msgid "No such URL found: %s"
+msgid "unknown notes merge strategy %s"
 msgstr ""
 
-#: builtin/remote.c:1581
-msgid "Will not delete all non-push URLs"
+#: builtin/notes.c:771
+msgid "General options"
 msgstr ""
 
-#: builtin/remote.c:1595
-msgid "be verbose; must be placed before a subcommand"
+#: builtin/notes.c:773
+msgid "Merge options"
 msgstr ""
 
-#: builtin/repack.c:17
-msgid "git repack [<options>]"
+#: builtin/notes.c:775
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
 msgstr ""
 
-#: builtin/repack.c:159
-msgid "pack everything in a single pack"
+#: builtin/notes.c:777
+msgid "Committing unmerged notes"
 msgstr ""
 
-#: builtin/repack.c:161
-msgid "same as -a, and turn unreachable objects loose"
+#: builtin/notes.c:779
+msgid "finalize notes merge by committing unmerged notes"
 msgstr ""
 
-#: builtin/repack.c:164
-msgid "remove redundant packs, and run git-prune-packed"
+#: builtin/notes.c:781
+msgid "Aborting notes merge resolution"
 msgstr ""
 
-#: builtin/repack.c:166
-msgid "pass --no-reuse-delta to git-pack-objects"
+#: builtin/notes.c:783
+msgid "abort notes merge"
 msgstr ""
 
-#: builtin/repack.c:168
-msgid "pass --no-reuse-object to git-pack-objects"
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
 msgstr ""
 
-#: builtin/repack.c:170
-msgid "do not run git-update-server-info"
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
 msgstr ""
 
-#: builtin/repack.c:173
-msgid "pass --local to git-pack-objects"
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
 msgstr ""
 
-#: builtin/repack.c:175
-msgid "write bitmap index"
+#: builtin/notes.c:860
+#, c-format
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr ""
 
-#: builtin/repack.c:176
-msgid "approxidate"
+#: builtin/notes.c:863
+#, c-format
+msgid "failed to store link to current notes ref (%s)"
 msgstr ""
 
-#: builtin/repack.c:177
-msgid "with -A, do not loosen objects older than this"
+#: 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 ""
 
-#: builtin/repack.c:179
-msgid "size of the window used for delta compression"
+#: builtin/notes.c:887
+#, c-format
+msgid "Object %s has no note\n"
 msgstr ""
 
-#: builtin/repack.c:180 builtin/repack.c:184
-msgid "bytes"
+#: builtin/notes.c:899
+msgid "attempt to remove non-existent note is not an error"
 msgstr ""
 
-#: builtin/repack.c:181
-msgid "same as the above, but limit memory size instead of entries count"
+#: builtin/notes.c:902
+msgid "read object names from the standard input"
 msgstr ""
 
-#: builtin/repack.c:183
-msgid "limits the maximum delta depth"
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
 msgstr ""
 
-#: builtin/repack.c:185
-msgid "maximum size of each packfile"
+#: builtin/notes.c:941
+msgid "report pruned notes"
 msgstr ""
 
-#: builtin/repack.c:187
-msgid "repack objects in packs marked with .keep"
+#: builtin/notes.c:983
+msgid "notes-ref"
 msgstr ""
 
-#: builtin/repack.c:197
-msgid "cannot delete packs in a precious-objects repo"
+#: builtin/notes.c:984
+msgid "use notes from <notes-ref>"
 msgstr ""
 
-#: builtin/repack.c:381
+#: builtin/notes.c:1019
 #, c-format
-msgid "removing '%s' failed"
+msgid "unknown subcommand: %s"
 msgstr ""
 
-#: builtin/replace.c:19
-msgid "git replace [-f] <object> <replacement>"
+#: builtin/pack-objects.c:29
+msgid ""
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
 msgstr ""
 
-#: builtin/replace.c:20
-msgid "git replace [-f] --edit <object>"
+#: builtin/pack-objects.c:30
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
 msgstr ""
 
-#: builtin/replace.c:21
-msgid "git replace [-f] --graft <commit> [<parent>...]"
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
+#, c-format
+msgid "deflate error (%d)"
 msgstr ""
 
-#: builtin/replace.c:22
-msgid "git replace -d <object>..."
+#: builtin/pack-objects.c:768
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 
-#: builtin/replace.c:23
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
+#: builtin/pack-objects.c:781
+msgid "Writing objects"
 msgstr ""
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
-#, c-format
-msgid "Not a valid object name: '%s'"
+#: builtin/pack-objects.c:1070
+msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 
-#: builtin/replace.c:355
-#, c-format
-msgid "bad mergetag in commit '%s'"
+#: builtin/pack-objects.c:2346
+msgid "Compressing objects"
 msgstr ""
 
-#: builtin/replace.c:357
+#: builtin/pack-objects.c:2759
 #, c-format
-msgid "malformed mergetag in commit '%s'"
+msgid "unsupported index version %s"
 msgstr ""
 
-#: builtin/replace.c:368
+#: builtin/pack-objects.c:2763
 #, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
+msgid "bad index version '%s'"
 msgstr ""
 
-#: builtin/replace.c:401
-#, c-format
-msgid "the original commit '%s' has a gpg signature."
+#: builtin/pack-objects.c:2793
+msgid "do not show progress meter"
 msgstr ""
 
-#: builtin/replace.c:402
-msgid "the signature will be removed in the replacement commit!"
+#: builtin/pack-objects.c:2795
+msgid "show progress meter"
 msgstr ""
 
-#: builtin/replace.c:408
-#, c-format
-msgid "could not write replacement commit for: '%s'"
+#: builtin/pack-objects.c:2797
+msgid "show progress meter during object writing phase"
 msgstr ""
 
-#: builtin/replace.c:432
-msgid "list replace refs"
+#: builtin/pack-objects.c:2800
+msgid "similar to --all-progress when progress meter is shown"
 msgstr ""
 
-#: builtin/replace.c:433
-msgid "delete replace refs"
+#: builtin/pack-objects.c:2801
+msgid "version[,offset]"
 msgstr ""
 
-#: builtin/replace.c:434
-msgid "edit existing object"
+#: builtin/pack-objects.c:2802
+msgid "write the pack index file in the specified idx format version"
 msgstr ""
 
-#: builtin/replace.c:435
-msgid "change a commit's parents"
+#: builtin/pack-objects.c:2805
+msgid "maximum size of each output pack file"
 msgstr ""
 
-#: builtin/replace.c:436
-msgid "replace the ref if it exists"
+#: builtin/pack-objects.c:2807
+msgid "ignore borrowed objects from alternate object store"
 msgstr ""
 
-#: builtin/replace.c:437
-msgid "do not pretty-print contents for --edit"
+#: builtin/pack-objects.c:2809
+msgid "ignore packed objects"
 msgstr ""
 
-#: builtin/replace.c:438
-msgid "use this format"
+#: builtin/pack-objects.c:2811
+msgid "limit pack window by objects"
 msgstr ""
 
-#: builtin/rerere.c:12
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+#: builtin/pack-objects.c:2813
+msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
+#: builtin/pack-objects.c:2815
+msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 
-#: builtin/reset.c:26
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+#: builtin/pack-objects.c:2817
+msgid "reuse existing deltas"
 msgstr ""
 
-#: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
+#: builtin/pack-objects.c:2819
+msgid "reuse existing objects"
 msgstr ""
 
-#: builtin/reset.c:28
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+#: builtin/pack-objects.c:2821
+msgid "use OFS_DELTA objects"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "mixed"
+#: builtin/pack-objects.c:2823
+msgid "use threads when searching for best delta matches"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "soft"
+#: builtin/pack-objects.c:2825
+msgid "do not create an empty pack output"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "hard"
+#: builtin/pack-objects.c:2827
+msgid "read revision arguments from standard input"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "merge"
+#: builtin/pack-objects.c:2829
+msgid "limit the objects to those that are not yet packed"
 msgstr ""
 
-#: builtin/reset.c:34
-msgid "keep"
+#: builtin/pack-objects.c:2832
+msgid "include objects reachable from any reference"
 msgstr ""
 
-#: builtin/reset.c:74
-msgid "You do not have a valid HEAD."
+#: builtin/pack-objects.c:2835
+msgid "include objects referred by reflog entries"
 msgstr ""
 
-#: builtin/reset.c:76
-msgid "Failed to find tree of HEAD."
+#: builtin/pack-objects.c:2838
+msgid "include objects referred to by the index"
 msgstr ""
 
-#: builtin/reset.c:82
-#, c-format
-msgid "Failed to find tree of %s."
+#: builtin/pack-objects.c:2841
+msgid "output pack to stdout"
 msgstr ""
 
-#: builtin/reset.c:100
-#, c-format
-msgid "HEAD is now at %s"
+#: builtin/pack-objects.c:2843
+msgid "include tag objects that refer to objects to be packed"
 msgstr ""
 
-#: builtin/reset.c:183
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
+#: builtin/pack-objects.c:2845
+msgid "keep unreachable objects"
 msgstr ""
 
-#: builtin/reset.c:276
-msgid "be quiet, only report errors"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
 msgstr ""
 
-#: builtin/reset.c:278
-msgid "reset HEAD and index"
+#: builtin/pack-objects.c:2849
+msgid "unpack unreachable objects newer than <time>"
 msgstr ""
 
-#: builtin/reset.c:279
-msgid "reset only HEAD"
+#: builtin/pack-objects.c:2852
+msgid "create thin packs"
 msgstr ""
 
-#: builtin/reset.c:281 builtin/reset.c:283
-msgid "reset HEAD, index and working tree"
+#: builtin/pack-objects.c:2854
+msgid "create packs suitable for shallow fetches"
 msgstr ""
 
-#: builtin/reset.c:285
-msgid "reset HEAD but keep local changes"
+#: builtin/pack-objects.c:2856
+msgid "ignore packs that have companion .keep file"
 msgstr ""
 
-#: builtin/reset.c:288
-msgid "record only the fact that removed paths will be added later"
+#: builtin/pack-objects.c:2858
+msgid "pack compression level"
 msgstr ""
 
-#: builtin/reset.c:305
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
+#: builtin/pack-objects.c:2860
+msgid "do not hide commits by grafts"
 msgstr ""
 
-#: builtin/reset.c:313
-#, c-format
-msgid "Failed to resolve '%s' as a valid tree."
+#: builtin/pack-objects.c:2862
+msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 
-#: builtin/reset.c:322
-msgid "--patch is incompatible with --{hard,mixed,soft}"
+#: builtin/pack-objects.c:2864
+msgid "write a bitmap index together with the pack index"
 msgstr ""
 
-#: builtin/reset.c:331
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+#: builtin/pack-objects.c:2993
+msgid "Counting objects"
 msgstr ""
 
-#: builtin/reset.c:333
-#, c-format
-msgid "Cannot do %s reset with paths."
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
 msgstr ""
 
-#: builtin/reset.c:343
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
+#: builtin/pack-refs.c:14
+msgid "pack everything"
 msgstr ""
 
-#: builtin/reset.c:347
-msgid "-N can only be used with --mixed"
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
 msgstr ""
 
-#: builtin/reset.c:364
-msgid "Unstaged changes after reset:"
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
 msgstr ""
 
-#: builtin/reset.c:370
-#, c-format
-msgid "Could not reset index file to revision '%s'."
+#: builtin/prune-packed.c:40
+msgid "Removing duplicate objects"
 msgstr ""
 
-#: builtin/reset.c:374
-msgid "Could not write new index file."
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr ""
 
-#: builtin/rev-list.c:350
-msgid "rev-list does not support display of notes"
+#: builtin/prune.c:106 builtin/worktree.c:128
+msgid "report pruned objects"
 msgstr ""
 
-#: builtin/rev-parse.c:358
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+#: builtin/prune.c:109 builtin/worktree.c:130
+msgid "expire objects older than <time>"
 msgstr ""
 
-#: builtin/rev-parse.c:363
-msgid "keep the `--` passed as an arg"
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
 msgstr ""
 
-#: builtin/rev-parse.c:365
-msgid "stop parsing after the first non-option argument"
+#: builtin/pull.c:51 builtin/pull.c:53
+#, c-format
+msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: builtin/rev-parse.c:368
-msgid "output in stuck long form"
+#: builtin/pull.c:73
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
 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/pull.c:121
+msgid "Options related to merging"
 msgstr ""
 
-#: builtin/revert.c:22
-msgid "git revert [<options>] <commit-ish>..."
+#: builtin/pull.c:124
+msgid "incorporate changes by rebasing rather than merging"
 msgstr ""
 
-#: builtin/revert.c:23
-msgid "git revert <subcommand>"
+#: builtin/pull.c:148 builtin/revert.c:101
+msgid "allow fast-forward"
 msgstr ""
 
-#: builtin/revert.c:28
-msgid "git cherry-pick [<options>] <commit-ish>..."
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
 msgstr ""
 
-#: builtin/revert.c:29
-msgid "git cherry-pick <subcommand>"
+#: builtin/pull.c:173
+msgid "Options related to fetching"
 msgstr ""
 
-#: builtin/revert.c:71
+#: builtin/pull.c:195
+msgid "number of submodules pulled in parallel"
+msgstr ""
+
+#: builtin/pull.c:284
 #, c-format
-msgid "%s: %s cannot be used with %s"
+msgid "Invalid value for pull.ff: %s"
 msgstr ""
 
-#: builtin/revert.c:80
-msgid "end revert or cherry-pick sequence"
+#: builtin/pull.c:397
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
 msgstr ""
 
-#: builtin/revert.c:81
-msgid "resume revert or cherry-pick sequence"
+#: builtin/pull.c:399
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
 msgstr ""
 
-#: builtin/revert.c:82
-msgid "cancel revert or cherry-pick sequence"
+#: 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:83
-msgid "don't automatically commit"
+#: 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:84
-msgid "edit the commit message"
+#: builtin/pull.c:408 git-parse-remote.sh:73
+msgid "You are not currently on a branch."
 msgstr ""
 
-#: builtin/revert.c:87
-msgid "parent number"
+#: 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:89
-msgid "merge strategy"
+#: 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/revert.c:90
-msgid "option"
+#: builtin/pull.c:413 builtin/pull.c:428
+msgid "See git-pull(1) for details."
 msgstr ""
 
-#: builtin/revert.c:91
-msgid "option for merge strategy"
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
 msgstr ""
 
-#: builtin/revert.c:104
-msgid "append commit name"
+#: 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/revert.c:106
-msgid "preserve initially empty commits"
+#: builtin/pull.c:423 git-parse-remote.sh:75
+msgid "There is no tracking information for the current branch."
 msgstr ""
 
-#: builtin/revert.c:107
-msgid "allow commits with empty messages"
+#: 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/revert.c:108
-msgid "keep redundant, empty commits"
+#: 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 ""
 
-#: builtin/revert.c:112
-msgid "program error"
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
 msgstr ""
 
-#: builtin/revert.c:197
-msgid "revert failed"
+#: builtin/pull.c:801
+msgid "--[no-]autostash option is only valid with --rebase."
 msgstr ""
 
-#: builtin/revert.c:212
-msgid "cherry-pick failed"
+#: builtin/pull.c:809
+msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 
-#: builtin/rm.c:17
-msgid "git rm [<options>] [--] <file>..."
+#: builtin/pull.c:812
+msgid "pull with rebase"
 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:813
+msgid "please commit or stash them."
+msgstr ""
 
-#: builtin/rm.c:71
+#: builtin/pull.c:838
+#, c-format
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: builtin/push.c:89
+msgid "tag shorthand without <tag>"
+msgstr ""
+
+#: builtin/push.c:99
+msgid "--delete only accepts plain target ref names"
+msgstr ""
+
+#: builtin/push.c:143
 msgid ""
 "\n"
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+"To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 
-#: builtin/rm.c:230
+#: builtin/push.c:146
+#, c-format
 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] ""
+"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/rm.c:235
+#: 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 ""
+
+#: 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"
-"(use -f to force removal)"
+"    git push --set-upstream %s %s\n"
 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/push.c:183
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr ""
 
-#: builtin/rm.c:243 builtin/rm.c:254
+#: 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/push.c:242
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+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."
+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 ""
+
+#: 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."
+msgstr ""
+
+#: builtin/push.c:268
+msgid "Updates were rejected because the tag already exists in the remote."
+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"
+msgstr ""
+
+#: builtin/push.c:331
+#, c-format
+msgid "Pushing to %s\n"
+msgstr ""
+
+#: builtin/push.c:335
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr ""
+
+#: builtin/push.c:366
+#, c-format
+msgid "bad repository '%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"
-"(use --cached to keep the file, or -f to force removal)"
+"    git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+"    git push <name>\n"
 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/push.c:385
+msgid "--all and --tags are incompatible"
+msgstr ""
 
-#: builtin/rm.c:269
-msgid "do not list removed files"
+#: builtin/push.c:386
+msgid "--all can't be combined with refspecs"
+msgstr ""
+
+#: builtin/push.c:391
+msgid "--mirror and --tags are incompatible"
+msgstr ""
+
+#: builtin/push.c:392
+msgid "--mirror can't be combined with refspecs"
+msgstr ""
+
+#: builtin/push.c:397
+msgid "--all and --mirror are incompatible"
+msgstr ""
+
+#: builtin/push.c:515
+msgid "repository"
+msgstr ""
+
+#: builtin/push.c:516 builtin/send-pack.c:161
+msgid "push all refs"
+msgstr ""
+
+#: builtin/push.c:517 builtin/send-pack.c:163
+msgid "mirror all refs"
+msgstr ""
+
+#: builtin/push.c:519
+msgid "delete refs"
+msgstr ""
+
+#: builtin/push.c:520
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr ""
+
+#: builtin/push.c:523 builtin/send-pack.c:164
+msgid "force updates"
+msgstr ""
+
+#: builtin/push.c:525 builtin/send-pack.c:175
+msgid "refname>:<expect"
+msgstr ""
+
+#: builtin/push.c:526 builtin/send-pack.c:176
+msgid "require old value of ref to be at this value"
+msgstr ""
+
+#: builtin/push.c:529
+msgid "control recursive pushing of submodules"
+msgstr ""
+
+#: builtin/push.c:531 builtin/send-pack.c:169
+msgid "use thin pack"
+msgstr ""
+
+#: 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:534
+msgid "set upstream for git pull/status"
+msgstr ""
+
+#: builtin/push.c:537
+msgid "prune locally removed refs"
+msgstr ""
+
+#: builtin/push.c:539
+msgid "bypass pre-push hook"
+msgstr ""
+
+#: builtin/push.c:540
+msgid "push missing but relevant tags"
+msgstr ""
+
+#: builtin/push.c:543 builtin/send-pack.c:166
+msgid "GPG sign the push"
+msgstr ""
+
+#: builtin/push.c:545 builtin/send-pack.c:170
+msgid "request atomic transaction on remote side"
+msgstr ""
+
+#: 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 ""
+
+#: builtin/push.c:562
+msgid "--delete doesn't make sense without any refs"
+msgstr ""
+
+#: 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>) "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+
+#: builtin/read-tree.c:110
+msgid "write resulting index to <file>"
+msgstr ""
+
+#: builtin/read-tree.c:113
+msgid "only empty the index"
+msgstr ""
+
+#: builtin/read-tree.c:115
+msgid "Merging"
+msgstr ""
+
+#: builtin/read-tree.c:117
+msgid "perform a merge in addition to a read"
+msgstr ""
+
+#: builtin/read-tree.c:119
+msgid "3-way merge if no file level merging required"
+msgstr ""
+
+#: builtin/read-tree.c:121
+msgid "3-way merge in presence of adds and removes"
+msgstr ""
+
+#: builtin/read-tree.c:123
+msgid "same as -m, but discard unmerged entries"
+msgstr ""
+
+#: builtin/read-tree.c:124
+msgid "<subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:125
+msgid "read the tree into the index under <subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:128
+msgid "update working tree with merge result"
+msgstr ""
+
+#: builtin/read-tree.c:130
+msgid "gitignore"
+msgstr ""
+
+#: builtin/read-tree.c:131
+msgid "allow explicitly ignored files to be overwritten"
+msgstr ""
+
+#: builtin/read-tree.c:134
+msgid "don't check the working tree after merging"
+msgstr ""
+
+#: builtin/read-tree.c:135
+msgid "don't update the index or the work tree"
+msgstr ""
+
+#: builtin/read-tree.c:137
+msgid "skip applying sparse checkout filter"
+msgstr ""
+
+#: builtin/read-tree.c:139
+msgid "debug unpack-trees"
+msgstr ""
+
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: builtin/receive-pack.c:1883
+msgid "quiet"
+msgstr ""
+
+#: builtin/receive-pack.c:1897
+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"
+msgstr ""
+
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr ""
+
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr ""
+
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr ""
+
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr ""
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr ""
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr ""
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr ""
+
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr ""
+
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr ""
+
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr ""
+
+#: builtin/remote.c:94
+#, 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"
+msgstr ""
+
+#: builtin/remote.c:143
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: builtin/remote.c:194 builtin/remote.c:633
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr ""
+
+#: builtin/remote.c:234
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr ""
+
+#: builtin/remote.c:336
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr ""
+
+#: 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:854
+#, c-format
+msgid "No such remote: %s"
+msgstr ""
+
+#: builtin/remote.c:639
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+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."
+msgstr ""
+
+#: builtin/remote.c:695
+#, c-format
+msgid "deleting '%s' failed"
+msgstr ""
+
+#: builtin/remote.c:729
+#, c-format
+msgid "creating '%s' failed"
+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/remote.c:806
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr ""
+
+#: builtin/remote.c:907
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr ""
+
+#: builtin/remote.c:910
+msgid " tracked"
+msgstr ""
+
+#: builtin/remote.c:912
+msgid " stale (use 'git remote prune' to remove)"
+msgstr ""
+
+#: builtin/remote.c:914
+msgid " ???"
+msgstr ""
+
+#: builtin/remote.c:955
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr ""
+
+#: builtin/remote.c:963
+#, c-format
+msgid "rebases interactively onto remote %s"
+msgstr ""
+
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr ""
+
+#: builtin/remote.c:967
+#, c-format
+msgid " merges with remote %s"
+msgstr ""
+
+#: builtin/remote.c:970
+#, c-format
+msgid "merges with remote %s"
+msgstr ""
+
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr ""
+
+#: builtin/remote.c:1016
+msgid "create"
+msgstr ""
+
+#: builtin/remote.c:1019
+msgid "delete"
+msgstr ""
+
+#: builtin/remote.c:1023
+msgid "up to date"
+msgstr ""
+
+#: builtin/remote.c:1026
+msgid "fast-forwardable"
+msgstr ""
+
+#: builtin/remote.c:1029
+msgid "local out of date"
+msgstr ""
+
+#: builtin/remote.c:1036
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr ""
+
+#: builtin/remote.c:1039
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr ""
+
+#: builtin/remote.c:1043
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr ""
+
+#: builtin/remote.c:1046
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr ""
+
+#: builtin/remote.c:1114
+msgid "do not query remotes"
+msgstr ""
+
+#: builtin/remote.c:1141
+#, c-format
+msgid "* remote %s"
+msgstr ""
+
+#: builtin/remote.c:1142
+#, c-format
+msgid "  Fetch URL: %s"
+msgstr ""
+
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
+msgid "(no URL)"
+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"
+msgstr ""
+
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr ""
+
+#: 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 ""
+
+#: builtin/remote.c:1176
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/remote.c:1179 builtin/remote.c:1205
+msgid " (status not queried)"
+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'"
+msgstr ""
+
+#: 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] ""
+msgstr[1] ""
+
+#: builtin/remote.c:1223
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr ""
+
+#: builtin/remote.c:1225
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr ""
+
+#: builtin/remote.c:1240
+msgid "Cannot determine remote HEAD"
+msgstr ""
+
+#: builtin/remote.c:1242
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+msgstr ""
+
+#: builtin/remote.c:1252
+#, c-format
+msgid "Could not delete %s"
+msgstr ""
+
+#: builtin/remote.c:1260
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr ""
+
+#: builtin/remote.c:1262
+#, c-format
+msgid "Could not setup %s"
+msgstr ""
+
+#: builtin/remote.c:1280
+#, c-format
+msgid " %s will become dangling!"
+msgstr ""
+
+#: builtin/remote.c:1281
+#, c-format
+msgid " %s has become dangling!"
+msgstr ""
+
+#: builtin/remote.c:1291
+#, c-format
+msgid "Pruning %s"
+msgstr ""
+
+#: builtin/remote.c:1292
+#, c-format
+msgid "URL: %s"
+msgstr ""
+
+#: builtin/remote.c:1308
+#, c-format
+msgid " * [would prune] %s"
+msgstr ""
+
+#: builtin/remote.c:1311
+#, c-format
+msgid " * [pruned] %s"
+msgstr ""
+
+#: builtin/remote.c:1356
+msgid "prune remotes after fetching"
+msgstr ""
+
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
+#, c-format
+msgid "No such remote '%s'"
+msgstr ""
+
+#: builtin/remote.c:1435
+msgid "add branch"
+msgstr ""
+
+#: builtin/remote.c:1442
+msgid "no remote specified"
+msgstr ""
+
+#: builtin/remote.c:1459
+msgid "query push URLs rather than fetch URLs"
+msgstr ""
+
+#: builtin/remote.c:1461
+msgid "return all URLs"
+msgstr ""
+
+#: builtin/remote.c:1489
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr ""
+
+#: builtin/remote.c:1515
+msgid "manipulate push URLs"
+msgstr ""
+
+#: builtin/remote.c:1517
+msgid "add URL"
+msgstr ""
+
+#: builtin/remote.c:1519
+msgid "delete URLs"
+msgstr ""
+
+#: builtin/remote.c:1526
+msgid "--add --delete doesn't make sense"
+msgstr ""
+
+#: builtin/remote.c:1567
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr ""
+
+#: builtin/remote.c:1575
+#, c-format
+msgid "No such URL found: %s"
+msgstr ""
+
+#: builtin/remote.c:1577
+msgid "Will not delete all non-push URLs"
+msgstr ""
+
+#: 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 ""
+
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
+msgstr ""
+
+#: builtin/repack.c:160
+msgid "pack everything in a single pack"
+msgstr ""
+
+#: builtin/repack.c:162
+msgid "same as -a, and turn unreachable objects loose"
+msgstr ""
+
+#: builtin/repack.c:165
+msgid "remove redundant packs, and run git-prune-packed"
+msgstr ""
+
+#: builtin/repack.c:167
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr ""
+
+#: builtin/repack.c:169
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr ""
+
+#: builtin/repack.c:171
+msgid "do not run git-update-server-info"
+msgstr ""
+
+#: builtin/repack.c:174
+msgid "pass --local to git-pack-objects"
+msgstr ""
+
+#: builtin/repack.c:176
+msgid "write bitmap index"
+msgstr ""
+
+#: builtin/repack.c:177
+msgid "approxidate"
+msgstr ""
+
+#: builtin/repack.c:178
+msgid "with -A, do not loosen objects older than this"
+msgstr ""
+
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr ""
+
+#: builtin/repack.c:182
+msgid "size of the window used for delta compression"
+msgstr ""
+
+#: builtin/repack.c:183 builtin/repack.c:187
+msgid "bytes"
+msgstr ""
+
+#: builtin/repack.c:184
+msgid "same as the above, but limit memory size instead of entries count"
+msgstr ""
+
+#: builtin/repack.c:186
+msgid "limits the maximum delta depth"
+msgstr ""
+
+#: builtin/repack.c:188
+msgid "maximum size of each packfile"
+msgstr ""
+
+#: builtin/repack.c:190
+msgid "repack objects in packs marked with .keep"
+msgstr ""
+
+#: builtin/repack.c:200
+msgid "cannot delete packs in a precious-objects repo"
+msgstr ""
+
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr ""
+
+#: builtin/repack.c:391 builtin/worktree.c:115
+#, c-format
+msgid "failed to remove '%s'"
+msgstr ""
+
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr ""
+
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr ""
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr ""
+
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr ""
+
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr ""
+
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr ""
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr ""
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr ""
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr ""
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr ""
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr ""
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr ""
+
+#: builtin/replace.c:432
+msgid "list replace refs"
+msgstr ""
+
+#: builtin/replace.c:433
+msgid "delete replace refs"
+msgstr ""
+
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr ""
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr ""
+
+#: builtin/replace.c:436
+msgid "replace the ref if it exists"
+msgstr ""
+
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr ""
+
+#: builtin/replace.c:438
+msgid "use this format"
+msgstr ""
+
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+msgstr ""
+
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr ""
+
+#: 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:386
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr ""
+
+#: builtin/rev-parse.c:391
+msgid "keep the `--` passed as an arg"
+msgstr ""
+
+#: builtin/rev-parse.c:393
+msgid "stop parsing after the first non-option argument"
+msgstr ""
+
+#: builtin/rev-parse.c:396
+msgid "output in stuck long form"
+msgstr ""
+
+#: builtin/rev-parse.c:527
+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:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr ""
+
+#: builtin/revert.c:80
+msgid "end revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:81
+msgid "resume revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr ""
+
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr ""
+
+#: builtin/revert.c:87
+msgid "parent number"
+msgstr ""
+
+#: builtin/revert.c:89
+msgid "merge strategy"
+msgstr ""
+
+#: builtin/revert.c:90
+msgid "option"
+msgstr ""
+
+#: builtin/revert.c:91
+msgid "option for merge strategy"
+msgstr ""
+
+#: builtin/revert.c:100
+msgid "append commit name"
+msgstr ""
+
+#: builtin/revert.c:102
+msgid "preserve initially empty commits"
+msgstr ""
+
+#: builtin/revert.c:103
+msgid "allow commits with empty messages"
+msgstr ""
+
+#: builtin/revert.c:104
+msgid "keep redundant, empty commits"
+msgstr ""
+
+#: builtin/revert.c:192
+msgid "revert failed"
+msgstr ""
+
+#: builtin/revert.c:205
+msgid "cherry-pick failed"
+msgstr ""
+
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+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/rm.c:71
+msgid ""
+"\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+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/rm.c:235
+msgid ""
+"\n"
+"(use -f to force removal)"
+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
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+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"
+msgstr ""
+
+#: builtin/rm.c:270
+msgid "only remove from the index"
+msgstr ""
+
+#: builtin/rm.c:271
+msgid "override the up-to-date check"
+msgstr ""
+
+#: builtin/rm.c:272
+msgid "allow recursive removal"
+msgstr ""
+
+#: builtin/rm.c:274
+msgid "exit with a zero status even if nothing matched"
+msgstr ""
+
+#: builtin/rm.c:335
+#, c-format
+msgid "not removing '%s' recursively without -r"
+msgstr ""
+
+#: builtin/rm.c:374
+#, 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"
+msgstr ""
+
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr ""
+
+#: builtin/send-pack.c:173
+msgid "print status from remote helper"
+msgstr ""
+
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr ""
+
+#: builtin/shortlog.c:242
+msgid "sort output according to the number of commits per author"
+msgstr ""
+
+#: builtin/shortlog.c:244
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr ""
+
+#: builtin/shortlog.c:246
+msgid "Show the email address of each author"
+msgstr ""
+
+#: builtin/shortlog.c:247
+msgid "w[,i1[,i2]]"
+msgstr ""
+
+#: builtin/shortlog.c:248
+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:375
+#, 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:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr ""
+
+#: builtin/show-branch.c:639
+msgid "show remote-tracking and local branches"
+msgstr ""
+
+#: builtin/show-branch.c:641
+msgid "show remote-tracking branches"
+msgstr ""
+
+#: builtin/show-branch.c:643
+msgid "color '*!+-' corresponding to the branch"
+msgstr ""
+
+#: builtin/show-branch.c:645
+msgid "show <n> more commits after the common ancestor"
+msgstr ""
+
+#: builtin/show-branch.c:647
+msgid "synonym to more=-1"
+msgstr ""
+
+#: builtin/show-branch.c:648
+msgid "suppress naming strings"
+msgstr ""
+
+#: builtin/show-branch.c:650
+msgid "include the current branch"
+msgstr ""
+
+#: builtin/show-branch.c:652
+msgid "name commits with their object names"
+msgstr ""
+
+#: builtin/show-branch.c:654
+msgid "show possible merge bases"
+msgstr ""
+
+#: builtin/show-branch.c:656
+msgid "show refs unreachable from any other ref"
+msgstr ""
+
+#: builtin/show-branch.c:658
+msgid "show commits in topological order"
+msgstr ""
+
+#: builtin/show-branch.c:661
+msgid "show only commits not on the first branch"
+msgstr ""
+
+#: builtin/show-branch.c:663
+msgid "show merges reachable from only one tip"
+msgstr ""
+
+#: builtin/show-branch.c:665
+msgid "topologically sort, maintaining date order where possible"
+msgstr ""
+
+#: builtin/show-branch.c:668
+msgid "<n>[,<base>]"
+msgstr ""
+
+#: builtin/show-branch.c:669
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr ""
+
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr ""
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr ""
+
+#: 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] ""
+msgstr[1] ""
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr ""
+
+#: builtin/show-branch.c:829
+#, 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:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr ""
+
+#: builtin/show-branch.c:836
+#, 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:165
+msgid "only show tags (can be combined with heads)"
+msgstr ""
+
+#: builtin/show-ref.c:166
+msgid "only show heads (can be combined with tags)"
+msgstr ""
+
+#: builtin/show-ref.c:167
+msgid "stricter reference checking, requires exact ref path"
+msgstr ""
+
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr ""
+
+#: builtin/show-ref.c:174
+msgid "dereference tags into object IDs"
+msgstr ""
+
+#: builtin/show-ref.c:176
+msgid "only show SHA1 hash using <n> digits"
+msgstr ""
+
+#: builtin/show-ref.c:180
+msgid "do not print results to stdout (useful with --verify)"
+msgstr ""
+
+#: builtin/show-ref.c:182
+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:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
+#, 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:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
+msgid "alternative anchor for relative paths"
+msgstr ""
+
+#: builtin/submodule--helper.c:287
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, c-format
+msgid "No url found for submodule path '%s' in .gitmodules"
+msgstr ""
+
+#: builtin/submodule--helper.c:369
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:373
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr ""
+
+#: builtin/submodule--helper.c:383
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr ""
+
+#: builtin/submodule--helper.c:390
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr ""
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr ""
+
+#: builtin/submodule--helper.c:435
+msgid "git submodule--helper name <path>"
+msgstr ""
+
+#: builtin/submodule--helper.c:441
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr ""
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr ""
+
+#: builtin/submodule--helper.c:593
+msgid "where the new submodule will be cloned to"
+msgstr ""
+
+#: builtin/submodule--helper.c:596
+msgid "name of the new submodule"
+msgstr ""
+
+#: builtin/submodule--helper.c:599
+msgid "url where to clone the submodule from"
+msgstr ""
+
+#: builtin/submodule--helper.c:605
+msgid "depth for shallow clones"
+msgstr ""
+
+#: 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 ""
+
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
+#, c-format
+msgid "could not create directory '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:644
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr ""
+
+#: builtin/submodule--helper.c:660
+#, c-format
+msgid "cannot open file '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:665
+#, c-format
+msgid "could not close file %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:672
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr ""
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr ""
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr ""
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr ""
+
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr ""
+
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr ""
+
+#: builtin/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr ""
+
+#: builtin/submodule--helper.c:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr ""
+
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr ""
+
+#: builtin/submodule--helper.c:956
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr ""
+
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr ""
+
+#: 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:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr ""
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr ""
+
+#: 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 ""
+
+#: builtin/submodule--helper.c:1100
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+
+#: builtin/submodule--helper.c:1107
+#, 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>] [--points-at <object>]\n"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+msgstr ""
+
+#: builtin/tag.c:27
+msgid "git tag -v <tagname>..."
+msgstr ""
+
+#: builtin/tag.c:81
+#, c-format
+msgid "tag name too long: %.*s..."
+msgstr ""
+
+#: builtin/tag.c:86
+#, c-format
+msgid "tag '%s' not found."
+msgstr ""
+
+#: builtin/tag.c:101
+#, c-format
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr ""
+
+#: builtin/tag.c:117
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+
+#: builtin/tag.c:121
+#, 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: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 ""
 
-#: builtin/rm.c:270
-msgid "only remove from the index"
+#: builtin/tag.c:275
+msgid "no tag message?"
 msgstr ""
 
-#: builtin/rm.c:271
-msgid "override the up-to-date check"
+#: builtin/tag.c:281
+#, c-format
+msgid "The tag message has been left in %s\n"
 msgstr ""
 
-#: builtin/rm.c:272
-msgid "allow recursive removal"
+#: builtin/tag.c:339
+msgid "list tag names"
 msgstr ""
 
-#: builtin/rm.c:274
-msgid "exit with a zero status even if nothing matched"
+#: builtin/tag.c:341
+msgid "print <n> lines of each tag message"
 msgstr ""
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+#: builtin/tag.c:343
+msgid "delete tags"
 msgstr ""
 
-#: builtin/rm.c:335
-#, c-format
-msgid "not removing '%s' recursively without -r"
+#: builtin/tag.c:344
+msgid "verify tags"
 msgstr ""
 
-#: builtin/rm.c:374
-#, c-format
-msgid "git rm: unable to remove %s"
+#: builtin/tag.c:346
+msgid "Tag creation options"
 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."
+#: builtin/tag.c:348
+msgid "annotated tag, needs a message"
 msgstr ""
 
-#: builtin/send-pack.c:160
-msgid "remote name"
+#: builtin/tag.c:350
+msgid "tag message"
 msgstr ""
 
-#: builtin/send-pack.c:171
-msgid "use stateless RPC protocol"
+#: builtin/tag.c:352
+msgid "annotated and GPG-signed tag"
 msgstr ""
 
-#: builtin/send-pack.c:172
-msgid "read refs from stdin"
+#: builtin/tag.c:356
+msgid "use another key to sign the tag"
 msgstr ""
 
-#: builtin/send-pack.c:173
-msgid "print status from remote helper"
+#: builtin/tag.c:357
+msgid "replace the tag if exists"
 msgstr ""
 
-#: builtin/shortlog.c:13
-msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
 msgstr ""
 
-#: builtin/shortlog.c:242
-msgid "sort output according to the number of commits per author"
+#: builtin/tag.c:360
+msgid "Tag listing options"
 msgstr ""
 
-#: builtin/shortlog.c:244
-msgid "Suppress commit descriptions, only provides commit count"
+#: builtin/tag.c:361
+msgid "show tag list in columns"
 msgstr ""
 
-#: builtin/shortlog.c:246
-msgid "Show the email address of each author"
+#: builtin/tag.c:362 builtin/tag.c:363
+msgid "print only tags that contain the commit"
 msgstr ""
 
-#: builtin/shortlog.c:247
-msgid "w[,i1[,i2]]"
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
 msgstr ""
 
-#: builtin/shortlog.c:248
-msgid "Linewrap output"
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
 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>)...]"
+#: builtin/tag.c:370
+msgid "print only tags of the object"
 msgstr ""
 
-#: builtin/show-branch.c:14
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+#: builtin/tag.c:399
+msgid "--column and -n are incompatible"
 msgstr ""
 
-#: builtin/show-branch.c:640
-msgid "show remote-tracking and local branches"
+#: builtin/tag.c:419
+msgid "-n option is only allowed with -l."
 msgstr ""
 
-#: builtin/show-branch.c:642
-msgid "show remote-tracking branches"
+#: builtin/tag.c:421
+msgid "--contains option is only allowed with -l."
 msgstr ""
 
-#: builtin/show-branch.c:644
-msgid "color '*!+-' corresponding to the branch"
+#: builtin/tag.c:423
+msgid "--points-at option is only allowed with -l."
 msgstr ""
 
-#: builtin/show-branch.c:646
-msgid "show <n> more commits after the common ancestor"
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
 msgstr ""
 
-#: builtin/show-branch.c:648
-msgid "synonym to more=-1"
+#: builtin/tag.c:433
+msgid "only one -F or -m option is allowed."
 msgstr ""
 
-#: builtin/show-branch.c:649
-msgid "suppress naming strings"
+#: builtin/tag.c:452
+msgid "too many params"
 msgstr ""
 
-#: builtin/show-branch.c:651
-msgid "include the current branch"
+#: builtin/tag.c:458
+#, c-format
+msgid "'%s' is not a valid tag name."
 msgstr ""
 
-#: builtin/show-branch.c:653
-msgid "name commits with their object names"
+#: builtin/tag.c:463
+#, c-format
+msgid "tag '%s' already exists"
 msgstr ""
 
-#: builtin/show-branch.c:655
-msgid "show possible merge bases"
+#: builtin/tag.c:491
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
 
-#: builtin/show-branch.c:657
-msgid "show refs unreachable from any other ref"
+#: builtin/unpack-objects.c:493
+msgid "Unpacking objects"
 msgstr ""
 
-#: builtin/show-branch.c:659
-msgid "show commits in topological order"
+#: builtin/update-index.c:79
+#, c-format
+msgid "failed to create directory %s"
 msgstr ""
 
-#: builtin/show-branch.c:662
-msgid "show only commits not on the first branch"
+#: builtin/update-index.c:85
+#, c-format
+msgid "failed to stat %s"
 msgstr ""
 
-#: builtin/show-branch.c:664
-msgid "show merges reachable from only one tip"
+#: builtin/update-index.c:95
+#, c-format
+msgid "failed to create file %s"
 msgstr ""
 
-#: builtin/show-branch.c:666
-msgid "topologically sort, maintaining date order where possible"
+#: builtin/update-index.c:103
+#, c-format
+msgid "failed to delete file %s"
 msgstr ""
 
-#: builtin/show-branch.c:669
-msgid "<n>[,<base>]"
+#: builtin/update-index.c:110 builtin/update-index.c:212
+#, c-format
+msgid "failed to delete directory %s"
 msgstr ""
 
-#: builtin/show-branch.c:670
-msgid "show <n> most recent ref-log entries starting at base"
+#: builtin/update-index.c:133
+#, c-format
+msgid "Testing mtime in '%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>...]"
+#: builtin/update-index.c:145
+msgid "directory stat info does not change after adding a new file"
 msgstr ""
 
-#: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>]"
+#: builtin/update-index.c:158
+msgid "directory stat info does not change after adding a new directory"
 msgstr ""
 
-#: builtin/show-ref.c:165
-msgid "only show tags (can be combined with heads)"
+#: builtin/update-index.c:171
+msgid "directory stat info changes after updating a file"
 msgstr ""
 
-#: builtin/show-ref.c:166
-msgid "only show heads (can be combined with tags)"
+#: builtin/update-index.c:182
+msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
 
-#: builtin/show-ref.c:167
-msgid "stricter reference checking, requires exact ref path"
+#: builtin/update-index.c:193
+msgid "directory stat info does not change after deleting a file"
 msgstr ""
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
-msgid "show the HEAD reference, even if it would be filtered out"
+#: builtin/update-index.c:206
+msgid "directory stat info does not change after deleting a directory"
 msgstr ""
 
-#: builtin/show-ref.c:174
-msgid "dereference tags into object IDs"
+#: builtin/update-index.c:213
+msgid " OK"
 msgstr ""
 
-#: builtin/show-ref.c:176
-msgid "only show SHA1 hash using <n> digits"
+#: builtin/update-index.c:564
+msgid "git update-index [<options>] [--] [<file>...]"
 msgstr ""
 
-#: builtin/show-ref.c:180
-msgid "do not print results to stdout (useful with --verify)"
+#: builtin/update-index.c:919
+msgid "continue refresh even when index needs update"
 msgstr ""
 
-#: builtin/show-ref.c:182
-msgid "show refs from stdin that aren't in local repository"
+#: builtin/update-index.c:922
+msgid "refresh: ignore submodules"
 msgstr ""
 
-#: builtin/stripspace.c:17
-msgid "git stripspace [-s | --strip-comments]"
+#: builtin/update-index.c:925
+msgid "do not ignore new files"
 msgstr ""
 
-#: builtin/stripspace.c:18
-msgid "git stripspace [-c | --comment-lines]"
+#: builtin/update-index.c:927
+msgid "let files replace directories and vice-versa"
 msgstr ""
 
-#: builtin/stripspace.c:35
-msgid "skip and remove all lines starting with comment character"
+#: builtin/update-index.c:929
+msgid "notice files missing from worktree"
 msgstr ""
 
-#: builtin/stripspace.c:38
-msgid "prepend comment character and space to each line"
+#: builtin/update-index.c:931
+msgid "refresh even if index contains unmerged entries"
 msgstr ""
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
-msgid "alternative anchor for relative paths"
+#: builtin/update-index.c:934
+msgid "refresh stat information"
 msgstr ""
 
-#: builtin/submodule--helper.c:78
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+#: builtin/update-index.c:938
+msgid "like --refresh, but ignore assume-unchanged setting"
 msgstr ""
 
-#: builtin/submodule--helper.c:108
-msgid "git submodule--helper name <path>"
+#: builtin/update-index.c:942
+msgid "<mode>,<object>,<path>"
 msgstr ""
 
-#: builtin/submodule--helper.c:114
-#, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
+#: builtin/update-index.c:943
+msgid "add the specified entry to the index"
 msgstr ""
 
-#: builtin/submodule--helper.c:164
-msgid "where the new submodule will be cloned to"
+#: builtin/update-index.c:952
+msgid "mark files as \"not changing\""
 msgstr ""
 
-#: builtin/submodule--helper.c:167
-msgid "name of the new submodule"
+#: builtin/update-index.c:955
+msgid "clear assumed-unchanged bit"
 msgstr ""
 
-#: builtin/submodule--helper.c:170
-msgid "url where to clone the submodule from"
+#: builtin/update-index.c:958
+msgid "mark files as \"index-only\""
 msgstr ""
 
-#: builtin/submodule--helper.c:176
-msgid "depth for shallow clones"
+#: builtin/update-index.c:961
+msgid "clear skip-worktree bit"
 msgstr ""
 
-#: builtin/submodule--helper.c:182
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+#: builtin/update-index.c:964
+msgid "add to index only; do not add content to object database"
 msgstr ""
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
-#, c-format
-msgid "could not create directory '%s'"
+#: builtin/update-index.c:966
+msgid "remove named paths even if present in worktree"
 msgstr ""
 
-#: builtin/submodule--helper.c:198
-#, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
+#: builtin/update-index.c:968
+msgid "with --stdin: input lines are terminated by null bytes"
 msgstr ""
 
-#: builtin/submodule--helper.c:221
-#, c-format
-msgid "cannot open file '%s'"
+#: builtin/update-index.c:970
+msgid "read list of paths to be updated from standard input"
 msgstr ""
 
-#: builtin/submodule--helper.c:226
-#, c-format
-msgid "could not close file %s"
+#: builtin/update-index.c:974
+msgid "add entries from standard input to the index"
 msgstr ""
 
-#: builtin/submodule--helper.c:241
-#, c-format
-msgid "could not get submodule directory for '%s'"
+#: builtin/update-index.c:978
+msgid "repopulate stages #2 and #3 for the listed paths"
 msgstr ""
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+#: builtin/update-index.c:982
+msgid "only update entries that differ from HEAD"
 msgstr ""
 
-#: builtin/submodule--helper.c:274
-#, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+#: builtin/update-index.c:986
+msgid "ignore files missing from worktree"
 msgstr ""
 
-#: builtin/symbolic-ref.c:7
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
+#: builtin/update-index.c:989
+msgid "report actions to standard output"
 msgstr ""
 
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref -d [-q] <name>"
+#: builtin/update-index.c:991
+msgid "(for porcelains) forget saved unresolved conflicts"
 msgstr ""
 
-#: builtin/symbolic-ref.c:40
-msgid "suppress error message for non-symbolic (detached) refs"
+#: builtin/update-index.c:995
+msgid "write index in this format"
 msgstr ""
 
-#: builtin/symbolic-ref.c:41
-msgid "delete symbolic ref"
+#: builtin/update-index.c:997
+msgid "enable or disable split index"
 msgstr ""
 
-#: builtin/symbolic-ref.c:42
-msgid "shorten ref output"
+#: builtin/update-index.c:999
+msgid "enable/disable untracked cache"
 msgstr ""
-
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason"
+
+#: builtin/update-index.c:1001
+msgid "test if the filesystem supports untracked cache"
 msgstr ""
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason of the update"
+#: builtin/update-index.c:1003
+msgid "enable untracked cache without testing the filesystem"
 msgstr ""
 
-#: builtin/tag.c:23
+#: builtin/update-index.c:1119
 msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
-"[<head>]"
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
 msgstr ""
 
-#: builtin/tag.c:24
-msgid "git tag -d <tagname>..."
+#: builtin/update-index.c:1123
+msgid "Untracked cache disabled"
 msgstr ""
 
-#: builtin/tag.c:25
+#: builtin/update-index.c:1131
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
 msgstr ""
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
+#: builtin/update-index.c:1135
+#, c-format
+msgid "Untracked cache enabled for '%s'"
 msgstr ""
 
-#: builtin/tag.c:80
-#, c-format
-msgid "tag name too long: %.*s..."
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
 msgstr ""
 
-#: builtin/tag.c:85
-#, c-format
-msgid "tag '%s' not found."
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
 msgstr ""
 
-#: builtin/tag.c:100
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
 msgstr ""
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
+#: builtin/update-ref.c:363
+msgid "delete the reference"
 msgstr ""
 
-#: builtin/tag.c:122
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
 msgstr ""
 
-#: builtin/tag.c:126
-#, 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"
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
 msgstr ""
 
-#: builtin/tag.c:199
-msgid "unable to sign the tag"
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
 msgstr ""
 
-#: builtin/tag.c:201
-msgid "unable to write tag file"
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
 msgstr ""
 
-#: builtin/tag.c:226
-msgid "bad object type."
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
 msgstr ""
 
-#: builtin/tag.c:239
-msgid "tag header too big."
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
 msgstr ""
 
-#: builtin/tag.c:275
-msgid "no tag message?"
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
 msgstr ""
 
-#: builtin/tag.c:281
-#, c-format
-msgid "The tag message has been left in %s\n"
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+msgid "print raw gpg status output"
 msgstr ""
 
-#: builtin/tag.c:339
-msgid "list tag names"
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
 msgstr ""
 
-#: builtin/tag.c:341
-msgid "print <n> lines of each tag message"
+#: builtin/verify-pack.c:64
+msgid "verbose"
 msgstr ""
 
-#: builtin/tag.c:343
-msgid "delete tags"
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
 msgstr ""
 
-#: builtin/tag.c:344
-msgid "verify tags"
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr ""
 
-#: builtin/tag.c:346
-msgid "Tag creation options"
+#: builtin/verify-tag.c:34
+msgid "print tag contents"
 msgstr ""
 
-#: builtin/tag.c:348
-msgid "annotated tag, needs a message"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr ""
 
-#: builtin/tag.c:350
-msgid "tag message"
+#: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
 msgstr ""
 
-#: builtin/tag.c:352
-msgid "annotated and GPG-signed tag"
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
 msgstr ""
 
-#: builtin/tag.c:356
-msgid "use another key to sign the tag"
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
 msgstr ""
 
-#: builtin/tag.c:357
-msgid "replace the tag if exists"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
 msgstr ""
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
-msgid "create a reflog"
+#: builtin/worktree.c:42
+#, c-format
+msgid "Removing worktrees/%s: not a valid directory"
 msgstr ""
 
-#: builtin/tag.c:360
-msgid "Tag listing options"
+#: builtin/worktree.c:48
+#, c-format
+msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr ""
 
-#: builtin/tag.c:361
-msgid "show tag list in columns"
+#: builtin/worktree.c:53
+#, c-format
+msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr ""
 
-#: builtin/tag.c:362 builtin/tag.c:363
-msgid "print only tags that contain the commit"
+#: builtin/worktree.c:64
+#, c-format
+msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr ""
 
-#: builtin/tag.c:364
-msgid "print only tags that are merged"
+#: builtin/worktree.c:80
+#, c-format
+msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 
-#: builtin/tag.c:365
-msgid "print only tags that are not merged"
+#: builtin/worktree.c:204
+#, c-format
+msgid "'%s' already exists"
 msgstr ""
 
-#: builtin/tag.c:370
-msgid "print only tags of the object"
+#: builtin/worktree.c:236
+#, c-format
+msgid "could not create directory of '%s'"
 msgstr ""
 
-#: builtin/tag.c:399
-msgid "--column and -n are incompatible"
+#: builtin/worktree.c:272
+#, c-format
+msgid "Preparing %s (identifier %s)"
 msgstr ""
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
+#: builtin/worktree.c:323
+msgid "checkout <branch> even if already checked out in other worktree"
 msgstr ""
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
+#: builtin/worktree.c:325
+msgid "create a new branch"
 msgstr ""
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
+#: builtin/worktree.c:327
+msgid "create or reset a branch"
 msgstr ""
 
-#: builtin/tag.c:425
-msgid "--merged and --no-merged option are only allowed with -l"
+#: builtin/worktree.c:329
+msgid "populate the new working tree"
 msgstr ""
 
-#: builtin/tag.c:433
-msgid "only one -F or -m option is allowed."
+#: builtin/worktree.c:337
+msgid "-b, -B, and --detach are mutually exclusive"
 msgstr ""
 
-#: builtin/tag.c:453
-msgid "too many params"
+#: builtin/worktree.c:470
+msgid "reason for locking"
 msgstr ""
 
-#: builtin/tag.c:459
+#: builtin/worktree.c:482 builtin/worktree.c:515
 #, c-format
-msgid "'%s' is not a valid tag name."
+msgid "'%s' is not a working tree"
 msgstr ""
 
-#: builtin/tag.c:464
-#, c-format
-msgid "tag '%s' already exists"
+#: builtin/worktree.c:484 builtin/worktree.c:517
+msgid "The main working tree cannot be locked or unlocked"
 msgstr ""
 
-#: builtin/tag.c:489
+#: builtin/worktree.c:489
 #, c-format
-msgid "Updated tag '%s' (was %s)\n"
+msgid "'%s' is already locked, reason: %s"
 msgstr ""
 
-#: builtin/unpack-objects.c:490
-msgid "Unpacking objects"
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
 msgstr ""
 
-#: builtin/update-index.c:79
+#: builtin/worktree.c:519
 #, c-format
-msgid "failed to create directory %s"
+msgid "'%s' is not locked"
 msgstr ""
 
-#: builtin/update-index.c:85
-#, c-format
-msgid "failed to stat %s"
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr ""
 
-#: builtin/update-index.c:95
-#, c-format
-msgid "failed to create file %s"
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
 msgstr ""
 
-#: builtin/update-index.c:103
-#, c-format
-msgid "failed to delete file %s"
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
 msgstr ""
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
-#, c-format
-msgid "failed to delete directory %s"
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
 msgstr ""
 
-#: builtin/update-index.c:133
-#, c-format
-msgid "Testing mtime in '%s' "
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
 msgstr ""
 
-#: builtin/update-index.c:145
-msgid "directory stat info does not change after adding a new file"
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
 msgstr ""
 
-#: builtin/update-index.c:158
-msgid "directory stat info does not change after adding a new directory"
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
 msgstr ""
 
-#: builtin/update-index.c:171
-msgid "directory stat info changes after updating a file"
+#: upload-pack.c:1032
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
 msgstr ""
 
-#: builtin/update-index.c:182
-msgid "directory stat info changes after adding a file inside subdirectory"
+#: upload-pack.c:1034
+msgid "interrupt transfer after <n> seconds of inactivity"
 msgstr ""
 
-#: builtin/update-index.c:193
-msgid "directory stat info does not change after deleting a file"
+#: 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 ""
 
-#: builtin/update-index.c:206
-msgid "directory stat info does not change after deleting a directory"
+#: credential-cache--daemon.c:271
+msgid "print debugging messages to stderr"
 msgstr ""
 
-#: builtin/update-index.c:213
-msgid " OK"
+#: 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 ""
 
-#: builtin/update-index.c:575
-msgid "git update-index [<options>] [--] [<file>...]"
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
 msgstr ""
 
-#: builtin/update-index.c:930
-msgid "continue refresh even when index needs update"
+#: http.c:351
+msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr ""
 
-#: builtin/update-index.c:933
-msgid "refresh: ignore submodules"
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
 msgstr ""
 
-#: builtin/update-index.c:936
-msgid "do not ignore new files"
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
 msgstr ""
 
-#: builtin/update-index.c:938
-msgid "let files replace directories and vice-versa"
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
 msgstr ""
 
-#: builtin/update-index.c:940
-msgid "notice files missing from worktree"
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
 msgstr ""
 
-#: builtin/update-index.c:942
-msgid "refresh even if index contains unmerged entries"
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
 msgstr ""
 
-#: builtin/update-index.c:945
-msgid "refresh stat information"
+#: common-cmds.h:17
+msgid "Add file contents to the index"
 msgstr ""
 
-#: builtin/update-index.c:949
-msgid "like --refresh, but ignore assume-unchanged setting"
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
 msgstr ""
 
-#: builtin/update-index.c:953
-msgid "<mode>,<object>,<path>"
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
 msgstr ""
 
-#: builtin/update-index.c:954
-msgid "add the specified entry to the index"
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
 msgstr ""
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
 msgstr ""
 
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
+#: common-cmds.h:22
+msgid "Record changes to the repository"
 msgstr ""
 
-#: builtin/update-index.c:963
-msgid "mark files as \"not changing\""
+#: 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 ""
 
-#: builtin/update-index.c:966
-msgid "clear assumed-unchanged bit"
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
 msgstr ""
 
-#: builtin/update-index.c:969
-msgid "mark files as \"index-only\""
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
 msgstr ""
 
-#: builtin/update-index.c:972
-msgid "clear skip-worktree bit"
+#: common-cmds.h:27
+msgid "Show commit logs"
 msgstr ""
 
-#: builtin/update-index.c:975
-msgid "add to index only; do not add content to object database"
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
 msgstr ""
 
-#: builtin/update-index.c:977
-msgid "remove named paths even if present in worktree"
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
 msgstr ""
 
-#: builtin/update-index.c:979
-msgid "with --stdin: input lines are terminated by null bytes"
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
 msgstr ""
 
-#: builtin/update-index.c:981
-msgid "read list of paths to be updated from standard input"
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
 msgstr ""
 
-#: builtin/update-index.c:985
-msgid "add entries from standard input to the index"
+#: common-cmds.h:32
+msgid "Reapply commits on top of another base tip"
 msgstr ""
 
-#: builtin/update-index.c:989
-msgid "repopulate stages #2 and #3 for the listed paths"
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
 msgstr ""
 
-#: builtin/update-index.c:993
-msgid "only update entries that differ from HEAD"
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
 msgstr ""
 
-#: builtin/update-index.c:997
-msgid "ignore files missing from worktree"
+#: common-cmds.h:35
+msgid "Show various types of objects"
 msgstr ""
 
-#: builtin/update-index.c:1000
-msgid "report actions to standard output"
+#: common-cmds.h:36
+msgid "Show the working tree status"
 msgstr ""
 
-#: builtin/update-index.c:1002
-msgid "(for porcelains) forget saved unresolved conflicts"
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
 msgstr ""
 
-#: builtin/update-index.c:1006
-msgid "write index in this format"
+#: parse-options.h:145
+msgid "expiry-date"
 msgstr ""
 
-#: builtin/update-index.c:1008
-msgid "enable or disable split index"
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
 msgstr ""
 
-#: builtin/update-index.c:1010
-msgid "enable/disable untracked cache"
+#: parse-options.h:238
+msgid "be more verbose"
 msgstr ""
 
-#: builtin/update-index.c:1012
-msgid "test if the filesystem supports untracked cache"
+#: parse-options.h:240
+msgid "be more quiet"
 msgstr ""
 
-#: builtin/update-index.c:1014
-msgid "enable untracked cache without testing the filesystem"
+#: parse-options.h:246
+msgid "use <n> digits to display SHA-1s"
 msgstr ""
 
-#: builtin/update-index.c:1134
-msgid "Untracked cache disabled"
+#: rerere.h:40
+msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 
-#: builtin/update-index.c:1146
-#, c-format
-msgid "Untracked cache enabled for '%s'"
+#: git-bisect.sh:54
+msgid "You need to start by \"git bisect start\""
 msgstr ""
 
-#: builtin/update-ref.c:9
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+#. 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 ""
 
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+#: git-bisect.sh:121
+#, sh-format
+msgid "unrecognised option: '$arg'"
 msgstr ""
 
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>] --stdin [-z]"
+#: git-bisect.sh:125
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
 msgstr ""
 
-#: builtin/update-ref.c:363
-msgid "delete the reference"
+#: git-bisect.sh:154
+msgid "Bad HEAD - I need a HEAD"
 msgstr ""
 
-#: builtin/update-ref.c:365
-msgid "update <refname> not the one it points to"
+#: git-bisect.sh:167
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr ""
 
-#: builtin/update-ref.c:366
-msgid "stdin has NUL-terminated arguments"
+#: git-bisect.sh:177
+msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 
-#: builtin/update-ref.c:367
-msgid "read updates from stdin"
+#: git-bisect.sh:181
+msgid "Bad HEAD - strange symbolic ref"
 msgstr ""
 
-#: builtin/update-server-info.c:6
-msgid "git update-server-info [--force]"
+#: git-bisect.sh:233
+#, sh-format
+msgid "Bad bisect_write argument: $state"
 msgstr ""
 
-#: builtin/update-server-info.c:14
-msgid "update the info files from scratch"
+#: git-bisect.sh:262
+#, sh-format
+msgid "Bad rev input: $arg"
 msgstr ""
 
-#: builtin/verify-commit.c:17
-msgid "git verify-commit [-v | --verbose] <commit>..."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
 msgstr ""
 
-#: builtin/verify-commit.c:72
-msgid "print commit contents"
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
 msgstr ""
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
-msgid "print raw gpg status output"
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr ""
 
-#: builtin/verify-pack.c:54
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
 msgstr ""
 
-#: builtin/verify-pack.c:64
-msgid "verbose"
+#. 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 ""
 
-#: builtin/verify-pack.c:66
-msgid "show statistics only"
+#: 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 ""
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
+#: 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 ""
 
-#: builtin/verify-tag.c:83
-msgid "print tag contents"
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
 msgstr ""
 
-#: builtin/worktree.c:15
-msgid "git worktree add [<options>] <path> [<branch>]"
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
 msgstr ""
 
-#: builtin/worktree.c:16
-msgid "git worktree prune [<options>]"
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
 msgstr ""
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
+#: git-bisect.sh:458
+msgid "No logfile given"
 msgstr ""
 
-#: builtin/worktree.c:39
-#, c-format
-msgid "Removing worktrees/%s: not a valid directory"
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
 msgstr ""
 
-#: builtin/worktree.c:45
-#, c-format
-msgid "Removing worktrees/%s: gitdir file does not exist"
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
 msgstr ""
 
-#: builtin/worktree.c:50
-#, c-format
-msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
 msgstr ""
 
-#: builtin/worktree.c:61
-#, c-format
-msgid "Removing worktrees/%s: invalid gitdir file"
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
 
-#: builtin/worktree.c:77
-#, c-format
-msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
 msgstr ""
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
 msgstr ""
 
-#: builtin/worktree.c:201
-#, c-format
-msgid "'%s' already exists"
+#: git-bisect.sh:538
+msgid "bisect run success"
 msgstr ""
 
-#: builtin/worktree.c:233
-#, c-format
-msgid "could not create directory of '%s'"
+#: git-bisect.sh:565
+msgid "please use two different terms"
 msgstr ""
 
-#: builtin/worktree.c:269
-#, c-format
-msgid "Preparing %s (identifier %s)"
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
 msgstr ""
 
-#: builtin/worktree.c:317
-msgid "checkout <branch> even if already checked out in other worktree"
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
 msgstr ""
 
-#: builtin/worktree.c:319
-msgid "create a new branch"
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
 msgstr ""
 
-#: builtin/worktree.c:321
-msgid "create or reset a branch"
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
+#: git-bisect.sh:636
+msgid "no terms defined"
 msgstr ""
 
-#: builtin/worktree.c:329
-msgid "-b, -B, and --detach are mutually exclusive"
+#: 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 ""
 
-#: builtin/write-tree.c:13
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
 msgstr ""
 
-#: builtin/write-tree.c:26
-msgid "<prefix>/"
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
 msgstr ""
 
-#: builtin/write-tree.c:27
-msgid "write tree object for a subdirectory <prefix>"
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
 msgstr ""
 
-#: builtin/write-tree.c:30
-msgid "only useful for debugging"
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
 msgstr ""
 
-#: credential-cache--daemon.c:262
-msgid "print debugging messages to stderr"
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
 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."
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
 msgstr ""
 
-#: http.c:321
-msgid "Public key pinning not supported with cURL < 7.44.0"
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
 msgstr ""
 
-#: common-cmds.h:9
-msgid "start a working area (see also: git help tutorial)"
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
 msgstr ""
 
-#: common-cmds.h:10
-msgid "work on the current change (see also: git help everyday)"
+#: 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 ""
 
-#: common-cmds.h:11
-msgid "examine the history and state (see also: git help revisions)"
+#: git-rebase.sh:156 git-rebase.sh:395
+#, sh-format
+msgid "Could not move back to $head_name"
 msgstr ""
-
-#: common-cmds.h:12
-msgid "grow, mark and tweak your common history"
+
+#: git-rebase.sh:167
+msgid "Applied autostash."
 msgstr ""
 
-#: common-cmds.h:13
-msgid "collaborate (see also: git help workflows)"
+#: git-rebase.sh:170
+#, sh-format
+msgid "Cannot store $stash_sha1"
 msgstr ""
 
-#: common-cmds.h:17
-msgid "Add file contents to the index"
+#: 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 ""
 
-#: common-cmds.h:18
-msgid "Use binary search to find the commit that introduced a bug"
+#: git-rebase.sh:210
+msgid "The pre-rebase hook refused to rebase."
 msgstr ""
 
-#: common-cmds.h:19
-msgid "List, create, or delete branches"
+#: git-rebase.sh:215
+msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr ""
 
-#: common-cmds.h:20
-msgid "Switch branches or restore working tree files"
+#: git-rebase.sh:356
+msgid "No rebase in progress?"
 msgstr ""
 
-#: common-cmds.h:21
-msgid "Clone a repository into a new directory"
+#: git-rebase.sh:367
+msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr ""
 
-#: common-cmds.h:22
-msgid "Record changes to the repository"
+#: git-rebase.sh:374
+msgid "Cannot read HEAD"
 msgstr ""
 
-#: common-cmds.h:23
-msgid "Show changes between commits, commit and working tree, etc"
+#: git-rebase.sh:377
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
 msgstr ""
 
-#: common-cmds.h:24
-msgid "Download objects and refs from another repository"
+#: git-rebase.sh:414
+#, 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 ""
 
-#: common-cmds.h:25
-msgid "Print lines matching a pattern"
+#: git-rebase.sh:465
+#, sh-format
+msgid "invalid upstream $upstream_name"
 msgstr ""
 
-#: common-cmds.h:26
-msgid "Create an empty Git repository or reinitialize an existing one"
+#: git-rebase.sh:489
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
 msgstr ""
 
-#: common-cmds.h:27
-msgid "Show commit logs"
+#: git-rebase.sh:492 git-rebase.sh:496
+#, sh-format
+msgid "$onto_name: there is no merge base"
 msgstr ""
 
-#: common-cmds.h:28
-msgid "Join two or more development histories together"
+#: git-rebase.sh:501
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
 msgstr ""
 
-#: common-cmds.h:29
-msgid "Move or rename a file, a directory, or a symlink"
+#: git-rebase.sh:524
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
 msgstr ""
 
-#: common-cmds.h:30
-msgid "Fetch from and integrate with another repository or a local branch"
+#: git-rebase.sh:557
+msgid "Cannot autostash"
 msgstr ""
 
-#: common-cmds.h:31
-msgid "Update remote refs along with associated objects"
+#: git-rebase.sh:562
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
 msgstr ""
 
-#: common-cmds.h:32
-msgid "Reapply commits on top of another base tip"
+#: git-rebase.sh:566
+msgid "Please commit or stash them."
 msgstr ""
 
-#: common-cmds.h:33
-msgid "Reset current HEAD to the specified state"
+#: git-rebase.sh:586
+#, sh-format
+msgid "Current branch $branch_name is up to date."
 msgstr ""
 
-#: common-cmds.h:34
-msgid "Remove files from the working tree and from the index"
+#: git-rebase.sh:590
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr ""
 
-#: common-cmds.h:35
-msgid "Show various types of objects"
+#: git-rebase.sh:601
+#, sh-format
+msgid "Changes from $mb to $onto:"
 msgstr ""
 
-#: common-cmds.h:36
-msgid "Show the working tree status"
+#: git-rebase.sh:610
+msgid "First, rewinding head to replay your work on top of it..."
 msgstr ""
 
-#: common-cmds.h:37
-msgid "Create, list, delete or verify a tag object signed with GPG"
+#: git-rebase.sh:620
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr ""
 
-#: parse-options.h:145
-msgid "expiry-date"
+#: git-stash.sh:50
+msgid "git stash clear with parameters is unimplemented"
 msgstr ""
 
-#: parse-options.h:160
-msgid "no-op (backward compatibility)"
+#: git-stash.sh:73
+msgid "You do not have the initial commit yet"
 msgstr ""
 
-#: parse-options.h:237
-msgid "be more verbose"
+#: git-stash.sh:88
+msgid "Cannot save the current index state"
 msgstr ""
 
-#: parse-options.h:239
-msgid "be more quiet"
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
 msgstr ""
 
-#: parse-options.h:245
-msgid "use <n> digits to display SHA-1s"
+#: git-stash.sh:123 git-stash.sh:136
+msgid "Cannot save the current worktree state"
 msgstr ""
 
-#: rerere.h:38
-msgid "update the index with reused conflict resolution if possible"
+#: git-stash.sh:140
+msgid "No changes selected"
 msgstr ""
 
-#: git-bisect.sh:55
-msgid "You need to start by \"git bisect start\""
+#: git-stash.sh:143
+msgid "Cannot remove temporary index (can't happen)"
 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:61
-msgid "Do you want me to do it for you [Y/n]? "
+#: git-stash.sh:156
+msgid "Cannot record working tree state"
 msgstr ""
 
-#: git-bisect.sh:122
+#: git-stash.sh:188
 #, sh-format
-msgid "unrecognised option: '$arg'"
+msgid "Cannot update $ref_stash with $w_commit"
 msgstr ""
 
-#: git-bisect.sh:126
+#. 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 "'$arg' does not appear to be a valid revision"
+msgid ""
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
 msgstr ""
 
-#: git-bisect.sh:155
-msgid "Bad HEAD - I need a HEAD"
+#: git-stash.sh:251
+msgid "Can't use --patch and --include-untracked or --all at the same time"
 msgstr ""
 
-#: git-bisect.sh:168
-#, sh-format
-msgid ""
-"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+#: git-stash.sh:259
+msgid "No local changes to save"
 msgstr ""
 
-#: git-bisect.sh:178
-msgid "won't bisect on cg-seek'ed tree"
+#: git-stash.sh:263
+msgid "Cannot initialize stash"
 msgstr ""
 
-#: git-bisect.sh:182
-msgid "Bad HEAD - strange symbolic ref"
+#: git-stash.sh:267
+msgid "Cannot save the current status"
 msgstr ""
 
-#: git-bisect.sh:234
+#: git-stash.sh:268
 #, sh-format
-msgid "Bad bisect_write argument: $state"
+msgid "Saved working directory and index state $stash_msg"
 msgstr ""
 
-#: git-bisect.sh:263
-#, sh-format
-msgid "Bad rev input: $arg"
+#: git-stash.sh:285
+msgid "Cannot remove worktree changes"
 msgstr ""
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
+#: git-stash.sh:403
+#, sh-format
+msgid "unknown option: $opt"
 msgstr ""
 
-#: git-bisect.sh:290
-#, sh-format
-msgid "Bad rev input: $rev"
+#: git-stash.sh:416
+msgid "No stash found."
 msgstr ""
 
-#: git-bisect.sh:299
+#: git-stash.sh:423
 #, sh-format
-msgid "'git bisect $TERM_BAD' can take only one argument."
+msgid "Too many revisions specified: $REV"
 msgstr ""
 
-#: git-bisect.sh:322
+#: git-stash.sh:438
 #, sh-format
-msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgid "$reference is not a valid reference"
 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-stash.sh:466
+#, sh-format
+msgid "'$args' is not a stash-like commit"
 msgstr ""
 
-#: git-bisect.sh:340
+#: git-stash.sh:477
 #, 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.)"
+msgid "'$args' is not a stash reference"
 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.)"
+#: git-stash.sh:485
+msgid "unable to refresh index"
 msgstr ""
 
-#: git-bisect.sh:414 git-bisect.sh:546
-msgid "We are not bisecting."
+#: git-stash.sh:489
+msgid "Cannot apply a stash in the middle of a merge"
 msgstr ""
 
-#: git-bisect.sh:421
-#, sh-format
-msgid "'$invalid' is not a valid commit"
+#: git-stash.sh:497
+msgid "Conflicts in index. Try without --index."
 msgstr ""
 
-#: git-bisect.sh:430
-#, sh-format
-msgid ""
-"Could not check out original HEAD '$branch'.\n"
-"Try 'git bisect reset <commit>'."
+#: git-stash.sh:499
+msgid "Could not save index tree"
 msgstr ""
 
-#: git-bisect.sh:458
-msgid "No logfile given"
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
 msgstr ""
 
-#: git-bisect.sh:459
-#, sh-format
-msgid "cannot read $file for replaying"
+#: git-stash.sh:533
+msgid "Cannot unstage modified files"
 msgstr ""
 
-#: git-bisect.sh:480
-msgid "?? what are you talking about?"
+#: git-stash.sh:548
+msgid "Index was not unstashed."
 msgstr ""
 
-#: git-bisect.sh:492
-#, sh-format
-msgid "running $command"
+#: git-stash.sh:562
+msgid "The stash is kept in case you need it again."
 msgstr ""
 
-#: git-bisect.sh:499
+#: git-stash.sh:571
 #, sh-format
-msgid ""
-"bisect run failed:\n"
-"exit code $res from '$command' is < 0 or >= 128"
+msgid "Dropped ${REV} ($s)"
 msgstr ""
 
-#: git-bisect.sh:525
-msgid "bisect run cannot continue any more"
+#: git-stash.sh:572
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: git-bisect.sh:531
-#, sh-format
-msgid ""
-"bisect run failed:\n"
-"'bisect_state $state' exited with error code $res"
+#: git-stash.sh:580
+msgid "No branch name specified"
 msgstr ""
 
-#: git-bisect.sh:538
-msgid "bisect run success"
+#: git-stash.sh:652
+msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
-#: git-bisect.sh:565
-msgid "please use two different terms"
+#: git-submodule.sh:184
+msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr ""
 
-#: git-bisect.sh:575
+#: git-submodule.sh:194
 #, sh-format
-msgid "'$term' is not a valid term"
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-bisect.sh:578
+#: git-submodule.sh:211
 #, sh-format
-msgid "can't use the builtin command '$term' as a term"
+msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-bisect.sh:587 git-bisect.sh:593
+#: git-submodule.sh:215
 #, sh-format
-msgid "can't change the meaning of term '$term'"
+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-bisect.sh:606
+#: git-submodule.sh:233
 #, sh-format
-msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-bisect.sh:636
-msgid "no terms defined"
+#: git-submodule.sh:235
+#, sh-format
+msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-bisect.sh:653
+#: git-submodule.sh:243
 #, sh-format
-msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
 
-#: git-rebase.sh:57
+#: git-submodule.sh:245
+#, sh-format
 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:165
-msgid "Applied autostash."
+"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-rebase.sh:168
+#: git-submodule.sh:251
 #, sh-format
-msgid "Cannot store $stash_sha1"
+msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr ""
 
-#: git-rebase.sh:169
-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"
+#: git-submodule.sh:263
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-rebase.sh:208
-msgid "The pre-rebase hook refused to rebase."
+#: git-submodule.sh:268
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-rebase.sh:213
-msgid "It looks like git-am is in progress. Cannot rebase."
+#: git-submodule.sh:277
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
+#: git-submodule.sh:324
+#, sh-format
+msgid "Entering '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:359
-msgid "No rebase in progress?"
+#: git-submodule.sh:344
+#, sh-format
+msgid "Stopping at '$displaypath'; script returned non-zero status."
 msgstr ""
 
-#: git-rebase.sh:370
-msgid "The --edit-todo action can only be used during interactive rebase."
+#: git-submodule.sh:415
+#, sh-format
+msgid "pathspec and --all are incompatible"
 msgstr ""
 
-#: git-rebase.sh:377
-msgid "Cannot read HEAD"
+#: git-submodule.sh:420
+#, sh-format
+msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 
-#: git-rebase.sh:380
+#: git-submodule.sh:440
+#, sh-format
 msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
+"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-rebase.sh:398
+#: git-submodule.sh:448
 #, sh-format
-msgid "Could not move back to $head_name"
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
 msgstr ""
 
-#: git-rebase.sh:417
+#: git-submodule.sh:451
 #, 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."
+msgid "Cleared directory '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:468
+#: git-submodule.sh:452
 #, sh-format
-msgid "invalid upstream $upstream_name"
+msgid "Could not remove submodule work tree '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:492
+#: git-submodule.sh:455
 #, sh-format
-msgid "$onto_name: there are more than one merge bases"
+msgid "Could not create empty submodule directory '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-submodule.sh:464
 #, sh-format
-msgid "$onto_name: there is no merge base"
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:504
+#: git-submodule.sh:617
 #, sh-format
-msgid "Does not point to a valid commit: $onto_name"
+msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:527
+#: git-submodule.sh:627
 #, sh-format
-msgid "fatal: no such branch: $branch_name"
+msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-rebase.sh:560
-msgid "Cannot autostash"
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
 msgstr ""
 
-#: git-rebase.sh:565
+#: git-submodule.sh:650
 #, sh-format
-msgid "Created autostash: $stash_abbrev"
+msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:569
-msgid "Please commit or stash them."
+#: 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 ""
 
-#: git-rebase.sh:589
+#: git-submodule.sh:663
 #, sh-format
-msgid "Current branch $branch_name is up to date."
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:593
+#: git-submodule.sh:664
 #, sh-format
-msgid "Current branch $branch_name is up to date, rebase forced."
+msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr ""
 
-#: git-rebase.sh:604
+#: git-submodule.sh:668
 #, sh-format
-msgid "Changes from $mb to $onto:"
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-rebase.sh:613
-msgid "First, rewinding head to replay your work on top of it..."
+#: git-submodule.sh:669
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr ""
 
-#: git-rebase.sh:623
+#: git-submodule.sh:674
 #, sh-format
-msgid "Fast-forwarded $branch_name to $onto_name."
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr ""
 
-#: git-stash.sh:51
-msgid "git stash clear with parameters is unimplemented"
+#: git-submodule.sh:675
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr ""
 
-#: git-stash.sh:74
-msgid "You do not have the initial commit yet"
+#: git-submodule.sh:680
+#, sh-format
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
 msgstr ""
 
-#: git-stash.sh:89
-msgid "Cannot save the current index state"
+#: git-submodule.sh:681
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
 msgstr ""
 
-#: git-stash.sh:124 git-stash.sh:137
-msgid "Cannot save the current worktree state"
+#: git-submodule.sh:712
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr ""
 
-#: git-stash.sh:141
-msgid "No changes selected"
+#: git-submodule.sh:820
+msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
-#: git-stash.sh:144
-msgid "Cannot remove temporary index (can't happen)"
+#: git-submodule.sh:872
+#, sh-format
+msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-stash.sh:157
-msgid "Cannot record working tree state"
+#: git-submodule.sh:892
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-stash.sh:189
+#: git-submodule.sh:895
 #, sh-format
-msgid "Cannot update $ref_stash with $w_commit"
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 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:239
+#: git-submodule.sh:898
 #, sh-format
-msgid ""
-"error: unknown option for 'stash save': $option\n"
-"       To provide a message, use git stash save -- '$option'"
+msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-stash.sh:260
-msgid "No local changes to save"
+#: git-submodule.sh:1045
+#, sh-format
+msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-stash.sh:264
-msgid "Cannot initialize stash"
+#: git-submodule.sh:1112
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
 msgstr ""
 
-#: git-stash.sh:268
-msgid "Cannot save the current status"
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
 msgstr ""
 
-#: git-stash.sh:286
-msgid "Cannot remove worktree changes"
+#: git-rebase--interactive.sh:140
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
 msgstr ""
 
-#: git-stash.sh:405
-#, sh-format
-msgid "unknown option: $opt"
+#: 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 ""
 
-#: git-stash.sh:415
-msgid "No stash found."
+#: git-rebase--interactive.sh:171
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr ""
 
-#: git-stash.sh:422
-#, sh-format
-msgid "Too many revisions specified: $REV"
+#: git-rebase--interactive.sh:175
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
 msgstr ""
 
-#: git-stash.sh:428
+#: git-rebase--interactive.sh:211
 #, sh-format
-msgid "$reference is not a valid reference"
+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 ""
 
-#: git-stash.sh:456
+#: git-rebase--interactive.sh:236
 #, sh-format
-msgid "'$args' is not a stash-like commit"
+msgid "$sha1: not a commit that can be picked"
 msgstr ""
 
-#: git-stash.sh:467
+#: git-rebase--interactive.sh:275
 #, sh-format
-msgid "'$args' is not a stash reference"
+msgid "Invalid commit name: $sha1"
 msgstr ""
 
-#: git-stash.sh:475
-msgid "unable to refresh index"
+#: git-rebase--interactive.sh:317
+msgid "Cannot write current commit's replacement sha1"
 msgstr ""
 
-#: git-stash.sh:479
-msgid "Cannot apply a stash in the middle of a merge"
+#: git-rebase--interactive.sh:369
+#, sh-format
+msgid "Fast-forward to $sha1"
 msgstr ""
 
-#: git-stash.sh:487
-msgid "Conflicts in index. Try without --index."
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
 msgstr ""
 
-#: git-stash.sh:489
-msgid "Could not save index tree"
+#: git-rebase--interactive.sh:380
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
 msgstr ""
 
-#: git-stash.sh:523
-msgid "Cannot unstage modified files"
+#: git-rebase--interactive.sh:385
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
 msgstr ""
 
-#: git-stash.sh:538
-msgid "Index was not unstashed."
+#: git-rebase--interactive.sh:399
+#, sh-format
+msgid "Error redoing merge $sha1"
 msgstr ""
 
-#: git-stash.sh:561
+#: git-rebase--interactive.sh:407
 #, sh-format
-msgid "Dropped ${REV} ($s)"
+msgid "Could not pick $sha1"
 msgstr ""
 
-#: git-stash.sh:562
+#: git-rebase--interactive.sh:416
 #, sh-format
-msgid "${REV}: Could not drop stash entry"
+msgid "This is the commit message #${n}:"
 msgstr ""
 
-#: git-stash.sh:570
-msgid "No branch name specified"
+#: git-rebase--interactive.sh:421
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
 msgstr ""
 
-#: git-stash.sh:642
-msgid "(To restore them type \"git stash apply\")"
-msgstr ""
+#: 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-submodule.sh:104
+#: git-rebase--interactive.sh:440
 #, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
+msgid "Cannot write $fixup_msg"
 msgstr ""
 
-#: git-submodule.sh:281
-msgid "Relative path can only be used from the toplevel of the working tree"
+#: git-rebase--interactive.sh:443
+msgid "This is a combination of 2 commits."
 msgstr ""
 
-#: git-submodule.sh:291
-#, sh-format
-msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+#: git-rebase--interactive.sh:444
+msgid "This is the 1st commit message:"
 msgstr ""
 
-#: git-submodule.sh:308
+#: git-rebase--interactive.sh:484 git-rebase--interactive.sh:527
+#: git-rebase--interactive.sh:530
 #, sh-format
-msgid "'$sm_path' already exists in the index"
+msgid "Could not apply $sha1... $rest"
 msgstr ""
 
-#: git-submodule.sh:312
+#: git-rebase--interactive.sh:558
 #, 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."
+"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-submodule.sh:330
+#: git-rebase--interactive.sh:573
 #, sh-format
-msgid "Adding existing repo at '$sm_path' to the index"
+msgid "Stopped at $sha1_abbrev... $rest"
 msgstr ""
 
-#: git-submodule.sh:332
+#: git-rebase--interactive.sh:588
 #, sh-format
-msgid "'$sm_path' already exists and is not a valid git repo"
+msgid "Cannot '$squash_style' without a previous commit"
 msgstr ""
 
-#: git-submodule.sh:340
+#: git-rebase--interactive.sh:630
 #, sh-format
-msgid "A git directory for '$sm_name' is found locally with remote(s):"
+msgid "Executing: $rest"
 msgstr ""
 
-#: git-submodule.sh:342
+#: git-rebase--interactive.sh:638
 #, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
+msgid "Execution failed: $rest"
 msgstr ""
 
-#: git-submodule.sh:344
-#, sh-format
+#: git-rebase--interactive.sh:640
+msgid "and made changes to the index and/or the working tree"
+msgstr ""
+
+#: git-rebase--interactive.sh:642
 msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
 
-#: git-submodule.sh:345
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:655
 #, sh-format
 msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
+"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-submodule.sh:347
+#: git-rebase--interactive.sh:666
 #, sh-format
-msgid "Reactivating local git directory for submodule '$sm_name'."
+msgid "Unknown command: $command $sha1 $rest"
 msgstr ""
 
-#: git-submodule.sh:359
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
+#: git-rebase--interactive.sh:667
+msgid "Please fix this using 'git rebase --edit-todo'."
 msgstr ""
 
-#: git-submodule.sh:364
+#: git-rebase--interactive.sh:702
 #, sh-format
-msgid "Failed to add submodule '$sm_path'"
+msgid "Successfully rebased and updated $head_name."
 msgstr ""
 
-#: git-submodule.sh:373
-#, sh-format
-msgid "Failed to register submodule '$sm_path'"
+#: git-rebase--interactive.sh:749
+msgid "Could not skip unnecessary pick commands"
 msgstr ""
 
-#: git-submodule.sh:417
+#: git-rebase--interactive.sh:907
 #, sh-format
-msgid "Entering '$prefix$displaypath'"
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
 msgstr ""
 
-#: git-submodule.sh:437
+#: git-rebase--interactive.sh:940
 #, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
 msgstr ""
 
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
+#: git-rebase--interactive.sh:979
+msgid "could not detach HEAD"
 msgstr ""
 
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
+#: git-rebase--interactive.sh:1017
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
 
-#: git-submodule.sh:494
-#, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
+#: 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 ""
 
-#: git-submodule.sh:511
+#: git-rebase--interactive.sh:1036
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
 msgstr ""
 
-#: git-submodule.sh:549
-#, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
+#: git-rebase--interactive.sh:1053
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
 msgstr ""
 
-#: git-submodule.sh:566
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
+#: git-rebase--interactive.sh:1054
+msgid "Or you can abort the rebase with 'git rebase --abort'."
 msgstr ""
 
-#: git-submodule.sh:567
-#, sh-format
-msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+#: git-rebase--interactive.sh:1078
+msgid "Could not remove CHERRY_PICK_HEAD"
 msgstr ""
 
-#: git-submodule.sh:573
+#: git-rebase--interactive.sh:1083
 #, sh-format
 msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
+"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-submodule.sh:576
-#, sh-format
-msgid "Cleared directory '$displaypath'"
+#: git-rebase--interactive.sh:1100
+msgid "Error trying to find the author identity to amend commit"
 msgstr ""
 
-#: git-submodule.sh:577
-#, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
+#: 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-submodule.sh:580
-#, sh-format
-msgid "Could not create empty submodule directory '$displaypath'"
+#: git-rebase--interactive.sh:1110 git-rebase--interactive.sh:1114
+msgid "Could not commit staged changes."
 msgstr ""
 
-#: git-submodule.sh:589
-#, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+#: 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 ""
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
+#: git-rebase--interactive.sh:1146 git-rebase--interactive.sh:1304
+msgid "Could not execute editor"
 msgstr ""
 
-#: git-submodule.sh:736
+#: git-rebase--interactive.sh:1159
 #, sh-format
-msgid "Unable to find current revision in submodule path '$displaypath'"
+msgid "Could not checkout $switch_to"
 msgstr ""
 
-#: git-submodule.sh:745
-#, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
+#: git-rebase--interactive.sh:1164
+msgid "No HEAD?"
 msgstr ""
 
-#: git-submodule.sh:768
+#: git-rebase--interactive.sh:1165
 #, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
+msgid "Could not create temporary $state_dir"
 msgstr ""
 
-#: git-submodule.sh:788
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+#: git-rebase--interactive.sh:1167
+msgid "Could not mark as interactive"
 msgstr ""
 
-#: git-submodule.sh:789
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
+#: git-rebase--interactive.sh:1177 git-rebase--interactive.sh:1182
+msgid "Could not init rewritten commits"
 msgstr ""
 
-#: git-submodule.sh:793
+#: git-rebase--interactive.sh:1282
 #, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
+msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: git-rebase--interactive.sh:1287
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
 msgstr ""
 
-#: git-submodule.sh:794
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
+#: git-rebase--interactive.sh:1294
+msgid "Note that empty commits are commented out"
 msgstr ""
 
-#: git-submodule.sh:799
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgid "usage: $dashless $USAGE"
 msgstr ""
 
-#: git-submodule.sh:800
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
 msgstr ""
 
-#: git-submodule.sh:805
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgid "fatal: $program_name cannot be used without a working tree."
 msgstr ""
 
-#: git-submodule.sh:806
-#, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
 msgstr ""
 
-#: git-submodule.sh:836
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
 
-#: git-submodule.sh:944
-msgid "The --cached option cannot be used with the --files option"
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
 msgstr ""
 
-#: git-submodule.sh:996
+#: git-sh-setup.sh:229
 #, sh-format
-msgid "unexpected mode $mod_dst"
+msgid "Cannot $action: You have unstaged changes."
 msgstr ""
 
-#: git-submodule.sh:1016
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
 
-#: git-submodule.sh:1019
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
 msgstr ""
 
-#: git-submodule.sh:1022
+#: git-sh-setup.sh:248
 #, sh-format
-msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
 
-#: git-submodule.sh:1047
-msgid "blob"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
 msgstr ""
 
-#: git-submodule.sh:1165
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
 msgstr ""
 
-#: git-submodule.sh:1229
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
 msgstr ""
index 8692a8b5b274b9e3d3cf6ab8df74c8460c875d88..b8b34fd65eff39813762ca3bd657ee3f3975b046 100644 (file)
--- a/po/is.po
+++ b/po/is.po
@@ -7,14 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2010-09-20 14:44+0000\n"
-"PO-Revision-Date: 2010-06-05 19:06 +0000\n"
-"Last-Translator: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n"
+"POT-Creation-Date: 2016-06-17 18:55+0000\n"
+"PO-Revision-Date: 2016-06-17 19:17+0000\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
 "Language-Team: Git Mailing List <git@vger.kernel.org>\n"
 "Language: is\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.5\n"
 
 #. TRANSLATORS: This is a test. You don't need to translate it.
 #: t/t0200/test.c:5
@@ -72,22 +73,31 @@ msgstr "TILRAUN: Perl tilraunastrengur"
 msgid "TEST: A Perl test variable %s"
 msgstr "TILRAUN: Perl tilraunastrengur með breytunni %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:355
+#: builtin/init-db.c:402
 #, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "%s%s Git lind í %s%s\n"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
+msgstr "Endurgerði Git lind í %s%s\n"
 
-#: builtin/init-db.c:356
-msgid "Reinitialized existing"
-msgstr "Endurgerði"
+#: builtin/init-db.c:403
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
+msgstr "Endurgerði Git lind í %s%s\n"
+
+#: builtin/init-db.c:407
+#, c-format
+msgid "Initialized empty shared Git repository in %s%s\n"
+msgstr "Bjó til tóma sameiginlega Git lind í %s%s\n"
+
+#: builtin/init-db.c:408
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "Bjó til tóma Git lind í %s%s\n"
+
+#~ msgid "Reinitialized existing"
+#~ msgstr "Endurgerði"
 
-#: builtin/init-db.c:356
-msgid "Initialized empty"
-msgstr "Bjó til tóma"
+#~ msgid "Initialized empty"
+#~ msgstr "Bjó til tóma"
 
-#: builtin/init-db.c:357
-msgid " shared"
-msgstr " sameiginlega"
+#~ msgid " shared"
+#~ msgstr " sameiginlega"
index 3ff3b9bfec49de76cbdd7eeaf2594ad23c270704..ee64355d812f426e5053864f6b9425c748c018c4 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -39,6 +39,7 @@
 #  | log          | 기록                                         |
 #  | merge        | 병합                                         |
 #  | note         | 노트                                         |
+#  | octopus      | 옥토퍼스 (병합 전략)                         |
 #  | pack         | 묶음                                         |
 #  | pathspec     | 경로명세                                     |
 #  | rebase       | 리베이스                                     |
@@ -57,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-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-16 10:30+0900\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:56+0800\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
 "Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-"
 "ko>\n"
@@ -73,7 +74,32 @@ 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."
@@ -81,3290 +107,4384 @@ msgstr ""
 "작업 폴더에서 문제를 바로잡은 다음, 'git add/rm <파일>'을 적절히\n"
 "사용해 해결 표시하고 커밋하십시오."
 
-#: advice.c:101 builtin/merge.c:1226
+#: 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>...]"
+"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"
+"\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:1232
-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:2547 builtin/blame.c:2548
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:720 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 "저장만 하기"
-
-#: archive.c:438
-msgid "compress faster"
-msgstr "더 빠르게 압축"
+msgid "unrecognized whitespace option '%s'"
+msgstr "알 수 없는 공백 옵션 '%s'"
 
-#: archive.c:446
-msgid "compress better"
-msgstr "더 작게 압축"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "알 수 없는 공백 무시 옵션 '%s'"
 
-#: archive.c:449
-msgid "list supported archive formats"
-msgstr "지원하는 압축 형식의 목록을 표시합니다"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject 및 --3way 옵션은 같이 쓸 수 없습니다."
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "저장소"
+#: apply.c:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached 및 --3way 옵션은 같이 쓸 수 없습니다."
 
-#: 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¤"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "ì \80ì\9e¥ì\86\8c ë°\96ì\97\90ì\84\9c --3way ì\98µì\85\98 ì\82¬ì\9a©"
 
-#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "명령"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "저장소 밖에서 --index 옵션 사용"
 
-#: archive.c:454 builtin/archive.c:93
-msgid "path to the remote git-upload-archive command"
-msgstr "ì\9b\90격 git-upload-archive ëª\85ë ¹ì\9d\98 ê²½ë¡\9c"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "ì \80ì\9e¥ì\86\8c ë°\96ì\97\90ì\84\9c --cached ì\98µì\85\98 ì\82¬ì\9a©"
 
-#: attr.c:263
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-"git attributes에서 반대 패턴은 무시됩니다.\n"
-"앞에 느낌표를 쓰려면 '\\!'를 사용하십시오."
+#: apply.c:845
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
 
-#: branch.c:53
+#: apply.c:854
 #, 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 "regexec returned %d for input: %s"
+msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
 
-#: branch.c:67
+#: apply.c:938
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "%s 브랜치를 자신의 업스트림으로 지정하지 않음."
+msgid "unable to find filename in patch at line %d"
+msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
 
-#: branch.c:93
+#: apply.c:977
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었"
-"습니다."
+"git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이"
+"(가) 왔습니다"
 
-#: branch.c:94
+#: apply.c:983
 #, 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 new filename on line %d"
+msgstr ""
+"git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
 
-#: branch.c:98
+#: apply.c:984
 #, c-format
-msgid "Branch %s set up to track local branch %s by rebasing."
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 따라가도록 설정되었습니다."
+"git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
 
-#: branch.c:99
+#: apply.c:990
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "%s 브랜치가 %s 브랜치를 따라가도록 설정되었습니다."
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
 
-#: branch.c:104
+#: apply.c:1488
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
-"%s 브랜치가 리베이스를 통해 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: 예상치 못한 줄: %.*s"
 
-#: branch.c:105
+#: apply.c:1557
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "%s 브랜치가 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
 
-#: branch.c:109
+#: apply.c:1577
 #, c-format
-msgid "Branch %s set up to track local ref %s by rebasing."
-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번 줄)"
 
-#: branch.c:110
+#: apply.c:1589
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "%s 브랜치가 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+msgid "git diff header lacks filename information (line %d)"
+msgstr "git diff 헤더에 파일 이름 정보가 없습니다 (%d번 줄)"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "ì\97\85ì\8a¤í\8a¸ë¦¼ ë¸\8cë\9e\9cì¹\98 ì\84¤ì \95ì\9d\84 ì\93¸ ì\88\98 ì\97\86ì\8aµ니다"
+#: 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©니다"
 
-#: branch.c:156
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "삭제한 파일에 아직 내용이 들어 있습니다"
+
+#: apply.c:1795
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "따라가지 않음: %s 레퍼런스에 대해 애매한 정보"
+msgid "corrupt patch at line %d"
+msgstr "패치가 %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 "ì\9d´ë¦\84ì\9d´ '%s'ì\9d¸ ë¸\8cë\9e\9cì¹\98ê°\80 ì\9d´ë¯¸ ì\9e\88ì\8aµë\8b\88ë\8b¤."
+msgid "deleted file %s still has contents"
+msgstr "ì\82­ì \9cí\95\9c í\8c\8cì\9d¼ %sì\9d´(ê°\80) ì\95\84ì§\81 ë\82´ì\9a©ì\9d´ ë\93¤ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "현재 브랜치를 강제로 업데이트할 수 없습니다."
+#: apply.c:1837
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
 
-#: branch.c:218
+#: apply.c:1984
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
-"따라가기 정보를 설정할 수 없습니다. 시작 위치 '%s'이(가) 브랜치가 아닙니다."
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
 
-#: branch.c:220
+#: apply.c:2021
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "요청한 업스트림 '%s' 브랜치가 없습니다"
+msgid "unrecognized binary patch at line %d"
+msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
 
-#: 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하는 업스트림을 설정할 수 있습니다."
+#: apply.c:2182
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
 
-#: branch.c:266
+#: apply.c:2274
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "올바른 오브젝트 이름이 아닙니다: '%s'."
+msgid "unable to read symlink %s"
+msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
 
-#: branch.c:286
+#: apply.c:2278
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "애매한 오브젝트 이름: '%s'."
+msgid "unable to open or read %s"
+msgstr "%s을(를) 열거나 읽을 수 없습니다"
 
-#: branch.c:291
+#: apply.c:2931
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "ì\98¬ë°\94른 ë¸\8cë\9e\9cì¹\98 ì\9c\84ì¹\98ê°\80 ì\95\84ë\8b\99ë\8b\88ë\8b¤: '%s'."
+msgid "invalid start of line: '%c'"
+msgstr "ì¤\84 ì\8b\9cì\9e\91ì\9d´ ì\9e\98못ë\90¨: '%c'"
 
-#: branch.c:344
+#: apply.c:3050
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s'은(는) 이미 '%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번 줄)"
 
-#: bundle.c:34
+#: apply.c:3062
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
 
-#: bundle.c:61
+#: apply.c:3068
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "인식할 수 없는 헤더: %s%s (%d)"
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"다음을 검색하던 중:\n"
+"%.*s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3090
 #, 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:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "리비전 walk 준비가 실패했습니다"
+msgid "missing binary patch data for '%s'"
+msgstr "'%s'에 대한 바이너리 패치 데이터가 없습니다"
 
-#: bundle.c:185
+#: apply.c:3098
 #, 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 "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr ""
+"반대 헝크가 없으면 '%s'에 대한 바이너리 패치를 반대로 적용할 수 없습니다"
 
-#: bundle.c:194
+#: apply.c:3144
 #, 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 명령을 실행할 수 없습니다"
-
-#: bundle.c:264
-msgid "pack-objects died"
-msgstr "pack-objects 명령이 죽었습니다"
-
-#: bundle.c:304
-msgid "rev-list died"
-msgstr "rev-list 명령이 죽었습니다"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"전체 인덱스 라인이 없으면 '%s'에 대한 바이너리 패치를 적용할 수 없습니다"
 
-#: bundle.c:353
+#: apply.c:3154
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "패치가 '%s'(%s)에 적용되지만, 현재 내용과 일치하지 않습니다."
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3162
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "알 수 없는 인자: %s"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "패치는 빈 '%s'에 적용되지만, 현재 비어 있지 않습니다"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "빈 번들은 만들지 않습니다."
-
-#: bundle.c:459
+#: apply.c:3180
 #, c-format
-msgid "cannot create '%s'"
-msgstr "'%s'을(를) 만들 수 없습니다"
-
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "index-pack 명령이 죽었습니다"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "'%2$s'에 대한 필요한 %1$s 포스트이미지를 읽을 수 없습니다"
 
-#: color.c:275
+#: apply.c:3193
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "잘못된 색 값: %.*s"
+msgid "binary patch does not apply to '%s'"
+msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3199
 #, c-format
-msgid "could not parse %s"
-msgstr "parse %s을(를) 파싱할 수 없습니다"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
+"제 %s)"
 
-#: commit.c:42
+#: apply.c:3220
 #, 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 "patch failed: %s:%ld"
+msgstr "패치 실패: %s:%ld"
 
-#: config.c:475 config.c:477
+#: apply.c:3342
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "%2$s %3$s %1$d번 줄에 잘못된 설정"
+msgid "cannot checkout %s"
+msgstr "%s을(를) 가져올 수 없습니다"
 
-#: config.c:593
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s %s): %s"
+msgid "failed to read %s"
+msgstr "%s을(를) 읽는데 실패했습니다"
 
-#: config.c:595
+#: apply.c:3398
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "ì\9e\98못ë\90\9c ì\88\98ì¹\98 ì\84¤ì \95 ê°\92 '%s' (í\82¤ '%s'): %s"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "ì\8b¬ë³¼ë¦­ ë§\81í\81¬ ë\92¤ì\97\90 ì\9e\88ë\8a\94 '%s' ì\9d½ê¸°"
 
-#: config.c:680
+#: apply.c:3427 apply.c:3667
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
+msgid "path %s has been renamed/deleted"
+msgstr "%s 경로가 이름이 바뀌었거나 삭제되었습니다"
 
-#: config.c:758 config.c:769
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
+msgid "%s: does not exist in index"
+msgstr "%s: 인덱스에 없습니다"
 
-#: config.c:891
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "오브젝트 생성 모드가 올바르지 않습니다: %s"
+msgid "%s: does not match index"
+msgstr "%s: 인덱스와 맞지 않습니다"
 
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "명령행 설정을 파싱할 수 없습니다"
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
 
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "설정 파일을 읽는 중 알 수 없는 오류가 생겼습니다"
+#: apply.c:3557
+#, c-format
+msgid "Falling back to three-way merge...\n"
+msgstr "3-방향 병합으로 대신합니다...\n"
 
-#: config.c:1629
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "명령행 설정에서 '%s'을(를) 설정할 수 없습니다"
+msgid "cannot read the current contents of '%s'"
+msgstr "'%s'의 현재 내용을 읽을 수 없습니다"
 
-#: config.c:1631
+#: apply.c:3589
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "3-방향 병합으로 대신하는데 실패했습니다...\n"
 
-#: config.c:1690
+#: apply.c:3603
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s은(는) 여러 개 값이 있습니다"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "패치를 '%s'에 충돌이 있는 상태로 적용.\n"
 
-#: config.c:2226
+#: apply.c:3608
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "'%s'을(를) '%s'에 설정할 수 없습니다"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "패치를 '%s'에 패치 문제 없이 적용.\n"
 
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "'git rev-list'를 실행할 수 없습니다"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
 
-#: connected.c:89
+#: apply.c:3706
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "rev-list 쓰기에 실패했습니다: %s"
+msgid "%s: wrong type"
+msgstr "%s: 잘못된 종류"
 
-#: connected.c:97
+#: apply.c:3708
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "rev-list의 표준입력을 닫는데 실패했습니다: %s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "미래에"
+msgid "%s has type %o, expected %o"
+msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
 
-#: date.c:101
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu초 전"
+msgid "invalid path '%s'"
+msgstr "잘못된 경로 '%s'"
 
-#: date.c:108
+#: apply.c:3917
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu분 전"
+msgid "%s: already exists in index"
+msgstr "%s: 이미 인덱스에 있습니다"
 
-#: date.c:115
+#: apply.c:3920
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu시간 전"
+msgid "%s: already exists in working directory"
+msgstr "%s: 이미 작업 디렉터리에 있습니다"
 
-#: date.c:122
+#: apply.c:3940
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu일 전"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
 
-#: date.c:128
+#: apply.c:3945
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu주 전"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "%2$s의 새 모드(%1$o)가 %4$s의 예전 모드(%3$o)와 다릅니다"
 
-#: date.c:135
+#: apply.c:3965
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu달 전"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "영향 받는 '%s' 파일이 심볼릭 링크 뒤에 있습니다"
 
-#: date.c:146
+#: apply.c:3969
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu년"
+msgid "%s: patch does not apply"
+msgstr "%s: 패치를 적용하지 않습니다"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:3984
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s %lu달 전"
+msgid "Checking patch %s..."
+msgstr "%s 패치를 확인하는 중입니다..."
 
-#: date.c:154 date.c:159
+#: apply.c:4075
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu년 전"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "sha1 정보가 없거나 %s 하위 모듈에서 쓸 수 없습니다"
 
-#: diffcore-order.c:24
+#: apply.c:4082
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "%s에 대한 모드 변경이지만, 현재 HEAD에 없습니다"
 
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
+#: apply.c:4085
+#, c-format
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1 정보가 없거나 쓸 수 없습니다 (%s)."
 
-#: diff.c:115
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "경로 '%s'에 대해 make_cache_entry 실패"
 
-#: diff.c:120
+#: apply.c:4094
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
+msgid "could not add %s to temporary index"
+msgstr "임시 인덱스에 %s 항목을 추가할 수 없습니다"
 
-#: diff.c:215
+#: apply.c:4104
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
+msgid "could not write temporary index to %s"
+msgstr "임시 인덱스를 %s에 쓸 수 없습니다"
 
-#: diff.c:267
+#: apply.c:4242
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"'diff.submodule' 설정 변수에 오류:\n"
-"%s'"
+msgid "unable to remove %s from index"
+msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
 
-#: diff.c:2997
+#: apply.c:4277
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
+msgid "corrupt patch for submodule %s"
+msgstr "하위 모듈 %s에 대해 손상된 패치"
 
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
+#: apply.c:4283
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
 
-#: diff.c:3556
+#: apply.c:4291
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
-"%s"
+msgid "unable to create backing store for newly created file %s"
+msgstr "새로 만든 파일 '%s'에 대해 예비 저장소를 만들 수 없습니다"
 
-#: diff.c:3570
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
+msgid "unable to add cache entry for %s"
+msgstr "%s에 대해 캐시 항목을 추가할 수 없습니다"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "커널 이름과 정보를 가져오는데 실패했습니다"
+#: apply.c:4338
+#, c-format
+msgid "failed to write to '%s'"
+msgstr "'%s'에 쓰는데 실패했습니다"
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr "이 시스템 또는 위치에서는 추적되지 않는 캐시를 사용하지 않습니다."
+#: apply.c:4342
+#, c-format
+msgid "closing file '%s'"
+msgstr "'%s' 파일을 닫는 중입니다"
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "gpg를 실행할 수 없습니다."
+#: apply.c:4412
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg에서 데이터를 받아들이지 않습니다"
+#: apply.c:4510
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "%s 패치 깔끔하게 적용."
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
+#: apply.c:4518
+msgid "internal error"
+msgstr "내부 오류"
 
-#: gpg-interface.c:222
+#: apply.c:4521
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "임시 파일 '%s'을(를) 만들 수 없습니다: %s"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "%%s 패치를 (%d개 거부) 적용..."
 
-#: gpg-interface.c:225
+#: apply.c:4532
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다: %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
 
-#: grep.c:1718
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': %s을(를) 읽을 수 없습니다"
+msgid "cannot open %s"
+msgstr "%s을(를) 열 수 없습니다"
 
-#: grep.c:1735
+#: apply.c:4554
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s': %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "패치 부위 #%d 깔끔하게 적용."
 
-#: grep.c:1746
+#: apply.c:4558
 #, c-format
-msgid "'%s': short read %s"
-msgstr "'%s': %s에서 읽다가 잘림"
+msgid "Rejected hunk #%d."
+msgstr "패치 부위 #%d 거부됨."
 
-#: help.c:205
+#: apply.c:4668
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "'%s'에 있는 깃 명령"
+msgid "Skipped patch '%s'."
+msgstr "패치 '%s' 건너뜀."
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "다른 $PATH에 있는 깃 명령"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "인식할 수 없는 입력"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "인덱스 파일을 읽을 수 없습니다"
 
-#: help.c:309
+#: apply.c:4833
 #, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
+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개를 넘어갑니다"
+
+#: apply.c:4864 apply.c:4879
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%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번 줄 적용."
+
+#: 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 "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
+
+#: 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 "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
+
+#: 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 "패치를 적용하지 않으면 3-방향 병합을 시도합니다"
+
+#: 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 "경로를 NUL 문자로 구분합니다"
+
+#: 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 ""
-"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
-"없습니다. 아마도 git-%s 망가진 것 같습니다."
+"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로"
+">...]"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "어라라. 시스템에 깃 명령이 하나도 없다고 나옵니다."
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <저장소> [--exec <명령>] --list"
 
-#: help.c:388
+#: 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/archive.c:88 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 "아카이브에 포함된 파일을 표준오류로 표시합니다"
+
+#: 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 ""
-"WARNING: You called a Git command named '%s', which does not exist.\n"
-"Continuing under the assumption that you meant '%s'"
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
-"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
-"ì\9e\90ë\8f\99ì\9c¼ë¡\9c '%s' ëª\85ë ¹ì\9d´ë\9d¼ê³  ê°\80ì \95í\95\98ê³  ê³\84ì\86\8dí\95©ë\8b\88ë\8b¤"
+"git attributes에서 반대 패턴은 무시됩니다.\n"
+"ì\95\9eì\97\90 ë\8a\90ë\82\8cí\91\9c를 ì\93°ë ¤ë©´ '\\!'를 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤."
 
-#: help.c:393
+#: bisect.c:441
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "(%0.1f초 뒤에)..."
+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 단계)"
+
+#. 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] "이등분: %2$s 뒤에 시험할 리비전이 %1$d개 남았습니다\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\" 명령을\n"
+"실행해 수정할 수 있습니다."
+
+#: 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"
+"리모트에 이미 있는 업스트림 브랜치를 기반으로 작업하려면,\n"
+"먼저 \"git fetch\"로 가져 리모트 브랜치를 가져옵니다.\n"
+"\n"
+"새 로컬 브랜치를 거기에 해당하는 리모트 브랜치로 push하려면,\n"
+"\"git push -u\"로 push하는 업스트림을 설정할 수 있습니다."
+
+#: 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:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "작업 폴더 %s의 헤드가 업데이트되지 않았습니다"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "인식할 수 없는 헤더: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:963 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: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 "리비전 walk 준비가 실패했습니다"
+
+#: bundle.c:185
+#, 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 "번들은 전체 커밋 내역을 기록합니다."
+
+#: bundle.c:194
+#, 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 명령을 실행할 수 없습니다"
+
+#: 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 "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
+
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, 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: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 "parse %s을(를) 파싱할 수 없습니다"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s, 커밋이 아닙니다"
+
+#: commit.c:1514
+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:516
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
+
+#: config.c:520
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "파일 %2$s 안에 %1$d번 줄에 잘못된 설정"
+
+#: config.c:524
+#, c-format
+msgid "bad config line %d in standard input"
+msgstr "표준 입력 안에 %d번 줄에 잘못된 설정"
 
-#: help.c:400
+#: config.c:528
 #, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
+msgid "bad config line %d in submodule-blob %s"
+msgstr "하위 모듈 블롭 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"다음을 의도하신 것 아니었나요?"
+#: config.c:532
+#, c-format
+msgid "bad config line %d in command line %s"
+msgstr "명령행 %2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: help.c:460
+#: config.c:536
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "bad config line %d in %s"
+msgstr "%2$s 안에 %1$d번 줄에 잘못된 설정"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "캐시를 읽는데 실패했습니다"
+#: config.c:655
+msgid "out of range"
+msgstr "범위를 벗어남"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
-msgstr "새 인덱스 파일을 쓸 수 없습니다"
+#: config.c:655
+msgid "invalid unit"
+msgstr "단위가 잘못됨"
 
-#: merge-recursive.c:189
+#: config.c:661
 #, c-format
-msgid "(bad commit)\n"
-msgstr "(잘못된 커밋)\n"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): %s"
 
-#: merge-recursive.c:209
+#: config.c:666
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
-
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "트리 빌드에 오류"
+msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 블롭 %s): %s"
 
-#: merge-recursive.c:689
+#: config.c:669
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "'%s' 경로 만들기에 실패했습니다%s"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 파일 %s): %s"
 
-#: merge-recursive.c:700
+#: config.c:672
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 표준입력): %s"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": 아마도 D/F 충돌?"
+#: config.c:675
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 하위 모듈 블롭 %s): %s"
 
-#: merge-recursive.c:725
+#: config.c:678
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', 명령행 %s): %s"
 
-#: merge-recursive.c:765
+#: config.c:681
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "%s '%s' 오브젝트를 읽을 수 없음"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s 안에): %s"
 
-#: merge-recursive.c:767
+#: config.c:768
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "%s '%s'에 대해 블롭을 예상"
+msgid "failed to expand user dir in: '%s'"
+msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
 
-#: merge-recursive.c:790 builtin/clone.c:374
+#: config.c:852 config.c:863
 #, c-format
-msgid "failed to open '%s'"
-msgstr "'%s'을(를) 여는데 실패"
+msgid "bad zlib compression level %d"
+msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
 
-#: merge-recursive.c:798
+#: config.c:978
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "'%s' 심볼릭 링크에 실패"
+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 "설정 파일을 읽는 중 알 수 없는 오류가 생겼습니다"
 
-#: merge-recursive.c:801
+#: config.c:1716
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "ë\8b¤ì\9d\8cì\9d\84 ì\96´ë\96»ê²\8c í\95 ì§\80 ì\95\8c ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %06o %s '%s'"
+msgid "unable to parse '%s' from command-line config"
+msgstr "ëª\85ë ¹í\96\89 ì\84¤ì \95ì\97\90ì\84\9c '%s'ì\9d\84(를) ì\84¤ì \95í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "내부 병합 실행에 실패"
+#: config.c:1718
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
 
-#: merge-recursive.c:943
+#: config.c:1777
 #, 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습니다"
+msgid "%s has multiple values"
+msgstr "%sì\9d\80\8a\94) ì\97¬ë\9f¬ ê°\9c ê°\92ì\9d´ ì\9e\88습니다"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "트리에서 지원하지 않는 오브젝트 종류"
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "'%s'을(를) '%s'(으)로 설정할 수 없습니다"
 
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: 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 ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
 msgstr ""
-"충돌! (%s/삭제): %s (위치 %s) 및 %s (%s에서) 삭제. %s 버전의 %s 트리에 남음."
+"리모트 저장소에서 읽을 수 없습니다\n"
+"\n"
+"올바른 접근 권한이 있는지, 그리고 저장소가 있는지\n"
+"확인하십시오."
+
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "연결을 확인하는 중입니다"
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: 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의 표준입력을 닫는데 실패했습니다"
+
+#: convert.c:201
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"충돌! (%s/삭제): %s (위치 %s) 및 %s (위치 %s) 삭제. %s 버전의 %s 트리에 "
-"%s(으)로 남음."
-
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "이름바꾸기"
+"%s에서 CRLF는 LF로 바뀝니다.\n"
+"작업 디렉터리에서는 원래 줄 바꿈 형식을 유지합니다."
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "이름바꿈"
-
-#: merge-recursive.c:1150
+#: convert.c:205
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%sì\9d\80\8a\94) %sì\97\90 ì\9e\88ë\8a\94 ë\94\94ë \89í\84°ë¦¬ë¡\9c %s(ì\9c¼)ë¡\9c ì\9d´ë¦\84ì\9d\84 ë°\94ê¿\89ë\8b\88ë\8b¤"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "%sì\97\90ì\84\9c CRLFë\8a\94 LFë¡\9c ë°\94ë\80\9dë\8b\88ë\8b¤."
 
-#: merge-recursive.c:1172
+#: convert.c:211
 #, c-format
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
-"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
+"%s에서 LF는 CRLF로 바뀝니다.\n"
+"작업 디렉터리에서는 원래 줄 바꿈 형식을 유지합니다."
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (해결되지 않음)"
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "%s에서 LF는 CRLF로 바뀝니다."
 
-#: merge-recursive.c:1231
+#: date.c:97
+msgid "in the future"
+msgstr "미래에"
+
+#: date.c:103
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
-"치 %s)"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu초 전"
 
-#: merge-recursive.c:1261
+#: date.c:110
 #, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "대신 이름을 %s에서 %s(으)로 바꾸고 %s에서 %s(으)로 바꿉니다"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu분 전"
 
-#: merge-recursive.c:1460
+#: date.c:117
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu시간 전"
 
-#: merge-recursive.c:1470
+#: date.c:124
 #, c-format
-msgid "Adding merged %s"
-msgstr "병합된 %s을(를) 추가합니다"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu일 전"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: date.c:130
 #, c-format
-msgid "Adding as %s instead"
-msgstr "대신 %s(으)로 추가합니다"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu주 전"
 
-#: merge-recursive.c:1526
+#: date.c:137
 #, c-format
-msgid "cannot read object %s"
-msgstr "%s 오브젝트를 읽을 수 없습니다"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu달 전"
 
-#: merge-recursive.c:1529
+#: date.c:148
 #, c-format
-msgid "object %s is not a blob"
-msgstr "%s 오브젝트는 블롭이 아닙니다"
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu년"
 
-#: merge-recursive.c:1581
-msgid "modify"
-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달 전"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "수정됨"
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu년 전"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "내용"
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "추가/추가"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
 
-#: merge-recursive.c:1632
+#: diff.c:62
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "건너뛰기: %s (기존과 같게 병합)"
+msgid "option '%s' requires a value"
+msgstr "'%s' 옵션에는 값이 필요합니다"
 
-#: merge-recursive.c:1646
+#: diff.c:124
 #, c-format
-msgid "Auto-merging %s"
-msgstr "자동 병합: %s"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "하위 모듈"
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
 
-#: merge-recursive.c:1651
+#: diff.c:283
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "충돌! (%s): %s에 병합 충돌"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
 
-#: merge-recursive.c:1737
+#: diff.c:346
 #, c-format
-msgid "Removing %s"
-msgstr "제거: %s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"'diff.submodule' 설정 변수에 오류:\n"
+"%s'"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "파일/디렉터리"
+#: diff.c:3087
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "디렉터리/파일"
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr ""
+"\"--name-only, --name-status, --check, -s 옵션 중 하나만 쓸 수 있습니다"
 
-#: merge-recursive.c:1773
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
+
+#: diff.c:3665
 #, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
 msgstr ""
-"충돌! (%s): 이름이 %s인 디렉터리가 %s에 있습니다. %s을(를) %s(으)로 추가합니"
-""
+"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
+"%s"
 
-#: merge-recursive.c:1783
+#: diff.c:3679
 #, c-format
-msgid "Adding %s"
-msgstr "추가: %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "치명적인 병합 실패, 일어날 수 없는 상황."
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "파일이 너무 많아서 부정확한 이름 바꾸기 검색 기능을 건너뜁니다."
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "이미 업데이트 상태입니다!"
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "파일이 너무 많아서 수정한 경로의 복사본만 찾았습니다."
 
-#: merge-recursive.c:1828
+#: diff.c:4706
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "%s 및 %s 트리의 병합이 실패했습니다"
+msgid ""
+"you may want to set your %s variable to at least %d and retry the command."
+msgstr "%s 변수를 최소한 %d(으)로 설정하고 명령을 다시 시도해 보십시오."
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "처리되지 않은 경로??? %s"
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "커널 이름과 정보를 가져오는데 실패했습니다"
 
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "병합:"
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "이 시스템 또는 위치에서는 추적되지 않는 캐시를 사용하지 않습니다."
+
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: 얕은 목록을 예상함"
 
-#: merge-recursive.c:1919
+#: 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 "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "과거의 공통 커밋 %u개 발견:"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ACK/NAK가 와야 하지만, '%s'을(를) 받았습니다"
 
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
-msgstr "병합 결과에 커밋이 없습니다"
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc 옵션은 multi_ack_detailed가 필요합니다"
 
-#: merge-recursive.c:2013
+#: fetch-pack.c:381
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+msgid "invalid shallow line: %s"
+msgstr "shallow 줄이 잘못됨: %s"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "인덱스를 쓸 수 없습니다."
+#: fetch-pack.c:387
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "unshallow 줄이 잘못됨: %s"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "오브젝트가 없습니다: %s"
 
-#: notes-utils.c:100
+#: fetch-pack.c:392
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "ì\9e\98못ë\90\9c notes.rewriteMode ê°\92: '%s'"
+msgid "error in object: %s"
+msgstr "ì\98¤ë¸\8cì \9dí\8a¸ì\97\90 ì\98¤ë¥\98: %s"
 
-#: notes-utils.c:110
+#: fetch-pack.c:394
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
+msgid "no shallow found: %s"
+msgstr "shallow가 없습니다: %s"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: fetch-pack.c:397
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "잘못된 %s 값: '%s'"
+msgid "expected shallow/unshallow, got %s"
+msgstr "shallow/unshallow가 와야 하지만, %s을(를) 받았습니다"
+
+#: fetch-pack.c:436
+#, c-format
+msgid "got %s %d %s"
+msgstr "받음: %s %d %s"
 
-#: object.c:242
+#: fetch-pack.c:450
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "ì\98¤ë¸\8cì \9dí\8a¸ë¥¼ í\8c\8cì\8b±í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s"
+msgid "invalid commit %s"
+msgstr "ì\9e\98못ë\90\9c ì»¤ë°\8b %s"
 
-#: parse-options.c:570
-msgid "..."
-msgstr "..."
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "포기함"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "완료"
 
-#: parse-options.c:588
+#: fetch-pack.c:505
 #, c-format
-msgid "usage: %s"
-msgstr "사용법: %s"
+msgid "got %s (%d) %s"
+msgstr "받음: %s (%d) %s"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: fetch-pack.c:551
 #, c-format
-msgid "   or: %s"
-msgstr "  또는: %s"
+msgid "Marking %s as complete"
+msgstr "%s 항목을 완료로 표시"
 
-#: parse-options.c:595
+#: fetch-pack.c:697
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "already have %s (%s)"
+msgstr "이미 %s (%s) 있음"
 
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-NUM"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: 사이드밴드 디멀티플렉서를 fork할 수 없습니다"
 
-#: parse-options-cb.c:108
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "프로토콜 오류: 잘못된 묶음 헤더"
+
+#: fetch-pack.c:799
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "잘못된 형식의 오브젝트 이름 '%s'"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: %s 명령을 fork할 수 없습니다"
 
-#: path.c:752
+#: fetch-pack.c:815
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
+msgid "%s failed"
+msgstr "%s 실패"
 
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "사이드밴드 디멀티플렉서에 오류"
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "서버에서 shallow 클라이언트를 지원하지 않습니다"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "서버에서 multi_ack_detailed를 지원합니다"
 
-#: pathspec.c:183
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "서버에서 no-done을 지원합니다"
 
-#: pathspec.c:187
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "서버에서 multi_ack를 지원합니다"
 
-#: pathspec.c:205
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "서버에서 side-band-64k를 지원합니다"
 
-#: pathspec.c:230
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "서버에서 side-band를 지원합니다"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "서버에서 allow-tip-sha1-in-want를 지원합니다"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "서버에서 allow-reachable-sha1-in-want를 지원합니다"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "서버에서 ofs-delta를 지원합니다"
+
+#: fetch-pack.c:890
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
+msgid "Server version is %.*s"
+msgstr "서버 버전이 %.*s입니다"
 
-#: pathspec.c:241
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "서버에서 --shallow-signed 옵션을 지원하지 않습니다"
+
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "서버에서 --shallow-exclude 옵션을 지원하지 않습니다"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "서버에서 --deepen 옵션을 지원하지 않습니다"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "공통 커밋 없음"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: 가져오기 실패."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "해당하는 리모트 헤드가 없습니다"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "임시 파일을 만들 수 없습니다"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s'은(는) 저장소 밖입니다"
+msgid "failed writing detached signature to '%s'"
+msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다"
 
-#: pathspec.c:291
+#: grep.c:1782
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
+msgid "'%s': unable to read %s"
+msgstr "'%s': %s을(를) 읽을 수 없습니다"
 
-#: pathspec.c:353
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
+msgid "failed to stat '%s'"
+msgstr "'%s'에 대해 stat()이 실패했습니다"
 
-#: pathspec.c:433
+#: grep.c:1810
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
+msgid "'%s': short read"
+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"
-"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
+#: help.c:203
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "'%s'에 있는 깃 명령"
 
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "--pretty 형식을 파싱할 수 없습니다"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "다른 $PATH에 있는 깃 명령"
 
-#: progress.c:235
-msgid "done"
-msgstr "완료"
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
 
-#: read-cache.c:1281
+#: help.c:306
 #, c-format
 msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
-"%i 버전을 사용합니다"
+"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
+"없습니다. 아마도 git-%s 망가진 것 같습니다."
+
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "어라라. 시스템에 깃 명령이 하나도 없다고 나옵니다."
 
-#: read-cache.c:1291
+#: help.c:383
 #, c-format
 msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
-"%i 버전을 사용합니다"
+"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
+"자동으로 '%s' 명령이라고 가정하고 계속합니다"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: help.c:388
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+msgid "in %0.1f seconds automatically..."
+msgstr "(%0.1f초 뒤에)..."
 
-#: refs/files-backend.c:2374
+#: help.c:395
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
 
-#: refs/files-backend.c:2377
-#, c-format
-msgid "could not delete references: %s"
-msgstr "레퍼런스를 삭제할 수 없습니다: %s"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"다음을 의도하신 것 아니었나요?"
 
-#: refs/files-backend.c:2386
+#: help.c:461
 #, c-format
-msgid "could not remove reference %s"
-msgstr "%s 레퍼런스를 제거할 수 없습니다"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "예상한 형식: %%(color:<색>)"
+#: 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"
 
-#: ref-filter.c:57
+#: lockfile.c:152
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "인식할 수 없는 색: %%(color:%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"
+"이 저장소에서 다른 깃 프로세스가 실행 중인 것으로 보입니다. (예를\n"
+"들어 'git commit' 명령으로 편집기가 열려 있다든지.) 모든 프로세스를\n"
+"끝냈는지 확인하시고 다시 시도해 보십시오. 그래도 계속 실패하면, 이\n"
+"저장소에서 깃 프로세스가 전에 이상 종료했을 수도 있습니다:\n"
+"수동으로 해당 파일을 제거하고 계속하십시오."
 
-#: ref-filter.c:71
+#: lockfile.c:160
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "알 수 없는 형식: %%(%s)"
+msgid "Unable to create '%s.lock': %s"
+msgstr "'%s.lock'을 만들 수 없습니다: %s"
 
-#: ref-filter.c:77
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body)에 인자를 받지 않습니다"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "캐시를 읽는데 실패했습니다"
 
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject)에 인자를 받지 않습니다"
+#: 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 "새 인덱스 파일을 쓸 수 없습니다"
 
-#: ref-filter.c:101
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(잘못된 커밋)\n"
+
+#: merge-recursive.c:231
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
 
-#: ref-filter.c:103
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "트리 빌드에 오류"
+
+#: merge-recursive.c:720
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "알 수 없는 %%(contents) 인자: %s"
+msgid "failed to create path '%s'%s"
+msgstr "'%s' 경로 만들기에 실패했습니다%s"
 
-#: ref-filter.c:113
+#: merge-recursive.c:731
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "알 수 없는 %%(objectname) 인자: %s"
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
 
-#: ref-filter.c:135
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": 아마도 D/F 충돌?"
+
+#: merge-recursive.c:754
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "예상한 형식: %%(align:<너비>,<위치>)"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
 
-#: ref-filter.c:147
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "인식할 수 없는 위치:%s"
+msgid "cannot read object %s '%s'"
+msgstr "%s '%s' 오브젝트를 읽을 수 없음"
 
-#: ref-filter.c:151
+#: merge-recursive.c:798
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "인식할 수 없는 너비:%s"
+msgid "blob expected for %s '%s'"
+msgstr "%s '%s'에 대해 블롭을 예상"
 
-#: ref-filter.c:157
+#: merge-recursive.c:822
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "인식할 수 없는 %%(align) 인자:%s"
+msgid "failed to open '%s': %s"
+msgstr "'%s'을(를) 여는데 실패: %s"
 
-#: ref-filter.c:161
+#: merge-recursive.c:833
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
+msgid "failed to symlink '%s': %s"
+msgstr "'%s' 심볼릭 링크에 실패: %s"
 
-#: ref-filter.c:244
+#: merge-recursive.c:838
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "잘못된 형식의 필드 이름: %.*s"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "다음을 어떻게 할지 알 수 없습니다: %06o %s '%s'"
 
-#: ref-filter.c:270
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "내부 병합 실행에 실패"
+
+#: merge-recursive.c:982
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "알 수 없는 필드 이름: %.*s"
+msgid "Unable to add %s to database"
+msgstr "%s을(를) 데이터베이스에 추가할 수 없습니다"
 
-#: ref-filter.c:372
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
+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:424
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "malformed format string %s"
-msgstr "잘못된 형식의 문자열 %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:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= 명령에는 0보다 큰 정수 인자가 필요합니다"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "이름바꾸기"
 
-#: ref-filter.c:883
-#, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "'%s' 레퍼런스에 :strip할 구성 요소 %ld개가 없습니다"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "이름바꿈"
 
-#: ref-filter.c:1046
+#: merge-recursive.c:1200
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "알 수 없는 %.*s 형식 %s"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s은(는) %s에 있는 디렉터리로 %s(으)로 이름을 바꿉니다"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: merge-recursive.c:1225
 #, c-format
-msgid "missing object %s for %s"
-msgstr "없는 오브젝트 %s, %s에 대해"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
+"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "%s에 parse_object_buffer 실패 (%s에 대해)"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (해결되지 않음)"
 
-#: ref-filter.c:1311
+#: merge-recursive.c:1292
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "'%s'에 잘못된 형식의 오브젝트"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
+"치 %s)"
 
-#: ref-filter.c:1373
+#: merge-recursive.c:1325
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "ë§\9dê°\80ì§\84 ì\9d´ë¦\84 %sì\97\90 ë \88í\8d¼ë\9f°ì\8a¤ë¥¼ ë¬´ì\8b\9cí\95©니다"
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "ë\8c\80ì\8b  ì\9d´ë¦\84ì\9d\84 %sì\97\90ì\84\9c %s(ì\9c¼)ë¡\9c ë°\94꾸고 %sì\97\90ì\84\9c %s(ì\9c¼)ë¡\9c ë°\94ê¿\89니다"
 
-#: ref-filter.c:1378
+#: merge-recursive.c:1531
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "망가진 레퍼런스 %s 무시"
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
 
-#: ref-filter.c:1651
+#: merge-recursive.c:1546
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "형식: %%(end) 아톰이 없습니다"
+msgid "Adding merged %s"
+msgstr "병합된 %s을(를) 추가합니다"
 
-#: ref-filter.c:1705
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "malformed object name %s"
-msgstr "잘못된 형식의 오브젝트 이름 %s"
+msgid "Adding as %s instead"
+msgstr "대신 %s(으)로 추가합니다"
 
-#: remote.c:745
+#: merge-recursive.c:1610
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
+msgid "cannot read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
 
-#: remote.c:749
+#: merge-recursive.c:1613
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
+msgid "object %s is not a blob"
+msgstr "%s 오브젝트는 블롭이 아닙니다"
 
-#: remote.c:753
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s은(는) %s 및 %s 모두 추적합니다"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "수정"
 
-#: remote.c:761
-msgid "Internal error"
-msgstr "내부 오류"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "수정됨"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD가 브랜치를 가리키지 않습니다"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "내용"
 
-#: remote.c:1686
-#, c-format
-msgid "no such branch: '%s'"
-msgstr "그런 브랜치가 없습니다: '%s'"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "추가/추가"
 
-#: remote.c:1689
+#: merge-recursive.c:1718
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
+msgid "Skipped %s (merged same as existing)"
+msgstr "건너뛰기: %s (기존과 같게 병합)"
 
-#: remote.c:1695
+#: merge-recursive.c:1732
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "ì\97\85ì\8a¤í\8a¸ë¦¼ '%s' ë¸\8cë\9e\9cì¹\98ê°\80 ë¦¬ëª¨í\8a¸ ì¶\94ì \81 ë¸\8cë\9e\9cì¹\98ë¡\9c ì \80ì\9e¥ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤"
+msgid "Auto-merging %s"
+msgstr "ì\9e\90ë\8f\99 ë³\91í\95©: %s"
 
-#: remote.c:1710
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "하위 모듈"
 
-#: remote.c:1725
+#: merge-recursive.c:1737
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "'%s' 브랜치에 푸시 리모트가 없습니다"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "충돌! (%s): %s에 병합 충돌"
 
-#: remote.c:1736
+#: merge-recursive.c:1831
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
+msgid "Removing %s"
+msgstr "제거: %s"
 
-#: remote.c:1749
-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¤)"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "í\8c\8cì\9d¼/ë\94\94ë \89í\84°ë¦¬"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "하나의 대상에 대해 'simple' 푸시를 처리할 수 없습니다"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "디렉터리/파일"
 
-#: remote.c:2073
+#: merge-recursive.c:1868
 #, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"충돌! (%s): 이름이 %s인 디렉터리가 %s에 있습니다. %s을(를) %s(으)로 추가합니"
+"다"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
+#: merge-recursive.c:1877
+#, c-format
+msgid "Adding %s"
+msgstr "추가: %s"
 
-#: remote.c:2080
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "이미 업데이트 상태입니다!"
+
+#: merge-recursive.c:1923
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
+msgid "merging of trees %s and %s failed"
+msgstr "%s 및 %s 트리의 병합이 실패했습니다"
 
-#: remote.c:2084
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "병합:"
+
+#: merge-recursive.c:2019
 #, 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"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "과거의 공통 커밋 %u개 발견:"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "병합 결과에 커밋이 없습니다"
 
-#: remote.c:2093
+#: merge-recursive.c:2121
 #, 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 "Could not parse object '%s'"
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (로컬 브랜치를 업데이트하려면 \"git pull\"을 사용하십시오)\n"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "인덱스를 쓸 수 없습니다."
 
-#: remote.c:2104
+#: notes-merge.c:273
 #, 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"
+"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 ""
-"  (리모트의 브랜치를 현재 브랜치로 병합하려면 \"git pull\"을 사용하십시오)\n"
-
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "현재 브랜치가 망가진 것처럼 보입니다"
+"이전의 노트 병합을 다 마치지 않았습니다 (%s 있음).\n"
+"새로 노트 병합을 시작하기 전에 'git notes merge --commit'\n"
+"또는 'git notes merge --abort'로 이전 병합을 커밋/중지하십시오."
 
-#: revision.c:2134
+#: notes-merge.c:280
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "노트 병합 작업을 다 마치지 않았습니다. (%s 있음)"
 
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "/dev/null 열기 실패"
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "잘못된 notes.rewriteMode 값: '%s'"
 
-#: run-command.c:94
+#: notes-utils.c:110
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) 실패"
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-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'"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "받는 쪽에서 --signed 푸시를 지원하지 않습니다"
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "오브젝트를 파싱할 수 없습니다: %s"
 
-#: send-pack.c:406
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
+#: parse-options.c:590
+#, c-format
+msgid "usage: %s"
+msgstr "사용법: %s"
 
-#: 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 <경로>'로 표시하십시오"
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
+#, c-format
+msgid "   or: %s"
+msgstr "  또는: %s"
 
-#: 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'으로 커밋하십시오"
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
+
+#: parse-options-cb.c:108
 #, c-format
-msgid "Could not write to %s"
-msgstr "%s에 쓸 수 없습니다"
+msgid "malformed object name '%s'"
+msgstr "잘못된 형식의 오브젝트 이름 '%s'"
 
-#: sequencer.c:193
+#: path.c:826
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "%s 잠그는데 오류"
+msgid "Could not make %s writable by group"
+msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "로컬 변경 사항을 cherry-pick 때문에 덮어 쓰게 됩니다."
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "로컬 변경 사항을 revert 때문에 덮어 쓰게 됩니다."
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "변경 사항을 스테이징하거나 스태시한 다음 계속하십시오."
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: pathspec.c:183
 #, 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 "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
 
-#: sequencer.c:390
+#: pathspec.c:187
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "%s 커밋을 파싱할 수 없습니다\n"
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
 
-#: sequencer.c:395
+#: pathspec.c:205
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
-
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "인덱스 파일이 병합되지 않았습니다."
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
 
-#: sequencer.c:479
+#: pathspec.c:230
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
 
-# FIXME: "parent %d" 번호가 무슨 의미?
-#: sequencer.c:487
+#: pathspec.c:241
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Commit %s 커밋에 이전 커밋 %d이(가) 없습니다"
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s'은(는) 저장소 밖입니다"
 
-#: sequencer.c:491
+#: pathspec.c:291
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "메인라인을 지정했지만 %s 커밋이 병합 커밋이 아닙니다."
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: pathspec.c:353
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
 
-#: sequencer.c:508
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"경로명세로 빈 문자열을 넣는 일은 다음 릴리스에서 오류로 취급할 예정입니다. 모"
+"든 경로를 지정하려면 점(.)을 사용하십시오."
 
-#: sequencer.c:594
+#: pathspec.c:440
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
 
-#: sequencer.c:595
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
+#: pathspec.c:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+":(exclude) 패턴으로 제외할 사항이 없습니다.\n"
+"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "빈 커밋 모음을 건너 뜁니다"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "--pretty 형식을 파싱할 수 없습니다"
 
-#: sequencer.c:638
+#: read-cache.c:1315
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: 인덱스 읽기에 실패했습니다"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
 
-#: sequencer.c:642
+#: read-cache.c:1325
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
 
-#: sequencer.c:702
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "%2$s 동안 %1$s 할 수 없습니다"
+msgid "Could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
 
-#: sequencer.c:724
+#: refs/files-backend.c:2481
 #, c-format
-msgid "Could not parse line %d."
-msgstr "%d번 줄을 파싱할 수 없습니다."
-
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "파싱한 커밋이 없습니다."
+msgid "could not delete reference %s: %s"
+msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
 
-#: sequencer.c:741
+#: refs/files-backend.c:2484
 #, c-format
-msgid "Could not open %s"
-msgstr "%s을(를) 열 수 없습니다"
+msgid "could not delete references: %s"
+msgstr "레퍼런스를 삭제할 수 없습니다: %s"
 
-#: sequencer.c:745
+#: refs/files-backend.c:2493
 #, c-format
-msgid "Could not read %s."
-msgstr "%s을(를) 읽을 수 없습니다."
+msgid "could not remove reference %s"
+msgstr "%s 레퍼런스를 제거할 수 없습니다"
 
-#: sequencer.c:752
+#: ref-filter.c:55
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "ì\82¬ì\9a© ë¶\88ê°\80ë\8a¥ ì\9d¸ì\8a¤í\8a¸ë\9f­ì\85\98 í\8c\8cì\9d¼: %s"
+msgid "expected format: %%(color:<color>)"
+msgstr "ì\98\88ì\83\81í\95\9c í\98\95ì\8b\9d: %%(color:<ì\83\89>)"
 
-#: sequencer.c:782
+#: ref-filter.c:57
 #, c-format
-msgid "Invalid key: %s"
-msgstr "ì\9e\98못ë\90\9c í\82¤: %s"
+msgid "unrecognized color: %%(color:%s)"
+msgstr "ì\9d¸ì\8b\9dí\95  ì\88\98 ì\97\86ë\8a\94 ì\83\89: %%(color:%s)"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: ref-filter.c:71
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "%s의 값이 올바르지 않습니다: %s"
+msgid "unrecognized format: %%(%s)"
+msgstr "알 수 없는 형식: %%(%s)"
 
-#: sequencer.c:795
+#: ref-filter.c:77
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "형식이 잘못된 옵션 파일: %s"
-
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "이미 커밋 빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중입니다"
-
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "\"git cherry-pick (--continue | --quit | --abort)\" 명령을 해 보십시오"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body)에 인자를 받지 않습니다"
 
-#: sequencer.c:819
+#: ref-filter.c:84
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "%s 시퀀서 디렉터리를 만들 수 없습니다"
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject)에 인자를 받지 않습니다"
 
-#: sequencer.c:835 sequencer.c:917
+#: ref-filter.c:101
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "%s 잠그는데 오류."
-
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
-
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "HEAD를 구해 올 수 없습니다"
-
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "새로 만들고 있는 브랜치에서 중지할 수 없습니다"
+msgid "positive value expected contents:lines=%s"
+msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: ref-filter.c:103
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "%s을(를) 열 수 없습니다: %s"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "알 수 없는 %%(contents) 인자: %s"
 
-#: sequencer.c:881
+#: ref-filter.c:113
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "%s을(를) 읽을 수 없습니다: %s"
-
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "예상치 못하게 파일이 끝났습니다"
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "알 수 없는 %%(objectname) 인자: %s"
 
-#: sequencer.c:888
+#: ref-filter.c:135
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "예상한 형식: %%(align:<너비>,<위치>)"
 
-#: sequencer.c:910
+#: ref-filter.c:147
 #, c-format
-msgid "Could not format %s."
-msgstr "%s에 포매팅할 수 없습니다."
+msgid "unrecognized position:%s"
+msgstr "인식할 수 없는 위치:%s"
 
-#: sequencer.c:1055
+#: ref-filter.c:151
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: %s 커밋을 빼올 수 없습니다"
+msgid "unrecognized width:%s"
+msgstr "인식할 수 없는 너비:%s"
 
-#: sequencer.c:1058
+#: ref-filter.c:157
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: 잘못된 리비전"
-
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "최초의 커밋을 되돌릴 수 없습니다"
-
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "빈 헤드로 커밋을 빼올 수 없습니다."
+msgid "unrecognized %%(align) argument: %s"
+msgstr "인식할 수 없는 %%(align) 인자:%s"
 
-#: setup.c:246
+#: ref-filter.c:161
 #, c-format
-msgid "failed to read %s"
-msgstr "%s을(를) 읽는데 실패했습니다"
+msgid "positive width expected with the %%(align) atom"
+msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "오프셋이 묶음 파일 앞입니다 (망가진 .idx?)"
+#: ref-filter.c:244
+#, c-format
+msgid "malformed field name: %.*s"
+msgstr "잘못된 형식의 필드 이름: %.*s"
 
-#: sha1_file.c:2459
+#: ref-filter.c:270
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "ì\98¤í\94\84ì\85\8bì\9d´ %sì\9d\98 ë¬¶ì\9d\8c ì\9d¸ë\8d±ì\8a¤ ì\8b\9cì\9e\91ë³´ë\8b¤ ì\95\9eì\9e\85ë\8b\88ë\8b¤ (ë§\9dê°\80ì§\84 ì\9d¸ë\8d±ì\8a¤?)"
+msgid "unknown field name: %.*s"
+msgstr "ì\95\8c ì\88\98 ì\97\86ë\8a\94 í\95\84ë\93\9c ì\9d´ë¦\84: %.*s"
 
-#: sha1_file.c:2463
+#: ref-filter.c:372
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "오프셋이 %s의 묶음 인덱스 끝보다 뒤입니다 (망가진 인덱스?)"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
 
-#: 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 ""
-"깃에서는 보통 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\" 명령을 사용하십시오."
+#: ref-filter.c:424
+#, c-format
+msgid "malformed format string %s"
+msgstr "잘못된 형식의 문자열 %s"
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= 명령에는 0보다 큰 정수 인자가 필요합니다"
 
-#: submodule.c:66 submodule.c:100
+#: ref-filter.c:883
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "'%s' 레퍼런스에 :strip할 구성 요소 %ld개가 없습니다"
 
-#: submodule.c:74
+#: ref-filter.c:1046
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
+msgid "unknown %.*s format %s"
+msgstr "알 수 없는 %.*s 형식 %s"
 
-#: submodule.c:107
+#: ref-filter.c:1066 ref-filter.c:1097
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
-
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "업데이트한 .gitmodules를 커밋할 사항으로 표시하는데 실패"
+msgid "missing object %s for %s"
+msgstr "없는 오브젝트 %s, %s에 대해"
 
-#: trailer.c:237
+#: ref-filter.c:1069 ref-filter.c:1100
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "트레일러 명령 '%s' 실행 실패"
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "%s에 parse_object_buffer 실패 (%s에 대해)"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: ref-filter.c:1311
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "알 수 없는 값 '%s', 키 '%s'"
+msgid "malformed object at '%s'"
+msgstr "'%s'에 잘못된 형식의 오브젝트"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: ref-filter.c:1373
 #, c-format
-msgid "more than one %s"
-msgstr "%s이(가) 여러개입니다"
+msgid "ignoring ref with broken name %s"
+msgstr "망가진 이름 %s에 레퍼런스를 무시합니다"
 
-#: trailer.c:582
+#: ref-filter.c:1378
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "트레일러 '%.*s'에서 빈 트레일러 토큰"
+msgid "ignoring broken ref %s"
+msgstr "망가진 레퍼런스 %s 무시"
 
-#: trailer.c:702
+#: ref-filter.c:1633
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "'%s' 입력 파일을 읽을 수 없습니다"
+msgid "format: %%(end) atom missing"
+msgstr "형식: %%(end) 아톰이 없습니다"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "표준 입력에서 읽을 수 없습니다"
+#: ref-filter.c:1687
+#, c-format
+msgid "malformed object name %s"
+msgstr "잘못된 형식의 오브젝트 이름 %s"
 
-#: trailer.c:857 builtin/am.c:42
+#: remote.c:746
 #, c-format
-msgid "could not stat %s"
-msgstr "%s에 대해 stat()할 수 없습니다"
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
 
-#: trailer.c:859
+#: remote.c:750
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "'%s' 파일이 일반 파일이 아닙니다"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
 
-#: trailer.c:861
+#: remote.c:754
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "사용자가 %s 파일에 쓸 수 없습니다"
+msgid "%s tracks both %s and %s"
+msgstr "%s은(는) %s 및 %s 모두 추적합니다"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "임시 파일을 열 수 없습니다: %s"
+#: remote.c:762
+msgid "Internal error"
+msgstr "내부 오류"
+
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD가 브랜치를 가리키지 않습니다"
 
-#: trailer.c:912
+#: remote.c:1686
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "임시 파일 이름을 '%s'(으)로 바꿀 수 없습니다"
+msgid "no such branch: '%s'"
+msgstr "그런 브랜치가 없습니다: '%s'"
 
-#: transport-helper.c:1041
+#: remote.c:1689
 #, c-format
-msgid "Could not read ref %s"
-msgstr "%s 레퍼런스를 읽을 수 없습니다"
+msgid "no upstream configured for branch '%s'"
+msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "파일을 가져옵니다"
+#: remote.c:1695
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "업스트림 '%s' 브랜치가 리모트 추적 브랜치로 저장되지 않았습니다"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
+#: remote.c:1710
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: remote.c:1725
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "ì\9e\98못ë\90\9c %XX ì\9d´ì\8a¤ì¼\80ì\9d´í\94\84 ì\8b\9cí\80\80ì\8a¤"
+msgid "branch '%s' has no remote for pushing"
+msgstr "'%s' ë¸\8cë\9e\9cì¹\98ì\97\90 í\91¸ì\8b\9c ë¦¬ëª¨í\8a¸ê°\80 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
+#: remote.c:1736
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "푸시의 대상이 없습니다 (push.default가 'nothing'입니다)"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "í\98¸ì\8a¤í\8a¸ ì\9d´ë¦\84ì\97\90 ì\9e\98못ë\90\9c ë¬¸ì\9e\90"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "í\95\98ë\82\98ì\9d\98 ë\8c\80ì\83\81ì\97\90 ë\8c\80í\95´ 'simple' í\91¸ì\8b\9c를 ì²\98리í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "잘못된 포트 번호"
+#: remote.c:2073
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "경로에서 잘못된 '..' 부분"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
 
-#: wrapper.c:222 wrapper.c:381
+#: remote.c:2080
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
 
-#: wrapper.c:224 wrapper.c:383
+#: remote.c:2084
 #, c-format
-msgid "could not open '%s' for writing"
-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"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "'%s'을(를) 읽기용으로 열 수 없습니다"
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
 
-#: wrapper.c:611
+#: remote.c:2093
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "'%s'에 접근할 수 없습니다: %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"
 
-#: wrapper.c:632
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (로컬 브랜치를 업데이트하려면 \"git pull\"을 사용하십시오)\n"
+
+#: remote.c:2104
 #, c-format
-msgid "unable to access '%s'"
-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"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr ""
+"  (리모트의 브랜치를 현재 브랜치로 병합하려면 \"git pull\"을 사용하십시오)\n"
 
-#: wrapper.c:667
-#, c-format
-msgid "could not open %s for writing"
-msgstr "%s을(를) 쓰기용으로 열 수 없습니다"
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "현재 브랜치가 망가진 것처럼 보입니다"
 
-#: wrapper.c:678 builtin/am.c:410
+#: revision.c:2161
 #, c-format
-msgid "could not write to %s"
-msgstr "%s에 쓸 수 없습니다"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
 
-#: wrapper.c:684
-#, c-format
-msgid "could not close %s"
-msgstr "%s을(를) 닫을 수 없습니다"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "병합하지 않은 경로:"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "/dev/null 열기 실패"
 
-#: wt-status.c:176 wt-status.c:203
+#: run-command.c:108
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) 실패"
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "푸시 인증서 서명에 실패했습니다"
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "받는 쪽에서 --signed 푸시를 지원하지 않습니다"
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 msgstr ""
-"  (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)"
-
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
+"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "커밋할 변경 사항:"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "커밋하도록 정하지 않은 변경 사항:"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "받는 쪽에서 푸시 옵션을 지원하지 않습니다"
 
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
+#: sequencer.c:171
+msgid "revert"
+msgstr "되돌리기"
 
-#: wt-status.c:221
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "빼오기"
 
-#: wt-status.c:222
+#: sequencer.c:228
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
-"  (작업 폴더의 변경 사항을 버리려면 \"git checkout -- <파일>...\"을 사용하십"
-"시오)"
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오"
 
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
+#: sequencer.c:231
+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:236
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
+msgid "could not lock '%s'"
+msgstr "'%s'을(를) 잠글 수 없습니다"
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "양쪽에서 삭제:"
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "'%s'에 쓸 수 없습니다"
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "이 쪽에서 추가:"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "'%s'에 줄바꿈을 쓸 수 없습니다"
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "저 쪽에서 삭제:"
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "'%s' 마치는데 실패했습니다"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "저 쪽에서 추가:"
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
+#, c-format
+msgid "could not read '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "이 쪽에서 삭제:"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "로컬 변경 사항을 %s 때문에 덮어 쓰게 됩니다."
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "양쪽에서 추가:"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "변경 사항을 커밋하거나 스태시한 다음 계속하십시오."
+
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: 정방향 진행"
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: 새 인덱스 파일을 쓸 수 없습니다"
+
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "HEAD 커밋을 처리할 수 없습니다\n"
+
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "캐시 트리를 업데이트할 수 없습니다\n"
+
+#: sequencer.c:483
+#, 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 ""
+"작업 폴더에 스테이징한 변경 사항이 있습니다.\n"
+"이 변경 사항을 이전 커밋에 합치려면,\n"
+"다음을 실행하십시오:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"새 커밋으로 만드려면 다음을 실행하십시오:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"어떤 경우이든, 마친 다음에 다음 명령으로 계속합니다:\n"
+"\n"
+"  git rebase --continue\n"
+
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "%s 커밋을 파싱할 수 없습니다\n"
+
+#: sequencer.c:572
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "ì\96\91쪽ì\97\90ì\84\9c ì\88\98ì \95:"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "ì\9d¸ë\8d±ì\8a¤ í\8c\8cì\9d¼ì\9d´ ë³\91í\95©ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤."
 
-#: wt-status.c:265
+#: sequencer.c:675
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "bug: 병합하지 않은 상태 %x 처리되지 않음"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "새 파일:"
+# FIXME: "parent %d" 번호가 무슨 의미?
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "%s 커밋에 이전 커밋 %d이(가) 없습니다"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "복사함:"
+#: sequencer.c:687
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "메인라인을 지정했지만 %s 커밋이 병합 커밋이 아닙니다."
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "삭제함:"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "수정함:"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "이름 바꿈:"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "종류 바뀜:"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "알 수 없음:"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "빈 커밋 모음을 건너 뜁니다"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "병합하지 않음:"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: 인덱스 읽기에 실패했습니다"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "새 커밋, "
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "수정한 내용, "
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "잘못된 줄 %d: %.*s"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "추적하지 않은 내용, "
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "파싱한 커밋이 없습니다."
 
-#: wt-status.c:390
+#: sequencer.c:966
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "버그: 처리되지 않은 diff 상태 %c"
+msgid "could not read '%s'."
+msgstr "'%s'에서 읽을 수 없습니다."
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "변경되었지만 업데이트하지 않은 하위 모듈:"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "사용 불가능 인스트럭션 시트: '%s'"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "커밋할 하위 모듈의 변경 사항:"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "되돌리기(revert) 중에 빼오기(cherry-pick)를 할 수 없습니다."
 
-#: wt-status.c:837
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr ""
-"위의 줄을 바꾸지 마십시오.\n"
-"아래 있는 내용은 모두 제거됩니다."
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "빼오기(cherry-pick) 중에 되돌리기(revert)를 할 수 없습니다."
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "병합하지 않은 경로가 있습니다."
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "잘못된 키: %s"
 
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "%s의 값이 잘못됨: %s"
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "형식이 잘못된 옵션 시트: '%s'"
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "이미 커밋 빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중입니다"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "am 세션 중간에 있습니다."
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "\"git cherry-pick (--continue | --quit | --abort)\" 명령을 해 보십시오"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "현재 패치가 비어 있습니다."
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "'%s' 시퀀서 디렉터리를 만들 수 없습니다"
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "HEAD를 잠글 수 없습니다"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "HEAD를 구해 올 수 없습니다"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "ì\99\84ë£\8cí\95\9c ëª\85ë ¹ ì\97\86ì\9d\8c."
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "ì\83\88ë¡\9c ë§\8cë\93¤ê³  ì\9e\88ë\8a\94 ë¸\8cë\9e\9cì¹\98ì\97\90ì\84\9c ì¤\91ì§\80í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: wt-status.c:1108
+#: sequencer.c:1175 builtin/grep.c:578
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
+msgid "cannot open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
 
-#: wt-status.c:1119
+#: sequencer.c:1177
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (자세한 정보는 %s 파일 참고)"
+msgid "cannot read '%s': %s"
+msgstr "'%s'을(를) 읽을 수 없습니다: %s"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "명령이 남아있지 않음."
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "예상치 못하게 파일이 끝났습니다"
 
-#: wt-status.c:1127
+#: sequencer.c:1184
 #, 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:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
 
-#: wt-status.c:1148
+#: sequencer.c:1354
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
-
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "현재 리베이스하는 중입니다."
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s 커밋을 빼올 수 없습니다"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: 잘못된 리비전"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "최초의 커밋으로 되돌릴 수 없습니다"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
+#: 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:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+#: 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 ""
-"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
+"애매한 인자 '%s': 알 수 없는 리비전 또는 작업 폴더에 없는 경로.\n"
+"경로와 리비전을 구분하려면 다음과 같이 '--'를 사용하십시오:\n"
+"'git <명령> [<리비전>...] -- [<파일>...]'"
 
-#: wt-status.c:1181
+#: setup.c:223
 #, c-format
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 분리하는 중입니다."
+"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:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "현재 리베이스하는 중 커밋을 분리하는 중입니다."
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "깃 저장소 버전 <= %d 버전을 기대하지만, %d 버전이 발견되었습니다"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "알 수 없는 저장소 확장이 있습니다:"
 
-#: wt-status.c:1193
+#: setup.c:762
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "(현재 폴더 또는 상위 폴더가) 깃 저장소가 아닙니다: %s"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "리베이스 중에 커밋을 편집하는 중입니다."
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "현재 디렉터리로 돌아올 수 없습니다"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "현재 작업 디렉터리를 읽을 수 없습니다"
 
-#: wt-status.c:1203
+#: setup.c:920
+#, c-format
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
+"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까지 상위 폴더가) 깃 저장소가 아닙니다\n"
+"파일 시스템 경계에서 중지합니다. (GIT_DISCOVERY_ACROSS_FILESYSTEM 설정되지 않"
+"음)"
 
-#: wt-status.c:1213
+#: setup.c:927
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
+msgid "Cannot change to '%s/..'"
+msgstr "'%s/..' 위치로 이동할 수 없습니다"
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
+#: 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:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "'%s' 경로가 없습니다"
+
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
-"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
+"레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (뽑기 작업을 취소하려면 \"git cherry-pick --abort\"를 사용하십시오)"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
 
-#: wt-status.c:1232
+#: sha1_file.c:511
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "현재 %s 커밋을 되돌리는 중입니다."
+msgid "reference repository '%s' is shallow"
+msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "레퍼런스 '%s' 저장소가 붙어 있는 저장소입니다"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-"  (모든 충돌을 바로잡았습니다: \"git revert --continue\"를 실행하십시오)"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "오프셋이 묶음 파일 앞입니다 (망가진 .idx?)"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
+#: sha1_file.c:2592
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "오프셋이 %s의 묶음 인덱스 시작보다 앞입니다 (망가진 인덱스?)"
 
-#: wt-status.c:1253
+#: sha1_file.c:2596
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "오프셋이 %s의 묶음 인덱스 끝보다 뒤입니다 (망가진 인덱스?)"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "'이등분하는 중입니다."
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "짧은 SHA1 %s은(는) 여럿에 대응됩니다"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "후보는 다음과 같습니다:"
 
-#: wt-status.c:1438
-msgid "On branch "
-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 ""
+"깃에서는 보통 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\" 명령을 사용하십시오."
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "대화형 리베이스 진행 중. 갈 위치는 "
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "리베이스 진행 중. 갈 위치는 "
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
+
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD가 다음 위치에서 분리: "
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD가 다음으로부터 분리: "
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "업데이트한 .gitmodules를 커밋할 사항으로 표시하는데 실패"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "현재 어떤 브랜치도 사용하지 않음."
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "submodule.fetchJobs 값에 음수를 쓸 수 없습니다"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "최초 커밋"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "%s의 값이 올바르지 않습니다"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "추적하지 않는 파일"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "트레일러 명령 '%s' 실행 실패"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "무시한 파일"
+#: 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:1494
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, 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' 참고)"
+msgid "more than one %s"
+msgstr "%s이(가) 여러개입니다"
 
-#: wt-status.c:1500
+#: trailer.c:672
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "추적하지 않는 파일을 보지 않습니다%s"
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "트레일러 '%.*s'에서 빈 트레일러 토큰"
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "'%s' 입력 파일을 읽을 수 없습니다"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "변경 사항 없음"
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "표준 입력에서 읽을 수 없습니다"
 
-#: wt-status.c:1513
+#: trailer.c:929 builtin/am.c:44
 #, 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 "could not stat %s"
+msgstr "%s에 대해 stat()할 수 없습니다"
 
-#: wt-status.c:1516
+#: trailer.c:931
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
+msgid "file %s is not a regular file"
+msgstr "'%s' 파일이 일반 파일이 아닙니다"
 
-#: wt-status.c:1519
+#: trailer.c:933
 #, c-format
-msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr ""
-"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
-"\"git\n"
-"add\"를 사용하십시오)\n"
+msgid "file %s is not writable by user"
+msgstr "사용자가 %s 파일에 쓸 수 없습니다"
+
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "임시 파일을 열 수 없습니다: %s"
 
-#: wt-status.c:1522
+#: trailer.c:983
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
-msgstr "커ë°\8bí\95  ì\82¬í\95­ì\9d\84 ì¶\94ê°\80í\95\98ì§\80 ì\95\8aì\95\98ì§\80ë§\8c ì¶\94ì \81í\95\98ì§\80 ì\95\8aë\8a\94 í\8c\8cì\9d¼ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤\n"
+msgid "could not rename temporary file to %s"
+msgstr "ì\9e\84ì\8b\9c í\8c\8cì\9d¼ ì\9d´ë¦\84ì\9d\84 '%s'(ì\9c¼)ë¡\9c ë°\94ê¿\80 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
 
-#: wt-status.c:1525
+#: transport.c:62
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr ""
-"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
-"다)\n"
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "'%1$s'의 업스트림을 '%3$s'의 '%2$s'(으)로 설정할 것입니다\n"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: transport.c:151
 #, c-format
-msgid "nothing to commit\n"
-msgstr "커밋할 사항 없음\n"
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: 잘못된 깊이 옵션: %s"
 
-#: wt-status.c:1531
+#: transport.c:817
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
 msgstr ""
-"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
+"다음 하위 모듈 경로에 리모트 어디에도 없는\n"
+"변경 사항이 있습니다:\n"
 
-#: wt-status.c:1535
+#: transport.c:821
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
+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"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "ìµ\9cì´\88 ì»¤ë°\8b, ë¸\8cë\9e\9cì¹\98"
+#: transport.c:829
+msgid "Aborting."
+msgstr "ì¤\91ì§\80í\95¨."
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (브랜치 없음)"
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "%s 레퍼런스를 읽을 수 없습니다"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "없음"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "너무 짧은 트리 오브젝트"
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "다음 뒤에: "
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "트리 엔트리에 잘못된 형식의 모드"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "다음 앞에: "
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "트리 엔트리에 빈 파일 이름"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "'%s' 파일 삭제에 실패했습니다"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "너무 짧은 트리 파일"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<옵션>] [--] <경로명세>..."
+#: 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브랜치를 전환하기 전에 변경 사항을 커밋하거나 스태시하십시오."
 
-#: builtin/add.c:65
+#: unpack-trees.c:66
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "예상치 못한 diff 상태 %c"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"다음 파일의 로컬 변경 사항을 체크아웃 때문에 덮어 쓰게 됩니다:\n"
+"%%s"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-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."
+msgstr ""
+"다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다:\n"
+"%%s병합하기 전에 변경 사항을 커밋하거나 스태시하십시오."
 
-#: builtin/add.c:80
+#: unpack-trees.c:71
 #, c-format
-msgid "remove '%s'\n"
-msgstr "'%s' 제거\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr "다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다."
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-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 전에 변경 사항을 커밋하거나 스태시하십시오."
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-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"
 
-#: builtin/add.c:205
+#: unpack-trees.c:81
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "'%s' 파일을 쓰기용으로 열 수 없습니다."
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"다음 디렉터리를 업데이트하면 그 안의 추적하지 않는 파일을 잃어버립니다:\n"
+"%s"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-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."
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일이 제거됩니다:\n"
+"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "패치 편집에 실패했습니다"
+#: unpack-trees.c:87
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%s"
 
-#: builtin/add.c:215
+#: unpack-trees.c:90
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "'%s'을(를) stat()할 수 없습니다"
+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/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "빈 패치. 중지."
+#: unpack-trees.c:92
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%s"
 
-#: builtin/add.c:222
+#: unpack-trees.c:95
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "'%s'을(를) 적용할 수 없습니다"
+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/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "다음 경로는 .gitignore 파일 중 하나 때문에 무시합니다:\n"
+#: unpack-trees.c:97
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더 파일이 제거됩니다:\n"
+"%%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:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-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."
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:\n"
+"%%s브랜치를 전환하기 전에 이 파일을 옮기거나 제거하십시오."
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "자세히 표시"
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"체크아웃 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-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병합하기 전에 이 파일을 옮기거나 제거하십시오."
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "대화식으로 변경된 부분을 선택합니다"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"병합 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "현재 diff를 편집하고 적용합니다"
+#: unpack-trees.c:112
+#, 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:255
-msgid "allow adding otherwise ignored files"
-msgstr "무시하는 파일의 추가를 허용합니다"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"%s 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니다:\n"
+"%%s"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "추적되는 파일을 업데이트합니다"
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "'%s' 항목이 '%s'와(과) 겹칩니다.  묶을 수 없습니다."
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "나중에 추가할 것이라는 사실만 기록합니다"
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"드문 체크아웃을 업데이트할 수 없습니다. 다음 항목이 최신으로 업데이트되지 않"
+"았습니다:\n"
+"%s"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "추적되고 추적되지 않는 모든 파일의 변경 사항을 추가합니다"
+#: unpack-trees.c:126
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 덮어씁니"
+"다:\n"
+"%s"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "작업 폴더에서 제거한 경로를 무시합니다 (--no-all과 동일)"
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"드문 체크아웃 업데이트 때문에 추적하지 않는 다음 작업 폴더 파일을 제거합니"
+"다:\n"
+"%s"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "추가하지 않고 인덱스만 새로 고칩니다"
+#: unpack-trees.c:205
+#, c-format
+msgid "Aborting\n"
+msgstr "중지함\n"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr "오류 때문에 추가할 수 없는 파일을 건너뜁니다"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "파일을 가져옵니다"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "가짜로 실행했을 때 파일을 무시하는지 확인합니다"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
 
-#: builtin/add.c:287
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "정말로 추가하려면 -f 옵션을 사용하십시오.\n"
+msgid "invalid %XX escape sequence"
+msgstr "잘못된 %XX 이스케이프 시퀀스"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "파일 추가가 실패했습니다"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A 및 -u 옵션은 서로 호환되지 않습니다"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "호스트 이름에 잘못된 문자"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
-"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "잘못된 포트 번호"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "경로에서 잘못된 '..' 부분"
 
-#: builtin/add.c:352
+#: worktree.c:282
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
+msgid "failed to read '%s'"
+msgstr "'%s'을(를) 읽는데 실패했습니다"
 
-#: builtin/add.c:353
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
+msgid "could not open '%s' for reading and writing"
+msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "인덱스 파일이 손상되었습니다"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-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/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "could not read '%s'"
-msgstr "'%s'에서 읽을 수 없습니다"
+msgid "unable to access '%s'"
+msgstr "'%s'에 접근할 수 없습니다"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "작성자 스크립트를 파싱할 수 없습니다"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
 
-#: builtin/am.c:507
+#: wrapper.c:658
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
+msgid "could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: wrapper.c:660
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "잘못된 형식의 입력 줄: '%s'."
+msgid "could not close %s"
+msgstr "%s을(를) 닫을 수 없습니다"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "병합하지 않은 경로:"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "fseek 실패"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:772 builtin/am.c:860
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "'%s'을(를) 읽기용으로 열 수 없습니다: %s"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다: %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/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "'%s' 패치를 파싱할 수 없습니다"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "커밋할 변경 사항:"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "ì\8b\9cê°\81ì\9d´ ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "커ë°\8bí\95\98ë\8f\84ë¡\9d ì \95í\95\98ì§\80 ì\95\8aì\9d\80 ë³\80ê²½ ì\82¬í\95­:"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "Date 줄이 잘못되었습니다"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "시간대 오프셋이 잘못되었습니다"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "패치 형식 검색이 실패했습니다."
+#: 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 ""
+"  (하위 모듈의 추적되지 않는 파일이나 수정된 내용을 커밋하거나 버리십시오)"
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: wt-status.c:238
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "'%s' 디렉터리 만들기가 실패했습니다"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "패치를 쪼개는데 실패했습니다."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "양쪽에서 삭제:"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "ì\9d¸ë\8d±ì\8a¤ í\8c\8cì\9d¼ì\9d\84 ì\93¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "ì\9d´ ìª½ì\97\90ì\84\9c ì¶\94ê°\80:"
 
-#: builtin/am.c:1188
-#, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "이 문제를 해결했을 때 \"%s --continue\"를 실행하십시오."
+#: wt-status.c:257
+msgid "deleted by them:"
+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:259
+msgid "added by them:"
+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:261
+msgid "deleted by us:"
+msgstr "이 쪽에서 삭제:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "양쪽에서 추가:"
 
-#: builtin/am.c:1402 builtin/log.c:1350
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "잘못된 신원 줄: %s"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "양쪽에서 수정:"
 
-#: builtin/am.c:1429
-#, c-format
-msgid "unable to parse commit %s"
-msgstr "%s 커밋을 파싱할 수 없습니다"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "새 파일:"
 
-#: builtin/am.c:1631
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "복사함:"
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr "ì\9d¸ë\8d±ì\8a¤ ì \95보를 ì\82¬ì\9a©í\95´ ê¸°ë³¸ í\8a¸ë¦¬ë¥¼ ë\8b¤ì\8b\9c ë§\8cë\93­ë\8b\88ë\8b¤..."
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "ì\82­ì \9cí\95¨:"
 
-#: builtin/am.c:1652
-msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr ""
-"패치를 직접 편집하셨습니까?\n"
-"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "수정함:"
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "이름 바꿈:"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "변경 사항에서 병합하는데 실패했습니다."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "종류 바뀜:"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "알 수 없음:"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "ë¹\88 ì»¤ë°\8b ë\82´ì\97­ì\97\90 ë\8c\80í\95´ ì \81ì\9a©í\95©ë\8b\88ë\8b¤"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "ë³\91í\95©í\95\98ì§\80 ì\95\8aì\9d\8c:"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "커밋 오브젝트를 쓰는데 실패했습니다"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "새 커밋, "
 
-#: builtin/am.c:1749 builtin/am.c:1753
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "수정한 내용, "
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
+#: 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"
+"아래 있는 내용은 모두 제거됩니다."
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "커밋 본문은:"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+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:1784
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
 
-#: builtin/am.c:1834
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (병합을 중단하려면 \"git merge --abort\"를 사용하십시오)"
 
-#: builtin/am.c:1869 builtin/am.c:1941
-#, c-format
-msgid "Applying: %.*s"
-msgstr "적용하는 중: %.*s"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "변경 사항 없음 -- 패치가 이미 적용되었습니다."
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
 
-#: builtin/am.c:1893
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "패치가 %s %.*s 위치에서 실패했습니다"
+#: 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 "현재 패치가 비어 있습니다."
 
-#: builtin/am.c:1899
-#, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %s"
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
 
-#: builtin/am.c:1944
-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"
-"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"인덱스에 병합하지 않은 경로가 남아 있습니다.\n"
-"'git add' 사용을 잊지 않으셨습니까?"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "완료한 명령 없음."
+
+#: wt-status.c:1175
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
 
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "인덱스 지우기에 실패했습니다"
+#: wt-status.c:1186
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (자세한 정보는 %s 파일 참고)"
 
-#: builtin/am.c:2145
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr ""
-"마지막 'am' 실패 이후 HEAD를 옮긴 것 같습니다.\n"
-"ORIG_HEAD로 되돌리지 않습니다."
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "명령이 남아있지 않음."
 
-#: builtin/am.c:2206
+#: wt-status.c:1194
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "--patch-format 옵션에 대해 잘못된 값: %s"
-
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<옵션>] [(<mbox>|<Maildir>)...]"
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "다음에 할 명령 (%d개 명령 남음):"
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<옵션>] (--continue | --skip | --abort)"
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "대화형으로 실행합니다"
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "아무 동작도 하지 않습니다 (과거부터 있었던 옵션)"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "현재 리베이스하는 중입니다."
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "간략히 표시합니다"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
-msgstr "커밋 메시지에 Signed-off-by 줄을 남깁니다"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "git-mailinfo에 -k 옵션을 씁니다"
+#: 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:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "git-mailinfo에 -b 옵션을 씁니다"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "현재 리베이스하는 중 커밋을 분리하는 중입니다."
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "git-mailinfo에 -m 옵션을 씁니다"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2264
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-"am.keepcr에 무관하게 git-mailsplit에 --keep-cr 옵션을 사용하지 않습니다."
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "리베이스 중에 커밋을 편집하는 중입니다."
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "절취선 앞의 모든 사항을 무시합니다"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "동작"
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "git-apply에 넘깁니다"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "최상위"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "경로"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131 builtin/pull.c:185
-#: 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:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (뽑기 작업을 취소하려면 \"git cherry-pick --abort\"를 사용하십시오)"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "개수"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "현재 %s 커밋을 되돌리는 중입니다."
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "형식"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "패치의 형식"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git revert --continue\"를 실행하십시오)"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "충돌을 해결한 다음 패치 적용을 계속합니다"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "--continue 옵션과 동일"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "'이등분하는 중입니다."
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "현재 패치 건너뛰기"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
 
-#: builtin/am.c:2313
-msgid "restore the original branch and abort the patching operation."
-msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "현재 브랜치 "
 
-# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
-# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "커미터 시각을 작성자 시각으로 넣습니다"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "대화형 리베이스 진행 중. 갈 위치는 "
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "현재 시각을 작성자 시각으로 사용합니다"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "리베이스 진행 중. 갈 위치는 "
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "키-ID"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD가 다음 위치에서 분리: "
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "GPG 서명 커밋"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD가 다음으로부터 분리: "
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(git-rebase를 위한 내부 용도)"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "현재 어떤 브랜치도 사용하지 않음."
 
-#: builtin/am.c:2340
-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"
-"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "최초 커밋"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "ì\9d¸ë\8d±ì\8a¤ ì\9d½ê¸°ì\97\90 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "ì\94ì \81í\95\98ì§\80 ì\95\8aë\8a\94 í\8c\8cì\9d¼"
 
-#: builtin/am.c:2362
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "무시한 파일"
 
-#: builtin/am.c:2386
+#: wt-status.c:1580
 #, 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 ""
-"벗어난 %s 디렉터리가 발견되었습니다.\n"
-"제거하려면 \"git am --abort\"를 사용하십시오."
-
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "해소 작업이 진행 중입니다. 다시 시작하지 않습니다."
-
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<옵션>] [<패치>...]"
+"추적하지 않는 파일을 모두 확인하는데 %.2f초가 걸렸습니다.\n"
+"'status -uno' 옵션을 쓰면 빨라질 수도 있지만, 새 파일을\n"
+"직접 찾아서 추가해야 합니다. ('git help status' 참고)"
 
-#: builtin/apply.c:111
+#: wt-status.c:1586
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "ì\95\8c ì\88\98 ì\97\86ë\8a\94 ê³µë°± ì\98µì\85\98 '%s'"
+msgid "Untracked files not listed%s"
+msgstr "ì\94ì \81í\95\98ì§\80 ì\95\8aë\8a\94 í\8c\8cì\9d¼ì\9d\84 ë³´ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤%s"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "알 수 없는 공백 무시 옵션 '%s'"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "변경 사항 없음"
 
-#: builtin/apply.c:827
+#: wt-status.c:1599
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"커밋할 변경 사항을 추가하지 않았습니다 (\"git add\" 및/또는 \"git commit -a"
+"\"를\n"
+"사용하십시오)\n"
 
-#: builtin/apply.c:908
+#: wt-status.c:1602
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
+msgid "no changes added to commit\n"
+msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
 
-#: builtin/apply.c:940
+#: wt-status.c:1605
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이"
-"(가) 왔습니다"
+"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
+"\"git\n"
+"add\"를 사용하십시오)\n"
 
-#: builtin/apply.c:944
+#: wt-status.c:1608
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-"git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다\n"
 
-#: builtin/apply.c:945
+#: wt-status.c:1611
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
+"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
+"다)\n"
 
-#: builtin/apply.c:952
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
+msgid "nothing to commit\n"
+msgstr "커밋할 사항 없음\n"
 
-#: builtin/apply.c:1415
+#: wt-status.c:1617
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: 예상치 못한 줄: %.*s"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
 
-#: builtin/apply.c:1472
+#: wt-status.c:1621
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
+msgid "nothing to commit, working tree clean\n"
+msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
 
-#: builtin/apply.c:1489
-#, 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번 줄)"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "최초 커밋, 브랜치: "
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "새 파일이 예전 내용에 의존합니다"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (브랜치 없음)"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "ì\82­ì \9cí\95\9c í\8c\8cì\9d¼ì\97\90 ì\95\84ì§\81 ë\82´ì\9a©ì\9d´ ë\93¤ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "ì\97\86ì\9d\8c"
 
-#: builtin/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "패치가 %d번 줄에서 망가졌습니다"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "다음 뒤에: "
 
-#: builtin/apply.c:1719
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "새 파일 %s이(가) 예전 내용에 의존합니다"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "다음 앞에: "
 
-#: builtin/apply.c:1721
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "삭제한 파일 %s이(가) 아직 내용이 들어 있습니다"
+msgid "cannot %s: You have unstaged changes."
+msgstr "%s 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
 
-#: builtin/apply.c:1724
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
 
-#: builtin/apply.c:1870
+#: wt-status.c:2278
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "%s 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
 
-#: builtin/apply.c:1899
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
+msgid "failed to unlink '%s'"
+msgstr "'%s' 파일 삭제에 실패했습니다"
 
-#: builtin/apply.c:2050
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<옵션>] [--] <경로명세>..."
 
-#: builtin/apply.c:2140
+#: builtin/add.c:80
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
+msgid "unexpected diff status %c"
+msgstr "예상치 못한 diff 상태 %c"
 
-#: builtin/apply.c:2144
-#, c-format
-msgid "unable to open or read %s"
-msgstr "%s을(를) 열거나 읽을 수 없습니다"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "파일 업데이트가 실패했습니다"
 
-#: builtin/apply.c:2777
+#: builtin/add.c:95
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "줄 시작이 잘못됨: '%c'"
+msgid "remove '%s'\n"
+msgstr "'%s' 제거\n"
 
-#: builtin/apply.c:2896
-#, 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줄)"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "인덱스를 새로 고친 다음 커밋 표시하지 않은 변경 사항:"
 
-#: builtin/apply.c:2908
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/apply.c:2914
+#: builtin/add.c:220
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"다음을 검색하던 중:\n"
-"%.*s"
+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/apply.c:2934
+#: builtin/add.c:230
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "'%s'ì\97\90 ë\8c\80í\95\9c ë°\94ì\9d´ë\84\88리 í\8c¨ì¹\98 ë\8d°ì\9d´í\84°ê°\80 없습니다"
+msgid "Could not stat '%s'"
+msgstr "'%s'ì\9d\84(를) stat()í\95  ì\88\98 없습니다"
 
-#: builtin/apply.c:3035
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "빈 패치. 중지."
+
+#: builtin/add.c:237
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
+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: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/add.c:269
+msgid "interactive picking"
+msgstr "대화식으로 고릅니다"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "대화식으로 변경된 부분을 선택합니다"
+
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "현재 diff를 편집하고 적용합니다"
+
+#: 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/apply.c:3041
+#: 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:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "목록의 파일에서 실행 가능 비트를 바꿉니다"
+
+#: builtin/add.c:305
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+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 ""
-"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
-"제 %s)"
+"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
 
-#: builtin/apply.c:3062
+#: builtin/add.c:359
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "패치 실패: %s:%ld"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod 파라미터 '%s'은(는) -x 또는 +x 형식이어야 합니다"
 
-#: builtin/apply.c:3186
+#: builtin/add.c:374
 #, c-format
-msgid "cannot checkout %s"
-msgstr "%s을(를) 가져올 수 없습니다"
+msgid "Nothing specified, nothing added.\n"
+msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/add.c:375
 #, c-format
-msgid "read of %s failed"
-msgstr "%s 읽기가 실패했습니다"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
 
-#: builtin/apply.c:3239
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-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:131 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:244
+msgid "index file corrupt"
+msgstr "인덱스 파일이 손상되었습니다"
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "%s 경로가 이름이 바뀌었거나 삭제되었습니다"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "작성자 스크립트를 파싱할 수 없습니다"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: builtin/am.c:491
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: 인덱스에 없습니다"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: builtin/am.c:532
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "Malformed input line: '%s'."
+msgstr "잘못된 형식의 입력 줄: '%s'."
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/am.c:569
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: 인덱스와 맞지 않습니다"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek 실패"
 
-#: builtin/apply.c:3528
+#: builtin/am.c:775
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: 잘못된 종류"
+msgid "could not parse patch '%s'"
+msgstr "'%s' 패치를 파싱할 수 없습니다"
+
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
+
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "시각이 잘못되었습니다"
+
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "Date 줄이 잘못되었습니다"
 
-#: builtin/apply.c:3530
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "시간대 오프셋이 잘못되었습니다"
+
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "패치 형식 검색이 실패했습니다."
+
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
+msgid "failed to create directory '%s'"
+msgstr "'%s' 디렉터리 만들기가 실패했습니다"
+
+#: 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/apply.c:3689 builtin/apply.c:3691
+#: builtin/am.c:1176
 #, c-format
-msgid "invalid path '%s'"
-msgstr "ì\9e\98못ë\90\9c ê²½ë¡\9c '%s'"
+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¤."
 
-#: builtin/apply.c:3746
+#: builtin/am.c:1177
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: 이미 인덱스에 있습니다"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "이 패치를 건너뛰려면, 그 대신 \"%s --skip\"을 실행하십시오."
 
-#: builtin/apply.c:3749
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: 이미 작업 디렉터리에 있습니다"
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"원래 브랜치를 복구하고 패치 적용을 중지하려면 \"%s --abort\"를 실행하십시오."
 
-#: builtin/apply.c:3769
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
 
-#: builtin/apply.c:3774
+#: builtin/am.c:1390 builtin/log.c:1550
 #, 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 "invalid ident line: %s"
+msgstr "잘못된 신원 줄: %s"
 
-#: builtin/apply.c:3794
+#: builtin/am.c:1417
 #, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "영향 받는 '%s' 파일이 심볼릭 링크 뒤에 있습니다"
+msgid "unable to parse commit %s"
+msgstr "%s 커밋을 파싱할 수 없습니다"
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: 패치를 적용하지 않습니다"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
 
-#: builtin/apply.c:3812
-#, c-format
-msgid "Checking patch %s..."
-msgstr "%s 패치를 확인하는 중입니다..."
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "인덱스 정보를 사용해 기본 트리를 다시 만듭니다..."
 
-#: builtin/apply.c:3905 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:1631
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"패치를 직접 편집하셨습니까?\n"
+"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
 
-#: builtin/apply.c:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
 
-#: builtin/apply.c:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "하위 모듈 %s에 대해 손상된 패치"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "변경 사항에서 병합하는데 실패했습니다."
 
-#: builtin/apply.c:4081
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
 
-#: builtin/apply.c:4086
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "새로 만든 파일 '%s'에 대해 예비 저장소를 만들 수 없습니다"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "빈 커밋 내역에 대해 적용합니다"
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
-#, c-format
-msgid "unable to add cache entry for %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:4122
+#: builtin/am.c:1739 builtin/am.c:1743
 #, c-format
-msgid "closing file '%s'"
-msgstr "'%s' 파일을 닫는 중입니다"
+msgid "cannot resume: %s does not exist."
+msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
+
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"터미널에 표준 입력이 연결되지 않은 상태에서 대화형으로 실행할 수 없습니다."
+
+#: builtin/am.c:1764
+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:1774
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
 
-#: builtin/apply.c:4171
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
 
-#: builtin/apply.c:4258
+#: 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:4266
-msgid "internal error"
-msgstr "ë\82´ë¶\80 ì\98¤ë¥\98"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "ë³\80ê²½ ì\82¬í\95­ ì\97\86ì\9d\8c -- í\8c¨ì¹\98ê°\80 ì\9d´ë¯¸ ì \81ì\9a©ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤."
 
-#: builtin/apply.c:4269
+#: 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개 거부) 적용..."
+msgid "Patch failed at %s %.*s"
+msgstr "패치가 %s %.*s 위치에서 실패했습니다"
 
-#: builtin/apply.c:4279
+#: builtin/am.c:1891
 #, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %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"
+"커밋으로 표시할 사항이 남아 있지 않으면, 이미 같은 패치에서 적용된\n"
+"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
+
+#: 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:4300
+#: 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 "패치 부위 #%d 깔끔하게 적용."
+msgid "Could not parse object '%s'."
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
+
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "인덱스 지우기에 실패했습니다"
 
-#: builtin/apply.c:4303
+#: 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/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:4393
-msgid "unrecognized input"
-msgstr "인식할 수 없는 입력"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<옵션>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4404
-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:4507
-msgid "don't apply changes matching the given path"
-msgstr "주어진 경로에 해당하는 변경 사항을 적용하지 않습니다"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "대화형으로 실행합니다"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "주ì\96´ì§\84 ê²½ë¡\9cì\97\90 í\95´ë\8b¹í\95\98ë\8a\94 ë³\80ê²½ ì\82¬í\95­ì\9d\84 ì \81ì\9a©í\95©ë\8b\88ë\8b¤"
+#: 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:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
 
-#: builtin/apply.c:4516
-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:4518
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "커밋 메시지에 Signed-off-by 줄을 남깁니다"
 
-#: builtin/apply.c:4522
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "십진수로 추가 및 삭제한 줄 수를 표시합니다"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
 
-#: builtin/apply.c:4524
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "패치를 적용하는 대신, 입력에 대한 요약을 출력합니다"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "git-mailinfo에 -k 옵션을 씁니다"
 
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "패치를 적용하는 대신, 패치를 적용 가능한지 확인합니다"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "git-mailinfo에 -b 옵션을 씁니다"
 
-#: builtin/apply.c:4528
-msgid "make sure the patch is applicable to the current index"
-msgstr "현재 인덱스에서 패치가 적용 가능한지 확인합니다"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "git-mailinfo에 -m 옵션을 씁니다"
 
-#: builtin/apply.c:4530
-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 "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-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:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "그리고 패치도 적용합니다 (--stat/--summary/--check 옵션과 같이 사용)"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "절취선 앞의 모든 사항을 무시합니다"
 
-#: builtin/apply.c:4536
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "패치를 적용하지 않으면 3-방향 병합을 시도합니다"
+#: 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:4538
-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:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "경로를 NUL 문자로 구분합니다"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "형식"
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "최소한 <n>줄이 컨텍스트와 일치하는지 확인합니다"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "패치의 형식"
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "공백 오류가 있는 추가됐거나 수정된 줄을 찾습니다"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "컨í\85\8dì\8a¤í\8a¸ë¥¼ ì°¾ì\9d\84 ë\95\8c ê³µë°± ë³\80ê²½ ì\82¬í\95­ì\9d\84 ë¬´ì\8b\9c합니다"
+#: 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:4554
-msgid "apply the patch in reverse"
-msgstr "패치를 반대 순서로 적용합니다"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "--continue 옵션과 동일"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "최소한의 컨텍스트 한 줄도 없이 적용합니다"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "현재 패치 건너뛰기"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "거부된 패치 부분을 대응되는 *.rej 파일에 남겨둡니다"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "패치 부분이 겹쳐도 허용합니다"
+# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
+# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "커미터 시각을 작성자 시각으로 넣습니다"
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "í\8c\8cì\9d¼ ë\81\9dì\97\90 ì¤\84ë°\94ê¿\88ì\9d´ ë¹ ì¡\8cì\9d\8cì\9d\84 ì\9e\98못 ê²\80ì\83\89í\95\9c ê²½ì\9a°ì\97\90 ë¬´ì\8b\9c합니다"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "í\98\84ì\9e¬ ì\8b\9cê°\81ì\9d\84 ì\9e\91ì\84±ì\9e\90 ì\8b\9cê°\81ì\9c¼ë¡\9c ì\82¬ì\9a©합니다"
 
-#: builtin/apply.c:4566
-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 "키-ID"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "모든 파일 이름에 <최상위>를 앞에 붙입니다"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "GPG 서명 커밋"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "저장소 밖에서 --3way 옵션 사용"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(git-rebase를 위한 내부 용도)"
 
-#: builtin/apply.c:4599
-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 옵션은 오랜 시간 동안 아무 동작도 하지 않았으므로, 이\n"
+"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "ì \80ì\9e¥ì\86\8c ë°\96ì\97\90ì\84\9c --cached ì\98µì\85\98 ì\82¬ì\9a©"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "ì\9d¸ë\8d±ì\8a¤ ì\9d½ê¸°ì\97\90 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
 
-#: builtin/apply.c:4621
+#: builtin/am.c:2356
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "'%s' 패치를 열 수 없습니다"
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2380
 #, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "공백 오류 %d개를 넘어갑니다"
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"벗어난 %s 디렉터리가 발견되었습니다.\n"
+"제거하려면 \"git am --abort\"를 사용하십시오."
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%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
@@ -3421,137 +4541,186 @@ msgstr "git blame [<옵션>] [<리비전-옵션>] [<리비전>] [--] <파일>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<리비전-옵션>은 git-rev-list(1)에 설명되어 있습니다"
 
-#: builtin/blame.c:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "블레임 줄"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "블레임 항목을 찾자마자 점진적으로 표시합니다"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "가장자리 커밋에 대해 빈 SHA-1을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "최상위 커밋을 가장자리 커밋으로 취급하지 않습니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "작업 비용 통계를 표시합니다"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "강제로 진행 상황을 표시합니다"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "블레임 항목에 대해 출력 점수를 표시합니다"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "원래 파일 이름 표시 (기본값: 자동)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "원래 줄 번호 표시 (기본값: 하지 않음)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "컴퓨터 처리용으로 설계된 형식으로 표시합니다"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "줄마다 커밋 정보가 표시되는 사용자용 형식으로 표시합니다"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "git-annotate와 동일한 형식을 사용합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "내부 형식으로 시각을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "길게 커밋 SHA1을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "작성자 이름과 시각을 표시하지 않습니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr "작성자 이름 대신에 전자메일을 표시합니다 (기본값: 꺼짐)"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "공백 문자 차이점을 무시합니다"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr "diff를 향상하는데 실험적인 들여쓰기 기반 휴리스틱을 사용합니다."
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr "diff를 향상하는데 실험적인 빈 줄 기반 휴리스틱을 사용합니다."
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "더 일치하는 항목을 찾는데 더 시간을 소모합니다"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "git-rev-list를 호출하는 대신 <파일>에서 리비전을 사용합니다"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "<파일>의 내용을 최종 이미지로 사용합니다"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "점수"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "파일 내부와 파일 사이의 복사된 줄을 찾습니다"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "파일 내부와 파일 사이의 옮겨진 줄을 찾습니다"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "n,m줄 (1번 줄부터 시작) 사이의 범위만 처리"
 
+#: builtin/blame.c:2654
+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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "4년 11달 전"
 
-#: builtin/branch.c:25
+#: 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개 뿐입니다"
+
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<옵션>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<옵션>] [-l] [-f] <브랜치-이름> [<시작-지점>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<옵션>] [-r] (-d | -D) <브랜치-이름>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<옵션>] (-m | -M) [<과거-브랜치>] <새-브랜치>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<옵션>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3560,7 +4729,7 @@ msgstr ""
 "'%s' 브랜치를 삭제합니다. 이 브랜치는 '%s'에\n"
 "         병합되었지만, HEAD에는 병합되지 않았습니다."
 
-#: builtin/branch.c:146
+#: builtin/branch.c:147
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3569,12 +4738,12 @@ msgstr ""
 "'%s' 브랜치를 삭제하지 않습니다. 이 브랜치는 '%s'에\n"
 "         병합되지 않았지만, HEAD에는 병합되었습니다."
 
-#: builtin/branch.c:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "'%s'에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
 
-#: builtin/branch.c:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3583,299 +4752,331 @@ msgstr ""
 "'%s' 브랜치가 완전히 병합되지 않았습니다.\n"
 "정말로 삭제하려면 'git branch -D %s' 명령을 실행하십시오."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "config-file 업데이트가 실패했습니다"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "-a 옵션을 -d 옵션과 같이 쓸 수 없습니다"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "HEAD에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "'%s' 브랜치는 현재 위치한 브랜치이기 때문에 삭제할 수 없습니다."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "'%2$s' 위치에 체크아웃한 '%1$s' 브랜치를 삭제할 수 없습니다"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "리모트 추적 '%s' 브랜치가 없습니다."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "'%s' 브랜치가 없습니다."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "리모트 추적 '%s' 브랜치를 삭제하는데 오류"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "'%s' 브랜치를 삭제하는데 오류"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "리모트 추적 '%s' 브랜치를 삭제합니다. (과거 %s)\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "%s 브랜치 삭제 (과거 %s).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: 사라짐]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: %d개 뒤]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[%d개 뒤]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: %d개 앞]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[%d개 앞]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: %d개 앞, %d개 뒤]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[%d개 앞, %d개 뒤]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** 잘못된 레퍼런스 ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(브랜치 없음, %s 리베이스)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(브랜치 없음, 이등분 %s에서 시작)"
 
-#: builtin/branch.c:375
+#. 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 %s 위치에서 분리됨)"
 
-#: builtin/branch.c:378
+#. 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 %s(으)로부터 분리됨)"
 
-#: builtin/branch.c:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(브랜치 없음)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "%s 브랜치를 %s 위치에 리베이스합니다"
+
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "%s 브랜치를 %s 위치에서 bisect합니다"
+
+#: builtin/branch.c:563
 msgid "cannot rename the current branch while not on any."
 msgstr "브랜치 위에 없으면서 현재 브랜치 이름을 바꿀 수 없습니다."
 
-#: builtin/branch.c:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "잘못된 브랜치 이름: '%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "브랜치 이름 바꾸기 실패"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "이름이 잘못된 '%s' 브랜치의 이름을 다르게 바꿉니다"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "브랜치 이름을 %s(으)로 바꾸지만, HEAD를 업데이트하지 않습니다!"
 
-#: builtin/branch.c:564
+#: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "브랜치의 이름을 바꾸지만, config-file 업데이트가 실패했습니다"
 
-#: builtin/branch.c:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "브랜치 설명 서식을 쓸 수 없습니다: %s"
+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:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "일반 옵션"
 
 # FIXME: give twice?
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "해시와 제목을 표시하고, 업스트림 브랜치에 대한 위치를 표시합니다"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "여러가지 안내 메시지를 표시하지 않습니다"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "추적 모드를 설정합니다 (git-pull(1) 참고)"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "업스트림 정보를 바꿉니다"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "업스트림"
+
+#: builtin/branch.c:659
+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 "여러 색으로 출력합니다"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "리모트 추적 브랜치에 대해 동작합니다"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "커밋이 있는 브랜치만 표시합니다"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "특정 git-branch 동작:"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "리모트와 로컬의 브랜치 목록을 모두 표시합니다"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "완전히 병합된 브랜치를 삭제합니다"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "브랜치를 삭제합니다 (병합되지 않았더라도)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "브랜치와 그 reflog를 옮기거나 이름을 바꿉니다"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "대상이 이미 있더라도 브랜치를 옮기거나 이름을 바꿉니다"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "브랜치 이름 목록을 표시합니다"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "브랜치의 reflog를 만듭니다"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "브랜치의 설명을 편집합니다"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "강제로 만들고, 옮기거나 이름을 바꾸고, 삭제합니다"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "병합되는 브랜치만 표시합니다"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "병합되지 않는 브랜치만 표시합니다"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "목록을 여러 열로 표시합니다"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "키"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "정렬한 기준이 되는 필드 이름"
 
-#: builtin/branch.c:650 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 "오브젝트"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "해당 오브젝트의 브랜치만 표시합니다"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "HEAD를 올바른 레퍼런스로 구해내는데 실패했습니다."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "레퍼런스/헤드 아래에 HEAD가 없습니다!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column 및 --verbose 옵션은 호환되지 않습니다"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "브랜치 이름이 필요합니다"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "분리된 HEAD에 대한 설명을 부여할 수 없습니다"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "여러 브랜치에 대한 설명을 편집할 수 없습니다"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "아직 '%s' 브랜치에 커밋이 없습니다."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "이름이 '%s'인 브랜치가 없습니다."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "이름 바꾸기 작업에 대해 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "새 업스트림을 설정하는데 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3883,41 +5084,41 @@ msgstr ""
 "HEAD의 업스트림을 %s(으)로 설정할 수 없습니다. 어떤 브랜치도 가리키지 않습니"
 "다."
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "그런 브랜치가 ('%s') 없습니다"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "'%s' 브랜치가 없습니다"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "업스트림 설정을 해제하는데 브랜치가 너무 많습니다"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr ""
 "HEAD의 업스트림 설정을 해제할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
 
-#: builtin/branch.c:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "'%s' 브랜치에 업스트림 정보가 없습니다"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "'HEAD'를 수동으로 만드는 건 앞뒤가 맞지 않습니다"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "'git branch'에 대해 -a 및 -r 옵션은 브랜치 이름과 같이 쓰면 앞뒤가 맞지 않습"
 "니다"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3926,7 +5127,7 @@ msgstr ""
 "--set-upstream 옵션은 더 이상 사용되지 않고 제거될 예정입니다. --track 또는 "
 "--set-upstream-to 옵션을 사용해 보십시오\n"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -3936,16 +5137,6 @@ msgstr ""
 "\n"
 "'%s'을(를) 만들고 '%s'을(를) 추적하게 하려면, 다음을 하십시오:\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -3959,64 +5150,80 @@ 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>"
+"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: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 "오류가 없을 때 0을 리턴하고 끝냅니다"
 
-#: 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 "블롭 오브젝트에 대해서는, 오브젝트의 내용에 대해 textconv를 실행합니다"
 
-#: 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에서 모든 오브젝트를 표시합니다"
 
@@ -4036,7 +5243,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 "표준 입력에서 파일 이름을 읽습니다"
 
@@ -4044,7 +5251,7 @@ msgstr "표준 입력에서 파일 이름을 읽습니다"
 msgid "terminate input and output records by a NUL character"
 msgstr "NUL 문자를 기준으로 자료 입력 및 출력을 멈춥니다"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "진행 상황 표시를 하지 않습니다"
 
@@ -4134,8 +5341,9 @@ msgid "write the content to temporary files"
 msgstr "내용을 임시 파일에 씁니다"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "문자열"
 
@@ -4185,79 +5393,75 @@ msgstr "'%s' 경로: 병합할 수 없습니다"
 msgid "Unable to add merge result for '%s'"
 msgstr "'%s'에 대한 병합 결과를 추가할 수 없습니다"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' 옵션은 %s 옵션과 같이 쓸 수 없습니다"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "경로를 업데이트하고 '%s' 브랜치로 전환하는 일은 동시에 할 수 없습니다."
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "손상된 인덱스 파일"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "'%s' 경로를 병합하지 않았습니다"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "현재 인덱스를 먼저 해결해야 합니다"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "'%s'에 대해 reflog할 수 없습니다: %s\n"
 
-#: builtin/checkout.c:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD의 현재 위치는"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "HEAD를 업데이트할 수 없습니다"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "'%s' 브랜치 리셋\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "이미 '%s'에 있습니다\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "'%s' 브랜치로 전환하고 리셋합니다\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "새로 만든 '%s' 브랜치로 전환합니다\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "'%s' 브랜치로 전환합니다\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 그리고 %d개 더.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4275,7 +5479,7 @@ msgstr[0] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4296,151 +5500,151 @@ msgstr[0] ""
 " git branch <새-브랜치-이름> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "리비전 walk에 내부 오류"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "이전 HEAD 위치는"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "현재 위치가 만들 예정인 브랜치에 있습니다"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "하나의 레퍼런스만 지정해야 하지만 %d개를 지정했습니다."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "잘못된 레퍼런스: %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "레퍼런스가 트리가 아닙니다: %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "브랜치를 전환하는데 경로를 사용할 수 없습니다"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 옵션은 브랜치를 전환할 때 쓸 수 없습니다"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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:1104
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "브랜치를 커밋이 아닌 '%s'(으)로 전환할 수 없습니다"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "새 브랜치를 만들고 가져옵니다"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "브랜치를 만들거나 리셋하고 가져옵니다"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "새 브랜치에 대한 reflog를 만듭니다"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "지정한 커밋에서 HEAD를 분리합니다"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "HEAD를 해당 커밋에서 분리합니다"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "새 브랜치에 대한 업스트림 정보를 설정합니다"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "새-브랜치"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "상위 브랜치가 없는 새 브랜치"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "병합되지 않은 파일에 대해 우리쪽 버전을 가져옵니다"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "병합되지 않은 파일에 대해 상대편 버전을 가져옵니다"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "강제로 체크아웃합니다 (로컬에서 수정한 사항을 버립니다)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "새 브랜치에 대해 3-방향 병합을 수행합니다"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "무시하는 파일을 업데이트합니다 (기본값)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "스타일"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "충돌 스타일 (merge 또는 diff3)"
 
 # FIXME: 의미 불명
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "경로명세를 드문 항목에만 제한하지 않습니다"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "'git checkout <없는-브랜치>'에 대해 추측합니다"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "다른 작업폴더에 주어진 레퍼런스가 있는지 확인하지 않습니다"
 
-#: builtin/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B 및 --orphan 옵션은 서로 호환되지 않습니다"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track 옵션은 브랜치 이름이 필요합니다"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "브랜치 이름이 없습니다. -b 옵션을 사용해 보십시오"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "경로 명세가 잘못되었습니다"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4449,12 +5653,12 @@ msgstr ""
 "동시에 경로를 업데이트하고 '%s' 브랜치로 전환할 수 없습니다.\n"
 "커밋을 확인할 수 없는 '%s'을(를) 가져오려고 하셨습니까?"
 
-#: builtin/checkout.c:1263
+#: 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4605,8 +5809,8 @@ msgstr "대화형 지우기"
 msgid "remove whole directories"
 msgstr "전체 디렉터리 제거"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "패턴"
 
@@ -4646,103 +5850,130 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<옵션>] [--] <저장소> [<디렉터리>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "체크아웃을 만들지 않습니다"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "간략한 저장소를 만듭니다"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "미러 저장소를 만듭니다 (간략한 저장소로 취급)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "로컬 저장소에서 복제합니다"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "로컬 하드링크를 사용하지 않고, 항상 복사합니다"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "공유 저장소로 설정합니다"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "복제한 결과물에서 하위 모듈을 초기화합니다"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "병렬적으로 복제하는 하위모듈 개수"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "서식-디렉터리"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "서식을 사용할 디렉터리 위치"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
+#: 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:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "복제할 경우에만 --reference를 사용합니다"
 
-#: builtin/clone.c:82 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:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "업스트림 추적에 'origin' 대신 <이름>을 사용합니다"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "리모트의 HEAD 대신 <브랜치>를 가져옵니다"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "리모트의 git-upload-pack 경로"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665 builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "깊이"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "지정한 깊이의 얕은 복제를 만듭니다"
 
-#: builtin/clone.c:91
+#: 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:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "모든 복제한 하위 모듈은 얕은 모듈입니다"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "깃 디렉터리를 작업 폴더와 별개의 위치에 놓습니다"
 
-#: builtin/clone.c:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "키=값"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "새 저장소 안에서 설정합니다"
 
-#: builtin/clone.c:96 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:98 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:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4750,58 +5981,42 @@ msgstr ""
 "디렉터리 이름을 알아낼 수 없습니다.\n"
 "명령행에서 디렉터리를 지정하십시오"
 
-#: builtin/clone.c:305
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-"레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
-
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
-
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
-
-#: builtin/clone.c:315
+#: 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "'%s'ì\97\90 ë\8c\80í\95´ stat()ì\9d´ ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤"
+msgid "failed to open '%s'"
+msgstr "'%s'ì\9d\84(를) ì\97¬ë\8a\94ë\8d° ì\8b¤í\8c¨"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "'%s'이(가) 있지만 디렉터리가 아닙니다"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "'%s'에 대해 stat()이 실패했습니다\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "'%s' 링크를 만드는데 실패했습니다"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "파일을 '%s'(으)로 복사하는데 실패했습니다"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "완료.\n"
 
-#: builtin/clone.c:459
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4811,127 +6026,142 @@ msgstr ""
 "'git status' 명령으로 무엇을 체크아웃했는지 살펴볼 수 있고\n"
 "'git checkout -f HEAD'로 체크아웃을 다시 할 수 있습니다\n"
 
-#: builtin/clone.c:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "복제할 리모트의 %s 브랜치를 찾을 수 없습니다."
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "연결을 확인하는 중입니다..."
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "리모트에서 필요한 오브젝트를 모두 보내지 않았습니다"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "%s을(를) 업데이트할 수 없습니다"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "리모트 HEAD가 없는 레퍼런스를 참고하므로, 체크아웃할 수 없습니다.\n"
 
-#: builtin/clone.c:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "작업 폴더를 체크아웃할 수 없습니다"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "파라미터를 설정 파일에 쓸 수 없습니다"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "정리용으로 repack할 수 없습니다"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "보조 임시 파일을 삭제할 수 없습니다"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "너무 인자가 많습니다."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "복제할 저장소를 지정해야 합니다."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare 및 --origin %s 옵션은 호환되지 않습니다."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare 및 --separate-git-dir 옵션은 호환되지 않습니다."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "'%s' 저장소가 없습니다"
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "깊이가(%s) 0보다 큰 수가 아닙니다"
 
-#: builtin/clone.c:897
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "대상 경로가('%s') 이미 있고 빈 디렉터리가 아닙니다."
 
-#: builtin/clone.c:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "작업 폴더가('%s') 이미 있습니다."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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:925
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "작업 디렉터리를('%s') 만들 수 없습니다"
 
-#: builtin/clone.c:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "간략한 저장소로('%s') 복제합니다...\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "'%s'에 복제합니다...\n"
 
-#: builtin/clone.c:984
+#: 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:987
+#: 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:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local 옵션은 무시됩니다"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "%s의 복제 방법을 알지 못합니다"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "빈 저장소를 복제한 것처럼 보입니다."
 
@@ -5071,66 +6301,66 @@ msgstr ""
 "그 다음에 \"git cherry-pick --continue\"를 하면 나머지 커밋에\n"
 "대해 커밋 빼오기를 다시 시작합니다.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "HEAD 트리 오브젝트의 묶음을 푸는데 실패했습니다"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "임시 인덱스를 만들 수 없습니다"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "대화형 추가가 실패했습니다"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "임시 인덱스를 업데이트할 수 없습니다"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "주요 캐시 트리를 업데이트하는데 실패했습니다"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "병합하는 중 부분 커밋을 할 수 없습니다."
 
-#: builtin/commit.c:447
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "커밋 빼오기를 하는 중 부분 커밋을 할 수 없습니다."
 
-#: builtin/commit.c:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "임시 인덱스 파일을 쓸 수 없습니다"
 
-#: builtin/commit.c:580
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "'%s' 커밋에 작성자 헤더가 없습니다"
 
-#: builtin/commit.c:582
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "'%s' 커밋의 작성자 헤더 형식이 잘못되었습니다"
 
-#: builtin/commit.c:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "--author 파라미터 형식이 잘못되었습니다"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "시각 형식이 잘못되었습니다: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5138,38 +6368,38 @@ msgstr ""
 "현재 커밋 메시지에서 사용되지 않는 주석 문자를\n"
 "선택할 수 없습니다"
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(표준 입력에서 로그 메시지를 읽음)\n"
 
-#: builtin/commit.c:704
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "표준 입력에서 로그 메시지를 읽을 수 없습니다"
 
-#: builtin/commit.c:708
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "'%s' 로그 파일을 읽을 수 없습니다"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "MERGE_MSG를 읽을 수 없습니다"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "SQUASH_MSG를 읽을 수 없습니다"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "MERGE_MSG를 읽을 수 없습니다"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "커밋 서식을 쓸 수 없습니다"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5184,7 +6414,7 @@ msgstr ""
 "\t%s\n"
 "다시 시도하십시오.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5199,7 +6429,7 @@ msgstr ""
 "\t%s\n"
 "다시 시도하십시오.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5208,7 +6438,7 @@ msgstr ""
 "변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
 "줄은 무시되고, 메시지를 입력하지 않으면 커밋이 중지됩니다.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5219,149 +6449,153 @@ msgstr ""
 "줄은 보존되니, 필요하면 직접 제거하십시오. 메시지를 입력하지\n"
 "않으면 커밋이 중지됩니다.\n"
 
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%s작성자:    %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%s시각:      %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%s커미터: %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "인덱스를 읽을 수 없습니다"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "트리를 만드는데 오류"
 
-#: builtin/commit.c:953 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:1055
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr ""
 "--author '%s' 옵션이 '이름 <전자메일>' 형식이 아니고 기존 작성자에도 없습니다"
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "추적되지 않는 파일 모드가 ('%s') 잘못되었습니다"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long 및 -z 옵션은 호환되지 않습니다"
 
-#: builtin/commit.c:1137
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "--reset-author 및 --author 옵션을 모두 사용하면 앞뒤가 맞지 않습니다"
 
-#: builtin/commit.c:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "바꿀 사항이 없습니다."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "병합 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
 
-#: builtin/commit.c:1151
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "커밋 빼오기 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
 
-#: builtin/commit.c:1154
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "--squash 및 --fixup 옵션은 같이 쓸 수 없습니다"
 
-#: builtin/commit.c:1164
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "-c/-C/-F/--fixup 옵션 중에 하나만 사용할 수 있습니다."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "-m 옵션은 -c/-C/-F/--fixup 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/commit.c:1174
+#: 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:1191
+#: 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:1193
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "경로가 없이 --include/--only 옵션을 쓰면 앞뒤가 맞지 않습니다."
 
-#: builtin/commit.c:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "기발하네요... 마지막을 변경된 인덱스로 바꿉니다."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr ""
 "-i 또는 -o 없이 명시적인 경로를 지정했습니다. --only 경로를 가정합니다..."
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "잘못된 정리 모드 %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "-a 옵션과 경로를 같이 사용하면 앞뒤가 맞지 않습니다."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "상태를 간략하게 표시합니다"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "브랜치 정보를 표시합니다"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: 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:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "긴 형식으로 상태를 표시합니다 (기본값)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "NUL 문자로 항목을 끝냅니다"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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:1337 builtin/commit.c:1617
+#: 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "무시되는 파일을 표시합니다"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "언제"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5369,198 +6603,198 @@ msgstr ""
 "하위 모듈의 변경을 무시합니다. 추가 옵션: all, dirty, untracked. (기본값: "
 "all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "추적되지 않는 파일의 목록을 여러 열로 표시합니다"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "새로 만든 커밋을 찾아볼 수 없습니다"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "새로 만든 커밋을 파싱할 수 없습니다"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "HEAD 분리됨"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (최상위-커밋)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "성공적인 커밋 후에 요약을 표시하지 않습니다"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "커밋 메시지 서식에 diff를 표시합니다"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "커밋 메시지 옵션"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "파일에서 메시지를 읽습니다"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "작성자"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "커밋의 작성자를 지정합니다"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "시각"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "커밋의 시각을 지정합니다"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "커밋 메시지"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "지정한 커밋의 메시지를 재사용하고 편집합니다"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "지정한 커밋에서 메시지를 재사용합니다"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "지정한 커밋을 수정하는데 autosquash 형식 메시지를 사용합니다"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "지정한 커밋을 합치는데 autosquash 형식 메시지를 사용합니다"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "커밋을 내가 작성한 것으로 만듭니다 (-C/-c/--amend와 같이 사용)"
 
-#: builtin/commit.c:1588 builtin/log.c:1219 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:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "지정한 서식 파일을 사용합니다"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "커밋 편집을 강제합니다"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "기본값"
 
-#: builtin/commit.c:1591 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:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "커밋 메시지 서식에 상태를 포함합니다"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: 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:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "커밋 내용 옵션"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "변경된 파일을 모두 커밋합니다"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "지정한 파일을 커밋할 인덱스에 추가합니다"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "대화형으로 파일을 추가합니다"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "대화형으로 변경 사항을 추가합니다"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "지정한 파일만 커밋합니다"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "커밋 전 후크를 건너뜁니다"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "커밋 전 후크와 커밋 메시지 후크를 건너뜁니다"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "무엇을 커밋할지 표시합니다"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "바로 앞 커밋을 바꿉니다"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "다시쓰기 후 후크를 건너뜁니다"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "빈 변경 사항을 기록하도록 허용합니다"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "빈 메시지와 같이 변경 사항을 기록하도록 허용합니다"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "HEAD 커밋을 파싱할 수 없습니다"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "손상된 MERGE_HEAD 파일 (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "MERGE_MODE를 읽을 수 없습니다"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "커밋 메시지를 읽을 수 없습니다: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "커밋을 중지합니다. 메시지를 편집하지 않았습니다.\n"
 
-#: builtin/commit.c:1740
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "커밋을 중지합니다. 커밋 메시지가 비어 있습니다.\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5574,139 +6808,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 "블롭-id"
 
-#: 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 "설정한 색을 찾습니다: slot [<기본값>]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "색 설정을 찾습니다: slot [<표준출력이-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 "값을 NUL 바이트로 끝냅니다"
 
-#: 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:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5721,16 +6955,26 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: 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"
+"%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 "사람이 읽기 좋은 형식으로 크기를 표시합니다"
 
@@ -5757,7 +7001,7 @@ msgstr "주석 달린 %s 태그에 내장된 이름이 없습니다"
 msgid "tag '%s' is really '%s' here"
 msgstr "'%s' 태그가 실제 여기 '%s'입니다"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "올바른 오브젝트 이름이 아닙니다 (%s)"
@@ -5850,7 +7094,7 @@ msgstr "<n>개의 가장 최근의 태그만 고려합니다 (기본값: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "<패턴>과 일치하는 태그만 고려합니다"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "대안으로 요약한 커밋 오브젝트를 표시합니다"
 
@@ -5884,21 +7128,21 @@ msgstr "'%s': 일반 파일이나 심볼릭 링크가 아닙니다"
 msgid "invalid option: %s"
 msgstr "잘못된 옵션: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "깃 저장소가 아닙니다"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "잘못된 '%s' 오브젝트가 주어졌습니다."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "두 개보다 많은 블롭이 주어졌습니다: '%s'"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "처리하지 않은 '%s' 오브젝트가 주어졌습니다."
@@ -5955,181 +7199,181 @@ 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:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "모든 리모트에서 가져옵니다"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:172
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "리모트 쪽에 묶음을 업로드할 경로"
 
-#: builtin/fetch.c:97 builtin/pull.c:174
+#: 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:176
+#: 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:179
+#: 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:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "주문형"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "하위 모듈 재귀적으로 가져오기 방식을 설정합니다"
 
-#: builtin/fetch.c:113 builtin/pull.c:191
+#: 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:194
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "얕은 복제의 커밋 내역을 깊게 만듭니다"
 
-#: builtin/fetch.c:120 builtin/pull.c:197
+#: 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:122 builtin/log.c:1236
+#: 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:200
+#: 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:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "레퍼런스맵"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: 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:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "%s을(를) 열 수 없습니다: %s\n"
+#: 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 URL에서\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6138,55 +7382,55 @@ msgstr ""
 "업데이트할 수 없는 로컬 레퍼런스가 있습니다. 과거 충돌 브랜치를\n"
 " 제거하려면 '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 "\"%s\" 옵션의 \"%s\" 값은 %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."
@@ -6194,33 +7438,41 @@ msgstr ""
 "리모트 저장소를 지정하지 않았습니다. 새 리비전을 가져올 수 있는\n"
 "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 "그룹을 가져오고 레퍼런스명세를 지정하면 앞뒤가 맞지 않습니다"
 
@@ -6230,23 +7482,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 "읽어들일 파일"
 
@@ -6304,65 +7556,65 @@ msgstr "병합하지 않는 레퍼런스만 표시합니다"
 
 #: builtin/for-each-ref.c:45
 msgid "print only refs which contain the commit"
-msgstr "커밋이 포함된 레퍼런스만 표시합니다"
+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:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<옵션>] [<오브젝트>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
-msgstr "ì \90근할 수 없는 오브젝트를 표시합니다"
+msgstr "ì \91근할 수 없는 오브젝트를 표시합니다"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "연결이 끊어진 오브젝트를 표시합니다"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "태그를 알립니다"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "최상위 노드를 알립니다"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "인덱스 오브젝트 헤드 노드를 만듭니다"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "reflog 헤드 노드를 만듭니다 (기본값)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "묶음과 보조 오브젝트도 만듭니다"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "연결만 확인합니다"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "더 엄격하게 확인합니다"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr ".git/lost-found 안에 연결이 끊어진 오브젝트를 씁니다"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "진행 상황을 표시합니다"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "접근할 수 없는 오브젝트의 이름을 자세히 표시합니다"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "오브젝트를 확인합니다"
 
@@ -6454,225 +7706,220 @@ msgstr "grep: 스레드를 만드는데 실패했습니다: %s"
 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: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 "종류가 %s인 오브젝트에서 grep을 할 수 없습니다"
 
-#: builtin/grep.c:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "`%c' 옵션에는 숫자 값이 와야 합니다"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "'%s'을(를) 열 수 없습니다"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "작업 폴더 대신에 인덱스에서 검색합니다"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "깃으로 관리하지 않은 내용에서 찾습니다"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "추적되는 파일과 추적되지 않는 파일 모두에서 검색합니다"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "'.gitignore'로 지정한 파일을 무시합니다"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "일치하지 않는 줄을 표시합니다"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "대소문자 구별하지 않고 맞춥니다"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "단어 경계 부분에 대해서만 패턴을 맞춥니다"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "바이너리 파일을 텍스트로 처리합니다"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "바이너리 파일에서 패턴을 맞추지 않습니다"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "textconv 필터를 사용해 바이너리 파일을 처리합니다"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "최대 <깊이> 단계만큼 내려갑니다"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "POSIX 확장 정규식을 사용합니다"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "기본 POSIX 정규식을 사용합니다 (기본값)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "패턴을 고정 문자열로 해석합니다"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "펄과 호환되는 정규식을 사용합니다"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "줄 번호를 표시합니다"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "파일 이름을 표시하지 않습니다"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "파일 이름을 표시합니다"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "파일 이름을 최상위 디렉터리 상대 경로로 표시합니다"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "일치하는 줄을 표시하지 않고 파일 이름만 표시합니다"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "--files-with-matches 옵션과 동일"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "일치하지 않는 파일의 이름만 표시합니다"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "파일 이름 다음에 NUL을 출력합니다"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "일치하는 줄을 표시하지 않고 일치하는 수를 표시합니다"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "일치하는 부분을 강조합니다"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "다른 파일 사이에 일치하는 부분의 사이에 빈 줄을 출력합니다"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr "같은 파일에서 여러 개가 일치하면 파일 이름을 한 번만 표시합니다"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "일치하는 부분 앞뒤에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "일치하는 부분 앞에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "일치하는 부분 뒤에 컨텍스트를 <n>줄 표시합니다"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "<n>개의 작업 스레드를 사용합니다"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "-C NUM 옵션의 줄임"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "일치 항목 앞에 함수 이름 줄을 표시합니다"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "들어 있는 함수를 표시합니다"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "파일에서 패턴을 읽습니다"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "<패턴>과 일치"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "-e 옵션으로 지정한 패턴을 결합합니다"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "출력하지 않고 일치하는 항목을 exit() 상태 번호로 리턴합니다"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr "모든 패턴과 일치하는 파일의 일치하는 부분만 표시합니다"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "grep 표현식에 대한 파싱 트리를 표시합니다"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "페이저"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "일치하는 파일을 페이저 프로그램에서 표시합니다"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "grep(1) 실행을 허용합니다 (이 빌드에서는 무시)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "패턴을 지정하지 않았습니다."
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "잘못된 스레드 수를 지정했습니다 (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 옵션은 작업 폴더에서만 동작합니다"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 "--cached 또는 --untracked 옵션은 --no-index 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/grep.c:904
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 또는 --untracked 옵션은 리비전과 같이 쓸 수 없습니다."
 
-#: builtin/grep.c:907
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 옵션은 추적되는 내용에 대해 쓸 수 없습니다."
 
-#: builtin/grep.c:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "--cached 옵션과 트리를 모두 지정했습니다."
 
@@ -6688,83 +7935,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': %s"
-msgstr "실행 실패: '%s': %s"
+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"
@@ -6773,7 +8024,7 @@ msgstr ""
 "'%s': 지원하지 않는 맨 페이지 보기 프로그램 경로.\n"
 "대신에 'man.<도구>.cmd' 옵션을 사용해 보십시오."
 
-#: builtin/help.c:217
+#: builtin/help.c:219
 #, c-format
 msgid ""
 "'%s': cmd for supported man viewer.\n"
@@ -6782,424 +8033,425 @@ 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: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"
 msgstr[0] "%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 "묶음의 %lu 오프셋에 잘못된 오브젝트가 있습니다: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "묶음의 %<PRIuMAX> 오프셋에 잘못된 오브젝트가 있습니다: %s"
 
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "inflate가 %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 바이트 부족"
+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:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "심각한 inflate 부조화"
 
-#: 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 objects"
-msgstr "로컬 오브젝트 %d개 마침"
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] "로컬 오브젝트 %d개 마침"
 
-#: builtin/index-pack.c:1263
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "%s에 대해 예상치 못한 테일 체크섬 (디스크 손상?)"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "묶음에 알아내지 못한 델타 %d개가 있습니다"
 
-#: builtin/index-pack.c:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "추가한 오브젝트를 deflate할 수 없습니다 (%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "%s 로컬 오브젝트가 손상되었습니다"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "묶음 파일을 닫는데 오류"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "'%s' 보존 파일을 쓸 수 없습니다"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "쓴 '%s' 보존 파일을 닫지 못했습니다"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "묶음 파일을 저장할 수 없습니다"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "인덱스 파일을 저장할 수 없습니다"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "잘못된 pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "스레드 기능이 없습니다. %s 무시"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "기존 '%s' 묶음 파일을 열 수 없습니다"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "'%s'에 대한 기존 묶음 idx 파일을 열 수 없습니다"
 
-#: builtin/index-pack.c:1587
+#: builtin/index-pack.c:1591
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "델타 아님: 오브젝트 %d개"
 
-#: builtin/index-pack.c:1594
+#: builtin/index-pack.c:1598
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "체인 길이 = %d: 오브젝트 %lu개"
 
-#: builtin/index-pack.c:1624
-msgid "Cannot come back to cwd"
-msgstr "현재 디렉터리로 돌아올 수 없습니다"
+#: builtin/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "'%s' 묶음파일 이름이 '.pack'으로 끝나지 않습니다"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 옵션은 --stdin 옵션과 같이 쓸 수 없습니다"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "'%s' 묶음파일 이름이 '.pack'으로 끝나지 않습니다"
-
-#: builtin/index-pack.c:1730
+#: 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 "'%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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "%s에 서식이 없습니다"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "'%2$s'에서 잘못된 형식 버전 %1$d의 서식을 복사하지 않습니다"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s 파일이 이미 있습니다"
+msgid "not copying templates from '%s': %s"
+msgstr "'%s'에서 서식을 복사하지 않습니다: %s"
 
-#: builtin/init-db.c:340
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "파일 종류 %d번을 처리할 수 없습니다"
 
-#: builtin/init-db.c:343
+#: 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:399
+#: 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 깃 저장소, 위치 %s%s\n"
+msgid "Reinitialized existing shared Git repository in %s%s\n"
+msgstr "%s%s 안의 기존 공유 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:400
-msgid "Reinitialized existing"
-msgstr "다시 초기화: 기존"
+#: builtin/init-db.c:404
+#, c-format
+msgid "Reinitialized existing Git repository in %s%s\n"
+msgstr "%s%s 안의 기존 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:400
-msgid "Initialized empty"
-msgstr "초기화: 빈"
+#: 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:401
-msgid " shared"
-msgstr " 공유"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "%s%s 안의 빈 깃 저장소를 다시 초기화했습니다\n"
 
-#: builtin/init-db.c:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7207,25 +8459,25 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<서식-디렉터리>] [--shared[=<권"
 "한>]] [<디렉터리>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "권한"
 
-#: builtin/init-db.c:472
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "깃 저장소를 다른 사용자가 공유할 수 있게 지정"
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "%s에 대해 mkdir를 할 수 없습니다"
 
-#: builtin/init-db.c:515
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "%s에 대해 chdir를 할 수 없습니다"
 
-#: builtin/init-db.c:536
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7234,7 +8486,7 @@ msgstr ""
 "%s (또는 --work-tree=<디렉터리>) 허용되지 않음. %s (또는 --git-"
 "dir=<directory>) 지정이 없으면"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "작업 폴더 '%s'에 접근할 수 없습니다"
@@ -7267,276 +8519,329 @@ 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:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "diff를 출력하지 않습니다"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "소스를 표시합니다"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "메일 맵 파일을 사용합니다"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "꾸미기 옵션"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 msgid "Process line range n,m in file, counting from 1"
 msgstr "파일에서 n,m 범위의 줄을 처리합니다 (1부터 시작)"
 
-#: builtin/log.c:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "최종 출력: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: 잘못된 파일"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "%s 오브젝트를 읽을 수 없습니다"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "알 수 없는 종류: %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers 설정에 값이 없음"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "출력 디렉터리의 이름이 너무 깁니다"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "%s 패치 파일을 열 수 없습니다"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "정확히 하나의 범위가 필요합니다."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "범위가 아닙니다."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "커버레터는 전자메일 형식이어야 합니다"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "정신나간 in-reply-to 헤더: %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<옵션>] [<시작시각> | <리비전-범위>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "출력 디렉터리가 두개?"
 
-#: builtin/log.c:1214
+#: 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: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:1263
+msgid "Could not find exact merge base."
+msgstr "정확한 병합 기준점을 찾을 수 없습니다."
+
+#: 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 ""
+"업스트림을 가져오는데 실패했습니다. 베이스 커밋을 자동으로 기록하려면,\n"
+"'git branch --set-upstream-to' 명령으로 원격 브랜치를 추적하십시오.\n"
+"아니면 직접 '--base=<기준점-커밋-ID>' 옵션으로 기준점 커밋을 지정할\n"
+"수도 있습니다."
+
+#: builtin/log.c:1287
+msgid "Failed to find exact merge base"
+msgstr "정확한 병합 기준점을 찾는데 실패했습니다"
+
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
+msgstr "기준점 커밋은 리비전 목록의 상위 커밋이어야 합니다"
+
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
+msgstr "기준점 커밋은 리비전 목록에 들어 있으면 안 됩니다"
+
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "패치 ID를 알아낼 수 없습니다"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "하나의 패치에 대해서도 [PATCh n/m]을 붙입니다"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "여러 개 패치에 대해서도 [PATCH]를 붙입니다"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "패치를 표준 출력으로 표시합니다"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "커버레터를 만듭니다"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "출력 파일 이름에 간단한 일련 번호를 사용합니다"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "확장자"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "'.patch' 대신 <확장자>를 사용합니다"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "패치 번호를 1 대신 <n>에서 시작합니다"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "시리즈를 N번째 re-roll로 표시합니다"
 
-#: builtin/log.c:1233
+#: 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:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "결과 파일을 <디렉터리>에 저장합니다"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "[PATCH]를 자르거나 추가하지 않습니다"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "바이너리 diff를 만들지 않습니다"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "From 헤더에서 모두 0인 해시를 출력합니다"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "업스트림에 있는 패치를 포함하지 않습니다"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "기본값 (패치 + 통계) 대신 패치 형식을 표시합니다"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "메시징"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "헤더"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "전자메일 헤더"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "전자메일"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "To: 헤더를 추가합니다"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "Cc: 헤더를 추가합니다"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "신원"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "<신원>에서 From 주소를 설정합니다 (없으면 커미터 주소 신원 사용)"
 
-#: builtin/log.c:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "메시지-ID"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "첫 메일을 <메시지-ID>에 대한 답장 메일로 만듭니다"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "경계"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "패치를 첨부합니다"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "패치를 본문에 포함합니다"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "메시지에 스레드를 사용, 스타일: shallow, deep"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "서명"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "서명을 추가합니다"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "베이스-커밋"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "전제조건 트리 정보를 패치 시리즈에 추가합니다"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "파일에서 서명을 추가합니다"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "패치 파일 이름을 표시하지 않습니다"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 및 -k 옵션은 하나만 써야 합니다."
 
-#: builtin/log.c:1367
-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:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check 옵션은 앞뒤가 맞지 않습니다"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "표준 출력이나 디렉터리 중에 하나만 지정해야 합니다."
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "'%s' 디렉터리를 만들 수 없습니다"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "'%s' 서명 파일을 읽을 수 없습니다"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "출력 파일을 만드는데 실패했습니다"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<업스트림> [<헤드> [<한계값>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7544,104 +8849,103 @@ msgstr ""
 "추적되는 리모트 브랜치를 찾을 수 없습니다. <업스트림>을 수동으로 지정하십시"
 "오.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "알 수 없는 커밋 %s"
-
-#: 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 "resolve-undo 정보를 표시합니다"
 
-#: 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 "<í\8c\8cì\9d¼>ì\97\90ì\84\9c ì¶\94ê°\80ì \81ì\9d¸ ë\94\94ë \89í\86 리별 제외 패턴을 읽습니다"
+msgstr "<í\8c\8cì\9d¼>ì\97\90ì\84\9c ì¶\94ê°\80ì \81ì\9d¸ ë\94\94ë \89í\84°리별 제외 패턴을 읽습니다"
 
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "표준 깃 제외 패턴을 추가합니다"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 msgid "make the output relative to the project top directory"
-msgstr "최상위 디렉토리 상대 경로로 출력합니다"
+msgstr "최상위 디렉터리 상대 경로로 출력합니다"
+
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "하위 모듈에 재귀적으로 적용"
 
-#: builtin/ls-files.c:471
+#: 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 "디버깅 데이터를 표시합니다"
 
@@ -7727,183 +9031,173 @@ 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:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "`m' 옵션에는 값이 필요합니다"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "'%s' 병합 전략을 찾을 수 없습니다.\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "사용 가능한 전략은:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "사용 가능한 사용자 설정 전략은:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "병합이 끝날 때 diffstat을 표시하지 않습니다"
 
-#: builtin/merge.c:196 builtin/pull.c:126
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "병합이 끝날 때 diffstat을 표시합니다"
 
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(--stat 옵션과 동일)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 builtin/pull.c:136
 msgid "add (at most <n>) entries from shortlog to merge commit message"
 msgstr "병합 커밋의 메시지에 shortlog 항목을 (최대 <n>개) 추가합니다"
 
-#: builtin/merge.c:202 builtin/pull.c:135
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "병합하는 대신 하나의 커밋을 만듭니다"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "병합이 성공하면 커밋을 합니다 (기본값)"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "커밋 전에 메시지를 편집합니다"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "정방향 진행을 허용합니다 (기본값)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "정방향 진행이 불가능하면 중지합니다"
 
-#: builtin/merge.c:213
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "ì\9d´ë¦\84 ë¶\99ì\9d¸ 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+#: builtin/merge.c:215 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "ì§\80ì \95í\95\9c 커밋에 올바른 GPG 서명이 있는지 검증합니다"
 
-#: builtin/merge.c:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "전략"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "사용할 병합 전략"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "옵션=값"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "선택한 병합 전략에 대한 옵션"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "병합 커밋 메시지 (정방향이 아닌 병합에 대해)"
 
-#: builtin/merge.c:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "현재 진행 중인 병합을 중지합니다"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "관계 없는 커밋 내역의 병합을 허용합니다"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "stash를 실행할 수 없습니다."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
-msgstr "stash 실패"
+msgstr "스태시 실패"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "올바른 오브젝트가 아닙니다: %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "read-tree 실패"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (합칠 내용이 없습니다)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "커밋 합치기 -- HEAD를 업데이트하지 않습니다\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "'%s'에 쓸 수 없습니다"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "SQUASH_MSG를 쓰는 중"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "SQUASH_MSG를 마치는 중"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "병합 메시지가 없습니다 -- HEAD를 업데이트하지 않습니다\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s'이(가) 커밋을 가리키지 않습니다"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "잘못된 branch.%s.mergeoptions 문자열: %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
 msgstr "두 개의 헤드 병합 외에는 처리하지 않습니다."
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive에 대해 알 수 없는 옵션: -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "%s에 쓸 수 없습니다"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "'%s'에서 읽을 수 없습니다"
 
-#: builtin/merge.c:782
+#: 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:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7919,52 +9213,66 @@ msgstr ""
 "'%c' 문자로 시작하는 줄은 무시되고, 메시지가 비어 있으면 커밋을\n"
 "중지합니다.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "빈 커밋 메시지."
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "훌륭합니다.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.\n"
 
-#: builtin/merge.c:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s'은(는) 커밋이 아닙니다"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "현재 브랜치가 없습니다."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "현재 브랜치에 대한 리모트가 없습니다."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 msgid "No default upstream defined for the current branch."
 msgstr "현재 브랜치에 대해 기본 업스트림을 지정하지 않았습니다."
 
-#: builtin/merge.c:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "리모트 %2$s에서 %1$s에 대한 리모트 추적 브랜치가 없습니다"
 
-#: builtin/merge.c:1080
+#: 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:1207
+#: 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:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7972,7 +9280,7 @@ msgstr ""
 "병합을 마치지 않았습니다. (MERGE_HEAD 있음)\n"
 "병합하기 전에 변경 사항을 커밋하십시오."
 
-#: builtin/merge.c:1230
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -7980,100 +9288,112 @@ msgstr ""
 "커밋 빼오기를 마치지 않았습니다. (COMMIT_PICK_HEAD 있음)\n"
 "병합하기 전에 변경 사항을 커밋하십시오."
 
-#: builtin/merge.c:1233
+#: builtin/merge.c:1188
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "커밋 빼오기를 마치지 않았습니다. (CHERRY_PICK_HEAD 있음)"
 
-#: builtin/merge.c:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "--squash 옵션을 --no-ff 옵션과 같이 쓸 수 없습니다."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "커밋을 지정하지 않았고  merge.defaultToUpstream를 설정하지 않았습니다."
 
-#: builtin/merge.c:1267
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "빈 헤드로 커밋을 합치기는 지원하지 않습니다"
 
-#: builtin/merge.c:1269
+#: builtin/merge.c:1224
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "정방향이 아닌 커밋은 빈 헤드에서는 앞뒤가 맞지 않습니다"
 
-#: builtin/merge.c:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 병합할 수 있는 항목이 아닙니다"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 msgid "Can merge only exactly one commit into empty head"
 msgstr "빈 헤드에는 정확히 하나의 커밋만 병합할 수 있습니다"
 
-#: builtin/merge.c:1332
+#: builtin/merge.c:1287
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "%s 커밋에 신뢰하지 않는 (서명자가 %s라고 하는) GPG 서명이 있습니다."
 
-#: builtin/merge.c:1335
+#: builtin/merge.c:1290
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "%s 커밋에 잘못된 (서명자가 %s라고 하는) GPG 서명이 있습니다."
 
-#: builtin/merge.c:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "%s 커밋에 GPG 서명이 없습니다."
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "%s 커밋에 %s의 올바른 GPG 서명이 없습니다\n"
 
-#: builtin/merge.c:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "관계 없는 커밋 내역의 병합을 거부합니다"
+
+#: 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:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "아주 간단한 인덱스 내부 병합을 시도합니다...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "아님.\n"
 
-#: builtin/merge.c:1500
+#: 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:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "트리를 본래 위치로 되돌립니다...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "병합 전략 %s 시도...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "병합을 처리한 전략이 없습니다.\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "전략 %s(으)로 병합이 실패했습니다.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "수동 해결의 준비를 위해 %s 전략을 사용합니다.\n"
 
-#: builtin/merge.c:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "자동 병합이 잘 진행되었습니다. 요청한대로 커밋 전에 중지합니다\n"
@@ -8098,23 +9418,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에서 <커밋>이 분리된 위치를 찾습니다"
 
@@ -8158,6 +9478,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]"
@@ -8183,9 +9533,9 @@ msgstr "git mv [<옵션>] <원본>... <대상>"
 msgid "Directory %s is in index and no submodule?"
 msgstr "%s 디렉터리가 인덱스에 있고 하위 모듈이 없습니다?"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
-msgstr "계속하려면 .gitmodules의 변경 사항을 스테이지에 넣거나 stash 하십시오"
+msgstr "계속하려면 .gitmodules의 변경 사항을 스테이지에 넣거나 스태시 하십시오"
 
 #: builtin/mv.c:90
 #, c-format
@@ -8200,109 +9550,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:257 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:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<옵션>] <커밋>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<옵션>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<옵션>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "이름만 표시 (SHA-1 없이)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "커밋을 지정할 때 태그만 사용합니다"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "<패턴>과 일치하는 레퍼런스만 사용합니다"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "모든 레퍼런스에서 접근 가능한 모든 커밋 목록을 표시합니다"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "표준입력에서 읽습니다"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "`정의되지 않은' 이름 표시를 허용합니다 (기본값)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "입력의 태그 레퍼런스를 따라갑니다 (내부 사용)"
 
@@ -8417,6 +9767,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'"
@@ -8431,88 +9785,99 @@ msgstr "'show' 출력을 읽을 수 없습니다"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "오브젝트 '%s'에 대해 'show'를 마치는데 실패했습니다"
 
-#: 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"
+#: 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"
+msgid "the note contents have been left in %s"
 msgstr "노트 내용은 %s에 남습니다"
 
-#: builtin/notes.c:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "'%s'을(를) 읽을 수 없습니다"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "'%s'을(를) 열거나 읽을 수 없습니다"
 
-#: 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:880 builtin/tag.c:456
+#: 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."
+msgid "failed to resolve '%s' as a valid ref."
 msgstr "'%s'을(를) 올바른 레퍼런스로 알아내는데 실패했습니다."
 
-#: builtin/notes.c:256
+#: builtin/notes.c:257
 #, c-format
-msgid "Failed to read object '%s'."
+msgid "failed to read object '%s'."
 msgstr "'%s' 오브젝트 읽기에 실패했습니다."
 
-#: builtin/notes.c:260
+#: 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:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:945
+#: 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:375 builtin/notes.c:662
+#: 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: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 "
@@ -8521,29 +9886,29 @@ 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:885
+#: 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 "
@@ -8552,12 +9917,12 @@ msgstr ""
 "노트를 복사할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트"
 "를 덮어쓰려면 '-f' 옵션을 사용하십시오"
 
-#: builtin/notes.c:534
+#: 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:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8566,15 +9931,52 @@ msgstr ""
 "-m/-F/-c/-C 옵션은 'edit' 하위 명령에 대해 사용을 권하지 않습니다.\n"
 "대신에 'git notes add -f -m/-F/-c/-C' 명령을 사용하십시오.\n"
 
-#: builtin/notes.c:767
+#: 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:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "병합 옵션"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8582,231 +9984,273 @@ msgstr ""
 "주어진 전략을 사용해 노트 충돌을 해결합니다 (manual/ours/theirs/union/"
 "cat_sort_uniq)"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "병합하지 않은 노트 커밋"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "병합하지 않은 노트를 커밋해 노트 병합을 마칩니다"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "노트 병합 해결 중지"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "노트 병합을 중지합니다"
 
-#: builtin/notes.c:856
+#: 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"
+msgid "a notes merge into %s is already in-progress at %s"
 msgstr "%s 위치로 노트 병합이 이미 %s에서 진행중입니다"
 
-#: builtin/notes.c:883
+#: 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 ""
+"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:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "%s 오브젝트에 노트가 없습니다\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "없는 노트를 제거하려는 시도를 오류가 아닌 것으로 취급합니다"
 
-#: builtin/notes.c:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "표준 입력에서 오브젝트 이름을 읽습니다"
 
-#: builtin/notes.c:979
+#: 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:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "<노트-레퍼런스>에서 노트를 사용합니다"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: 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 ""
 "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 "deflate 오류 (%d)"
 
-#: builtin/pack-objects.c:772
+#: builtin/pack-objects.c:768
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+msgstr ""
+"배트맵 쓰기를 하지 않습니다. 묶음은 pack.packSizeLimit 값에 따라 쪼개집니다"
+
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "오브젝트 쓰는 중"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "묶음에 들어있지 않은 오브젝트가 있으므로, 비트맵 쓰기를 하지 않습니다"
 
-#: builtin/pack-objects.c:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "오브젝트 압축하는 중"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "지원하지 않는 인덱스 버전 %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "잘못된 인덱스 버전 '%s'"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "진행률을 표시하지 않습니다"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "진행률을 표시합니다"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "오브젝트 쓰기 단계에서 진행률을 표시합니다"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "진행률이 표시될 때 --all-progress와 비슷합니다"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "버전[,오프셋]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr "지정한 버전의 인덱스 형식에 따라 묶음 인덱스 파일을 씁니다"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "출력 묶음 파일의 최대 크기"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "보조 오브젝트 저장소에서 빌려온 오브젝트를 무시합니다"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "묶음 오브젝트를 무시합니다"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "묶음 윈도우를 오브젝트 단위로 제한합니다"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr "묶음 윈도우를 오브젝트 단위에 추가로 메모리 단위로 제한합니다"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "결과물 묶음에서 허용되는 최대 길이의 델타 체인"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "기존 델타를 재사용합니다"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "기존 오브젝트를 재사용합니다"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA 오브젝트를 사용합니다"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "최상의 델타 일치를 검색하는데 스레드를 사용합니다"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "빈 묶음 출력을 만들지 않습니다"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "표준 입력에서 리비전 인자를 읽습니다"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "묶지 않는 오브젝트 수를 제한합니다"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "모든 레퍼런스에서 접근 가능한 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "reflog 항목에서 레퍼런스할 수 있는 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "인덱스에서< 레퍼런스하는 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "묶음을 표준 출력으로 출력합니다"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "묶음에 들어갈 오브젝트를 레퍼런스하는 태그 오브젝트를 포함합니다"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "접근 불가능 오브젝트를 보존합니다"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "시각"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "느슨한 접근 불가능 오브젝트를 묶습니다"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "<시각>보다 새로운 접근 불가능 오브젝트의 묶음을 풉니다"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "얇은 묶음을 만듭니다"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "얕은 가져오기에 적합한 묶음을 만듭니다"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "해당하는 .keep 파일이 있는 묶음을 무시합니다"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "묶음 압축 단계"
 
 # FIXME: graft?
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "붙어 있는 커밋을 숨기지 않습니다"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "가능하면 비트맵 인덱스를 사용해 오브젝트 세기 속도를 높입니다"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "묶음 인덱스와 같이 비트맵 인덱스를 씁니다"
 
-#: builtin/pack-objects.c:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "오브젝트 개수 세는 중"
 
@@ -8834,15 +10278,11 @@ msgstr "중복된 오브젝트 제거"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <시각>] [--] [<헤드>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "제거하지 않고, 보여주기만 합니다"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "잘라낸 오브젝트를 알립니다"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "<시각>보다 오래 된 오브젝트가 만료됩니다"
 
@@ -8850,65 +10290,56 @@ 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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "병합 관련 옵션"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "변경 사항을 적용할 때 병합하는 대신 리베이스합니다"
 
-#: builtin/pull.c:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "정방향 진행을 허용합니다"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "지정한 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "리베이스 전과 후에 stash 및 stash pop을 자동으로 합니다"
 
-#: builtin/pull.c:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "가져오기 관련 옵션"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "병렬적으로 풀을 실행할 하위모듈 개수"
 
-#: builtin/pull.c:275
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "pull.ff에 대해 잘못된 값: %s"
 
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr ""
-"리베이스로 풀을 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"리베이스로 풀을 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
-
-#: builtin/pull.c:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "가져온 레퍼런스 중에 리베이스할 대상 후보가 없습니다."
 
-#: builtin/pull.c:445
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "가져온 레퍼런스 중에 병합할 대상 후보가 없습니다."
 
-#: builtin/pull.c:446
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -8916,7 +10347,7 @@ msgstr ""
 "보통 이런 경우는 리모트 쪽에는 없는 와일드카드 레퍼런스명세가\n"
 "주어졌을 때 일어납니다."
 
-#: builtin/pull.c:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -8927,38 +10358,42 @@ msgstr ""
 "이 리모트는 현재 브랜치에 대해 기본으로 설정된 리모트가\n"
 "아니기 때문에, 명령행에서 브랜치를 지정해야 합니다."
 
-#: builtin/pull.c:454
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "현재 어떤 브랜치 위에도 있지 않습니다."
 
-#: builtin/pull.c:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "자세한 정보는 git-pull(1) 페이지를 참고하십시오."
 
-#: builtin/pull.c:469
+#: 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:451
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-msgstr ""
-"이 브랜치에 대한 추적 정보를 설정하려면 다음과 같이 할 수 있습니다:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<브랜치> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr "이 브랜치에 대한 추적 정보를 설정하려면 다음과 같이 할 수 있습니다:"
 
-#: builtin/pull.c:483
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -8967,11 +10402,27 @@ msgstr ""
 "설정에서 리모트의 '%s' 레퍼런스와 병합하도록 지정했지만,\n"
 "그런 레퍼런스를 가져오지 않았습니다."
 
-#: builtin/pull.c:841
+#: 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:870
+#: 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"
@@ -8982,7 +10433,7 @@ msgstr ""
 "작업 폴더를 %s 커밋에서 정방향\n"
 "진행합니다."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -8999,11 +10450,11 @@ msgstr ""
 "$ git reset --hard\n"
 "복구됩니다."
 
-#: builtin/pull.c:890
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "여러 브랜치를 빈 헤드로 병합할 수 없습니다."
 
-#: builtin/pull.c:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "여러 브랜치로 리베이스할 수 없습니다."
 
@@ -9170,12 +10621,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 "
@@ -9196,103 +10647,115 @@ msgstr ""
 "\n"
 "    git push <name>\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 "receive pack 프로그램"
 
-#: 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 "푸시 전 후크를 건너뜁니다"
 
-#: 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>) "
@@ -9367,6 +10830,65 @@ msgstr "드문 체크아웃 필터 적용을 건너뜁니다"
 msgid "debug unpack-trees"
 msgstr "unpack-trees 디버깅"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <git-dir>"
+
+#: 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"
+"'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:1897
+msgid "You must specify a directory."
+msgstr "디렉터리를 지정해야 합니다."
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9513,12 +11035,12 @@ msgstr "--mirror 옵션과 같이 마스터 브랜치를 지정하면 앞뒤가
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "마스터 브랜치를 지정은 fetch 미러에서만 앞뒤가 맞습니다"
 
-#: 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'은(는) 올바른 리모트 이름이 아닙니다"
@@ -9541,17 +11063,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"
@@ -9562,17 +11084,17 @@ msgstr ""
 "\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:"
@@ -9584,358 +11106,383 @@ msgstr[0] ""
 "다.\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 값. 여러 개 브랜치로 리베이스할 수 없습니다"
 
-#: 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:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(URL 없음)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  푸시  URL: %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD 브랜치: %s"
 
-#: builtin/remote.c:1167
+#: 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:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  리모트 브랜치:%s"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (상태를 질의하지 않음)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  'git pull'에 사용할 로컬 브랜치를 설정:"
 
-#: builtin/remote.c:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  로컬 레퍼런스를 'git push'로 미러링할 예정"
 
-#: builtin/remote.c:1206
+#: 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:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "레퍼런스/리모트/<이름>/HEAD 값을 리모트에 맞게 설정합니다"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "레퍼런스/리모트/<이름>/HEAD 값을 삭제합니다"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "리모트 HEAD를 결정할 수 없습니다"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr ""
 "리모트 HEAD 브랜치가 여러개입니다. 다음 중 하나를 명시적으로 지정하십시오:"
 
-#: builtin/remote.c:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "%s을(를) 삭제할 수 없습니다"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "올바른 레퍼런스가 아닙니다: %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "%s을(를) 설정할 수 없습니다"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s의 연결이 끊어집니다!"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s의 연결이 끊어졌습니다!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "잘라냄: %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [잘라낼 예정] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [잘라냄] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "가져온 후에 리모트를 잘라냅니다"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "그런 리모트가 없습니다 ('%s')"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "브랜치를 추가합니다"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "리모트를 지정하지 않았습니다"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "가져오기 URL이 아니라 푸시 URL을 질의합니다"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "모든 URL을 리턴합니다"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "'%s' 리모트에 대한 URL을 설정하지 않았습니다"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "푸시 URL을 지정합니다"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "URL을 추가합니다"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "URL을 삭제합니다"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 옵션을 둘다 쓰면 안 됩니다"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "잘못된 오래전 URL 패턴: %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "그런 URL이 없습니다: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "푸시용이 아닌 모든 URL을 삭제하지 않습니다"
 
-#: builtin/remote.c:1595
+#: 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 "git-pack-objects에 --no-reuse-delta 옵션을 넘깁니다"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "git-pack-objects에 --no-reuse-object 옵션을 넘깁니다"
 
-#: 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 "git-pack-objects에 --local 옵션을 넘깁니다"
 
-#: 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>"
@@ -10037,8 +11584,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>...]"
@@ -10158,27 +11705,27 @@ msgstr "인덱스 파일을 '%s' 리비전으로 리셋할 수 없습니다."
 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 "stuck long 형식으로 출력합니다"
 
-#: 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"
@@ -10251,31 +11798,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 "cherry-pick 실패"
 
@@ -10359,10 +11902,6 @@ msgstr "재귀적 제거를 허용합니다"
 msgid "exit with a zero status even if nothing matched"
 msgstr "아무 것도 일치하지 않으면 상태 0번으로 끝납니다"
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr "계속하려면 .gitmodules의 변경 사항을 스테이징하거나 stash하십시오"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10441,70 +11980,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 | --"
@@ -10565,82 +12157,222 @@ msgstr "주석 문자로 시작하는 모든 줄을 건너뛰고 제거합니다
 msgid "prepend comment character and space to each line"
 msgstr "각 줄의 앞에 주석 문자와 공백을 붙입니다"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
+#: 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:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "전체 레퍼런스 이름이 필요하지만, 입력은 %s"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "'%s' URL 하나의 단계를 잘라낼 수 없습니다"
+
+#: 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:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<경로>] [<경로>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, c-format
+msgid "No url found for submodule path '%s' in .gitmodules"
+msgstr ".gitmodules에서 하위 모듈 경로 '%s'에 대한 URL이 없습니다"
+
+#: builtin/submodule--helper.c:369
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "하위 모듈 경로 '%s'에 대한 URL을 등록하는데 실패했습니다"
+
+#: builtin/submodule--helper.c:373
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr "'%3$s' 경로에 대해 '%1$s' (%2$s) 하위 모듈 등록\n"
+
+#: builtin/submodule--helper.c:383
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "경고: '%s' 하위 모듈에 대해 커맨드 업데이트 모드가 제안되었습니다\n"
+
+#: builtin/submodule--helper.c:390
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr "'%s' 하위 모듈에 대해 업데이트 모드 등록이 실패했습니다"
+
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr "하위 모듈 초기화에 출력을 하지 않습니다"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<경로>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <경로>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "경로 '%s'에 대해 .gitmodules에 있는 하위모듈 매핑이 없습니다"
 
-#: builtin/submodule--helper.c:164
+#: 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 "submodule.alternateErrorStrategy에 대한 값이('%s') 알 수 없는 값입니다"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "submodule.alternateLocation에 대한 값이('%s') 알 수 없는 값입니다"
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "새 하위 모듈을 복제할 대상 위치"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "새 하위 모듈 이름"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "하위 모듈을 복제해 올 URL"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "얕은 복제에 사용할 깊이"
 
-#: builtin/submodule--helper.c:182
+#: 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>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<경로>] [--quiet] [--reference <저장소"
-">] [--name <이름>] [--url <URL>][--depth <깊이>] [--] [<경로>...]"
+">] [--name <이름>] [--depth <깊이>] --url <url> --path <경로>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "'%s' 디렉터리를 만들 수 없습니다"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "'%s'에서 하위 모듈 경로 '%s'에 복제하는데 실패했습니다"
 
-#: builtin/submodule--helper.c:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "'%s' 파일을 열 수 없습니다"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "%s 파일을 닫을 수 없습니다"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "'%s'에 대한 하위 모듈 디렉터리를 가져올 수 없습니다"
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "'%s' 하위 모듈 경로가 초기화되지 않았습니다"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "'update --init'을 하려고 한 것 아니었습니까?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "병합하지 하위 모듈 %s 건너뜀"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "하위 모듈 '%s' 건너뜀"
+
+#: 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:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "작업 폴더로 가는 경로, 내장된 하위 모듈의 경계 통과"
+
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout 또는 none"
+
+#: builtin/submodule--helper.c:956
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "지정한 개수의 리비전에서 잘린 얕은 복제를 만듭니다"
+
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr "병렬 작업 개수"
+
+#: 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:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<경로>] [<경로>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "파라미터 업데이트에 값이 잘못되었습니다"
+
+#: 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 ""
-"치명적 이상: submodule--helper 하위 명령은 하위 명령으로 호출해야 합니다"
+"하위 모듈 (%s) 브랜치가 상위 프로젝트 브랜치를 이어받도록 설정되었지만, 상위 "
+"프로젝트에 브랜치가 없습니다"
 
-#: builtin/submodule--helper.c:274
+#: builtin/submodule--helper.c:1100
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr "submodule--helper 하위 명령은 하위 명령으로 호출해야 합니다"
+
+#: builtin/submodule--helper.c:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "치명적 이상: '%s'은(는) 올바른 submodule--helper 하위 명령이 아닙니다"
+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>]"
@@ -10694,27 +12426,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <태그이름>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "태그 이름이 너무 깁니다: %.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "'%s' 태그가 없습니다."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "'%s' 태그 삭제함 (과거 %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "'%s' 태그를 검증할 수 없습니다"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -10727,7 +12454,7 @@ msgstr ""
 "  %s\n"
 "'%c' 문자로 시작하는 줄은 무시됩니다.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -10858,26 +12585,26 @@ msgstr "--merged 및 --no-merged 옵션은 -l 옵션과 같이 써야 합니다.
 msgid "only one -F or -m option is allowed."
 msgstr "하나의 -F 또는 -m 옵션만 쓸 수 있습니다."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "파라미터가 너무 많습니다"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
-msgstr "'%s'은9는) 올바른 태그 이름이 아닙니다."
+msgstr "'%s'은(는) 올바른 태그 이름이 아닙니다."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "태그 '%s'이(가) 이미 있습니다"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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 "오브젝트 묶음 푸는 중"
 
@@ -10939,140 +12666,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: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 "파일을 인덱스 전용으로 (\"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 "파일 시스템 테스트 없이 추적하지 않는 캐시를 사용합니다"
+msgstr "파일 시스템 시험 없이 추적하지 않는 캐시를 사용합니다"
+
+#: 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값이 참입니다. 정말로 추적하지 않는 파일 캐시를 사용하지 "
+"않으려면 이 값을 제거하거나 바꾸십시오."
 
-#: builtin/update-index.c:1134
+#: builtin/update-index.c:1123
 msgid "Untracked cache disabled"
-msgstr "추적되지 않는 캐시를 사용하지 않습니다"
+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값이 거짓입니다. 정말로 추적하지 않는 파일 캐시를 사용하려"
+"면 이 값을 제거하거나 바꾸십시오."
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "'%s'에 대해 추적되지 않는 캐시를 사용하지 않습니다"
@@ -11121,7 +12856,7 @@ msgstr "git verify-commit [-v | --verbose] <커밋>..."
 msgid "print commit contents"
 msgstr "커밋 내용을 표시합니다"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "원본 GPG 상태를 출력합니다"
 
@@ -11141,7 +12876,7 @@ msgstr "통계만 표시"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <태그>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "태그 내용 표시"
 
@@ -11150,78 +12885,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:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "worktrees/%s 제거: 올바른 디렉터리가 아닙나다"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "worktrees/%s 제거: gitdir 파일이 없습니다"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "worktrees/%s 제거: gitdir 파일을 읽을 수 없습니다 (%s)"
 
-#: builtin/worktree.c:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "worktrees/%s 제거: gitdir 파일이 올바르지 않습니다"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "worktrees/%s 제거: gitdir 파일이 없는 위치를 가리킵니다"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "제거에 실패했습니다: %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s'이(가) 이미 있습니다"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "'%s'의 디렉터리를 만들 수 없습니다"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "%s 준비 중 (ID %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "다른 작업 폴더에서 체크아웃했더라도 <브랜치>를 체크아웃합니다"
 
-#: builtin/worktree.c:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "새 브랜치를 만듭니다"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "브랜치를 만들거나 리셋합니다"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "HEAD를 해당 커밋에서 분리합니다"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "새 작업 폴더를 만듭니다"
+
+#: 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=<접두어>/]"
@@ -11238,7 +13004,41 @@ msgstr "하위 디렉터리 <접두어>에 대해 트리 오브젝트를 씁니
 msgid "only useful for debugging"
 msgstr "디버깅 용도로만 사용"
 
-#: credential-cache--daemon.c:262
+#: 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/ 폴더를 시도하지 않습니다."
+
+#: upload-pack.c:1034
+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 "디버깅 메시지를 표준오류로 출력합니다"
 
@@ -11252,7 +13052,12 @@ msgstr ""
 "목록을 볼 수 있습니다. 특정 하위 명령어나 개념에 대해 읽어 보려면 'git help\n"
 "<명령>' 또는 'git help <개념>' 명령을 실행하십시오."
 
-#: http.c:321
+# HTTP delegation
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "딜리게이션 컨트롤은 cURL 7.44.0 앞 버전에서는 지원하지 않습니다"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
 msgstr "공개 키 고정은 cURL 7.44.0 앞 버전에서는 지원하지 않습니다"
 
@@ -11298,7 +13103,7 @@ msgstr "저장소를 복제해 새 디렉터리로 가져 옵니다"
 
 #: common-cmds.h:22
 msgid "Record changes to the repository"
-msgstr "바뀐 사항을 저장소에 기록합니다."
+msgstr "바뀐 사항을 저장소에 기록합니다"
 
 #: common-cmds.h:23
 msgid "Show changes between commits, commit and working tree, etc"
@@ -11368,48 +13173,48 @@ 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>개의 숫자를 사용합니다"
 
-#: rerere.h:38
+#: rerere.h:40
 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>'."
@@ -11417,27 +13222,28 @@ msgstr ""
 "'$start_head' 받아오기가 실패했습니다. 'git bisect reset <valid-branch>'를 "
 "해 보십시오."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
 msgstr "cg-seek한 트리에서 bisect를 할 수 없습니다"
 
-#: 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
@@ -11580,7 +13386,45 @@ msgstr ""
 "'git bisect terms'에 대해 잘못된 인자 '$arg'.\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 "옥토퍼스 전략 병합을 할 수 없습니다."
+
+#: 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"
@@ -11592,16 +13436,21 @@ msgstr ""
 "원래 브랜치를 체크아웃하고 리베이스를 중지하려면, \"git rebase --abort\"를 실"
 "행하십시오."
 
-#: git-rebase.sh:165
+#: 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:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "\"$stash_sha1\"을(를) 저장할 수 없습니다"
 
-#: git-rebase.sh:169
+#: git-rebase.sh:171
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -11611,31 +13460,27 @@ msgstr ""
 "변경 사항은 스태시 안에 안전하게 들어 있습니다.\n"
 "언제든지 \"git stash pop\" 또는 \"git stash drop\"을 실행할 수 있습니다.\n"
 
-#: git-rebase.sh:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "리베이스 전 후크에서 리베이스를 거부했습니다."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "git-am이 진행 중인 것처럼 보입니다. 리베이스할 수 없습니다."
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "--exec 옵션은 --interactive 옵션과 같이 사용해야 합니다"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "리베이스가 진행 중이지 않습니다"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "--edit-todo 동작은 대화형 리베이스에서만 사용할 수 있습니다."
 
-#: git-rebase.sh:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "HEAD를 읽을 수 없습니다"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11643,12 +13488,7 @@ msgstr ""
 "모든 병합 충돌을 편집하고 git add\n"
 "명령으로 해결되었다고 표시해야 합니다"
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "'$head_name' 위치로 돌아갈 수 없습니다"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11669,97 +13509,101 @@ msgstr ""
 "이 명령을 다시 실행하십시오. 중요한 사항이 남아 있을 경우를\n"
 "대비해 여기서 멈춥니다."
 
-#: git-rebase.sh:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "잘못된 업스트림 $upstream_name"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 여러 개의 병합 베이스가 있습니다"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 병합 베이스가 없습니다"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "올바른 커밋을 가리키지 않습니다: $onto_name"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "치명적 이상: 그런 브랜치가 없습니다: $branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "자동 스태시를 할 수 없습니다"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "자동 스태시를 만들었습니다: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "커밋하거나 스태시에 넣으십시오."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다. 강제 리베이스합니다."
 
-#: git-rebase.sh:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "변경 사항 '$mb'에서 '$onto'(으)로:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "작업 사항을 다시 넣기 위해 먼저 헤드를 뒤로 돌립니다..."
 
-#: git-rebase.sh:623
+#: 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 clear 명령을 파라미터와 같이 쓰기는 구현되지 않았습니다"
 
-#: 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(으)로 업데이트할 수 없습니다"
@@ -11774,7 +13618,7 @@ msgstr "$ref_stash을(를) $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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -11783,113 +13627,126 @@ 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:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "'$remoteurl' URL에서 하나의 항목을 잘라낼 수 없습니다"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "상대 경로는 작업 폴더의 최상위에서만 쓸 수 있습니다"
 
-#: git-submodule.sh:291
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "저장소 URL: '$repo' 값은 절대 경로거나 ./ 또는 ../로 시작해야 합니다."
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path'은(는) 이미 인덱스에 있습니다"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11900,111 +13757,86 @@ msgstr ""
 "$sm_path\n"
 "정말로 추가하려면 -f 옵션을 사용하십시오."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "'$sm_path'의 기존 저장소를 인덱스에 추가합니다"
 
-#: git-submodule.sh:332
+#: 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:340
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "'$sm_name'에 대한 깃 디렉터리가 로컬에서 리모트가 있는 채로 있습니다:"
 
-#: git-submodule.sh:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr "다시 복제하지 않고 이 로컬 깃 디렉터리를 재활용하려면"
-
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"'--force' 옵션을 사용하십시오. 로컬 깃 디렉터리가 올바른 저장소가 아니거나"
-
-#: git-submodule.sh:345
+#: git-submodule.sh:245
 #, 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 "무슨 의미인지 잘 모르겠다면 '--name' 옵션으로 다른 이름을 쓰십시오."
+msgstr ""
+"이 로컬 깃 디렉터리를 다음 저장소에서 다시 복제하는 대신 다시 사용하려면,\n"
+"  $realrepo\n"
+"'--force' 옵션을 사용하십시오. 로컬 깃 디렉터리가 올바른 저장소가 아니거나\n"
+"무슨 의미인지 잘 모르겠으면 '--name' 옵션으로 다른 이름을 선택하십시오."
 
-#: git-submodule.sh:347
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "로컬 깃 디렉터리를 '$sm_name' 하위모듈로 다시 활성화합니다."
 
-#: git-submodule.sh:359
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 체크아웃할 수 없습니다"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 추가하는데 실패했습니다"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "'$sm_path' 하위 모듈을 등록하는데 실패했습니다"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "'$prefix$displaypath' 입력"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr ""
-"'$prefix$displaypath' 위치에서 멈춤. 스크립트에서 0이 아닌 상태를 리턴했습니"
-"다."
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr ".gitmodules에서 하위 모듈 경로 '$displaypath'에 대한 URL이 없습니다"
-
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "하위 모듈 경로 '$displaypath'에 대한 URL을 등록하는데 실패했습니다"
-
-#: git-submodule.sh:494
+#: git-submodule.sh:324
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "'$displaypath' 경로에 ($url) 대해 등록된 '$name' 하위 모듈"
+msgid "Entering '$displaypath'"
+msgstr "'$displaypath' 들어감"
 
-#: git-submodule.sh:511
+#: git-submodule.sh:344
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr ""
-"하위 모듈 경로 '$displaypath'에 대해 업데이트 모드를 등록하는데 실패했습니다"
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr "'$displaypath'에서 멈춤. 스크립트가 0이 아닌 상태를 리턴함."
 
-#: git-submodule.sh:549
+#: git-submodule.sh:415
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "ì \95ë§\90ë¡\9c ëª¨ë\93  í\95\98ì\9c\84 ëª¨ë\93\88 ì´\88기í\99\94를 í\95´ì \9cí\95\98려면 '.'ì\9d\84 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤"
+msgid "pathspec and --all are incompatible"
+msgstr "ê²½ë¡\9cëª\85ì\84¸ ë°\8f --all ì\98µì\85\98ì\9d\80 í\98¸í\99\98ë\90\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤"
 
-#: git-submodule.sh:566
+#: git-submodule.sh:420
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "í\95\98ì\9c\84 ëª¨ë\93\88 ì\9e\91ì\97\85 í\8f´ë\8d\94ì\97\90 ('$displaypath') .git ë\94\94ë \89í\84°ë¦¬ê°\80 ë\93¤ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤"
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "ì \95ë§\90ë¡\9c ëª¨ë\93  í\95\98ì\9c\84 ëª¨ë\93\88 ì´\88기í\99\94를 í\95´ì \9cí\95\98려면 '--all'ì\9d\84 ì\82¬ì\9a©í\95\98ì\8b­ì\8b\9cì\98¤"
 
-#: git-submodule.sh:567
+#: 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:573
+#: git-submodule.sh:448
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -12013,133 +13845,603 @@ msgstr ""
 "하위 모듈 작업 폴더에 ('$displaypath') 로컬 수정 사항이 있습니다. 버리려면 '-"
 "f'를 사용하십시오"
 
-#: git-submodule.sh:576
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "'$displaypath' 디렉터리를 지웁니다"
 
-#: git-submodule.sh:577
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "하위 모듈 디렉터리를 ('$displaypath') 제거할 수 없습니다"
 
-#: git-submodule.sh:580
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "빈 하위 모듈 디렉터리를 ('$displaypath') 만들 수 없습니다"
 
-#: git-submodule.sh:589
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr ""
 "'$name' 하위 모듈이 ($url) '$displaypath' 경로에 대해 등록되지 않았습니다"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"하위 모듈 경로가 ('$displaypath') 초기화되지 않았습니다\n"
-"아마도 'update --init'이 필요합니다?"
-
-#: git-submodule.sh:736
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "하위 모듈 경로에서 ('$displaypath') 현재 리비전을 찾을 수 없습니다"
 
-#: git-submodule.sh:745
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "하위 모듈 경로 '$sm_path'에서 가져올 수 없습니다"
 
-#: git-submodule.sh:768
+#: git-submodule.sh:632
+#, 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:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 가져올 수 없습니다"
 
-#: git-submodule.sh:788
+#: 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 "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 체크아웃할 수 없습니다"
 
-#: git-submodule.sh:789
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1' 체크아웃"
 
-#: git-submodule.sh:793
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 리베이스할 수 없습니다"
 
-#: git-submodule.sh:794
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1'(으)로 리베이스"
 
-#: git-submodule.sh:799
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1' 병합할 수 없습니다"
 
-#: git-submodule.sh:800
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "하위 모듈 경로 '$displaypath': '$sha1'에서 병합"
 
-#: git-submodule.sh:805
+#: git-submodule.sh:680
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr ""
-"하위 모듈 경로 '$prefix$sm_path'에서 '$command $sha1' 실행이 실패했습니다"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+msgstr "'$command $sha1' 실행이 하위 모듈 경로 '$displaypath'에서 실패했습니다"
 
-#: git-submodule.sh:806
+#: git-submodule.sh:681
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "하위 모듈 경로 '$prefix$sm_path': '$command $sha1'"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$command $sha1'"
 
-#: git-submodule.sh:836
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "재귀적으로 하위 모듈 경로 '$displaypath'에 들어가는데 실패했습니다"
 
-#: git-submodule.sh:944
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "--cached 옵션은 --files 옵션과 같이 쓸 수 없습니다"
 
-#: git-submodule.sh:996
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "예상치 못한 모드 $mod_dst"
 
-#: git-submodule.sh:1016
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  경고: '$display_name'에 '$sha1_src' 커밋이 들어있지 않습니다"
 
-#: git-submodule.sh:1019
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  경고: '$display_name'에 '$sha1_dst' 커밋이 들어있지 않습니다"
 
-#: git-submodule.sh:1022
+#: 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:1047
-msgid "blob"
-msgstr "블롭"
-
-#: git-submodule.sh:1165
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "재귀적으로 하위 모듈 경로 '$sm_path'에 들어가는데 실패했습니다"
 
-#: git-submodule.sh:1229
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "하위 모듈 URL을 '$displaypath'에 대해 동기화"
+
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "자세한 정보는 git-${cmd}(1) 페이지를 참고하십시오."
+
+#: git-rebase--interactive.sh:131
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "리베이스중 ($new_count/$total)"
+
+#: 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"
+msgstr ""
+"\n"
+"명령어:\n"
+" p, pick = 커밋 사용\n"
+" r, reword = 커밋 사용하지만, 커밋 메시지 편집\n"
+" e, edit = 커밋 사용하지만, 커밋 수정(amend)을 위해 중단\n"
+" s, squash = 커밋 사용하지만, 이전 커밋과 합치기\n"
+" f, fixup = \"squash\"와 같지만, 이 커밋의 로그 메시지를 버림\n"
+" x, exec = 셸을 사용해 명령 실행 (뒤에 명령 지정)\n"
+" d, drop = 커밋 제거\n"
+"\n"
+"이 줄은 순서를 바꿀 수 있습니다. 위에서 아래 순서로 실행합니다.\n"
+
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"줄을 제거하지 않습니다. 커밋을 제거하려면 명시적으로 'drop'을 사용하십시오.\n"
+
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"여기 줄을 제거하면 해당 커밋을 잃어버립니다!\n"
+
+#: git-rebase--interactive.sh:202
+#, 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:227
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1: 빼오기가 가능한 커밋이 아닙니다"
+
+#: git-rebase--interactive.sh:266
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "잘못된 커밋 이름: $sha1"
+
+#: git-rebase--interactive.sh:308
+msgid "Cannot write current commit's replacement sha1"
+msgstr "현재 커밋의 대체 sha1을 쓸 수 없습니다"
+
+#: git-rebase--interactive.sh:360
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "정방향 진행, $sha1 위치로"
+
+#: git-rebase--interactive.sh:362
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "$sha1 위치로 정방향 진행할 수 없습니다"
+
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "HEAD를 $first_parent 위치로 옮길 수 없습니다"
+
+#: git-rebase--interactive.sh:376
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "병합 squash 거부: $sha1"
+
+#: git-rebase--interactive.sh:390
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "$sha1 병합을 다시 하는데 오류"
+
+#: git-rebase--interactive.sh:398
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "$sha1을 빼오기 할 수 없습니다"
+
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "커밋 메시지 #${n}번입니다:"
+
+#: git-rebase--interactive.sh:412
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "#${n}번째 커밋 메시지를 건너뜁니다:"
+
+#: 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] "커밋 $count개가 섞인 결과입니다."
+
+#: git-rebase--interactive.sh:431
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "$fixup_msg를 쓸 수 없습니다"
+
+#: git-rebase--interactive.sh:434
+msgid "This is a combination of 2 commits."
+msgstr "커밋 2개가 섞인 결과입니다."
+
+#: git-rebase--interactive.sh:435
+msgid "This is the 1st commit message:"
+msgstr "1번째 커밋 메시지입니다:"
+
+#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
+#: git-rebase--interactive.sh:521
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "다음을 적용할(apply) 수 없습니다: $sha1... $rest"
+
+#: git-rebase--interactive.sh:549
+#, 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"
+"때문입니다. 커밋 메시지를 수정하기 전에 이 문제를 먼저 해결해야 합니다."
+
+#: git-rebase--interactive.sh:564
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "다음에서 멈춥니다: $sha1_abbrev... $rest"
+
+#: git-rebase--interactive.sh:579
+#, sh-format
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "이전 커밋 없이 '$squash_style' 수행할 수 없습니다"
+
+#: git-rebase--interactive.sh:621
+#, sh-format
+msgid "Executing: $rest"
+msgstr "실행 중: $rest"
+
+#: git-rebase--interactive.sh:629
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "실행 실패: $rest"
+
+#: git-rebase--interactive.sh:631
+msgid "and made changes to the index and/or the working tree"
+msgstr "그리고 인덱스 그리고/또는 작업 폴더에 변경 사항이 있습니다"
+
+#: git-rebase--interactive.sh:633
+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: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"
+msgstr ""
+"실행 성공: $rest\n"
+"하지만 변경 사항을 인덱스 및/또는 작업 폴더에 남겨둡니다.\n"
+"변경 사항을 커밋하거나 스태시에 넣으려면, 다음을 실행하십시오:\n"
+"\n"
+"\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:657
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "알 수 없는 명령: $command $sha1 $rest"
+
+#: git-rebase--interactive.sh:658
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "'git rebase --edit-todo' 명령으로 바로잡으십시오."
+
+#: git-rebase--interactive.sh:693
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "성공적으로 리베이스했고 $head_name 업데이트했습니다."
+
+#: git-rebase--interactive.sh:740
+msgid "Could not skip unnecessary pick commands"
+msgstr "불필요한 빼오기 명령을 건너뛸 수 없습니다"
+
+#: git-rebase--interactive.sh:898
+#, 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:931
+#, sh-format
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"경고: 다음 줄에서 명령어가 무엇인지 알 수 없습니다:\n"
+" - $line"
+
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "HEAD는 분리할 수 없습니다"
+
+#: git-rebase--interactive.sh:1008
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+msgstr ""
+"경고: 일부 커밋이 의도치 않게 버려졌을 수도 있습니다.\n"
+"버려진 커밋 (최근에서 과거 순서):"
+
+#: 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."
+msgstr ""
+"이 메시지를 보지 않으려면, \"drop\"을 사용해 명시적으로 커밋을 제거하십시"
+"오.\n"
+"\n"
+"'git config rebase.missingCommitsCheck' 명령으로 경고 단계를 바꿀 수 있습니"
+"다.\n"
+"가능한 동작은: ignore, warn, error"
+
+#: git-rebase--interactive.sh:1027
+#, 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' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"'git rebase --edit-todo' 명령으로 바로잡을 수 있고 'git rebase --continue' 명"
+"령을 실행합니다."
+
+#: git-rebase--interactive.sh:1045
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "아니면 'git rebase --abort' 명령으로 리베이스를 중지할 수도 있습니다."
+
+#: git-rebase--interactive.sh:1069
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "CHERRY_PICK_HEAD를 제거할 수 없습니다"
+
+#: git-rebase--interactive.sh:1074
+#, 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"
+"\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:1091
+msgid "Error trying to find the author identity to amend commit"
+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."
+msgstr ""
+"작업 폴더에 커밋하지 않은 변경 사항이 있습니다. 이 사항을 먼저\n"
+"커밋하고 'git rebase --continue' 명령을 다시 실행하십시오."
+
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+msgid "Could not commit staged changes."
+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"
+msgstr ""
+"\n"
+"진행 중인 대화형 리베이스의 TODO 파일을 편집하는 중입니다.\n"
+"편집 뒤에 리베이스를 계속하려면 다음을 실행하십시오:\n"
+"    git rebase --continue\n"
+"\n"
+
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "편집기를 실행할 수 없습니다"
+
+#: git-rebase--interactive.sh:1150
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "$switch_to를 체크아웃할 수 없습니다"
+
+#: git-rebase--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "HEAD가 없습니다?"
+
+#: git-rebase--interactive.sh:1156
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "임시로 $state_dir 디렉터리를 만들 수 없습니다"
+
+#: git-rebase--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "대화형으로 표시할 수 없습니다."
+
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+msgid "Could not init rewritten commits"
+msgstr "다시 작성된 커밋을 초기화할 수 없습니다"
+
+#: git-rebase--interactive.sh:1273
+#, 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:1278
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr ""
+"\n"
+"하지만 모두 제거할 경우, 리베이스를 중지합니다.\n"
+"\n"
+
+#: git-rebase--interactive.sh:1285
+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 "$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 "깃 디렉터리의 절대 경로를 알아낼 수 없습니다"
index 321b55387743b8531bbc3b1ec44eafec91a00bde..c8e096e858a813f3040c228ca6c1a96366c4a186 100644 (file)
@@ -1,16 +1,17 @@
 # Portuguese translations for Git package.
 # Copyright (C) 2012 Marco Sousa <marcomsousa AT gmail.com>
+# Copyright (C) 2016 Vasco Almeida <vascomalmeida@sapo.pt>
 # This file is distributed under the same license as the Git package.
-# Contributers:
+# Contributors:
 # - Marco Sousa <marcomsousa AT gmail.com>
-# Vasco Almeida <vasco13almeida@gmail.com>, 2016.
+# Vasco Almeida <vascomalmeida@sapo.pt>, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-22 16:00+0000\n"
-"Last-Translator: Vasco Almeida <vasco13almeida@gmail.com>\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:58+0800\n"
+"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
 "Language-Team: Portuguese\n"
 "Language: pt\n"
 "MIME-Version: 1.0\n"
@@ -22,3371 +23,4533 @@ msgstr ""
 #: advice.c:55
 #, c-format
 msgid "hint: %.*s\n"
-msgstr "sugestão: %.*s\n"
+msgstr "dica: %.*s\n"
 
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr ""
+"Não é possível efetuar cherry-pick porque tem ficheiros não integrados."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr "Não é possível submeter porque tem ficheiros não integrados."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr "Não é possível integrar porque tem ficheiros não integrados."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr "Não é possível puxar porque tem ficheiros não integrados."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr "Não é possível reverte porque tem ficheiros não integrados."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr "Não é possível efetuar %s porque tem ficheiros não integrados."
+
+#: 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 ""
 "Corrija-os na árvore de trabalho e use 'git add/rm <ficheiro>'\n"
-"conforme apropriado para marcá-los como resolvidos e faça commit."
+"conforme apropriado para marcá-los como resolvidos e submeta."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "A terminar devido a conflito não resolvido."
+
+#: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr "Merge não concluído (MERGE_HEAD presente)."
+msgstr "Não concluído a integração (MERGE_HEAD presente)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
-msgstr "Faça commit das suas alterações antes de efetuar merge."
+msgstr "Submeta as suas alterações antes de integrar."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
-msgstr "A terminar por causa de merge incompleto."
-
-#: archive.c:12
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr "git archive [<opções>] <árvore> [<caminho>...]"
-
-#: archive.c:13
-msgid "git archive --list"
-msgstr "git archive --list"
+msgstr "A terminar devido a integração incompleta."
 
-#: 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 <repo> [--exec <cmd>] [<opções>] <tree-ish> "
-"[<caminho>...]"
-
-#: archive.c:15
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr "git archive --remote <repo> [--exec <cmd>] --list"
+"Nota: a extrair '%s'.\n"
+"\n"
+"Encontra-se em estado 'HEAD destacada'. Pode inspecionar, fazer alterações\n"
+"experimentais e submetê-las e pode descartar qualquer commit que faça neste\n"
+"estado sem interferir outro ramo se extrair outro ramo.\n"
+"\n"
+"Se deseja criar um novo ramo para reter os commits que criou, pode fazê-lo\n"
+"(agora ou mais tarde) usando -b com o comando checkout outra vez. Exemplo:\n"
+"\n"
+"  git checkout -b <novo-nome-ramo>\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 "o especificador de caminho '%s' não corresponde a nenhum ficheiro"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+msgid "unrecognized whitespace option '%s'"
+msgstr "opção de espaço em branco não reconhecida '%s'"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "formato do arquivo"
+#: 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:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "prefixo"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject e --3way não podem ser usados juntos."
 
-#: 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:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached e --3way não podem ser usados juntos."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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 "ficheiro"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way fora de um repositório"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "escrever o arquivo para este ficheiro"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index fora de um repositório"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "ler .gitattributes do diretório de trabalho"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached fora de um repositório"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "listar ficheiros arquivados para stderr"
+#: 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:437
-msgid "store only"
-msgstr "armazenar apenas"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec retornou %d para a entra: %s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "compressão rápida"
+#: 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:446
-msgid "compress better"
-msgstr "compressão ótima"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "listar formatos de arquivo suportados"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "repo"
+#: 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: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: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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "comando"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recontagem: linha inesperada: %.*s"
 
-#: 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:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "fragmento de patch sem cabeçalho na linha %d: %.*s"
 
-#: attr.c:263
+#: apply.c:1577
+#, c-format
 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."
+"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)"
 
-#: branch.c:53
+#: apply.c:1589
 #, 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 problema, pode tentar corrigir\n"
-"o ramo remoto que deve ser seguido invocando\n"
-"\"git branch --set-upstream-to=%s%s%s\"."
+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)"
 
-#: branch.c:67
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "o novo ficheiro depende de conteúdos antigos"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "o ficheiro eliminado ainda tem conteúdos"
+
+#: apply.c:1795
 #, 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 "corrupt patch at line %d"
+msgstr "patch corrompido na linha %d"
 
-#: branch.c:93
+#: apply.c:1832
 #, 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."
+msgid "new file %s depends on old contents"
+msgstr "o novo ficheiro %s depende de conteúdos antigos"
 
-#: branch.c:94
+#: apply.c:1834
 #, 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 "deleted file %s still has contents"
+msgstr "o ficheiro eliminado %s ainda tem conteúdos"
 
-#: branch.c:98
+#: apply.c:1837
 #, 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 "** warning: file %s becomes empty but is not deleted"
+msgstr "** aviso: o ficheiro %s ficará vazio, mas não será eliminado"
 
-#: branch.c:99
+#: apply.c:1984
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ramo %s configurado para seguir o ramo local %s."
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "patch binário corrompido na linha %d: %.*s"
 
-#: branch.c:104
+#: apply.c:2021
 #, 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 "unrecognized binary patch at line %d"
+msgstr "patch binário não reconhecido na linha %d"
 
-#: branch.c:105
+#: apply.c:2182
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Ramo %s configurado para seguir a referência remota %s."
+msgid "patch with only garbage at line %d"
+msgstr "patch incompreensível na linha %d"
 
-#: branch.c:109
+#: apply.c:2274
 #, 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."
+msgid "unable to read symlink %s"
+msgstr "não é possível ler a ligação simbólica %s"
 
-#: branch.c:110
+#: apply.c:2278
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Ramo %s configurado para seguir a referência local %s."
+msgid "unable to open or read %s"
+msgstr "não é possível abrir ou ler %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"
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "início de linha inválido: '%c'"
 
-#: branch.c:156
+#: apply.c:3050
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Não seguido: informação da referência %s ambígua"
+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)."
 
-#: branch.c:185
+#: apply.c:3062
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "'%s' não é um nome válido para um ramo."
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Contexto reduzido para (%ld/%ld) para aplicar o fragmento em %d"
 
-#: branch.c:190
+#: apply.c:3068
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Já existe um ramo designado '%s'."
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"ao procura por:\n"
+"%.*s"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Não é possível forçar a atualização do ramo atual."
+#: apply.c:3090
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "falta de dados do patch binário '%s'"
 
-#: branch.c:218
+#: apply.c:3098
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 msgstr ""
-"Não é possível configurar ramo a seguir; o ponto inicial '%s' não é um ramo."
+"não é possível aplicar o reverso de um patch binário a '%s' sem o excerto "
+"reverso"
 
-#: branch.c:220
+#: apply.c:3144
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "o ramo a montante solicitado '%s' não existe"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"não é possível aplicar patch binário a '%s' sem linha de índice completa"
 
-#: branch.c:222
+#: apply.c:3154
+#, 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."
+"the patch applies to '%s' (%s), which does not match the current contents."
 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."
+"o patch aplica-se a '%s' (%s), que não corresponde aos conteúdos atuais."
 
-#: branch.c:266
+#: apply.c:3162
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Nome de objeto inválido: '%s'."
+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"
 
-#: branch.c:286
+#: apply.c:3180
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Nome de objeto ambíguo: '%s'."
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "não é possível ler a postimage necessária %s de '%s'"
 
-#: branch.c:291
+#: apply.c:3193
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ponto no ramo inválido: '%s'."
+msgid "binary patch does not apply to '%s'"
+msgstr "o patch binário não foi aplicado corretamente a '%s'"
 
-#: branch.c:344
+#: apply.c:3199
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "'%s' já extraído em '%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)"
 
-#: bundle.c:34
+#: apply.c:3220
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' não parece ser um ficheiro bundle v2"
+msgid "patch failed: %s:%ld"
+msgstr "falha ao aplicar o patch: %s:%ld"
 
-#: bundle.c:61
+#: apply.c:3342
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "cabeçalho não reconhecido: %s%s (%d)"
+msgid "cannot checkout %s"
+msgstr "não é possível extrair %s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, c-format
-msgid "could not open '%s'"
-msgstr "não é 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:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "falha ao configurar percurso de revisões"
+msgid "failed to read %s"
+msgstr "falha ao ler %s"
 
-#: bundle.c:185
+#: apply.c:3398
 #, 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 "reading from '%s' beyond a symbolic link"
+msgstr "a ler '%s' indicado por uma ligação simbólica"
 
-#: bundle.c:194
+#: apply.c:3427 apply.c:3667
 #, 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"
+msgid "path %s has been renamed/deleted"
+msgstr "o caminho %s foi eliminado ou mudou de nome"
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, 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 "%s: does not exist in index"
+msgstr "%s: não existe no índice"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "argumento não reconhecido: %s"
+msgid "%s: does not match index"
+msgstr "%s: não tem correspondência no índice"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Criação de bundle vazio recusada."
+#: apply.c:3554
+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."
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "não é possível criar '%s'"
-
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "index-pack terminou inesperadamente"
+msgid "Falling back to three-way merge...\n"
+msgstr "A recorrer a integração com 3 pontos...\n"
 
-#: color.c:275
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "valor de cor inválido: %.*s"
+msgid "cannot read the current contents of '%s'"
+msgstr "não é possível ler o conteúdo atual de '%s'"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3589
 #, c-format
-msgid "could not parse %s"
-msgstr "não foi possível analisar %s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Falha a recorrer a integração com 3 pontos...\n"
 
-#: commit.c:42
+#: apply.c:3603
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s não é um commit!"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Patch aplicado a '%s' com conflitos.\n"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "memória esgotada"
+#: apply.c:3608
+#, c-format
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Patch aplicado a '%s' com sucesso.\n"
 
-#: config.c:475 config.c:477
-#, fuzzy, c-format
-msgid "bad config line %d in %s %s"
-msgstr "linha %d de configuração incorreta em %s %s"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "patch de remoção deixa conteúdos no ficheiro"
 
-#: config.c:593
+#: apply.c:3706
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "valor numérico '%s' da configuração '%s' em %s %s incorreto: %s"
+msgid "%s: wrong type"
+msgstr "%s: tipo errado"
 
-#: config.c:595
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "valor numérico '%s' da configuração '%s' incorreto: %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s é do tipo %o, esperado %o"
 
-#: config.c:680
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "falha ao expandir diretório de utilizador em: '%s'"
+msgid "invalid path '%s'"
+msgstr "caminho inválido '%s'"
 
-#: config.c:758 config.c:769
+#: apply.c:3917
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "nível de compressão zlib %d incorreto"
+msgid "%s: already exists in index"
+msgstr "%s: já existe no índice"
 
-#: config.c:891
+#: apply.c:3920
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "modo inválido para criação de objeto: %s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "não é possível analisar configuração de linha de comandos"
-
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr ""
-"ocorreu um erro desconhecido durante a leitura dos ficheiros de configuração"
+msgid "%s: already exists in working directory"
+msgstr "%s: já existe no diretório de trabalho"
 
-#: config.c:1629
+#: apply.c:3940
 #, 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"
+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)"
 
-#: config.c:1631
+#: apply.c:3945
 #, 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"
+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"
 
-#: config.c:1690
+#: apply.c:3965
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s tem múltiplos valores"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "o ficheiro afetado '%s' é indicado por uma ligação simbólica"
 
-#: config.c:2226
+#: apply.c:3969
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Não foi possível definir '%s' como '%s'"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Não foi possível executar 'git rev-list'"
+msgid "%s: patch does not apply"
+msgstr "%s: patch não se aplica com sucesso"
 
-#: connected.c:89
+#: apply.c:3984
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "falha ao escrever para rev-list: %s"
+msgid "Checking patch %s..."
+msgstr "A verificar o patch %s..."
 
-#: connected.c:97
+#: apply.c:4075
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "falha ao fechar stdin de rev-list: %s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "no futuro"
+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"
 
-#: date.c:101
+#: apply.c:4082
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "há %lu segundo atrás"
-msgstr[1] "há %lu segundos atrás"
+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"
 
-#: date.c:108
+#: apply.c:4085
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "há %lu minuto atrás"
-msgstr[1] "há %lu minutos atrás"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "falta informação de sha1 ou não é útil (%s)."
 
-#: date.c:115
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "há %lu hora atrás"
-msgstr[1] "há %lu horas atrás"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "falha ao invocar make_cache_entry em '%s'"
 
-#: date.c:122
+#: apply.c:4094
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "há %lu dia atrás"
-msgstr[1] "há %lu dias atrás"
+msgid "could not add %s to temporary index"
+msgstr "não foi possível adicionar %s ao índice temporário"
 
-#: date.c:128
+#: apply.c:4104
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "há %lu semana atrás"
-msgstr[1] "há %lu semanas atrás"
+msgid "could not write temporary index to %s"
+msgstr "não foi possível escrever índice temporário para %s"
 
-#: date.c:135
+#: apply.c:4242
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "há %lu mês atrás"
-msgstr[1] "há %lu meses atrás"
+msgid "unable to remove %s from index"
+msgstr "não é possível remover %s do índice"
 
-#: date.c:146
+#: apply.c:4277
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu ano"
-msgstr[1] "%lu anos"
+msgid "corrupt patch for submodule %s"
+msgstr "patch corrompido no submódulo %s"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4283
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "há %s e %lu mês"
-msgstr[1] "há %s e %lu meses"
+msgid "unable to stat newly created file '%s'"
+msgstr "não é possível obter estado do novo ficheiro criado '%s'"
 
-#: date.c:154 date.c:159
+#: apply.c:4291
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "há %lu ano atrás"
-msgstr[1] "há %lu anos atrás"
+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"
 
-#: diffcore-order.c:24
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "falha ao ler o ficheiro de comando '%s'"
-
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Deteção de mudança de nome inexata em curso"
+msgid "unable to add cache entry for %s"
+msgstr "não é possível adicionar %s à cache"
 
-#: diff.c:115
+#: apply.c:4338
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  Falha ao analisar percentagem limite de dirstat '%s'\n"
+msgid "failed to write to '%s'"
+msgstr "falha ao escrever para '%s'"
 
-#: diff.c:120
+#: apply.c:4342
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Parâmetro de dirstat desconhecido '%s'\n"
+msgid "closing file '%s'"
+msgstr "a fechar o ficheiro '%s'"
 
-#: diff.c:215
+#: apply.c:4412
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Valor desconhecido na variável de configuração 'diff.submodule': '%s'"
+msgid "unable to write file '%s' mode %o"
+msgstr "não é possível escrever o ficheiro '%s' com o modo %o"
 
-#: diff.c:267
+#: apply.c:4510
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Erros encontrados na variável de configuração 'diff.dirstat':\n"
-"%s"
+msgid "Applied patch %s cleanly."
+msgstr "Patch %s aplicado com sucesso."
 
-#: diff.c:2997
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr "o diff externo terminou inesperadamente, interrompido em %s"
+#: apply.c:4518
+msgid "internal error"
+msgstr "erro interno"
 
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow requer exatamente um único especificador de caminho"
+#: apply.c:4521
+#, 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..."
 
-#: diff.c:3556
+#: apply.c:4532
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Falha ao analisar parâmetro da opção --dirstat/-X:\n"
-"%s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "a truncar o nome do ficheiro .rej em %.*s.rej"
 
-#: diff.c:3570
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Falha ao analisar parâmetro da opção --submodule: '%s'"
+msgid "cannot open %s"
+msgstr "não é possível abrir %s"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "falha ao obter nome e informação do kernel"
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "Excerto nº%d aplicado com sucesso."
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr "A cache não controlada está desativada neste sistema ou localização."
+#: apply.c:4558
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "Excerto nº%d rejeitado."
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "não foi possível executar gpg."
+#: apply.c:4668
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "Patch '%s' ignorado."
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg não aceitou os dados"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "entrada não reconhecida"
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg não assinou os dados"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "não foi possível ler o ficheiro de índice"
 
-#: gpg-interface.c:222
+#: apply.c:4833
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "não foi possível criar ficheiro temporário '%s': %s"
+msgid "can't open patch '%s': %s"
+msgstr "não é possível abrir o patch '%s': %s"
 
-#: gpg-interface.c:225
+#: apply.c:4858
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "falha ao escrever assinatura destacada em '%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"
 
-#: grep.c:1718
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s': não foi possível ler %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."
 
-#: grep.c:1735
+#: apply.c:4872
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s': %s"
+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."
 
-#: grep.c:1746
-#, c-format
-msgid "'%s': short read %s"
-msgstr "'%s': leitura truncada %s"
+#: apply.c:4888 builtin/add.c:463 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"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "comandos do git disponível em '%s'"
+#: 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 "caminho"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "comandos do git disponíveis noutras localizações em $PATH"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "não aplicar alterações que correspondam ao caminho fornecido"
+
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "aplicar alterações que correspondam ao caminho fornecido"
+
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "num"
+
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "remover <num> barras à esquerda dos caminhos de diff tradicional"
+
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "ignorar adições feitas pelo patch"
+
+#: apply.c:4931
+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:4935
+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:4937
+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:4939
+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:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "garantir que o patch pode ser aplicado ao índice atual"
+
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "aplicar um patch sem tocar na árvore de trabalho"
+
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "aceitar patches que alteram ficheiros fora da área de trabalho"
+
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "aplicar o patch também (use com --stat/--summary/--check)"
+
+#: apply.c:4949
+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:4951
+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:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "os caminhos estão separados por caracteres NUL"
+
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "garantir que, pelo menos, <n> linhas de contexto coincidem"
+
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "ação"
+
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "detetar linhas novas ou modificadas que tenham espaços em branco"
+
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorar alterações de espaço em branco ao procurar contexto"
+
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "aplicar o patch em reverso"
+
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "não esperar nenhuma linha de contexto"
+
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "deixar os excertos rejeitados nos respetivos ficheiros *.rej"
+
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "permitir a sobreposição de excertos"
+
+#: 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 "ser verboso"
+
+#: apply.c:4976
+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:4979
+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:4981 builtin/am.c:2274
+msgid "root"
+msgstr "raiz"
+
+#: apply.c:4982
+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:344 builtin/add.c:152 builtin/add.c:442 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"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "fmt"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "formato do arquivo"
+
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "prefixo"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "preceder o prefixo a cada nome de caminho dentro do arquivo"
+
+#: archive.c:432 builtin/archive.c:88 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 "ficheiro"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "escrever o arquivo para este ficheiro"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "ler .gitattributes do diretório de trabalho"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "listar ficheiros arquivados para stderr"
+
+#: archive.c:437
+msgid "store only"
+msgstr "armazenar apenas"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "compressão rápida"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "compressão ótima"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "listar formatos de arquivo suportados"
+
+#: 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 "repo"
+
+#: 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>"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "comando"
+
+#: 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"
+
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Opção inesperada --remote"
+
+#: 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"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Opção inesperada --output"
+
+#: archive.c:487
+#, c-format
+msgid "Unknown archive format '%s'"
+msgstr "Formato de arquivo desconhecido '%s'"
+
+#: archive.c:494
+#, c-format
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argumento não suportado para o formato '%s': -%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."
+
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Não foi possível abrir o ficheiro '%s'"
+
+#: bisect.c:446
+#, c-format
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Conteúdo incorretamente citado no ficheiro '%s': %s"
+
+#: bisect.c:655
+#, c-format
+msgid "We cannot bisect more!\n"
+msgstr "Não se está a bissetar mais!\n"
+
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "%s não é um nome de commit válido"
+
+#: 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 ""
+"A base de integração %s é má (bad).\n"
+"Significa que o bug foi corrigido entre %s e [%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 ""
+"A base de integração %s é nova (new).\n"
+"A propriedade foi mudada entre %s e [%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 ""
+"A base de integração %s é %s.\n"
+"Significa que o primeiro commit '%s' está entre %s e [%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 ""
+"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: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 ""
+"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:798
+#, 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:849
+#, c-format
+msgid "a %s revision is needed"
+msgstr "precisa-se de uma revisão %s"
+
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "não foi possível criar o ficheiro '%s'"
+
+#: bisect.c:917
+#, c-format
+msgid "could not read file '%s'"
+msgstr "não foi possível ler o ficheiro '%s'"
+
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "falha ao ler referências bissetadas"
+
+#: bisect.c:967
+#, c-format
+msgid "%s was both %s and %s\n"
+msgstr "%s era %s e %s em simultâneo\n"
+
+#: bisect.c:975
+#, 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:994
+#, 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: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] "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:363
+#, 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:963 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: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 "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:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, 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:290
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "valor de cor inválido: %.*s"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Estes são comandos do Git comuns usados em diversas situações:"
+#: 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 "não foi possível analisar %s"
 
-#: help.c:309
+#: commit.c:42
 #, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s não é um commit!"
+
+#: 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?"
+"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 ""
-"'%s' parece ser um comando do git, mas não é possível\n"
-"executá-lo. Talvez git-%s esteja danificado?"
+"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"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Ai ai. Não há nenhum comando do Git disponível no sistema."
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "memória esgotada"
 
-#: 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 ""
-"AVISO: Invocou um comando do Git designado '%s' que não existe.\n"
-"Continuando, assumindo que queria dizer '%s'"
+msgid "bad config line %d in blob %s"
+msgstr "linha de configuração %d incorreta no blob %s"
 
-#: help.c:393
+#: config.c:520
 #, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "automaticamente em %0.1f..."
+msgid "bad config line %d in file %s"
+msgstr "linha de configuração %d incorreta no ficheiro %s"
 
-#: help.c:400
+#: config.c:524
 #, 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'."
+msgid "bad config line %d in standard input"
+msgstr "linha de configuração %d incorreta na entrada padrão"
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Queria dizer isto?"
-msgstr[1] ""
-"\n"
-"Queria dizer deste?"
+#: config.c:528
+#, c-format
+msgid "bad config line %d in submodule-blob %s"
+msgstr "linha de configuração %d incorreta no submódulo-blob %s"
 
-#: help.c:460
+#: config.c:532
 #, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+msgid "bad config line %d in command line %s"
+msgstr "linha de configuração %d incorreta na linha de comandos %s"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "falha ao ler a cache"
+#: config.c:536
+#, c-format
+msgid "bad config line %d in %s"
+msgstr "linha de configuração %d incorreta em %s"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
-msgstr "não foi possível escrever novo ficheiro de índice"
+#: config.c:655
+msgid "out of range"
+msgstr "fora de intervalo"
+
+#: config.c:655
+msgid "invalid unit"
+msgstr "unidade inválida"
 
-#: merge-recursive.c:189
+#: config.c:661
 #, c-format
-msgid "(bad commit)\n"
-msgstr "(commit incorreto)\n"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "valor numérico '%s' da configuração '%s' incorreto: %s"
 
-#: merge-recursive.c:209
+#: config.c:666
 #, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache falhou no caminho '%s'"
+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"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "erro ao construir árvores"
+#: config.c:669
+#, 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"
 
-#: merge-recursive.c:689
+#: config.c:672
 #, c-format
-msgid "failed to create path '%s'%s"
-msgstr "falha ao criar o caminho '%s'%s"
+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"
 
-#: merge-recursive.c:700
+#: config.c:675
 #, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "A remover %s para criar espaço para o subdiretório\n"
+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"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": talvez um conflito D/F?"
+#: config.c:678
+#, 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"
 
-#: merge-recursive.c:725
+#: config.c:681
 #, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "recusando-se a perder ficheiro não controlado em '%s'"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "valor numérico '%s' da configuração '%s' incorreto em %s: %s"
 
-#: merge-recursive.c:765
+#: config.c:768
 #, c-format
-msgid "cannot read object %s '%s'"
-msgstr "não é possível ler o objeto %s: '%s'"
+msgid "failed to expand user dir in: '%s'"
+msgstr "falha ao expandir diretório de utilizador em: '%s'"
 
-#: merge-recursive.c:767
+#: config.c:852 config.c:863
 #, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob para %s '%s' esperado"
+msgid "bad zlib compression level %d"
+msgstr "nível de compressão zlib %d incorreto"
 
-#: merge-recursive.c:790 builtin/clone.c:374
+#: config.c:978
 #, c-format
-msgid "failed to open '%s'"
-msgstr "falha ao abrir '%s'"
+msgid "invalid mode for object creation: %s"
+msgstr "modo inválido para criação de objeto: %s"
 
-#: merge-recursive.c:798
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "não é possível analisar configuração de linha de comandos"
+
+#: config.c:1362
+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
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "falha ao criar a ligação simbólica '%s'"
+msgid "unable to parse '%s' from command-line config"
+msgstr "não é possível analisar '%s' da configuração de linha de comandos"
 
-#: merge-recursive.c:801
+#: config.c:1718
 #, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "não sei o que fazer com %06o %s '%s'"
+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"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Falha ao executar merge interno"
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s tem múltiplos valores"
 
-#: merge-recursive.c:943
+#: config.c:2311
 #, c-format
-msgid "Unable to add %s to database"
-msgstr "Não é possível adicionar %s à base de dados"
+msgid "could not set '%s' to '%s'"
+msgstr "não foi possível definir '%s' como '%s'"
+
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
+msgstr "não foi possível reiniciar '%s'"
+
+#: 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:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "A verificar conectividade"
+
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Não foi possível executar 'git rev-list'"
+
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "falha ao escrever para rev-list"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "tipo de objeto sem suporte encontrado na árvore"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "falha ao fechar entrada padrão de rev-list"
 
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: convert.c:201
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
-"deixada na árvore."
+"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."
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: convert.c:211
 #, c-format
 msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
-"deixada na árvore em %s."
+"LF será substituído por CRLF em %s.\n"
+"O final de linha original será mantido no ficheiro da sua árvore de trabalho."
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "mudar nome"
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF será substituído por CRLF em %s."
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "nome mudado"
+#: date.c:97
+msgid "in the future"
+msgstr "no futuro"
 
-#: merge-recursive.c:1150
+#: date.c:103
 #, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s é um diretório em %s adicionando %s no seu lugar"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "há %lu segundo"
+msgstr[1] "há %lu segundos"
 
-#: merge-recursive.c:1172
+#: date.c:110
 #, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-"CONFLITO (mudar nome/mudar nome): Mudar o nome \"%s\"->\"%s\" no ramo \"%s\" "
-"mudar o nome \"%s\"->\"%s\" em \"%s\"%s"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "há %lu minuto"
+msgstr[1] "há %lu minutos"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (por resolver)"
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "há %lu hora"
+msgstr[1] "há %lu horas"
 
-#: merge-recursive.c:1231
+#: date.c:124
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"CONFLITO (mudar nome/mudar nome): Mudar de nome %s->%s em %s. Mudar o nome "
-"%s->%s em %s"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "há %lu dia"
+msgstr[1] "há %lu dias"
 
-#: merge-recursive.c:1261
+#: date.c:130
 #, c-format
-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"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "há %lu semana"
+msgstr[1] "há %lu semanas"
 
-#: merge-recursive.c:1460
+#: date.c:137
 #, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "há %lu mês"
+msgstr[1] "há %lu meses"
+
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu ano"
+msgstr[1] "%lu anos"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "há %s e %lu mês"
+msgstr[1] "há %s e %lu meses"
+
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "há %lu ano"
+msgstr[1] "há %lu anos"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "falha ao ler o ficheiro de comando '%s'"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Deteção de mudança de nome inexata em curso"
+
+#: 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:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Parâmetro de dirstat desconhecido '%s'\n"
+
+#: diff.c:283
+#, 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:346
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
 msgstr ""
-"CONFLITO (mudar nome/adicionar): Mudar o nome %s->%s em %s. %s adicionado em "
+"Erros encontrados na variável de configuração 'diff.dirstat':\n"
 "%s"
 
-#: merge-recursive.c:1470
+#: diff.c:3087
 #, c-format
-msgid "Adding merged %s"
-msgstr "A adicionar %s integrado"
+msgid "external diff died, stopping at %s"
+msgstr "o diff externo terminou inesperadamente, interrompido em %s"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: diff.c:3412
+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:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow requer exatamente um único especificador de caminho"
+
+#: diff.c:3665
 #, c-format
-msgid "Adding as %s instead"
-msgstr "A adicionar como %s, em alternativa."
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Falha ao analisar parâmetro da opção --dirstat/-X:\n"
+"%s"
 
-#: merge-recursive.c:1526
+#: diff.c:3679
 #, c-format
-msgid "cannot read object %s"
-msgstr "não foi possível ler o objeto %s"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Falha ao analisar parâmetro da opção --submodule: '%s'"
 
-#: merge-recursive.c:1529
+#: diff.c:4700
+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:4703
+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:4706
 #, c-format
-msgid "object %s is not a blob"
-msgstr "o objeto %s não é um blob"
+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."
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "modificar"
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "falha ao obter nome e informação do kernel"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "modificado"
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "A cache não controlada está desativada neste sistema ou localização."
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "conteúdo"
+#: fetch-pack.c:213
+#, fuzzy
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: esperava-se lista rasa"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "adicionar/adicionar"
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-pack: esperava-se ACK/NAK, obteve-se EOF"
 
-#: merge-recursive.c:1632
+#: fetch-pack.c:243
 #, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "%s ignorado (integrado é igual ao existente)"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: esperava-se ACK/NAK, obteve-se '%s'"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc requer multi_ack_detailed"
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Merge automático de %s"
+#: fetch-pack.c:381
+#, fuzzy, c-format
+msgid "invalid shallow line: %s"
+msgstr "linha rasa inválida: %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "submódulo"
+#: fetch-pack.c:387
+#, fuzzy, c-format
+msgid "invalid unshallow line: %s"
+msgstr "linha para aprofundar inválida: %s"
 
-#: merge-recursive.c:1651
+#: fetch-pack.c:389
 #, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLITO (%s): conflito de merge em %s"
+msgid "object not found: %s"
+msgstr "objeto não encontrado: %s"
 
-#: merge-recursive.c:1737
+#: fetch-pack.c:392
 #, c-format
-msgid "Removing %s"
-msgstr "A remover %s"
+msgid "error in object: %s"
+msgstr "erro no objeto: %s"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "ficheiro/diretório"
+#: fetch-pack.c:394
+#, fuzzy, c-format
+msgid "no shallow found: %s"
+msgstr "raso não encontrado: %s"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "diretório/ficheiro"
+#: fetch-pack.c:397
+#, fuzzy, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "esperava-se raso/aprofundar, obteve-se %s"
 
-#: merge-recursive.c:1773
+#: fetch-pack.c:436
 #, 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"
+msgid "got %s %d %s"
+msgstr "obteve-se %s %d %s"
 
-#: merge-recursive.c:1783
+#: fetch-pack.c:450
 #, c-format
-msgid "Adding %s"
-msgstr "A adicionar %s"
+msgid "invalid commit %s"
+msgstr "commit inválido %s"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Falha de merge fatal, não devia acontecer."
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "desistência"
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "Já está atualizado!"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "concluído"
 
-#: merge-recursive.c:1828
+#: fetch-pack.c:505
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "falha ao realizar merge das árvores %s e %s"
+msgid "got %s (%d) %s"
+msgstr "obteve-se %s (%d) %s"
 
-#: merge-recursive.c:1858
+#: fetch-pack.c:551
 #, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Caminho não processado??? %s"
-
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "A realizar merge:"
+msgid "Marking %s as complete"
+msgstr "Marcado %s como completo"
 
-#: merge-recursive.c:1919
+#: fetch-pack.c:697
 #, 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:"
+msgid "already have %s (%s)"
+msgstr "já se tem %s (%s)"
 
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
-msgstr "merge não retornou nenhum commit"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr ""
 
-#: merge-recursive.c:2013
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "erro de protocolo: cabeçalho de pacote incorreto"
+
+#: fetch-pack.c:799
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Não foi possível analisar o objeto '%s'"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: não é possível criar processo filho %s"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "Não é possível escrever no índice."
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "%s falhou"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
 msgstr ""
-"Não é possível fazer commit de árvore de notas não inicializada ou não "
-"referenciada"
 
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Valor de notes.rewriteMode incorreto: '%s'"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "O servidor não suporta clientes rasos"
 
-#: notes-utils.c:110
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Recusando-se a reescrever notas em %s (fora de refs/notes/)"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "O servidor suporta multi_ack_detailed"
 
-#. 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 "Valor incorreto de %s: '%s'"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "O servidor suporta no-done"
 
-#: object.c:242
-#, c-format
-msgid "unable to parse object: %s"
-msgstr "não foi possível analisar o objeto: %s"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "O servidor suporta muilti_ack"
 
-#: parse-options.c:570
-msgid "..."
-msgstr "..."
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "O servidor suporta side-band-64k"
 
-#: parse-options.c:588
-#, c-format
-msgid "usage: %s"
-msgstr "utilização: %s"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "O servidor suporta side-band"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
-#, c-format
-msgid "   or: %s"
-msgstr "        ou: %s"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "O servidor suporta allow-tip-sha1-in-want"
 
-#: parse-options.c:595
-#, c-format
-msgid "    %s"
-msgstr "         %s"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "O servidor suporta allow-reachable-sha1-in-want"
 
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-NUM"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "O servidor suporta ofs-delta"
 
-#: parse-options-cb.c:108
+#: fetch-pack.c:890
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "nome do objeto malformado '%s'"
+msgid "Server version is %.*s"
+msgstr "A versão do servidor é %.*s"
 
-#: path.c:752
-#, 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"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "O servidor não suporta --shallow-since"
 
-#: pathspec.c:133
-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"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "O servidor não suporta --shallow-exclude"
 
-#: pathspec.c:143
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-"a definição global de especificador de caminho 'literal' é incompatível com "
-"todas as outras definições globais de especificador de caminho (pathspec)"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "O servidor não suporta --deepen"
 
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "parâmetro inválido na mágica 'prefix' do especificador de caminho"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "nenhum commit em comum"
 
-#: pathspec.c:183
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Mágica do especificador de caminho '%.*s' inválida em '%s'"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: falha ao obter."
 
-#: pathspec.c:187
-#, 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'"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "nenhuma cabeça remota correspondente"
 
-#: pathspec.c:205
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Mágica de especificador de caminho '%c' em '%s' não implementada"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg não assinou os dados"
 
-#: pathspec.c:230
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: 'literal' e 'glob' são incompatíveis"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "não foi possível criar ficheiro temporário"
 
-#: pathspec.c:241
+#: gpg-interface.c:217
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: '%s' está fora do repositório"
+msgid "failed writing detached signature to '%s'"
+msgstr "falha ao escrever assinatura destacada em '%s'"
 
-#: pathspec.c:291
+#: grep.c:1782
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "O caminho '%s' está dentro do submódulo '%.*s'"
+msgid "'%s': unable to read %s"
+msgstr "'%s': não foi possível ler %s"
 
-#: pathspec.c:353
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, 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"
+msgid "failed to stat '%s'"
+msgstr "falha ao invocar stat de '%s'"
 
-#: pathspec.c:433
+#: grep.c:1810
 #, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr "o especificador de caminho '%s' é indicado por uma ligação simbólica"
+msgid "'%s': short read"
+msgstr "'%s': leitura truncada"
 
-#: 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 '.' ?"
+#: help.c:203
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "comandos do git disponível em '%s'"
 
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "não foi possível analisar o formato de --pretty"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "comandos do git disponíveis noutras localizações em $PATH"
 
-#: progress.c:235
-msgid "done"
-msgstr "concluído"
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Estes são comandos do Git comuns usados em diversas situações:"
 
-#: read-cache.c:1281
+#: help.c:306
 #, c-format
 msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
 msgstr ""
-"index.version definido, mas com valor inválido.\n"
-"A usar a versão %i"
+"'%s' parece ser um comando do git, mas não é possível\n"
+"executá-lo. Talvez git-%s esteja danificado?"
+
+#: help.c:361
+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."
 
-#: read-cache.c:1291
+#: help.c:383
 #, c-format
 msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
 msgstr ""
-"GIT_INDEX_VERSION definido, mas com valor inválido.\n"
-"A usar a versão %i"
+"AVISO: Invocou um comando do Git designado '%s' que não existe.\n"
+"Continuando, assumindo que queria dizer '%s'"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: help.c:388
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Não foi possível abrir '%s' para escrita"
+msgid "in %0.1f seconds automatically..."
+msgstr "automaticamente em %0.1f..."
 
-#: refs/files-backend.c:2374
+#: help.c:395
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "não foi possível eliminar a referência %s: %s"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s' não é um comando do git. Consulte 'git --help'."
 
-#: refs/files-backend.c:2377
-#, c-format
-msgid "could not delete references: %s"
-msgstr "não foi possível eliminar as referências: %s"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Queria dizer isto?"
+msgstr[1] ""
+"\n"
+"Queria dizer deste?"
 
-#: refs/files-backend.c:2386
+#: help.c:461
 #, c-format
-msgid "could not remove reference %s"
-msgstr "não foi possível eliminar a referência %s"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "formato esperado: %%(color:<cor>)"
+#: 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"
+"*** 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"
 
-#: ref-filter.c:57
+#: lockfile.c:152
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "cor não reconhecida: %%(color:%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 ""
+"Não é possível criar '%s.lock': %s.\n"
+"\n"
+"Outro processo git parece estar a executar neste repositório, e.g.\n"
+"um editor aberto por 'git commit'. Certifique-se que todos os processos\n"
+"terminaram e tente de novo. Se ainda assim falhar, um processo git\n"
+"pode ter falhado anteriormente no repositório:\n"
+"remova o ficheiro manualmente para continuar."
 
-#: ref-filter.c:71
+#: lockfile.c:160
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "formato não reconhecido: %%(%s)"
+msgid "Unable to create '%s.lock': %s"
+msgstr "Não é foi possível criar '%s.lock': %s"
 
-#: ref-filter.c:77
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) não leva argumentos"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "falha ao ler a cache"
 
-#: ref-filter.c:84
-#, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) não leva argumentos"
+#: 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 "não foi possível escrever novo ficheiro de índice"
 
-#: ref-filter.c:101
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(commit incorreto)\n"
+
+#: merge-recursive.c:231
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "valor positivo esperado contents:lines=%s"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache falhou no caminho '%s'"
 
-#: ref-filter.c:103
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "erro ao construir árvores"
+
+#: merge-recursive.c:720
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "argumento de %%(contents) não reconhecido: %s"
+msgid "failed to create path '%s'%s"
+msgstr "falha ao criar o caminho '%s'%s"
 
-#: ref-filter.c:113
+#: merge-recursive.c:731
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "argumento de %%(objectname) não reconhecido: %s"
+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
+msgid ": perhaps a D/F conflict?"
+msgstr ": talvez um conflito D/F?"
 
-#: ref-filter.c:135
+#: merge-recursive.c:754
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "formato esperado: %%(align:<largura>,<posição>)"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "perda de ficheiro não controlado em '%s' recusada"
 
-#: ref-filter.c:147
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "unrecognized position:%s"
-msgstr "posição não reconhecida:%s"
+msgid "cannot read object %s '%s'"
+msgstr "não é possível ler o objeto %s: '%s'"
 
-#: ref-filter.c:151
+#: merge-recursive.c:798
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "largura não reconhecida:%s"
+msgid "blob expected for %s '%s'"
+msgstr "blob para %s '%s' esperado"
 
-#: ref-filter.c:157
+#: merge-recursive.c:822
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "argumento de %%(align) não reconhecido: %s"
+msgid "failed to open '%s': %s"
+msgstr "falha ao abrir '%s': %s"
 
-#: ref-filter.c:161
+#: merge-recursive.c:833
 #, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "largura positiva esperada com o átomo %%(algn)"
+msgid "failed to symlink '%s': %s"
+msgstr "falha ao criar a ligação simbólica '%s': %s"
 
-#: ref-filter.c:244
+#: merge-recursive.c:838
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "nome de ficheiro malformado: %.*s"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "não sei o que fazer com %06o %s '%s'"
 
-#: ref-filter.c:270
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Falha ao executar integração interna"
+
+#: merge-recursive.c:982
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "nome do campo desconhecido: %.*s"
+msgid "Unable to add %s to database"
+msgstr "Não é possível adicionar %s à base de dados"
 
-#: ref-filter.c:372
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "formato: átomo %%(end) utilizado sem átomo correspondente"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
+"deixada na árvore."
 
-#: ref-filter.c:424
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, c-format
-msgid "malformed format string %s"
-msgstr "cadeia malformada %s"
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"CONFLITO (%s/eliminar): %s eliminado em %s e %s em %s. Versão de %s de %s "
+"deixada na árvore em %s."
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= requer um inteiro positivo como argumento"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "mudar nome"
 
-#: ref-filter.c:883
-#, 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"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "nome mudado"
 
-#: ref-filter.c:1046
+#: merge-recursive.c:1200
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "formato de %.*s desconhecido %s"
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s é um diretório em %s adicionando %s no seu lugar"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: merge-recursive.c:1225
 #, c-format
-msgid "missing object %s for %s"
-msgstr "falta o objeto %s de %s"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"CONFLITO (mudar nome/mudar nome): Mudar o nome \"%s\"->\"%s\" no ramo \"%s\" "
+"mudar o nome \"%s\"->\"%s\" em \"%s\"%s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "falha ao invocar parse_object_buffer sobre %s de %s"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (por resolver)"
 
-#: ref-filter.c:1311
+#: merge-recursive.c:1292
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "objeto malformado em '%s'"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"CONFLITO (mudar nome/mudar nome): Mudar de nome %s->%s em %s. Mudar o nome "
+"%s->%s em %s"
 
-#: ref-filter.c:1373
+#: merge-recursive.c:1325
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "a referência %s com nome danificado foi ignorada"
+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"
 
-#: ref-filter.c:1378
+#: merge-recursive.c:1531
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "a referência %s danificada foi ignorada"
+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"
 
-#: ref-filter.c:1651
+#: merge-recursive.c:1546
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "formato: falta átomo %%(end)"
+msgid "Adding merged %s"
+msgstr "A adicionar %s integrado"
 
-#: ref-filter.c:1705
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
-msgid "malformed object name %s"
-msgstr "nome de objeto malformado %s"
+msgid "Adding as %s instead"
+msgstr "A adicionar como %s, em alternativa."
 
-#: remote.c:745
+#: merge-recursive.c:1610
 #, 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"
+msgid "cannot read object %s"
+msgstr "não foi possível ler o objeto %s"
 
-#: remote.c:749
+#: merge-recursive.c:1613
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s geralmente segue %s, não %s"
+msgid "object %s is not a blob"
+msgstr "o objeto %s não é um blob"
 
-#: remote.c:753
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s segue %s e %s em simultâneo"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "modificar"
 
-#: remote.c:761
-msgid "Internal error"
-msgstr "Erro interno"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "modificado"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD não aponta para um ramo"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "conteúdo"
 
-#: remote.c:1686
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "adicionar/adicionar"
+
+#: merge-recursive.c:1718
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "ramo inexistente: '%s'"
+msgid "Skipped %s (merged same as existing)"
+msgstr "%s ignorado (integrado é igual ao existente)"
 
-#: remote.c:1689
+#: merge-recursive.c:1732
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "nenhum ramo a montante configurado para o ramo '%s'"
+msgid "Auto-merging %s"
+msgstr "A integrar automaticamente %s"
 
-#: remote.c:1695
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "submódulo"
+
+#: merge-recursive.c:1737
 #, 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 remoto seguido"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "CONFLITO (%s): conflito de integração em %s"
 
-#: remote.c:1710
+#: merge-recursive.c:1831
 #, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgid "Removing %s"
+msgstr "A remover %s"
+
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "ficheiro/diretório"
+
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "diretório/ficheiro"
+
+#: merge-recursive.c:1868
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
-"o destino de publicação '%s' no remoto '%s' não é seguido por nenhum ramo "
-"local"
+"CONFLITO (%s): Há um diretório designado %s em %s. A adicionar %s como %s"
 
-#: remote.c:1725
+#: merge-recursive.c:1877
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "o ramo '%s' não tem nenhum remoto para publicar"
+msgid "Adding %s"
+msgstr "A adicionar %s"
 
-#: remote.c:1736
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Já está atualizado!"
+
+#: merge-recursive.c:1923
 #, 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"
+msgid "merging of trees %s and %s failed"
+msgstr "falha ao integrar as árvores %s e %s"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "publicação sem destino (push.default é 'nothing')"
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "A integrar:"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "não é possível resolver a publicação 'simple' num único destino"
+#: merge-recursive.c:2019
+#, 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:"
 
-#: remote.c:2073
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "a integração não retornou nenhum commit"
+
+#: merge-recursive.c:2121
 #, 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"
+msgid "Could not parse object '%s'"
+msgstr "Não foi possível analisar o objeto '%s'"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (use \"git branch --unset-upstream\" para corrigir)\n"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Não é possível escrever no índice."
 
-#: remote.c:2080
+#: notes-merge.c:273
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "O seu ramo está atualizado com '%s'.\n"
+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."
 
-#: remote.c:2084
+#: notes-merge.c:280
 #, 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"
+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)."
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (use \"git push\" para publicar os commits locais)\n"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr ""
+"Não é possível submeter árvore de notas não inicializada ou não referenciada"
 
-#: remote.c:2093
+#: notes-utils.c:100
 #, 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] ""
-"O seu ramo está atrás de '%s' por %d commit, podendo ser atualizado com "
-"avanço rápido.\n"
-msgstr[1] ""
-"O seu ramo está atrás de '%s' por %d commits, podendo ser atualizado com "
-"avanço rápido.\n"
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Valor de notes.rewriteMode incorreto: '%s'"
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (use \"git pull\" para atualizar o seu ramo local)\n"
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Reescrita de notas em %s (fora de refs/notes/) recusada"
 
-#: remote.c:2104
+#. 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 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] ""
-"O seu ramo e '%s' divergiram,\n"
-"tendo cada um %d e %d commit diferente, respetivamente.\n"
-msgstr[1] ""
-"O seu ramo e '%s' divergiram,\n"
-"tendo cada um %d e %d commits diferentes, respetivamente.\n"
+msgid "Bad %s value: '%s'"
+msgstr "Valor incorreto de %s: '%s'"
 
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (use \"git pull\" para incorporar o ramo remoto no seu)\n"
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "não foi possível analisar o objeto: %s"
 
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "o ramo atual parece estar danificado"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: revision.c:2134
+#: parse-options.c:590
 #, 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"
+msgid "usage: %s"
+msgstr "utilização: %s"
 
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent é incompatível com --bisect"
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
+#, c-format
+msgid "   or: %s"
+msgstr "        ou: %s"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "falha ao abrir /dev/null"
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "         %s"
+
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-NUM"
 
-#: run-command.c:94
+#: parse-options-cb.c:108
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) falhou"
+msgid "malformed object name '%s'"
+msgstr "nome do objeto malformado '%s'"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "falha ao assinar o certificado de publicação"
+#: path.c:826
+#, 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"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "o recetor não suporta publicação com --signed"
+#: pathspec.c:133
+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"
 
-#: send-pack.c:406
+#: pathspec.c:143
 msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"certificado de publicação não enviado uma vez que o recetor não suporta "
-"publicação com --signed"
+"a definição global de especificador de caminho 'literal' é incompatível com "
+"todas as outras definições globais de especificador de caminho (pathspec)"
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "o recetor não suporta publicação com --atomic"
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "parâmetro inválido na mágica 'prefix' do especificador de caminho"
 
-#: sequencer.c:174
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-"depois de resolver os conflitos, marque os caminhos corrigidos\n"
-"com 'git add <caminhos>' ou 'git rm <caminhos>'"
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "Mágica do especificador de caminho '%.*s' inválida em '%s'"
 
-#: 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 ""
-"depois de resolver os conflitos, marque os caminhos corrigidos\n"
-"com 'git add <caminhos>' ou 'git rm <caminhos>'\n"
-"e faça commit do resultado com 'git commit'"
+#: pathspec.c:187
+#, 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'"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: pathspec.c:205
 #, c-format
-msgid "Could not write to %s"
-msgstr "Não foi possível escrever em %s"
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Mágica de especificador de caminho '%c' em '%s' não implementada"
 
-#: sequencer.c:193
-#, fuzzy, c-format
-msgid "Error wrapping up %s"
-msgstr "Erro ao isolar %s"
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal' e 'glob' são incompatíveis"
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s' está fora do repositório"
 
-#: 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."
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "O caminho '%s' está dentro do submódulo '%.*s'"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "As suas alterações locais serão substituídas por revert."
+#: pathspec.c:353
+#, 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"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "Faça commit ou stash das suas alterações para continuar."
+#: pathspec.c:408
+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"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: pathspec.c:440
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Não foi possível escrever novo ficheiro de índice"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "o especificador de caminho '%s' é indicado por uma ligação simbólica"
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Não foi possível resolver o commit HEAD\n"
+#: pathspec.c:449
+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 '.' ?"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Não foi possível atualizar a árvore de cache\n"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "não foi possível analisar o formato de --pretty"
 
-#: sequencer.c:390
+#: read-cache.c:1315
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Não foi possível analisar o commit %s\n"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version definido, mas com valor inválido.\n"
+"A usar a versão %i"
 
-#: sequencer.c:395
+#: read-cache.c:1325
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Não foi possível analisar o commit pai %s\n"
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION definido, mas com valor inválido.\n"
+"A usar a versão %i"
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Ficheiro de índice não integrado."
+#: refs.c:576 builtin/merge.c:840
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "Não foi possível abrir '%s' para escrita"
 
-#: sequencer.c:479
+#: refs/files-backend.c:2481
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "O commit %s é um merge mas nenhuma opção -m fornecida."
+msgid "could not delete reference %s: %s"
+msgstr "não foi possível eliminar a referência %s: %s"
 
-#: sequencer.c:487
+#: refs/files-backend.c:2484
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "O commit %s não tem o pai %d"
+msgid "could not delete references: %s"
+msgstr "não foi possível eliminar as referências: %s"
 
-#: sequencer.c:491
+#: refs/files-backend.c:2493
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Linha principal especificada mas o commit %s não é um merge."
+msgid "could not remove reference %s"
+msgstr "não foi possível eliminar a referência %s"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: ref-filter.c:55
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: não foi possível analisar o commit pai %s"
+msgid "expected format: %%(color:<color>)"
+msgstr "formato esperado: %%(color:<cor>)"
 
-#: sequencer.c:508
+#: ref-filter.c:57
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Não é possível obter a mensagem de commit de %s"
+msgid "unrecognized color: %%(color:%s)"
+msgstr "cor não reconhecida: %%(color:%s)"
 
-#: sequencer.c:594
+#: ref-filter.c:71
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "não foi possível reverter %s... %s"
+msgid "unrecognized format: %%(%s)"
+msgstr "formato não reconhecido: %%(%s)"
 
-#: sequencer.c:595
+#: ref-filter.c:77
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "não foi possível aplicar %s... %s"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) não leva argumentos"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "o conjunto de commits especificado está vazio"
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) não leva argumentos"
 
-#: sequencer.c:638
+#: ref-filter.c:101
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: falha ao ler o índice"
+msgid "positive value expected contents:lines=%s"
+msgstr "valor positivo esperado contents:lines=%s"
 
-#: sequencer.c:642
+#: ref-filter.c:103
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: falha ao atualizar o índice"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "argumento de %%(contents) não reconhecido: %s"
 
-#: sequencer.c:702
+#: ref-filter.c:113
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "Não foi possível efetuar %s durante %s"
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "argumento de %%(objectname) não reconhecido: %s"
 
-#: sequencer.c:724
+#: ref-filter.c:135
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Não foi possível analisar a linha %d."
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "formato esperado: %%(align:<largura>,<posição>)"
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Nenhum commit analisado."
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "posição não reconhecida:%s"
 
-#: sequencer.c:741
+#: ref-filter.c:151
 #, c-format
-msgid "Could not open %s"
-msgstr "Não foi possível abrir %s"
+msgid "unrecognized width:%s"
+msgstr "largura não reconhecida:%s"
 
-#: sequencer.c:745
+#: ref-filter.c:157
 #, c-format
-msgid "Could not read %s."
-msgstr "Não foi possível ler %s."
+msgid "unrecognized %%(align) argument: %s"
+msgstr "argumento de %%(align) não reconhecido: %s"
 
-#: sequencer.c:752
+#: ref-filter.c:161
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Folha de instruções inutilizável: %s"
+msgid "positive width expected with the %%(align) atom"
+msgstr "largura positiva esperada com o átomo %%(algn)"
 
-#: sequencer.c:782
+#: ref-filter.c:244
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Chave inválida: %s"
+msgid "malformed field name: %.*s"
+msgstr "nome de ficheiro malformado: %.*s"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: ref-filter.c:270
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Valor inválido de %s: %s"
+msgid "unknown field name: %.*s"
+msgstr "nome do campo desconhecido: %.*s"
 
-#: sequencer.c:795
+#: ref-filter.c:372
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Folha de opções malformada: %s"
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "formato: átomo %%(end) utilizado sem átomo correspondente"
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "cherry-pick ou revert em curso"
+#: ref-filter.c:424
+#, c-format
+msgid "malformed format string %s"
+msgstr "cadeia malformada %s"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "tente \"git cherry-pick (--continue | --quit |--abort)\""
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= requer um inteiro positivo como argumento"
 
-#: sequencer.c:819
+#: ref-filter.c:883
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Não foi possível criar o diretório do sequenciador %s"
+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"
 
-#: sequencer.c:835 sequencer.c:917
-#, fuzzy, c-format
-msgid "Error wrapping up %s."
-msgstr "Erro ao isolar %s."
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "formato de %.*s desconhecido %s"
 
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "nenhum cherry-pick ou revert em curso"
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "falta o objeto %s de %s"
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "não é possível resolver HEAD"
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "falha ao invocar parse_object_buffer sobre %s de %s"
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "não é possível abortar um ramo ainda não criado"
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "objeto malformado em '%s'"
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: ref-filter.c:1373
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "não é possível abrir %s: %s"
+msgid "ignoring ref with broken name %s"
+msgstr "a referência %s com nome danificado foi ignorada"
 
-#: sequencer.c:881
+#: ref-filter.c:1378
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "não é possível ler %s: %s"
+msgid "ignoring broken ref %s"
+msgstr "a referência %s danificada foi ignorada"
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "fim de ficheiro inesperado"
+#: ref-filter.c:1633
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "formato: falta átomo %%(end)"
 
-#: sequencer.c:888
+#: ref-filter.c:1687
 #, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "o ficheiro HEAD de pre-cherry-pick '%s' está corrompido"
+msgid "malformed object name %s"
+msgstr "nome de objeto malformado %s"
 
-#: sequencer.c:910
+#: remote.c:746
 #, c-format
-msgid "Could not format %s."
-msgstr "Não foi possível formatar %s."
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Não é possível obter %s e %s ao mesmo tempo para %s"
 
-#: sequencer.c:1055
+#: remote.c:750
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: não é possível efetuar cherry-pick de %s"
+msgid "%s usually tracks %s, not %s"
+msgstr "%s geralmente segue %s, não %s"
 
-#: sequencer.c:1058
+#: remote.c:754
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: revisão incorreta"
+msgid "%s tracks both %s and %s"
+msgstr "%s segue %s e %s em simultâneo"
 
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "Não é possível reverter como commit inicial"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Erro interno"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Não é possível efetuar cherry-pick numa cabeça vazia"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD não aponta para um ramo"
 
-#: setup.c:246
+#: remote.c:1686
 #, c-format
-msgid "failed to read %s"
-msgstr "falha ao ler %s"
-
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset antes do fim do ficheiro de pacote (.idx danificado?)"
+msgid "no such branch: '%s'"
+msgstr "ramo inexistente: '%s'"
 
-#: sha1_file.c:2459
+#: remote.c:1689
 #, 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 "no upstream configured for branch '%s'"
+msgstr "nenhum ramo a montante configurado para o ramo '%s'"
 
-#: sha1_file.c:2463
+#: remote.c:1695
 #, 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?)"
-
-#: 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\""
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
 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\""
+"o ramo a montante '%s' não está guardado como um ramo de monitorização remoto"
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+#: remote.c:1710
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
 msgstr ""
-"Não é possível alterar .gitmodules não integrado, resolva os conflitos do "
-"merge primeiro"
+"o destino de publicação '%s' no remoto '%s' não é seguido por nenhum ramo "
+"local"
 
-#: submodule.c:66 submodule.c:100
+#: remote.c:1725
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Secção de .gitmodules cujo path=%s não encontrada"
+msgid "branch '%s' has no remote for pushing"
+msgstr "o ramo '%s' não tem nenhum remoto para publicar"
 
-#: submodule.c:74
+#: remote.c:1736
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Não foi possível atualizar o elemento %s de .gitmodules"
+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"
 
-#: submodule.c:107
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Não foi possível remover o elemento %s de .gitmodules"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "publicação sem destino (push.default é 'nothing')"
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "falha ao preparar .gitmodules atualizado"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "não é possível resolver a publicação 'simple' num único destino"
 
-#: trailer.c:237
+#: remote.c:2073
 #, c-format
-msgid "running trailer command '%s' failed"
-msgstr "falha ao executar o comando trailer '%s'"
+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"
 
-#: 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 "valor desconhecido '%s' da chave '%s'"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (use \"git branch --unset-upstream\" para corrigir)\n"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: remote.c:2080
 #, c-format
-msgid "more than one %s"
-msgstr "mais do que um %s"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "O seu ramo está atualizado com '%s'.\n"
 
-#: trailer.c:582
+#: remote.c:2084
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
+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
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (use \"git push\" para publicar os commits locais)\n"
 
-#: trailer.c:702
+#: remote.c:2093
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "não foi possível ler o ficheiro de entrada '%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] ""
+"O seu ramo está atrás de '%s' por %d commit, podendo ser atualizado com "
+"avanço rápido.\n"
+msgstr[1] ""
+"O seu ramo está atrás de '%s' por %d commits, podendo ser atualizado com "
+"avanço rápido.\n"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "não foi possível ler da entrada padrão"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (use \"git pull\" para atualizar o seu ramo local)\n"
 
-#: trailer.c:857 builtin/am.c:42
+#: remote.c:2104
 #, c-format
-msgid "could not stat %s"
-msgstr "não foi possível obter stat de %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] ""
+"O seu ramo e '%s' divergiram,\n"
+"tendo cada um %d e %d commit diferente, respetivamente.\n"
+msgstr[1] ""
+"O seu ramo e '%s' divergiram,\n"
+"tendo cada um %d e %d commits diferentes, respetivamente.\n"
 
-#: trailer.c:859
-#, c-format
-msgid "file %s is not a regular file"
-msgstr "o ficheiro %s não é um ficheiro regular"
+#: remote.c:2114
+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"
 
-#: trailer.c:861
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "o ramo atual parece estar danificado"
+
+#: revision.c:2161
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "o ficheiro %s não pode ser escrito pelo utilizador"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "o ramo atual '%s' ainda não contém nenhum commit"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "não foi possível abrir ficheiro temporário"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent é incompatível com --bisect"
 
-#: 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"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "falha ao abrir /dev/null"
 
-#: transport-helper.c:1041
+#: run-command.c:108
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Não foi possível ler a referência %s"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) falhou"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "A extrair ficheiros"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "falha ao assinar o certificado de publicação"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "nome de esquema de URL inválido ou falta do sufixo '://'"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "o recetor não suporta publicação com --signed"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr "sequencia de escape %XX inválida"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"certificado de publicação não enviado uma vez que o recetor não suporta "
+"publicação com --signed"
 
-#: 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:'"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "o recetor não suporta publicação com --atomic"
 
-#: 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"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "o recetor não suporta opções de publicação"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "caracteres inválidos no nome do anfitrião"
+#: sequencer.c:171
+msgid "revert"
+msgstr "reverter"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "número de porta inválido"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "segmento de caminho '..' inválido"
+#: sequencer.c:228
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"depois de resolver os conflitos, marque os caminhos corrigidos\n"
+"com 'git add <caminhos>' ou 'git rm <caminhos>'"
+
+#: sequencer.c:231
+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 ""
+"depois de resolver os conflitos, marque os caminhos corrigidos\n"
+"com 'git add <caminhos>' ou 'git rm <caminhos>'\n"
+"e submeta o resultado com 'git commit'"
 
-#: wrapper.c:222 wrapper.c:381
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "não foi possível abrir '%s' para leitura e escrita"
+msgid "could not lock '%s'"
+msgstr "não foi possível bloquear '%s'"
 
-#: wrapper.c:224 wrapper.c:383
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "não foi possível abrir '%s' para escrita"
+msgid "could not write to '%s'"
+msgstr "não foi possível escrever em '%s'"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
+#: sequencer.c:251
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "não foi possível abrir '%s' para leitura"
+msgid "could not write eol to '%s'"
+msgstr "não foi possível escrever fim de linha em '%s'"
 
-#: wrapper.c:611
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "não é possível aceder a '%s': %s"
+msgid "failed to finalize '%s'."
+msgstr "falha ao finalizar '%s'."
 
-#: wrapper.c:632
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "unable to access '%s'"
-msgstr "não é possível aceder a '%s'"
+msgid "could not read '%s'"
+msgstr "não foi possível ler '%s'"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "não é possível de obter o diretório de trabalho atual"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "as suas alterações locais serão substituídas ao %s."
+
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "submeta ou esconda as suas alterações para continuar."
 
-#: wrapper.c:667
+#: sequencer.c:324
 #, c-format
-msgid "could not open %s for writing"
-msgstr "não foi possível abrir %s para escrita"
+msgid "%s: fast-forward"
+msgstr "%s: avanço rápido"
 
-#: wrapper.c:678 builtin/am.c:410
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "could not write to %s"
-msgstr "não foi possível escrever para %s"
+msgid "%s: Unable to write new index file"
+msgstr "%s: Não foi possível escrever novo ficheiro de índice"
+
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "não foi possível resolver o commit HEAD\n"
 
-#: wrapper.c:684
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "não foi possível atualizar a árvore de cache\n"
+
+#: sequencer.c:483
 #, c-format
-msgid "could not close %s"
-msgstr "não foi possível fechar %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 ""
+"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"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Caminhos não integrados:"
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "não foi possível analisar o commit %s\n"
 
-#: wt-status.c:176 wt-status.c:203
+#: sequencer.c:572
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (use \"git reset %s <ficheiro>...\" para retirar do índice)"
+msgid "could not parse parent commit %s\n"
+msgstr "não foi possível analisar o commit pai %s\n"
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (use \"git rm --cached <ficheiro>...\" para retirar do índice)"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "ficheiro de índice não integrado."
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (use \"git add <ficheiro>...\" para marcar como resolvido)"
+#: sequencer.c:675
+#, 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 a opção -m."
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "o commit %s não tem o pai %d"
+
+#: sequencer.c:687
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
 msgstr ""
-"  (use \"git add/rm <ficheiro>...\" conforme apropriado para marcar como "
-"resolvido)"
+"a linha principal foi especificada mas o commit %s não é uma integração."
 
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (use \"git rm <ficheiro>...\" para marcar como resolvido)"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: não foi possível analisar o commit pai %s"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Alterações incluídas no próximo commit:"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "não é possível obter a mensagem de commit de %s"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Alterações não preparadas para commit:"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "não foi possível reverter %s... %s"
 
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-"  (use \"git add <ficheiro>...\" para atualizar o que será incluído no "
-"commit)"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "não foi possível aplicar %s... %s"
 
-#: wt-status.c:221
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-"  (use \"git add/rm <ficheiro>...\" para atualizar o que será incluído no "
-"commit)"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "o conjunto de commits especificado está vazio"
 
-#: wt-status.c:222
-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)"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: falha ao ler o índice"
 
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-"  (faça commit ou descarte o conteúdo modificado ou não controlado nos "
-"submódulos)"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: falha ao atualizar o índice"
 
-#: wt-status.c:236
+#: sequencer.c:944
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (use \"git %s <ficheiro>...\" para incluir no próximo commit)"
+msgid "invalid line %d: %.*s"
+msgstr "linha %d inválida: %.*s"
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "eliminado por ambos:"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "nenhum commit analisado."
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "adicionado por nós:"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "não foi possível ler '%s'."
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "eliminado por eles:"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "folha de instruções inutilizável: '%s'"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "adicionado por eles:"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "não é possível efetuar cherry-pick durante uma reversão."
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "eliminado por nós:"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "não é possível reverter durante um cherry-pick."
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "adicionado por ambos:"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "chave inválida: %s"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "modificado por ambos:"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "valor inválido de %s: %s"
 
-#: wt-status.c:265
+#: sequencer.c:1063
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr ""
+msgid "malformed options sheet: '%s'"
+msgstr "folha de opções malformada: '%s'"
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "novo ficheiro:"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "cherry-pick ou revert em curso"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "copiado:"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "tente \"git cherry-pick (--continue | --quit |--abort)\""
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "eliminado:"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "não foi possível criar o diretório do sequenciador '%s'"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "modificado:"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "não foi possível bloquear HEAD"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "nome mudado:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "nenhum cherry-pick ou revert em curso"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "tipo alterado:"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "não é possível resolver HEAD"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "desconhecido:"
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "não é possível abortar um ramo ainda não criado"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "não integrado:"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "não é possível abrir '%s'"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "novos commits, "
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "não é possível ler '%s': %s"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "conteúdo modificado, "
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "fim de ficheiro inesperado"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "conteúdo não controlado, "
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "o ficheiro HEAD de pre-cherry-pick '%s' está corrompido"
 
-#: wt-status.c:390
+#: sequencer.c:1354
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr ""
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: não é possível efetuar cherry-pick de %s"
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Submódulos alterados mas não atualizados:"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: revisão incorreta"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Alterações em submódulos incluídas no próximo commit:"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "não é possível reverter como commit inicial"
 
-#: wt-status.c:837
+#: setup.c:160
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
-"Não altere a linha acima.\n"
-"Tudo o que estiver abaixo será removido."
-
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "Há caminhos não integrados."
-
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (corrija os conflitos e execute \"git commit\")"
-
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "Todos os conflitos foram corrigidos mas o merge continua em curso."
+"%s: não há tal caminho na árvore de trabalho.\n"
+"Use 'git <comando> -- <caminho>...' para especificar caminhos que não "
+"existem localmente."
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (use \"git commit\" para concluir o merge)"
+#: 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 ""
+"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>...]'"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Sessão am em curso."
+#: 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 ""
+"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>...]'"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "O patch atual está vazio."
+#: 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"
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (corrija os conflitos e execute \"git am --continue\")"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "extensões de repositório desconhecidas encontradas:"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (use \"git am --skip\" para ignorar este patch)"
+#: setup.c:762
+#, 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"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (use \"git am --abort\" para restaurar o ramo original)"
+#: 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"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Nenhum comando concluído."
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Não é possível ler o diretório de trabalho atual"
 
-#: wt-status.c:1108
+#: setup.c:920
 #, 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 ""
+"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)."
 
-#: wt-status.c:1119
+#: setup.c:927
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (veja mais no ficheiro %s)"
-
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Nenhum comando por concluir."
+msgid "Cannot change to '%s/..'"
+msgstr "Não é possível mudar para '%s/..'"
 
-#: wt-status.c:1127
+#: setup.c:989
 #, 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):"
-
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (use \"git rebase --edit-todo\" para visualizar e editar)"
+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."
 
-#: wt-status.c:1148
+#: sha1_file.c:473
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "A realizar rebase do ramo '%s' sobre '%s'."
+msgid "path '%s' does not exist"
+msgstr "o caminho '%s' não existe"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Rebase em curso."
+#: sha1_file.c:499
+#, 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."
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (corrija os conflitos e execute \"git rebase --continue\")"
+#: sha1_file.c:505
+#, 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."
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (use \"git rebase --skip\" para ignorar este patch)"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "o repositório de referência '%s' é raso"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (use \"git rebase --abort\" para restaurar o ramo original)"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "o repositório de referência '%s' está enxertado"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git rebase --continue\")"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset antes do fim do ficheiro de pacote (.idx danificado?)"
 
-#: wt-status.c:1181
+#: sha1_file.c:2592
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"A dividir um commit ao mesmo tempo que efetua rebase do ramo '%s' sobre '%s'."
-
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "A dividir um commit durante um rebase."
+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:1189
-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\")"
+#: sha1_file.c:2596
+#, 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:1193
+#: sha1_name.c:407
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr ""
-"A editar um commit ao mesmo tempo que efetua rebase do ramo '%s' sobre '%s'."
+msgid "short SHA1 %s is ambiguous"
+msgstr "SHA1 curto %s é ambíguo"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "A editar um commit durante um rebase."
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Os candidatos são:"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (use \"git commit --amend\" para emendar o commit atual)"
+#: 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 ""
+"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:1203
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
 msgstr ""
-"  (use \"git rebase --continue\" assim que estiver satisfeito com as "
-"alterações)"
+"Não é possível alterar .gitmodules não integrado, resolva primeiro os "
+"conflitos de integração"
 
-#: wt-status.c:1213
+#: submodule.c:68 submodule.c:102
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "A realizar cherry-pick do commit %s."
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Secção de .gitmodules cujo path=%s não encontrada"
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (corrija os conflitos e execute \"git cherry-pick --continue\")"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Não foi possível atualizar o elemento %s de .gitmodules"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git cherry-pick --continue"
-"\")"
+#: submodule.c:109
+#, 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:1223
-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)"
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "falha ao preparar .gitmodules atualizado"
 
-#: wt-status.c:1232
-#, c-format
-msgid "You are currently reverting commit %s."
-msgstr "A reverter o commit %s."
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "não é permitido valores negativos em submodule.fetchJobs"
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (corrija dos conflitos e execute \"git revert --continue\")"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "valor inválido de %s"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
-"  (todos os conflitos foram corrigidos: execute \"git revert --continue\")"
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "falha ao executar o comando trailer '%s'"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (use \"git rever --abort\" para cancelar a operação de reversão)"
+#: 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 "valor desconhecido '%s' da chave '%s'"
 
-#: wt-status.c:1253
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Bissecção em curso, iniciada a partir do ramo '%s'."
+msgid "more than one %s"
+msgstr "mais do que um %s"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Bissecção em curso."
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "token terminador vazio no terminador '%.*s'"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (use \"git bisect reset\" para voltar ao ramo original)"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "não foi possível ler o ficheiro de entrada '%s'"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "No ramo "
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "não foi possível ler da entrada padrão"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "rebase interativo em curso; sobre "
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "não foi possível obter stat de %s"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "rebase em curso; sobre "
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "o ficheiro %s não é um ficheiro regular"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD destacada em "
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "o ficheiro %s não pode ser escrito pelo utilizador"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD destacada de "
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "não foi possível abrir ficheiro temporário"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Não se encontra em nenhum ramo neste momento."
+#: trailer.c:983
+#, 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:1474
-msgid "Initial commit"
-msgstr "Commit inicial"
+#: transport.c:62
+#, 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"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Ficheiros não controlados"
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "transporte: opção de profundidade '%s' inválida"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "Ficheiros ignorados"
+#: transport.c:817
+#, 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:1494
+#: transport.c:821
 #, 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')."
+"\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 ""
-"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')."
+"\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:1500
+#: transport.c:829
+msgid "Aborting."
+msgstr "Abortado."
+
+#: transport-helper.c:1075
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Ficheiros não controlados não listados%s"
+msgid "Could not read ref %s"
+msgstr "Não foi possível ler a referência %s"
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (use a opção -u para mostrar os ficheiros não controlados)"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "objeto árvore demasiado curto"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Sem alterações"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "modo na entrada de árvore malformado"
+
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "nome de ficheiro vazio na entrada de árvore"
 
-#: wt-status.c:1513
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "ficheiro de árvore demasiado curto"
+
+#: unpack-trees.c:64
 #, 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 checkout:\n"
+"%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
-"nenhuma alteração adicionada para commit (use \"git add\" e/ou \"git commit -"
-"a\")\n"
+"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:1516
+#: unpack-trees.c:66
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "nenhuma alteração adicionada para commit\n"
+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"
 
-#: wt-status.c:1519
+#: unpack-trees.c:69
 #, 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 merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
 msgstr ""
-"não foi adicionado nada para commit, mas existem ficheiros não controlados "
-"(use \"git add\" para controlá-los)\n"
+"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:1522
+#: unpack-trees.c:71
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
 msgstr ""
-"não foi adicionado nada para commit, mas existem ficheiros não controlados\n"
+"As suas alterações locais nos seguintes ficheiros seriam substituídas ao "
+"integrar:\n"
+"%%s"
 
-#: wt-status.c:1525
+#: unpack-trees.c:74
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+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 ""
-"não há nada para fazer commit (crie/copie ficheiros e use \"git add\" para "
-"controlá-los)\n"
+"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:1528 wt-status.c:1533
+#: unpack-trees.c:76
 #, c-format
-msgid "nothing to commit\n"
-msgstr "não há nada para fazer commit\n"
+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"
 
-#: wt-status.c:1531
+#: unpack-trees.c:81
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
 msgstr ""
-"não há nada para fazer commit (use -u para mostrar os ficheiros não "
-"controlados)\n"
+"Perder-se-iam ficheiros não controlados ao atualizar os seguintes "
+"diretórios:\n"
+"%s"
 
-#: wt-status.c:1535
+#: unpack-trees.c:85
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "não há nada para fazer commit, diretório de trabalho limpo\n"
-
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Commit inicial em "
-
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (nenhum ramo)"
-
-#: wt-status.c:1675
-msgid "gone"
-msgstr "desaparecido"
-
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "atrás "
-
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "à frente "
+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."
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: unpack-trees.c:87
 #, 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 removed by checkout:\n"
+"%%s"
+msgstr ""
+"Os seguintes ficheiros não controlados na árvore de trabalho seriam "
+"removidos ao extrair:\n"
+"%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:90
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "diff status inesperado %c"
-
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "falha ao atualizar os ficheiros"
+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."
 
-#: builtin/add.c:80
+#: unpack-trees.c:92
 #, c-format
-msgid "remove '%s'\n"
-msgstr "remover '%s'\n"
-
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Alterações não preparadas depois de atualizar o índice:"
-
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Não foi possível ler o índice"
+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"
 
-#: builtin/add.c:205
+#: unpack-trees.c:95
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Não foi possível abrir '%s' para escrita."
-
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Não foi possível escrever patch"
-
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "falha ao editar patch"
+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."
 
-#: builtin/add.c:215
+#: unpack-trees.c:97
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Não foi possível obter stat de '%s'"
-
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Patch vazio. Abortado."
+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"
 
-#: builtin/add.c:222
+#: unpack-trees.c:102
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Não foi possível aplicar '%s'"
-
-#: builtin/add.c:232
-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/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "simular ação"
+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."
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "ser verboso"
+#: unpack-trees.c:104
+#, 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"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "seleção interativa"
+#: 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 ""
+"Os seguintes ficheiros não controlados da árvore de trabalho seriam "
+"substituídos ao integrar:\n"
+"%%sMova ou remova-os antes de integrar."
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "selecionar blocos interativamente"
+#: unpack-trees.c:109
+#, 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"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "editar o diff atual e aplicá-lo"
+#: unpack-trees.c:112
+#, c-format
+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."
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "permitir adicionar ficheiros ignorados"
+#: unpack-trees.c:114
+#, 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"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "atualizar ficheiros controlados"
+#: unpack-trees.c:121
+#, c-format
+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:257
-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"
+#: unpack-trees.c:124
+#, c-format
+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:258
-msgid "add changes from all tracked and untracked files"
+#: unpack-trees.c:126
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"adicionar alterações de todos os ficheiros controlados ou não controlados"
+"Os seguintes ficheiros na árvore de trabalho seriam substituídos ao "
+"atualizar a extração esparsa:\n"
+"%s"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
 msgstr ""
-"ignorar caminhos removidos na árvore de trabalho (o mesmo que --no-all)"
+"Os seguintes ficheiros na árvore de trabalho seriam removidos ao atualizar a "
+"extração esparsa:\n"
+"%s"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "não adicionar, apenas atualizar o índice"
+#: unpack-trees.c:205
+#, c-format
+msgid "Aborting\n"
+msgstr "A abortar\n"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr "ignorar ficheiros que não podem ser adicionados por causa de erros"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "A extrair ficheiros"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "verificar quais os ficheiros ignorados na simulação"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "nome de esquema de URL inválido ou falta do sufixo '://'"
 
-#: builtin/add.c:287
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "Use -f se deseja mesmo adicioná-los.\n"
+msgid "invalid %XX escape sequence"
+msgstr "sequencia de escape %XX inválida"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "falha ao adicionar ficheiros"
+#: 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:'"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A e -u são mutuamente incompatíveis"
+#: 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"
 
-#: builtin/add.c:337
-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"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "caracteres inválidos no nome do anfitrião"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "número de porta inválido"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "segmento de caminho '..' inválido"
 
-#: builtin/add.c:352
+#: worktree.c:282
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Não foi especificado nada, nada adicionado.\n"
+msgid "failed to read '%s'"
+msgstr "falha ao ler '%s'"
 
-#: builtin/add.c:353
+#: wrapper.c:222 wrapper.c:392
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Queria dizer 'git add .'?\n"
+msgid "could not open '%s' for reading and writing"
+msgstr "não foi possível abrir '%s' para leitura e escrita"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "ficheiro de índice corrompido"
+#: 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:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Não foi possível escrever novo ficheiro de índice"
+#: 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 "não foi possível abrir '%s' para leitura"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "could not read '%s'"
-msgstr "não foi possível ler '%s'"
+msgid "unable to access '%s'"
+msgstr "não é possível aceder a '%s'"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "não foi possível analisar o autor do script"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "não é possível de obter o diretório de trabalho atual"
 
-#: builtin/am.c:507
+#: wrapper.c:658
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' foi eliminado pelo hook applypatch-msg"
+msgid "could not write to %s"
+msgstr "não foi possível escrever para %s"
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: wrapper.c:660
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Linha de entrada malformada: '%s'."
+msgid "could not close %s"
+msgstr "não foi possível fechar %s"
+
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Caminhos não integrados:"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Falha ao copiar notas de '%s' para '%s'"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (use \"git reset %s <ficheiro>...\" para despreparar)"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "falha ao invocar fseek"
+#: 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/am.c:772 builtin/am.c:860
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "não foi possível abrir '%s' para leitura: %s"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (use \"git add <ficheiro>...\" para marcar como resolvido)"
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "não foi possível abrir '%s' para escrita: %s"
+#: 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/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "não foi possível analisar o patch '%s'"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (use \"git rm <ficheiro>...\" para marcar como resolvido)"
 
-#: builtin/am.c:853
-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:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Alterações para serem submetidas:"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "carimbo de data/hora inválido"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Alterações não preparadas para submeter:"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "linha de Data inválida"
+#: 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:909
-msgid "invalid timezone offset"
-msgstr "mudança de fuso horário inválida"
+#: 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:996
-msgid "Patch format detection failed."
-msgstr "Falha ao detetar o formato do patch."
+#: 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)"
+
+#: 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:1001 builtin/clone.c:378
+#: wt-status.c:238
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "falha ao criar o diretório '%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:1005
-msgid "Failed to split patches."
-msgstr "Falha ao dividir patches."
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "eliminado por ambos:"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "não é possível escrever o ficheiro de índice"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "adicionado por nós:"
 
-#: 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:257
+msgid "deleted by them:"
+msgstr "eliminado por eles:"
 
-#: 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:259
+msgid "added by them:"
+msgstr "adicionado por eles:"
 
-#: 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:261
+msgid "deleted by us:"
+msgstr "eliminado por nós:"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "O patch está vazio. Foi dividido incorretamente?"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "adicionado por ambos:"
 
-#: builtin/am.c:1402 builtin/log.c:1350
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "linha de identidade inválida: %s"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "modificado por ambos:"
 
-#: 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:275
+msgid "new file:"
+msgstr "novo ficheiro:"
 
-#: builtin/am.c:1631
-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 merge com 3 "
-"pontos."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "copiado:"
 
-#: builtin/am.c:1633
-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:279
+msgid "deleted:"
+msgstr "eliminado:"
 
-#: builtin/am.c:1652
-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."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "modificado:"
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-"A recorrer a uma de base para aplicação de patches e merge com 3 pontos..."
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "nome mudado:"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Falha ao efetuar merge das alterações."
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "tipo alterado:"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree falhou ao escrever uma árvore"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "desconhecido:"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "a aplicar a um histórico vazio"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "não integrado:"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "falha ao escrever objeto de commit"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "novos commits, "
 
-#: builtin/am.c:1749 builtin/am.c:1753
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "não é possível continuar: %s não existe."
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "conteúdo modificado, "
 
-#: builtin/am.c:1769
-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:375
+msgid "untracked content, "
+msgstr "conteúdo não controlado, "
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "Corpo do commit:"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Submódulos alterados mas não atualizados:"
 
-#. 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:1784
-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:820
+msgid "Submodule changes to be committed:"
+msgstr "Alterações em submódulos para serem submetidas:"
+
+#: wt-status.c:901
+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."
 
-#: builtin/am.c:1834
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Índice modificado: não é possível aplicar patches (modificado: %s)"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Há caminhos não integrados."
 
-#: builtin/am.c:1869 builtin/am.c:1941
-#, c-format
-msgid "Applying: %.*s"
-msgstr "A aplicar: %.*s"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (corrija os conflitos e execute \"git commit\")"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Nenhuma alteração -- Já foi aplicado o patch."
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (use \"git am --abort\" para abortar a integração)"
 
-#: builtin/am.c:1893
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Falha ao aplicar o patch em %s %.*s"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Todos os conflitos foram corrigidos mas ainda está a integrar."
 
-#: builtin/am.c:1899
-#, 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"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (use \"git commit\" para concluir a integração)"
 
-#: builtin/am.c:1944
-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."
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Sessão am em curso."
 
-#: builtin/am.c:1951
-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:1039
+msgid "The current patch is empty."
+msgstr "O patch atual está vazio."
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
-#, c-format
-msgid "Could not parse object '%s'."
-msgstr "Não foi possível analisar o objeto '%s'."
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (corrija os conflitos e execute \"git am --continue\")"
 
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "falha ao limpar o índice"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (use \"git am --skip\" para ignorar este patch)"
 
-#: builtin/am.c:2145
-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:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (use \"git am --abort\" para restaurar o ramo original)"
+
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Nenhum comando concluído."
 
-#: builtin/am.c:2206
+#: wt-status.c:1175
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Valor inválido de --patch-format: %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:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<opções>] [(<mbox>|<Maildir>)...]"
+#: wt-status.c:1186
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (veja mais no ficheiro %s)"
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<opções>] (--continue | --skip | --abort)"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Nenhum comando por concluir."
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "executar interativamente"
+#: wt-status.c:1194
+#, 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):"
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "opção histórica -- sem-ação"
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (use \"git rebase --edit-todo\" para visualizar e editar)"
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "permitir recorrer a merge com 3 pontos se necessário"
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Está a realizar rebase do ramo '%s' sobre '%s'."
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "silencioso"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Está a rebasear neste momento."
 
-#: builtin/am.c:2253
-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:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (corrija os conflitos e execute \"git rebase --continue\")"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "recodificar em utf8 (predefinição)"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (use \"git rebase --skip\" para ignorar este patch)"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "passar a opção -k ao git-mailinfo"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (use \"git rebase --abort\" para restaurar o ramo original)"
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "passar a opção -b ao git-mailinfo"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git rebase --continue\")"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "passar a opção -m ao git-mailinfo"
+#: wt-status.c:1248
+#, 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:2264
-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:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Está a dividir um commit durante um rebase."
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
-"não passar a opção --keep-cr ao git-mailsplit independentemente de am.keepcr"
+"  (Assim que o diretório de trabalho estiver limpo, execute \"git rebase --"
+"continue\")"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "retirar todo o conteúdo antes da linha de tesoura"
+#: wt-status.c:1260
+#, 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:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "ação"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Está a editar um commit durante um rebase."
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "transmitir ao git-apply"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (use \"git commit --amend\" para emendar o commit atual)"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "raiz"
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (use \"git rebase --continue\" assim que estiver satisfeito com as "
+"alterações)"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "caminho"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Está a realizar cherry-pick do commit %s."
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (corrija os conflitos e execute \"git cherry-pick --continue\")"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "num"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git cherry-pick --continue"
+"\")"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "formato"
+#: wt-status.c:1290
+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:2296
-msgid "format the patch(es) are in"
-msgstr "formato de apresentação de patches"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Está a reverter o commit %s neste comento."
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "substituir a mensagem de erro quando a aplicação do patch falha"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (corrija dos conflitos e execute \"git revert --continue\")"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "continuar a aplicar os patches depois de resolver os conflitos"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (todos os conflitos foram corrigidos: execute \"git revert --continue\")"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "sinónimo de --continue"
+#: wt-status.c:1309
+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:2310
-msgid "skip the current patch"
-msgstr "ignorar o patch atual"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Está a bissetar, iniciado a partir do ramo '%s'."
 
-#: builtin/am.c:2313
-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:1324
+msgid "You are currently bisecting."
+msgstr "Está a bissetar neste momento."
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "mentir sobre a data de commit"
+#: wt-status.c:1327
+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:2319
-msgid "use current timestamp for author date"
-msgstr "usar a data e hora atual como data de autor"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "No ramo "
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "id-chave"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "rebase interativo em curso; sobre "
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "assinar os commits com GPG"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "rebase em curso; sobre "
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(uso interno de git-rebase)"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD destacada em "
 
-#: builtin/am.c:2340
-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."
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD destacada de "
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "falha ao ler o índice"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Não se encontra em nenhum ramo neste momento."
 
-#: builtin/am.c:2362
-#, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr ""
-"o diretório de rebesa anterior %s ainda existe, mas foi fornecida uma mbox."
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Commit inicial"
 
-#: builtin/am.c:2386
-#, 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."
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Ficheiros não controlados"
 
-#: builtin/am.c:2392
-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."
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Ficheiros ignorados"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<opções>] [<patch>...]"
+#: 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 ""
+"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/apply.c:111
+#: wt-status.c:1586
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "opção de espaço em branco não reconhecida '%s'"
+msgid "Untracked files not listed%s"
+msgstr "Ficheiros não controlados não listados%s"
 
-#: builtin/apply.c:126
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "opção de ignorar espaço em branco não reconhecida '%s'"
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (use a opção -u para mostrar os ficheiros não controlados)"
 
-#: builtin/apply.c:818
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Não é possível preparar a regexp de carimbo de data/hora %s"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Sem alterações"
 
-#: builtin/apply.c:827
+#: wt-status.c:1599
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec retornou %d para a entra: %s"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"nenhuma alteração adicionada para submeter (use \"git add\" e/ou \"git "
+"commit -a\")\n"
 
-#: builtin/apply.c:908
+#: wt-status.c:1602
 #, 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 "no changes added to commit\n"
+msgstr "nenhuma alteração adicionada para submeter\n"
 
-#: builtin/apply.c:940
+#: wt-status.c:1605
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
-"git apply: git-diff incorreto - esperava-se /dev/null, obteve-se %s na linha "
-"%d"
+"não foi adicionado nada para submeter, mas existem ficheiros não controlados "
+"(use \"git add\" para controlá-los)\n"
 
-#: builtin/apply.c:944
+#: wt-status.c:1608
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgid "nothing added to commit but untracked files present\n"
 msgstr ""
-"git apply: git-diff incorreto - o nome do novo ficheiro na linha %d é "
-"inconsistente"
+"não foi adicionado nada para submeter, mas existem ficheiros não "
+"controlados\n"
 
-#: builtin/apply.c:945
+#: wt-status.c:1611
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
-"git apply: git-diff incorreto - o nome do ficheiro antigo na linha %d é "
-"inconsistente"
+"não há nada para submeter (crie/copie ficheiros e use \"git add\" para "
+"controlá-los)\n"
 
-#: builtin/apply.c:952
+#: wt-status.c:1614 wt-status.c:1619
 #, 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 "nothing to commit\n"
+msgstr "não há nada para submeter\n"
 
-#: builtin/apply.c:1415
+#: wt-status.c:1617
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recontagem: linha inesperada: %.*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:1472
+#: wt-status.c:1621
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragmento de patch sem cabeçalho na linha %d: %.*s"
+msgid "nothing to commit, working tree clean\n"
+msgstr "não há nada para submeter, árvore de trabalho limpa\n"
 
-#: builtin/apply.c:1489
-#, 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)"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Commit inicial em "
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "o novo ficheiro depende de conteúdos antigos"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (nenhum ramo)"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "o ficheiro eliminado ainda tem conteúdos"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "desaparecido"
 
-#: builtin/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "patch corrompido na linha %d"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "atrás "
 
-#: builtin/apply.c:1719
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr "o novo ficheiro %s depende de conteúdos antigos"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "à frente "
 
-#: builtin/apply.c:1721
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "o ficheiro eliminado %s ainda tem conteúdos"
+msgid "cannot %s: You have unstaged changes."
+msgstr "não é possível efetuar %s: tem alterações não preparadas."
 
-#: builtin/apply.c:1724
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** aviso: o ficheiro %s ficará vazio, mas não será eliminado"
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "além disso, o índice contém alterações não submetidas."
 
-#: builtin/apply.c:1870
+#: wt-status.c:2278
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binário corrompido na linha %d: %.*s"
+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:1899
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "patch binário não reconhecido na linha %d"
+msgid "failed to unlink '%s'"
+msgstr "falha ao invocar unlink de '%s'"
 
-#: builtin/apply.c:2050
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch incompreensível na linha %d"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<opções>] [--] <caminho>..."
 
-#: builtin/apply.c:2140
+#: builtin/add.c:80
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "não é possível ler a ligação simbólica %s"
+msgid "unexpected diff status %c"
+msgstr "diff status inesperado %c"
 
-#: builtin/apply.c:2144
-#, c-format
-msgid "unable to open or read %s"
-msgstr "não é possível abrir ou ler %s"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "falha ao atualizar os ficheiros"
 
-#: builtin/apply.c:2777
+#: builtin/add.c:95
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "início de linha inválido: '%c'"
+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:840
+msgid "Could not read the index"
+msgstr "Não foi possível ler o índice"
 
-#: builtin/apply.c:2896
+#: builtin/add.c:220
 #, 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)"
+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/add.c:227
+msgid "editing patch failed"
+msgstr "falha ao editar patch"
 
-#: builtin/apply.c:2908
+#: builtin/add.c:230
 #, 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 "Could not stat '%s'"
+msgstr "Não foi possível obter stat de '%s'"
 
-#: builtin/apply.c:2914
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Patch vazio. Abortado."
+
+#: builtin/add.c:237
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
+msgid "Could not apply '%s'"
+msgstr "Não foi possível aplicar '%s'"
+
+#: 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/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 "simular ação"
+
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "seleção interativa"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 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 ""
-"ao procura por:\n"
-"%.*s"
+"adicionar alterações de todos os ficheiros controlados ou não controlados"
 
-#: builtin/apply.c:2934
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "falta de dados do patch binário '%s'"
+#: 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:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:3035
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "substituir o bit executável dos ficheiros listados"
+
+#: builtin/add.c:305
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "o patch binário não foi aplicado corretamente a '%s'"
+msgid "Use -f if you really want to add them.\n"
+msgstr "Use -f se deseja mesmo adicioná-los.\n"
+
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "falha ao adicionar ficheiros"
+
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A e -u são mutuamente incompatíveis"
+
+#: 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:3041
+#: builtin/add.c:359
 #, 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 "--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:3062
+#: builtin/add.c:374
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "falha ao aplicar o patch: %s:%ld"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Não foi especificado nada, nada adicionado.\n"
 
-#: builtin/apply.c:3186
+#: builtin/add.c:375
 #, c-format
-msgid "cannot checkout %s"
-msgstr "não é possível extrair %s"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Queria dizer 'git add .'?\n"
+
+#: 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 "ficheiro de índice corrompido"
+
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "não foi possível analisar o autor do script"
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/am.c:491
 #, c-format
-msgid "read of %s failed"
-msgstr "falha ao ler %s"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "'%s' foi eliminado pelo hook applypatch-msg"
 
-#: builtin/apply.c:3239
+#: builtin/am.c:532
 #, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "a ler '%s' indicado por uma ligação simbólica"
+msgid "Malformed input line: '%s'."
+msgstr "Linha de entrada malformada: '%s'."
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
+#: builtin/am.c:569
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "o caminho %s foi eliminado ou mudou de nome"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Falha ao copiar notas de '%s' para '%s'"
+
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "falha ao invocar fseek"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: builtin/am.c:775
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: não existe no índice"
+msgid "could not parse patch '%s'"
+msgstr "não foi possível analisar o patch '%s'"
+
+#: 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/am.c:887
+msgid "invalid timestamp"
+msgstr "carimbo de data/hora inválido"
+
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "linha de Data inválida"
+
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "mudança de fuso horário inválida"
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Falha ao detetar o formato do patch."
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: não tem correspondência no índice"
+msgid "failed to create directory '%s'"
+msgstr "falha ao criar o diretório '%s'"
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "patch de remoção deixa conteúdos no ficheiro"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Falha ao dividir patches."
 
-#: builtin/apply.c:3528
-#, c-format
-msgid "%s: wrong type"
-msgstr "%s: tipo errado"
+#: 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:3530
+#: builtin/am.c:1176
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s é do tipo %o, esperado %o"
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "Após resolver este problema, execute \"%s --continue\"."
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
+#: builtin/am.c:1177
 #, c-format
-msgid "invalid path '%s'"
-msgstr "caminho inválido '%s'"
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "Se preferir ignorar este patch, execute \"%s --skip\"."
 
-#: builtin/apply.c:3746
+#: builtin/am.c:1178
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: já existe no índice"
+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:3749
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: já existe no diretório de trabalho"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "O patch está vazio. Foi dividido incorretamente?"
 
-#: builtin/apply.c:3769
+#: builtin/am.c:1390 builtin/log.c:1550
 #, 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 "invalid ident line: %s"
+msgstr "linha de identidade inválida: %s"
 
-#: builtin/apply.c:3774
+#: builtin/am.c:1417
 #, 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"
+msgid "unable to parse commit %s"
+msgstr "não foi possível analisar o commit %s"
 
-#: builtin/apply.c:3794
-#, 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: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:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: patch não se aplica com sucesso"
+#: 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:3812
-#, c-format
-msgid "Checking patch %s..."
-msgstr "A verificar o patch %s..."
+#: 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:3905 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: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:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "não é possível remover %s do índice"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Falha ao integrar as alterações."
 
-#: builtin/apply.c:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "patch corrompido no submódulo %s"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree falhou ao escrever uma árvore"
 
-#: builtin/apply.c:4081
-#, 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:1693
+msgid "applying to an empty history"
+msgstr "a aplicar a um histórico vazio"
+
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "falha ao escrever objeto de commit"
 
-#: builtin/apply.c:4086
+#: 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:4089 builtin/apply.c:4197
-#, 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:4122
-#, 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:4171
+#: 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:4258
+#: 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:4266
-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:4269
+#: 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:4279
+#: 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:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Excerto nº%d aplicado com sucesso."
+#: 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:4303
+#: 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 "Excerto nº%d rejeitado."
+msgid "Could not parse object '%s'."
+msgstr "Não foi possível analisar o objeto '%s'."
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "entrada não reconhecida"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "falha ao limpar o índice"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "não foi possível ler o ficheiro de índice"
+#: 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:4507
-msgid "don't apply changes matching the given path"
-msgstr "não aplicar alterações que correspondam ao caminho fornecido"
+#: builtin/am.c:2200
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Valor inválido de --patch-format: %s"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "aplicar alterações que correspondam ao caminho fornecido"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<opções>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "remover <num> barras à esquerda dos caminhos de diff tradicional"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<opções>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "ignorar adições feitas pelo patch"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "executar interativamente"
 
-#: builtin/apply.c:4518
-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:2242
+msgid "historical option -- no-op"
+msgstr "opção histórica -- sem-ação"
 
-#: builtin/apply.c:4522
-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: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:4524
-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:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "silencioso"
 
-#: builtin/apply.c:4526
-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: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:4528
-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:2250
+msgid "recode into utf8 (default)"
+msgstr "recodificar em utf8 (predefinição)"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "aplicar um patch sem tocar na árvore de trabalho"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "passar a opção -k ao git-mailinfo"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-msgstr "aceitar patches que alteram ficheiros fora da área de trabalho"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "passar a opção -b ao git-mailinfo"
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "aplicar o patch também (use com --stat/--summary/--check)"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "passar a opção -m ao git-mailinfo"
 
-#: builtin/apply.c:4536
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "tentar merge com três pontos se um patch não for aplicado corretamente"
+#: 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:4538
-msgid "build a temporary index based on embedded index information"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
 msgstr ""
-"construir um índice temporário baseado na informação incorporada do índice"
+"não passar a opção --keep-cr ao git-mailsplit independentemente de am.keepcr"
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "os caminhos estão separados por caracteres NUL"
+#: 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:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "garantir que, pelo menos, <n> linhas de contexto coincidem"
+#: 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:4545
-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: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:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorar alterações de espaço em branco ao procurar contexto"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "formato"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "aplicar o patch em reverso"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "formato de apresentação de patches"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "não esperar nenhuma linha de contexto"
+#: 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/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "continuar a aplicar os patches depois de resolver os conflitos"
+
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "sinónimo de --continue"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "deixar os excertos rejeitados nos respetivos ficheiros *.rej"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "ignorar o patch atual"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "permitir a sobreposição de excertos"
+#: 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:4563
-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"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "mentir sobre a data de commit"
 
-#: builtin/apply.c:4566
-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:2313
+msgid "use current timestamp for author date"
+msgstr "usar a data e hora atual como data de autor"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "preceder <root> a todos os nomes de ficheiro"
+#: 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 "id-chave"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way fora de um repositório"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "assinar os commits com GPG"
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index fora de um repositório"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(uso interno de git-rebase)"
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached fora de um repositório"
+#: 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:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "não é possível abrir o patch '%s'"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "falha ao ler o índice"
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2356
 #, 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 repimidos"
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr ""
+"o diretório de rebesa anterior %s ainda existe, mas foi fornecida uma mbox."
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
+#: builtin/am.c:2380
 #, 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."
+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/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
@@ -3443,465 +4606,548 @@ 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:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "Linhas de culpa"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr ""
 "Mostrar entradas de culpa à medida que forem encontradas, incrementalmente"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
-msgstr ""
-"Mostar SHA-1 dos commits de limite em branco (Predefinição: desativado)"
+msgstr "Mostar SHA-1 dos commits limite em branco (Predefinição: desativado)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2579
 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:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Mostrar estatísticas de custo de atividade"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Forçar informação de progresso"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Mostrar a pontuação das entradas de culpa"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Mostrar o nome do ficheiro original (Predefinição: auto)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Mostrar números de linha originais (Predefinição: desativado)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 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:2539
+#: builtin/blame.c:2586
 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:2540
+#: builtin/blame.c:2587
 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:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Mostrar carimbo de data/hora em bruto (Predefinição: desativado)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Mostrar SHA1 longo de commit (Predefinição: desativado)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr ""
 "Suprimir nome de autor e carimbo de data/hora (Predefinição: desativado)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2591
 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:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Ignorar as diferenças de espaço em branco"
 
-#: builtin/blame.c:2546
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"Usar um heurística experimental baseada em indentação para melhorar diffs"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
+msgstr ""
+"Usar uma heurística experimental baseada em linhas brancas para melhorar "
+"diffs"
+
+#: builtin/blame.c:2602
 msgid "Spend extra cycles to find better match"
 msgstr "Despender ciclos extra para encontrar uma melhor correspondência"
 
-#: builtin/blame.c:2547
+#: builtin/blame.c:2603
 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:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Usar o conteúdo do <ficheiro> como imagem final"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "pontuação"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Localizar linhas copiadas dentro e entre ficheiros"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Localizar linhas movidas dentro e entre ficheiros"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 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:2654
+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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "há 4 anos e 11 meses atrás"
 
-#: builtin/branch.c:25
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents e --reverse não se misturam bem."
+
+#: builtin/blame.c:2800
+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:2805
+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:2832
+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:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "o caminho %s não existe em %s"
+
+#: builtin/blame.c:2854
+#, 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:2873
+#, 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]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<opções>] [-l] [-f] <nome-ramo> [<ponto-de-partida>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<opções>] [-r] (-d | -D) <nome-do-ramo>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<opções>] (-m | -M) [<ramo-antigo>] <novo-ramo>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<opções>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr ""
-"a eliminar o ramo '%s' incorporado em\n"
-"         '%s', mas ainda não incorporado em HEAD."
+"a eliminar o ramo '%s' integrado em\n"
+"         '%s', mas ainda não integrado em HEAD."
 
-#: builtin/branch.c:146
+#: 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 ""
-"ramo '%s' não eliminado, visto que ainda não foi incorporado em\n"
-"         '%s', apesar de já ter sido incorporado em HEAD."
+"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:160
+#: builtin/branch.c:161
 #, 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:164
+#: 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 ""
-"O ramo '%s' não foi totalmente incorporado.\n"
+"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:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "Falha ao atualizar o ficheiro de configuração"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "não é possível usar -a com -d"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Não foi possível pesquisar pelo objeto commit de HEAD"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Não é possível eliminar o ramo '%s' no qual se encontra neste momento."
+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:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
-msgstr "ramo remoto seguido '%s' não encontrado."
+msgstr "ramo de monitorização remoto '%s' não encontrado."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "ramo '%s' não encontrado."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Erro a eliminar o ramo remoto seguido '%s'"
+msgstr "Erro a eliminar o ramo de monitorização remoto '%s'"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Erro a eliminar ramo '%s'"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr "Ramo remoto seguido %s eliminado (era %s).\n"
+msgstr "Ramo de monitorização remoto %s eliminado (era %s).\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Ramo %s eliminado (era %s).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: desaparecido]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: atrás %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[atrás %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: à frente %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[à frente %d]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: à frente %d, atrás %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[à frente %d, atrás %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** referências inválida ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(nenhum ramo, a efetuar rebase de %s)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(nenhum ramo, bissecção iniciada em %s)"
 
-#: builtin/branch.c:375
+#. 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)"
 
-#: builtin/branch.c:378
+#. 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:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(nenhum ramo)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "O ramo %s está a ser rebaseado em %s"
+
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "O ramo %s está a ser bissetado em %s"
+
+#: builtin/branch.c:563
 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:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Nome de ramo inválido: '%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "Falha ao mudar o nome do ramo"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "O ramo incorretamente denominado '%s' mudou de nome"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, 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:564
+#: builtin/branch.c:604
 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:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "não foi possível escrever o modelo da descrição de ramo: %s"
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Edite a descrição do ramo:\n"
+"  %s\n"
+"Linha começadas com '%c' serão ignoradas.\n"
 
-#: builtin/branch.c:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Opções genéricas"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "apresentar hash e assunto, duplique para ramos a montante"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "suprimir mensagens informativas"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "configurar modo de seguimento (consulte git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "alterar a informação do ramo a montante"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "a montante"
+
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "alterar a informação do ramo a montante"
+
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Remover a informação do ramo a montante"
+
+#: builtin/branch.c:661
 msgid "use colored output"
 msgstr "usar saída colorida"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
-msgstr "atuar sobre ramos remotos seguidos"
+msgstr "atuar sobre ramos de monitorização remotos"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "imprimir apenas ramos que contenham o commit"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "Ações específicas do git-branch:"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
-msgstr "listar ramos remotos seguidos e ramos locais"
+msgstr "listar ramos de monitorização remotos e ramos locais"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
-msgstr "eliminar um ramo totalmente incorporado"
+msgstr "eliminar um ramo totalmente integrado"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
-msgstr "eliminar um ramo (mesmo que não tenha sido incorporado)"
+msgstr "eliminar um ramo (mesmo que não tenha sido integrado)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "mover ou mudar o nome de um ramo e o seu reflog"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 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:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "listar os nomes dos ramos"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "criar reflog do ramo"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "editar a descrição do ramo"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "forçar criação, mover/mudar o nome ou exclusão"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
-msgstr "imprimir apenas os ramos que foram incorporados"
+msgstr "imprimir apenas os ramos que foram integrados"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
-msgstr "imprimir apenas os ramos que não foram incorporados"
+msgstr "imprimir apenas os ramos que não foram integrados"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "listar os ramos em colunas"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "chave"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "nome do campo pelo qual ordernar"
 
-#: builtin/branch.c:650 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 "objeto"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "imprimir apenas os ramos do objeto"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Falha ao resolver HEAD numa referência válida."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD não encontrada em refs/heads!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column e --verbose são incompatíveis"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "nome do ramo é obrigatório"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "Não é possível atribuir descrição a HEAD destacada"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 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:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Ainda não há commits no ramo '%s'."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Não há nenhum ramo denominado '%s'."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "demasiados ramos para uma operação de mudança de nome"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "demasiados ramos para definir novo ramo a montante"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
@@ -3909,41 +5155,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:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "o ramo '%s' não existe"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "o ramo '%s' não existe"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "demasiados ramos para remover a definição de ramo a montante"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 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:790
+#: builtin/branch.c:826
 #, 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:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "não faz sentido criar 'HEAD' manualmente"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 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:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -3952,7 +5198,7 @@ msgstr ""
 "A opção --set-upstream é obsoleta e será removida. Considere o uso de --"
 "track ou --set-upstream-to\n"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -3963,16 +5209,6 @@ msgstr ""
 "Se quer que '%s' siga '%s', faça:\n"
 "\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -3986,65 +5222,81 @@ msgstr "É necessário um repositório para criar um bundle."
 msgid "Need a repository to unbundle."
 msgstr "É preciso um repositório para desempacotar."
 
-#: 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>"
+"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: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 "<tipo> pode ser um de: blob, tree, commit, tag"
 
-#: builtin/cat-file.c:467
+#: builtin/cat-file.c:552
 msgid "show object type"
 msgstr "mostrar tipo do objeto"
 
-#: builtin/cat-file.c:468
+#: builtin/cat-file.c:553
 msgid "show object size"
 msgstr "mostrar tamanho do objeto"
 
-#: builtin/cat-file.c:470
+#: 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:471
+#: 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:473
+#: 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:475
+#: 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:923
+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:476
+#: builtin/cat-file.c:565
 msgid "buffer --batch output"
 msgstr "carregar a saída de --batch"
 
-#: builtin/cat-file.c:478
+#: 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:481
+#: 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:484
+#: 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:486
+#: builtin/cat-file.c:575
 msgid "show all objects with --batch or --batch-check"
 msgstr "mostrar todos os objetos com --batch ou --batch-check"
 
@@ -4064,7 +5316,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"
 
@@ -4072,7 +5324,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:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "suprimir informação de progresso"
 
@@ -4164,8 +5416,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:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "cadeia"
 
@@ -4213,82 +5466,78 @@ msgstr "caminho '%s': não é possível integrar"
 #: builtin/checkout.c:230
 #, c-format
 msgid "Unable to add merge result for '%s'"
-msgstr "Não é possível integrar os resultados do merge de '%s'"
+msgstr "Não é possível adicionar os resultados da integração de '%s'"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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' não pode ser usado com caminhos em atualização"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' não pode ser usado com %s"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, 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:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "ficheiro de índice corrompido"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "o caminho '%s' não foi integrado"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "primeiro deve resolver o índice atual"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, 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:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD está agora em"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "não foi possível atualizar HEAD"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Repor ramo '%s'\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Já em '%s'\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Mudou para e repôs o ramo '%s'\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Mudou para o novo ramo '%s'\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Mudou para o ramo '%s'\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... e mais %d.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4309,7 +5558,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4336,151 +5585,151 @@ msgstr[1] ""
 " git branch <nome-do-novo-ramo> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "erro interno durante o curso de revisões"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "A posição anterior de HEAD era"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Está num ramo ainda não criado"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "esperava-se apenas uma referência, %d fornecidas."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "referência inválida: %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "a referência não é uma árvore: %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "não podem ser usados caminhos ao mudar de ramo"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' não pode ser usado ao mudar de ramo"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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' não pode ser usado com '%s'"
 
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1105
 #, 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:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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 "ramo"
 
-#: builtin/checkout.c:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "criar e extrair um novo ramo"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "criar/repor e extrair um ramo"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "criar reflog do novo ramo"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
 msgstr "destacar HEAD no commit indicado"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "definir a informação do ramo a montante do novo ramo"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "novo-ramo"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "novo ramo sem pai"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "extrair a nossa versão dos ficheiros não integrados"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "extrair a versão deles dos ficheiros não integrados"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "forçar extração (descartar modificações locais)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
-msgstr "realizar um merge com 3 pontos com o novo ramo"
+msgstr "realizar uma integração com 3 pontos com o novo ramo"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "atualizar ficheiros ignorados (predefinição)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "estilo"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "estilo de conflito (merge ou diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "não restringir especificadores de caminho a entradas esparsas"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "tentar adivinhar 'git checkout <ramo-inexistente>'"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 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:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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 "forçar informação de progresso"
 
-#: builtin/checkout.c:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B e --orphan são mutuamente exclusivos"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track requer um nome dum ramo"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Falta um nome dum ramo; tente -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "especificação de caminho inválida"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4488,14 +5737,14 @@ msgid ""
 msgstr ""
 "Não é possível atualizar os caminho e mudar para o ramo '%s' ao mesmo "
 "tempo.\n"
-"Pretendia extrair '%s' podendo ser resolvido num commit?"
+"Pretendia extrair '%s' o qual não pode ser resolvido como commit?"
 
-#: builtin/checkout.c:1263
+#: builtin/checkout.c:1264
 #, 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4579,7 +5828,7 @@ msgstr "Introduza padrões a ignorar>> "
 #: builtin/clean.c:690
 #, c-format
 msgid "WARNING: Cannot find items matched by: %s"
-msgstr "AVISO: não foram encontrados itens correspondentes a %s"
+msgstr "AVISO: não foram encontrados itens correspondentes a: %s"
 
 #: builtin/clean.c:711
 msgid "Select items to delete"
@@ -4647,8 +5896,8 @@ msgstr "limpeza interativa"
 msgid "remove whole directories"
 msgstr "remover diretórios inteiros"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "padrão"
 
@@ -4674,7 +5923,7 @@ msgid ""
 "clean"
 msgstr ""
 "clean.requireForce definido como true e nenhum -i, -n, ou -f fornecido; "
-"recusando-se a limpar"
+"limpeza recusada"
 
 #: builtin/clean.c:904
 msgid ""
@@ -4682,110 +5931,136 @@ msgid ""
 "refusing to clean"
 msgstr ""
 "clean.requireForce predefinido como true e nenhum -i, -n, ou -f fornecido; "
-"recusando-se a limpar"
+"limpeza recusada"
 
 #: builtin/clone.c:37
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<opções>] [--] <repo> [<dir>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
-msgstr "não realizar extração"
+msgstr "não criar uma extração"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "criar um repositório nu"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "criar um repositório espelhado (implica repositório nu)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "para clonar de um repositório local"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "não usar ligações fixas, copiar sempre"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "configurar como repositório partilhado"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "inicializar submódulos no clone"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "número de submódulos clonados em paralelo"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "diretório-modelo"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 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:79 builtin/submodule--helper.c:173
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
 msgid "reference repository"
 msgstr "repositório de referência"
 
-#: builtin/clone.c:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "usar --reference apenas para clonar"
 
-#: builtin/clone.c:82 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 "nome"
 
-#: builtin/clone.c:83
+#: builtin/clone.c:92
 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:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "extrair <ramo> em vez da HEAD do remoto"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "caminho para git-upload-pack no remoto"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "profundidade"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "criar um clone raso com essa profundidade"
 
-#: builtin/clone.c:91
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "hora"
+
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "criar um clone raso desde uma data específica"
+
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "revisão"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "aprofundar o histórico de um clone raso ao excluir uma revisão"
+
+#: builtin/clone.c:104
 msgid "clone only one branch, HEAD or --branch"
 msgstr "clonar apenas um ramo, HEAD ou --branch"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "qualquer submódulo clonado será raso"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "gitdir"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 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:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "chave=valor"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "definir configuração dentro do novo repositório"
 
-#: builtin/clone.c:96 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 "usar apenas endereços IPv4"
 
-#: builtin/clone.c:98 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 "usar apenas endereços IPv6"
 
-#: builtin/clone.c:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4793,59 +6068,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:305
-#, 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:307
-#, 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:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "o repositório de referência '%s' é raso"
-
-#: builtin/clone.c:315
+#: builtin/clone.c:303
 #, 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "falha ao invocar stat de '%s'"
+msgid "failed to open '%s'"
+msgstr "falha ao abrir '%s'"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s existe e não é um diretório"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "falha ao invocar stat de %s\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "falha ao criar a ligação '%s'"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "falha ao copiar o ficheiro para '%s'"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "concluído.\n"
 
-#: builtin/clone.c:459
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4855,128 +6113,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:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Ramo remoto %s não encontrado para clonar."
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "A verificar a conectividade... "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "o remoto não enviou todos os objetos necessários"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "não foi possível atualizar %s"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 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:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "não foi possível extrair a árvore de trabalho"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 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:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "não é possível reempacotar para limpar"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
-msgstr "não é possível invocar unlink sobre o ficheiro alternates temporário"
+msgstr ""
+"não é possível invocar unlink sobre o ficheiro sobressalente temporário"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Demasiados argumentos."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Deve especificar um repositório para clonar."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, 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:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare e --separate-git-dir são incompatíveis."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "o repositório '%s' não existe"
 
-#: builtin/clone.c:887 builtin/fetch.c:1174
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "profundidade %s não é um número positivo"
 
-#: builtin/clone.c:897
+#: builtin/clone.c:915
 #, 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:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "a árvore de trabalho '%s' já existe."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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 "não foi possível criar os diretórios superiores de '%s'"
 
-#: builtin/clone.c:925
+#: builtin/clone.c:943
 #, 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:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "A clonar no repositório nu '%s'...\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "A clonar em '%s'...\n"
 
-#: builtin/clone.c:984
+#: builtin/clone.c:963
+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:1019
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr "--depth é ignorado em clones locais; use file:// ."
 
-#: builtin/clone.c:987
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since é ignorado em clones locais; use file:// ."
+
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr "--shallow-exclude é ignorado em clones locais; use file:// ."
+
+#: builtin/clone.c:1026
 msgid "source repository is shallow, ignoring --local"
 msgstr "o repositório de origem é raso, --local ignorado"
 
-#: builtin/clone.c:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local ignorado"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Não sei como clonar %s"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: builtin/clone.c:1090 builtin/clone.c:1098
 #, 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Parece foi clonado um repositório vazio."
 
@@ -5076,7 +6346,7 @@ msgid ""
 "it empty. You can repeat your command with --allow-empty, or you can\n"
 "remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr ""
-"Pediu para emendar o commit mais recente, mas fazê-lo torná-lo-ia\n"
+"Pediu para emendar o commit mais recente, mas ao fazê-lo torná-lo-ia\n"
 "vazio. Pode repetir o comando com --allow-empty, ou pode remover o\n"
 "commit completamente com \"git reset HEAD^\".\n"
 
@@ -5090,7 +6360,7 @@ msgid ""
 msgstr ""
 "O cherry-pick anterior está vazio, possivelmente devido a resolução de "
 "conflitos.\n"
-"Se deseja fazer commit de qualquer forma, use:\n"
+"Se deseja submeter de qualquer forma, use:\n"
 "\n"
 "    git commit --allow-empty\n"
 "\n"
@@ -5115,66 +6385,66 @@ msgstr ""
 "Depois \"git cherry-pick --continue\" irá retomar o cherry-pick\n"
 "dos restantes commits.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "falha ao descompactar o objeto árvore HEAD"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "não foi possível criar índice temporário"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "falha ao adicionar interativamente"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "não é possível atualizar o índice temporário"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Falha ao atualizar a árvore de cache principal"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
-msgstr "não é possível fazer um commit parcial durante um merge."
+msgstr "não é possível fazer um commit parcial durante uma integração."
 
-#: builtin/commit.c:447
+#: 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:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "não é possível ler o índice"
 
-#: builtin/commit.c:475
+#: 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:580
+#: 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:582
+#: 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:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "parâmetro --author malformado"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "formato de data inválido: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
@@ -5182,38 +6452,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:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(a ler mensagem de log da entrada padrão)\n"
 
-#: builtin/commit.c:704
+#: 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:708
+#: 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:730
-msgid "could not read MERGE_MSG"
-msgstr "não foi possível ler MERGE_MSG"
-
-#: builtin/commit.c:734
+#: 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:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "não foi possível ler MERGE_MSG"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "não foi possível escrever o modelo de commit"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5223,12 +6493,12 @@ msgid ""
 "and try again.\n"
 msgstr ""
 "\n"
-"Parece que está a fazer commit de um merge.\n"
+"Parece que está a submeter uma integração.\n"
 "Se não for o caso, remova o ficheiro\n"
 "\t%s\n"
 "e tente de novo.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5238,12 +6508,12 @@ msgid ""
 "and try again.\n"
 msgstr ""
 "\n"
-"Parece que está a fazer commit de um cherry-pick.\n"
+"Parece que está a submeter um cherry-pick.\n"
 "Se não é o caso, remova o ficheiro\n"
-"        %s\n"
+"\t%s\n"
 "e tente outra vez.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5253,7 +6523,7 @@ msgstr ""
 "Linhas começadas com '%c' serão ignoradas, e uma mensagem vazia\n"
 "aborta o commit.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5264,149 +6534,153 @@ 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:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sAutor:    %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sData:      %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sCommitter: %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Não é possível ler o índice"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Erro ao construir árvores"
 
-#: builtin/commit.c:953 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 "Indique a mensagem usando as opções -m ou -F.\n"
 
-#: builtin/commit.c:1055
+#: 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:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Modo inválido de ficheiros não controlados '%s'"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long e -z são incompatíveis"
 
-#: builtin/commit.c:1137
+#: 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:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Não há nada para emendar."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
-msgstr "Merge em curso -- não é possível emendar."
+msgstr "Integração em curso -- não é possível emendar."
 
-#: builtin/commit.c:1151
+#: 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:1154
+#: 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:1164
+#: 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:1166
+#: 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:1174
+#: 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:1191
+#: 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:1193
+#: 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:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Inteligente... a emendar o último commit com o índice sujo."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 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:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Modo de limpeza inválido %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
-msgstr "A especificação de caminhos com -a não faz sentido."
+msgstr "Indicar caminhos com -a não faz sentido."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "mostrar status de forma concisa"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "mostrar informação do ramo"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "versão"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
 msgid "machine-readable output"
 msgstr "saída inteligível por máquina"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "apresentar status em formato longo (predefinição)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "terminar entradas com NUL"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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 "modo"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
+#: builtin/commit.c:1354 builtin/commit.c:1629
 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "mostrar ficheiros ignorados"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "quando"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
@@ -5414,200 +6688,200 @@ msgstr ""
 "ignorar alterações em submódulos, quando é opcional: all, dirty, untracked. "
 "(Predefinição: all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "listar ficheiros não controlados em colunas"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "não foi possível consultar o commit recém-criado"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "não foi possível analisar o commit recém-criado"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "HEAD destacada"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (commit-raiz)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
-msgstr "suprimir o resumo depois de fazer commit com sucesso"
+msgstr "suprimir o resumo depois de submeter com sucesso"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "mostrar diff no modelo da mensagem de commit"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Opções de mensagem de commit"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "ler mensagem de um ficheiro"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "autor"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "substituir autor do commit"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "data"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "substituir data do commit"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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 "mensagem"
 
-#: builtin/commit.c:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "mensagem de commit"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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 "commit"
 
-#: builtin/commit.c:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "reutilizar e editar a mensagem de um commit especificado"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "reutilizar a mensagem de um commit especificado"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr ""
 "usar mensagem com formato autosquash para corrigir o commit especificado"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr ""
 "usar mensagem com formato autosquash para esmagar o commit especificado"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 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:1588 builtin/log.c:1219 builtin/revert.c:86
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
 msgid "add Signed-off-by:"
 msgstr "adicionar Signed-off-by:"
 
-#: builtin/commit.c:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "usar ficheiro de modelo especificado"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "forçar edição do commit"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "predefinição"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
+#: builtin/commit.c:1603 builtin/tag.c:354
 msgid "how to strip spaces and #comments from message"
 msgstr "como retirar espaços e #comentários da mensagem"
 
-#: builtin/commit.c:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "incluir status no modelo da mensagem de commit"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: builtin/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
 #: builtin/revert.c:93
 msgid "GPG sign commit"
 msgstr "assinar o commit com GPG"
 
-#: builtin/commit.c:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Opções de conteúdo do commit"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
-msgstr "fazer commit de todos os ficheiros alterados"
+msgstr "submeter todos os ficheiros alterados"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
-msgstr "adicionar ficheiros especificados ao índice para incluir no commit"
+msgstr "adicionar ficheiros especificados ao índice para submeter"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "adicionar ficheiros interativamente"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "adicionar alterações interativamente"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
-msgstr "fazer commit somente dos ficheiros especificados"
+msgstr "submeter somente os ficheiros especificados"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "ignorar pre-commit hook"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "ignorar pre-commit e commit-msg hooks"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
-msgstr "mostrar o que será incluído no commit"
+msgstr "mostrar o que seria submetido"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "emendar o commit anterior"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "ignorar post-rewrite hook"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "aceitar o registo duma alteração vazia"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "aceitar o registo duma alteração com uma mensagem vazia"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "não foi possível analisar o commit HEAD"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Ficheiro MERGE_HEAD corrompido (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "não foi possível ler MERGE_MODE"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "não foi possível ler a mensagem de commit: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, 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:1740
+#: builtin/commit.c:1754
 #, 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:1788
+#: 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"
@@ -5621,142 +6895,142 @@ msgstr ""
 msgid "git config [<options>]"
 msgstr "git config [<opções>]"
 
-#: builtin/config.c:56
+#: builtin/config.c:55
 msgid "Config file location"
 msgstr "Localização do ficheiro de configuração"
 
-#: builtin/config.c:57
+#: builtin/config.c:56
 msgid "use global config file"
 msgstr "usar ficheiro de configuração global"
 
-#: builtin/config.c:58
+#: builtin/config.c:57
 msgid "use system config file"
 msgstr "usar ficheiro de configuração do sistema"
 
-#: builtin/config.c:59
+#: builtin/config.c:58
 msgid "use repository config file"
 msgstr "usar ficheiro de configuração do repositório"
 
-#: builtin/config.c:60
+#: builtin/config.c:59
 msgid "use given config file"
 msgstr "usar ficheiro de configuração fornecido"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "blob-id"
 msgstr "id-blob"
 
-#: builtin/config.c:61
+#: builtin/config.c:60
 msgid "read config from given blob object"
 msgstr "ler configuração a partir do objeto blob fornecido"
 
-#: builtin/config.c:62
+#: builtin/config.c:61
 msgid "Action"
 msgstr "Ação"
 
-#: builtin/config.c:63
+#: builtin/config.c:62
 msgid "get value: name [value-regex]"
 msgstr "obter valor: nome [regex-do-valor]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "obter todos os valores: chave [regex-do-valor]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "obter valores para a regexp: regex-do-nome [regex-do-valor]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "obter valor do URL especificado: section[.var] URL"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "replace all matching variables: name value [value_regex]"
 msgstr ""
 "substituir todos as variáveis correspondentes: nome valor [regex-do-valor]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "adicionar uma nova variável: nome valor"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "remover uma variável: nome [regex-do-valor]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "remover todas as correspondências: nome [regex-do-valor]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "mudar o nome da secção: nome-antigo novo-nome"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "remover uma secção: nome"
 
-#: builtin/config.c:73
+#: builtin/config.c:72
 msgid "list all"
 msgstr "listar todos"
 
-#: builtin/config.c:74
+#: builtin/config.c:73
 msgid "open an editor"
 msgstr "abrir um editor"
 
-#: builtin/config.c:75
+#: builtin/config.c:74
 msgid "find the color configured: slot [default]"
 msgstr "encontrar a cor configurada: slot [predefinição]"
 
-#: builtin/config.c:76
+#: builtin/config.c:75
 msgid "find the color setting: slot [stdout-is-tty]"
 msgstr "encontrar a definição de cor: slot [stdout-é-tty]"
 
-#: builtin/config.c:77
+#: builtin/config.c:76
 msgid "Type"
 msgstr "Tipo"
 
-#: builtin/config.c:78
+#: builtin/config.c:77
 msgid "value is \"true\" or \"false\""
-msgstr "o valor é \"true\" (verdadeiro) ou \"falso\" (falso)"
+msgstr "o valor é \"true\" (verdadeiro) ou \"false\" (falso)"
 
-#: builtin/config.c:79
+#: builtin/config.c:78
 msgid "value is decimal number"
 msgstr "o valor é um número decimal"
 
-#: builtin/config.c:80
+#: builtin/config.c:79
 msgid "value is --bool or --int"
 msgstr "o valor é --bool ou --int"
 
-#: builtin/config.c:81
+#: builtin/config.c:80
 msgid "value is a path (file or directory name)"
 msgstr "o valor é um caminho (nome dum ficheiro ou diretório)"
 
-#: builtin/config.c:82
+#: builtin/config.c:81
 msgid "Other"
 msgstr "Outro"
 
-#: builtin/config.c:83
+#: builtin/config.c:82
 msgid "terminate values with NUL byte"
 msgstr "terminar valores com o byte NUL"
 
-#: builtin/config.c:84
+#: builtin/config.c:83
 msgid "show variable names only"
 msgstr "mostrar apenas os nomes das variáveis"
 
-#: builtin/config.c:85
+#: builtin/config.c:84
 msgid "respect include directives on lookup"
 msgstr "respeitar diretivas de inclusão ao pesquisar"
 
-#: builtin/config.c:86
+#: builtin/config.c:85
 msgid "show origin of config (file, standard input, blob, command line)"
 msgstr ""
 "mostrar a origem da configuração (ficheiro, entrada padrão, blob, linha de "
 "comandos)"
 
-#: builtin/config.c:328
+#: builtin/config.c:327
 msgid "unable to parse default color value"
 msgstr "não é possível analisar o valor de cor por omissão"
 
-#: builtin/config.c:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5771,22 +7045,31 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: builtin/config.c:613
 #, 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: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ã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
 msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [<opções>] [<commit-ish>...]"
+msgstr "git describe [<opções>] [<commit-etc>...]"
 
 #: builtin/describe.c:18
 msgid "git describe [<options>] --dirty"
@@ -5807,7 +7090,7 @@ msgstr "a tag anotada %s não tem nenhum nome incorporado"
 msgid "tag '%s' is really '%s' here"
 msgstr "a tag '%s' está de facto em '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "%s não é um nome de objeto válido"
@@ -5900,7 +7183,7 @@ msgstr "considerar as <n> tags mais recentes (predefinição: 10)"
 msgid "only consider tags matching <pattern>"
 msgstr "apenas considerar tags que correspondam ao <padrão>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "mostrar objetos de commit abreviados em recurso"
 
@@ -5936,21 +7219,21 @@ msgstr "'%s': não é um ficheiro regular nem uma ligação simbólica"
 msgid "invalid option: %s"
 msgstr "opção inválida: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "Não é um repositório git"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objeto inválido '%s' fornecido."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "mais do que dois blobs fornecidos: '%s'"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "objeto sem tratamento '%s' fornecido."
@@ -6007,182 +7290,183 @@ msgstr "Aplicar o especificador de referência a referências exportadas"
 msgid "anonymize output"
 msgstr "anonimizar saída"
 
-#: builtin/fetch.c:20
+#: builtin/fetch.c:21
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr ""
 "git fetch [<opções>] [<repositório> [<especificador-de-referência>...]]"
 
-#: builtin/fetch.c:21
+#: builtin/fetch.c:22
 msgid "git fetch [<options>] <group>"
 msgstr "git fetch [<opções>] <grupo>"
 
-#: builtin/fetch.c:22
+#: builtin/fetch.c:23
 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
 msgstr "git fetch --multiple [<opções>] [(<repositório> | <grupo>)...]"
 
-#: builtin/fetch.c:23
+#: builtin/fetch.c:24
 msgid "git fetch --all [<options>]"
 msgstr "git fetch --all [<opções>]"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "obter de todos os remotos"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:96 builtin/pull.c:172
+#: 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:97 builtin/pull.c:174
+#: 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:99
+#: builtin/fetch.c:102
 msgid "fetch from multiple remotes"
 msgstr "obter de múltiplos remotos"
 
-#: builtin/fetch.c:101 builtin/pull.c:176
+#: 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:103
+#: builtin/fetch.c:106
 msgid "do not fetch all tags (--no-tags)"
 msgstr "não obter todas as tags (--no-tags)"
 
-#: builtin/fetch.c:105
+#: builtin/fetch.c:108
 msgid "number of submodules fetched in parallel"
 msgstr "número de submódulos obtidos em paralelo"
 
-#: builtin/fetch.c:107 builtin/pull.c:179
+#: builtin/fetch.c:110 builtin/pull.c:188
 msgid "prune remote-tracking branches no longer on remote"
-msgstr "eliminar os ramos cujo respetivo ramo remoto já não existe"
+msgstr ""
+"eliminar os ramos de monitorização remotos que já não existem no remoto"
 
-#: builtin/fetch.c:108 builtin/pull.c:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: 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:113 builtin/pull.c:191
+#: builtin/fetch.c:116 builtin/pull.c:200
 msgid "keep downloaded pack"
 msgstr "manter o pacote transferido"
 
-#: builtin/fetch.c:115
+#: builtin/fetch.c:118
 msgid "allow updating of HEAD ref"
 msgstr "permitir a atualização da referência HEAD"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
+#: 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:120 builtin/pull.c:197
+#: 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:122 builtin/log.c:1236
+#: builtin/fetch.c:131 builtin/log.c:1433
 msgid "dir"
 msgstr "dir"
 
-#: builtin/fetch.c:123
+#: builtin/fetch.c:132
 msgid "prepend this to submodule path output"
 msgstr "preceder isto ao caminho do submódulo"
 
-#: builtin/fetch.c:126
+#: builtin/fetch.c:135
 msgid "default mode for recursion"
 msgstr "modo recursivo por omissão"
 
-#: builtin/fetch.c:128 builtin/pull.c:200
+#: 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:129 builtin/pull.c:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "mapa de referências"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: builtin/fetch.c:139 builtin/pull.c:212
 msgid "specify fetch refmap"
 msgstr "especificar mapa de referências"
 
-#: builtin/fetch.c:386
+#: builtin/fetch.c:398
 msgid "Couldn't find remote ref HEAD"
 msgstr "Referência remota HEAD não encontrada"
 
-#: builtin/fetch.c:466
+#: builtin/fetch.c:514
+#, 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:607
 #, c-format
 msgid "object %s not found"
 msgstr "objeto %s não encontrado"
 
-#: builtin/fetch.c:471
+#: builtin/fetch.c:611
 msgid "[up to date]"
 msgstr "[atualizado]"
 
-#: builtin/fetch.c:485
-#, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (não é possível obter no ramo atual)"
-
-#: builtin/fetch.c:486 builtin/fetch.c:574
+#: builtin/fetch.c:624 builtin/fetch.c:704
 msgid "[rejected]"
 msgstr "[rejeitado]"
 
-#: builtin/fetch.c:497
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "não é possível obter no ramo atual"
+
+#: builtin/fetch.c:634
 msgid "[tag update]"
 msgstr "[tag atualizada]"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (não é possível atualizar a referência local)"
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "não é possível atualizar a referência local"
 
-#: builtin/fetch.c:517
+#: builtin/fetch.c:654
 msgid "[new tag]"
 msgstr "[nova tag]"
 
-#: builtin/fetch.c:520
+#: builtin/fetch.c:657
 msgid "[new branch]"
 msgstr "[novo ramo]"
 
-#: builtin/fetch.c:523
+#: builtin/fetch.c:660
 msgid "[new ref]"
 msgstr "[nova referência]"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "não é possível atualizar a referência local"
-
-#: builtin/fetch.c:569
+#: builtin/fetch.c:699
 msgid "forced update"
 msgstr "atualização forçada"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(sem avanço rápido)"
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "sem avanço-rápido"
 
-#: builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "não é possível abrir %s: %s\n"
-
-#: builtin/fetch.c:619
+#: builtin/fetch.c:749
 #, 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:637
+#: builtin/fetch.c:769
 #, 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:724 builtin/fetch.c:816
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
 msgid "From %.*s\n"
 msgstr "De %.*s\n"
 
-#: builtin/fetch.c:735
+#: builtin/fetch.c:867
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -6191,55 +7475,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:787
+#: builtin/fetch.c:922
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s ficará suspenso)"
 
-#: builtin/fetch.c:788
+#: builtin/fetch.c:923
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s ficou suspenso)"
 
-#: builtin/fetch.c:820
+#: builtin/fetch.c:955
 msgid "[deleted]"
 msgstr "[eliminado]"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
+#: builtin/fetch.c:956 builtin/remote.c:1020
 msgid "(none)"
 msgstr "(nenhum)"
 
-#: builtin/fetch.c:841
+#: builtin/fetch.c:979
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "Não é possível obter objetos no ramo atual %s de um repositório não nu"
+msgstr "Obtenção de objetos no ramo atual %s de um repositório não nu recusada"
 
-#: builtin/fetch.c:860
+#: builtin/fetch.c:998
 #, 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:863
+#: builtin/fetch.c:1001
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Opção \"%s\" ignorada em %s\n"
 
-#: builtin/fetch.c:920
+#: builtin/fetch.c:1077
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Não sei como obter de %s"
 
-#: builtin/fetch.c:1080
+#: builtin/fetch.c:1237
 #, c-format
 msgid "Fetching %s\n"
 msgstr "A obter de %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 "Não foi possível obter de %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."
@@ -6247,32 +7531,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:1123
+#: builtin/fetch.c:1280
 msgid "You need to specify a tag name."
 msgstr "Deve especificar um nome para a tag."
 
-#: builtin/fetch.c:1165
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Não é suportada profundidade negativa em --deepen"
+
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen e --depth são mutuamente exclusivos"
+
+#: builtin/fetch.c:1329
 msgid "--depth and --unshallow cannot be used together"
 msgstr "--depth e --unshallow não podem ser usados juntos"
 
-#: builtin/fetch.c:1167
+#: builtin/fetch.c:1331
 msgid "--unshallow on a complete repository does not make sense"
 msgstr "usar --unshallow num repositório completo não faz sentido"
 
-#: builtin/fetch.c:1187
+#: builtin/fetch.c:1353
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all não leva um repositório como argumento"
 
-#: builtin/fetch.c:1189
+#: builtin/fetch.c:1355
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all não faz sentido com especificadores de referência"
 
-#: builtin/fetch.c:1200
+#: builtin/fetch.c:1366
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "O remoto ou grupo remoto não existe: %s"
 
-#: builtin/fetch.c:1208
+#: builtin/fetch.c:1374
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Não faz sentido obter um grupo e especificar uma referência"
 
@@ -6283,23 +7575,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"
 
@@ -6352,73 +7644,73 @@ msgstr "imprimir apenas referências que apontem para o objeto fornecido"
 
 #: builtin/for-each-ref.c:43
 msgid "print only refs that are merged"
-msgstr "imprimir apenas referenciadas incorporadas"
+msgstr "imprimir apenas referenciadas integradas"
 
 #: builtin/for-each-ref.c:44
 msgid "print only refs that are not merged"
-msgstr "imprimir apenas referências não incorporadas"
+msgstr "imprimir apenas referências não integrada"
 
 #: builtin/for-each-ref.c:45
 msgid "print only refs which contain the commit"
 msgstr "imprimir apenas referências que contenham o commit"
 
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "A verificar conectividade"
-
-#: builtin/fsck.c:486
+#: builtin/fsck.c:519
 msgid "Checking object directories"
 msgstr "A verificar diretórios de objetos"
 
-#: builtin/fsck.c:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<opções>] [<objeto>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "mostrar objetos inalcançáveis"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "mostrar objetos suspensos"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "mostrar tags"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "mostrar nós raiz"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "considerar objetos do índice como nós cabeça"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "considerar os reflogs como nós cabeça (predefinição)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
-msgstr "considerar também pacotes e objetos alternate"
+msgstr "considerar também pacotes e objetos sobressalente"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "verificar só a conetividade"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "ativar verificação mais rigorosa"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "escrever objetos suspensos em .git/lost-found"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "mostrar progresso"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "mostrar nomes verbosos de objetos inalcançáveis"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "A verificar objetos"
 
@@ -6446,7 +7738,7 @@ msgid ""
 "%s"
 msgstr ""
 "A última execução do gc reportou o seguinte.\n"
-"Corrija a raiz do problema e remova %s.\n"
+"Corrija a origem do problema e remova %s.\n"
 "A limpeza automática não será realizada enquanto o ficheiro existir.\n"
 "\n"
 "%s"
@@ -6513,231 +7805,226 @@ msgstr "grep: falha ao criar thread: %s"
 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:453 builtin/grep.c:488
 #, 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:503
 #, 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:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "a opção '%c' espera um valor numérico"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "não é possível abrir '%s'"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 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:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "procurar em conteúdos não geridos pelo git"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "procurar em ficheiros controlados e não controlados"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "ignorar ficheiros especificados via '.gitignore'"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "mostrar linhas não correspondidas"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "não diferenciar maiúsculas de minúsculas"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "corresponder padrões apenas a palavras"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "processar ficheiros binários como texto"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "ignorar ficheiros binários"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "processar ficheiros binários com filtros textconv"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "descer no máximo até <profundidade>"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "usar expressões regulares estendidas do POSIX"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "usar expressões regulares básicas do POSIX (predefinição)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "interpretar padrões como cadeias de caracteres fixas"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "usar expressões regulares compatíveis com Perl"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "mostrar números de linha"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "não mostrar nomes de ficheiro"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "mostrar nomes de ficheiro"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "mostrar nomes de ficheiro relativamente ao diretório superior"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "mostrar apenas nomes de ficheiro em vez de linhas correspondidas"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "sinónimo de --files-with-matches"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "mostrar apenas nomes de ficheiro sem correspondência"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "imprimir NUL depois dos nomes de ficheiro"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 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:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "realçar correspondências"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr ""
 "imprimir uma linha em branco entre correspondências de diferentes ficheiros"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 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:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "mostrar <n> linhas de contexto antes e depois das correspondências"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "mostrar <n> linhas de contexto antes das correspondências"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "mostrar <n> linhas de contexto depois das correspondências"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "usar <n> threads de trabalho"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "atalho para -C NUM"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 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:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "mostrar a função circundante"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "ler padrões do ficheiro"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "procurar <padrão>"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "combinar padrões especificados com -e"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 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:739
+#: builtin/grep.c:742
 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:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "mostrar árvore de analise da expressões grep"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "paginador"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "mostrar ficheiros com correspondências no paginador"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "permitir invocar grep(1) (ignorado nesta compilação)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "nenhum padrão fornecido."
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "número de threads especificado inválido (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager só funciona na árvore de trabalho"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:902
 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:904
+#: builtin/grep.c:907
 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:907
+#: builtin/grep.c:910
 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:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
-msgstr "--cached e árvores fornecidos simultaneamente."
+msgstr "--cached e árvores foram fornecidos simultaneamente."
 
 #: builtin/hash-object.c:81
 msgid ""
@@ -6751,528 +8038,532 @@ 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': %s"
-msgstr "falha ao executar '%s': %s"
+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"
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 "'%s': caminho para visualizador de manual não suportado.\n"
-"Considere usar 'man.<tool>.cmd'."
+"Considere usar 'man.<ferramenta>.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': comando de visualizador de manual suportado.\n"
-"Considere usar 'man.<tool>.path'."
+"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."
+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:408
+#: builtin/help.c:403
 msgid "Defining attributes per path"
 msgstr "Definir atributos por caminho"
 
-#: builtin/help.c:409
+#: 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:410
+#: builtin/help.c:405
 msgid "A Git glossary"
 msgstr "Um Glossário do Git"
 
-#: builtin/help.c:411
+#: builtin/help.c:406
 msgid "Specifies intentionally untracked files to ignore"
 msgstr ""
 "Especificar ficheiros não controlados para serem intencionalmente ignorados"
 
-#: builtin/help.c:412
+#: builtin/help.c:407
 msgid "Defining submodule properties"
 msgstr "Definir propriedades de submódulos"
 
-#: builtin/help.c:413
+#: builtin/help.c:408
 msgid "Specifying revisions and ranges for Git"
 msgstr "Especificar revisões e intervalos do Git"
 
-#: builtin/help.c:414
+#: 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:415
+#: 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:427
+#: builtin/help.c:422
 msgid "The common Git guides are:\n"
 msgstr "Os guias comuns do Git:\n"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "utilização: %s%s"
-
-#: builtin/help.c:481
+#: builtin/help.c:440
 #, c-format
 msgid "`git %s' is aliased to `%s'"
 msgstr "'git %s' é um alias de '%s'"
 
-#: builtin/index-pack.c:152
+#: 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 ler %s"
+msgstr "não foi possível abrir %s"
 
-#: builtin/index-pack.c:202
+#: 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:222
+#: 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:225
+#: 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:267
+#: 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:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "fim de ficheiro (EOF) prematuro"
 
-#: builtin/index-pack.c:278
+#: builtin/index-pack.c:280
 msgid "read error on input"
 msgstr "erro de leitura da entrada"
 
-#: builtin/index-pack.c:290
+#: 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:297
+#: 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:313
+#: 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:318
+#: builtin/index-pack.c:322
 #, c-format
 msgid "cannot open packfile '%s'"
 msgstr "não é possível abrir o ficheiro de pacote '%s'"
 
-#: builtin/index-pack.c:332
+#: builtin/index-pack.c:336
 msgid "pack signature mismatch"
 msgstr "a assinatura do pacote não corresponde"
 
-#: builtin/index-pack.c:334
+#: builtin/index-pack.c:338
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "versão de pacote %<PRIu32> não suportada"
 
-#: builtin/index-pack.c:352
+#: builtin/index-pack.c:356
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "pacote com objeto incorreto no offset %lu: %s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "pacote com objeto incorreto no offset %<PRIuMAX>: %s"
 
-#: builtin/index-pack.c:473
+#: builtin/index-pack.c:478
 #, c-format
 msgid "inflate returned %d"
 msgstr "a descompactação retornou %d"
 
-#: builtin/index-pack.c:522
+#: builtin/index-pack.c:527
 msgid "offset value overflow for delta base object"
 msgstr "delta de objeto base com capacidade excedida no valor de offset"
 
-#: builtin/index-pack.c:530
-#, fuzzy
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
-msgstr "um offset de base delta ultrapassou o limite"
+msgstr "offset da base delta está fora do limite"
 
-#: builtin/index-pack.c:538
+#: builtin/index-pack.c:543
 #, c-format
 msgid "unknown object type %d"
 msgstr "objeto de tipo desconhecido %d"
 
-#: builtin/index-pack.c:569
+#: builtin/index-pack.c:574
 msgid "cannot pread pack file"
 msgstr "não é possível invocar pread sobre o ficheiro de pacote"
 
-#: 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] "fim de ficheiro de pacote prematuro, falta %lu byte"
-msgstr[1] "fim de ficheiro de pacote prematuro, faltam %lu bytes"
+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:597
+#: builtin/index-pack.c:602
 msgid "serious inflate inconsistency"
 msgstr "inconsistência de descompactação grave"
 
-#: 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 "COLISÃO DE SHA1 COM %s ENCONTRADA!"
 
-#: 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 "não foi possível ler %s"
 
-#: builtin/index-pack.c:812
+#: builtin/index-pack.c:817
 #, c-format
 msgid "cannot read existing object %s"
 msgstr "não é possível ler o objeto existente %s"
 
-#: builtin/index-pack.c:826
+#: builtin/index-pack.c:831
 #, c-format
 msgid "invalid blob object %s"
 msgstr "objeto blob inválido %s"
 
-#: builtin/index-pack.c:840
+#: builtin/index-pack.c:845
 #, c-format
 msgid "invalid %s"
 msgstr "inválido %s"
 
-#: builtin/index-pack.c:843
+#: builtin/index-pack.c:848
 msgid "Error in object"
 msgstr "Erro no objeto"
 
-#: builtin/index-pack.c:845
+#: builtin/index-pack.c:850
 #, 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:917 builtin/index-pack.c:948
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
 msgid "failed to apply delta"
 msgstr "falha ao aplicar delta"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Receiving objects"
 msgstr "A receber objetos"
 
-#: builtin/index-pack.c:1118
+#: builtin/index-pack.c:1123
 msgid "Indexing objects"
 msgstr "A indexar objetos"
 
-#: builtin/index-pack.c:1150
+#: builtin/index-pack.c:1155
 msgid "pack is corrupted (SHA1 mismatch)"
 msgstr "pacote corrompido (SHA1 não corresponde)"
 
-#: builtin/index-pack.c:1155
+#: builtin/index-pack.c:1160
 msgid "cannot fstat packfile"
 msgstr "não é possível invocar fstat sobre o ficheiro de pacote"
 
-#: builtin/index-pack.c:1158
+#: builtin/index-pack.c:1163
 msgid "pack has junk at the end"
 msgstr "pacote com lixo no final"
 
-#: builtin/index-pack.c:1169
+#: builtin/index-pack.c:1174
 msgid "confusion beyond insanity in parse_pack_objects()"
 msgstr "extrema confusão em parse_pack_objects()"
 
-#: builtin/index-pack.c:1194
+#: builtin/index-pack.c:1197
 msgid "Resolving deltas"
 msgstr "A resolver deltas"
 
-#: builtin/index-pack.c:1205
+#: builtin/index-pack.c:1208
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "não foi possível criar thread: %s"
 
-#: builtin/index-pack.c:1247
+#: builtin/index-pack.c:1250
 msgid "confusion beyond insanity"
 msgstr "extrema confusão"
 
-#: builtin/index-pack.c:1253
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "completed with %d local objects"
-msgstr "concluído com %d objetos locais"
+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:1263
+#: builtin/index-pack.c:1268
 #, 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:1267
+#: builtin/index-pack.c:1272
 #, 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:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "não é possível compactar objeto acrescentado (%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "objeto local %s corrompido"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "erro ao fechar ficheiro de pacote"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "não é possível escrever o ficheiro de conservação '%s'"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, 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:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "não é possível guardar ficheiro de pacote"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "não é possível guardar o ficheiro índice"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "pack.indexversion=%<PRIu32> incorreto"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "sem suporte de threads, %s ignorado"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, 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:1540
+#: builtin/index-pack.c:1544
 #, 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:1587
+#: builtin/index-pack.c:1591
 #, 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:1594
+#: builtin/index-pack.c:1598
 #, 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:1624
-msgid "Cannot come back to cwd"
-msgstr "Não é possível voltar ao diretório de trabalho atual"
+#: builtin/index-pack.c:1611
+#, 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:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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 incorreto"
 
-#: builtin/index-pack.c:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin não pode ser usado sem --stdin"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, 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:1730
+#: builtin/index-pack.c:1740
 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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "modelos não encontrados em %s"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr ""
-"os modelos com versão de formato %d incorreta não foram copiados de '%s'"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s já existe"
+msgid "not copying templates from '%s': %s"
+msgstr "modelos não copiados de '%s': %s"
 
-#: builtin/init-db.c:340
+#: 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:343
+#: builtin/init-db.c:330
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "não foi possível mover %s para %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:399
+#: builtin/init-db.c:347 builtin/init-db.c:350
 #, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "Repositório Git %s%s em %s%s\n"
+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:400
-msgid "Reinitialized existing"
-msgstr "existente reinicializado"
+#: 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:400
-msgid "Initialized empty"
-msgstr "vazio inicializado"
+#: 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:401
-msgid " shared"
-msgstr " partilhado"
+#: 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:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7280,26 +8571,26 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<diretório-modelo>] [--"
 "shared[=<permissões>]] [<diretório>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "permissões"
 
-#: builtin/init-db.c:472
+#: 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:506 builtin/init-db.c:511
+#: 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:515
+#: 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:536
+#: builtin/init-db.c:545
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -7308,7 +8599,7 @@ msgstr ""
 "%s (ou --work-tree=<diretório>) não é permitido sem especificar %s (ou --git-"
 "dir=<diretório>)"
 
-#: builtin/init-db.c:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Não é possível aceder à árvore de trabalho '%s'"
@@ -7341,280 +8632,333 @@ msgstr "terminadores a adicionar"
 msgid "no input file given for in-place editing"
 msgstr "nenhum ficheiro de entrada fornecido para edição no local"
 
-#: builtin/log.c:43
+#: builtin/log.c:44
 msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
 msgstr "git log [<opções>] [<intervalo-de-revisões>] [[--] <caminho>...]"
 
-#: builtin/log.c:44
+#: builtin/log.c:45
 msgid "git show [<options>] <object>..."
 msgstr "git show [<opções>] <objeto>..."
 
-#: builtin/log.c:83
+#: builtin/log.c:84
 #, c-format
 msgid "invalid --decorate option: %s"
 msgstr "opção --decorate inválida: %s"
 
-#: builtin/log.c:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "suprimir saída do diff"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "mostrar origem"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "usar ficheiro de mapeamento de correio"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "opções de decoração"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 msgid "Process line range n,m in file, counting from 1"
-msgstr "processar intervalo de linhas n,m, a cantar a partir de 1"
+msgstr "processar intervalo de linhas n,m, a contar a partir de 1"
 
-#: builtin/log.c:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Resultado final: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: ficheiro incorreto"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "Não foi possível ler o objeto %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Tipo desconhecido: %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers sem valor"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "o nome do diretório de saída é demasiado longo"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Não é possível abrir o ficheiro de patch %s"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "É necessário exatamente um intervalo."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "Não é um intervalo."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "A carta de apresentação precisa de um formato de e-mail"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to incorreto: %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<opções>] [<desde> | <intervalo-de-revisões>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Dois diretórios de saída?"
 
-#: builtin/log.c:1214
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Commit desconhecido %s"
+
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "Falha ao resolver '%s' numa referência válida."
+
+#: builtin/log.c:1263
+msgid "Could not find exact merge base."
+msgstr "Não foi possível encontrar a base exata de integração."
+
+#: 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 ""
+"Falha ao obter ramo a montante, se quer gravar o commit base "
+"automaticamente,\n"
+"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:1287
+msgid "Failed to find exact merge base"
+msgstr "Falha ao procurar base exata de integração"
+
+#: builtin/log.c:1298
+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:1302
+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:1351
+msgid "cannot get patch id"
+msgstr "não é possível obter o id do patch"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "usar [PATCH n/m] mesmo com um único patch"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "usar [PATCH] mesmo com múltiplos patches"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "imprimir patches para a saída padrão"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "gerar uma carta de apresentação"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 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:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "sfx"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "usar <sfx> em vez de '.patch'"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 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:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "marcar a série como a n-ésima reiteração"
 
-#: builtin/log.c:1233
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Usar [RFC PATCH] em vez de [PATCH]"
+
+#: builtin/log.c:1430
 msgid "Use [<prefix>] instead of [PATCH]"
 msgstr "usar [<prefixo>] em vez de [PATCH]"
 
-#: builtin/log.c:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "guardar os ficheiros resultantes em <dir>"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "não tirar/inserir [PATCH]"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "não gerar diffs binários"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "preencher o cabeçalho From com hash de zeros"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 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:1248
+#: builtin/log.c:1445
 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:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Mensagem"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "cabeçalho"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "adicionar cabeçalho de e-mail"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "e-mail"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "adicionar cabeçalho To:"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "adicionar cabeçalho Cc:"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "identidade"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 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:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "id-mensagem"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "usar o primeiro email para responder a <id-mensagem>"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "limite"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "anexar o patch"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "incorporar o patch"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "ativar mensagens por tópicos, estilos: shallow (raso), deep (profundo)"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "assinatura"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "adicionar uma assinatura"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "commit-base"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "adicionar informação pré-requisito da árvore à série de patches"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "adicionar uma assinatura de um ficheiro"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "não imprimir os nomes dos ficheiros de patch"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n e -k são mutuamente exclusivos."
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix e -k são mutuamente exclusivos."
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc e -k são mutuamente exclusivos."
 
-#: builtin/log.c:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only não faz sentido"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status não faz sentido"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check não faz sentido"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "saída padrão, ou diretório, qual deles?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Não foi possível criar o diretório '%s'"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "não é possível ler o ficheiro de assinatura '%s'"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Falha ao criar os ficheiros de saída"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<ramo-a-montante> [<head> [<limite>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -7622,107 +8966,107 @@ msgstr ""
 "O ramo remoto seguido não foi encontrado, especifique <ramo-a-montante> "
 "manualmente.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Commit desconhecido %s"
-
-#: builtin/ls-files.c:378
+#: builtin/ls-files.c:458
 msgid "git ls-files [<options>] [<file>...]"
 msgstr "git ls-files [<opções>] [<ficheiro>...]"
 
-#: builtin/ls-files.c:427
+#: builtin/ls-files.c:507
 msgid "identify the file status with tags"
 msgstr "identificar o estado do ficheiro com tags"
 
-#: builtin/ls-files.c:429
+#: builtin/ls-files.c:509
 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:431
+#: builtin/ls-files.c:511
 msgid "show cached files in the output (default)"
-msgstr "mostrar ficheiros em cache na saída"
+msgstr "mostrar ficheiros em cache na saída (predefinição)"
 
-#: builtin/ls-files.c:433
+#: builtin/ls-files.c:513
 msgid "show deleted files in the output"
 msgstr "mostrar ficheiros eliminados na saída"
 
-#: builtin/ls-files.c:435
+#: builtin/ls-files.c:515
 msgid "show modified files in the output"
 msgstr "mostrar ficheiros modificados na saída"
 
-#: builtin/ls-files.c:437
+#: builtin/ls-files.c:517
 msgid "show other files in the output"
 msgstr "mostrar outros ficheiros na saída"
 
-#: builtin/ls-files.c:439
+#: builtin/ls-files.c:519
 msgid "show ignored files in the output"
 msgstr "mostrar ficheiros ignorados na saída"
 
-#: builtin/ls-files.c:442
+#: builtin/ls-files.c:522
 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:444
+#: builtin/ls-files.c:524
 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:446
+#: builtin/ls-files.c:526
 msgid "show 'other' directories' names only"
 msgstr "mostrar nomes de diretórios 'other' (outro)"
 
-#: builtin/ls-files.c:448
+#: builtin/ls-files.c:528
 msgid "show line endings of files"
 msgstr "mostrar finais de linha dos ficheiros"
 
-#: builtin/ls-files.c:450
+#: builtin/ls-files.c:530
 msgid "don't show empty directories"
 msgstr "não mostrar diretórios vazios"
 
-#: builtin/ls-files.c:453
+#: builtin/ls-files.c:533
 msgid "show unmerged files in the output"
-msgstr "mostrar ficheiros com versões não conciliadas, na saída"
+msgstr "mostrar ficheiros não integrados na saída"
 
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:535
 msgid "show resolve-undo information"
-msgstr "mostrar informação de resolver-anular"
+msgstr "mostrar informação de resolver-desfazer"
 
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:537
 msgid "skip files matching pattern"
 msgstr "ignorar ficheiros que correspondam ao padrão"
 
-#: builtin/ls-files.c:460
+#: builtin/ls-files.c:540
 msgid "exclude patterns are read from <file>"
 msgstr "ler padrões de exclusão do <ficheiro>"
 
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:543
 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:465
+#: builtin/ls-files.c:545
 msgid "add the standard git exclusions"
 msgstr "incluir as exclusões standard do git"
 
-#: builtin/ls-files.c:468
+#: builtin/ls-files.c:548
 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:471
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "percorrer submódulos recursivamente"
+
+#: builtin/ls-files.c:553
 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:472
+#: builtin/ls-files.c:554
 msgid "tree-ish"
-msgstr "árvore"
+msgstr "árvore-etc"
 
-#: builtin/ls-files.c:473
+#: builtin/ls-files.c:555
 msgid "pretend that paths removed since <tree-ish> are still present"
-msgstr "fingir que os caminhos removidos desde <árvore> ainda estão presentes"
+msgstr ""
+"fingir que os caminhos removidos desde <árvore-etc> ainda estão presentes"
 
-#: builtin/ls-files.c:475
+#: builtin/ls-files.c:557
 msgid "show debugging data"
 msgstr "mostrar dados de depuração"
 
@@ -7774,7 +9118,7 @@ msgstr "mostrar a referência subjacente em adição ao objeto por ela apontado"
 
 #: builtin/ls-tree.c:28
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr "git ls-tree [<opções>] <árvore> [<caminho>...]"
+msgstr "git ls-tree [<opções>] <árvore-etc> [<caminho>...]"
 
 #: builtin/ls-tree.c:128
 msgid "only show trees"
@@ -7809,184 +9153,176 @@ 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)"
 
-#: builtin/merge.c:45
+#: builtin/merge.c:46
 msgid "git merge [<options>] [<commit>...]"
 msgstr "git merge [<opções>] [<commit>...]"
 
-#: builtin/merge.c:46
+#: builtin/merge.c:47
 msgid "git merge [<options>] <msg> HEAD <commit>"
 msgstr "git merge [<opções>] <msg> HEAD <commit>"
 
-#: builtin/merge.c:47
+#: builtin/merge.c:48
 msgid "git merge --abort"
 msgstr "git merge --abort"
 
-#: builtin/merge.c:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "a opção 'm' requer um valor"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
-msgstr "Estratégia de merge '%s' não encontrada.\n"
+msgstr "Estratégia de integração '%s' não encontrada.\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Estratégias disponíveis:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Estratégias personalizadas disponíveis:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
-msgstr "não apresentar um diffstat no final do merge"
+msgstr "não apresentar um diffstat ao fim da integração"
 
-#: builtin/merge.c:196 builtin/pull.c:126
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
-msgstr "mostrar um diffstat no final do merge"
+msgstr "mostrar um diffstat ao fim da integração"
 
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(sinónimo de --stat)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: builtin/merge.c:201 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 do merge"
+"adicionar (no máximo <n>) entradas do shortlog à mensagem de commit da "
+"integração"
 
-#: builtin/merge.c:202 builtin/pull.c:135
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
-msgstr "criar um único commit em vez de realizar um merge"
+msgstr "criar um único commit em vez de realizar uma integração"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
-msgstr "realizar um commit se o merge for bem sucedido (predefinição)"
+msgstr "realizar um commit se a integração for bem sucedida (predefinição)"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
-msgstr "editar a mensagem antes de realizar commit"
+msgstr "editar a mensagem antes de submeter"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "permitir avanço rápido (predefinição)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 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:213
-msgid "Verify that the named commit has a valid GPG signature"
+#: builtin/merge.c:215 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:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "estratégia"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
-msgstr "estratégia de merge a usar"
+msgstr "estratégia de integração a usar"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "opção=valor"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
-msgstr "opções para a estratégia de merge selecionada"
+msgstr "opções da estratégia de integração selecionada"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 msgid "merge commit message (for a non-fast-forward merge)"
-msgstr "mensagem de commit (de merge não suscetível a avanço rápido)"
+msgstr "mensagem de commit (de integração não suscetível a avanço rápido)"
 
-#: builtin/merge.c:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
-msgstr "abortar merge em curso"
+msgstr "abortar integração em curso"
+
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "permitir integração de históricos não relacionados"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "não foi possível executar o comando stash."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "falha ao executar o comando stash"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "nome de objeto inválido: %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "falha ao executar o comando read-tree"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (não há nada para esmagar)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Commit esmagado -- HEAD não atualizada\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Não foi possível escrever em '%s'"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "A escrever SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "A concluir SQUASH_MSG"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
-msgstr "Sem mensagem de merge -- HEAD não atualizada\n"
+msgstr "Nenhuma mensagem de integração -- HEAD não atualizada\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' não aponta para um commit"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Valor de branch.%s.mergeoptions incorreto: %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
-msgstr "A processar exclusivamente merge de duas cabeças."
+msgstr "Não se processa outra coisa senão incorporação de duas cabeças."
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Opção desconhecida de merge-recursive: -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "não foi possível escrever %s"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Não foi possível ler '%s'"
 
-#: builtin/merge.c:782
+#: builtin/merge.c:742
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
-"Commit do merge não realizado; use 'git commit' para concluir o merge.\n"
+"Commit de integração não realizado; use 'git commit' para concluir a "
+"integração.\n"
 
-#: builtin/merge.c:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7995,180 +9331,206 @@ msgid ""
 "Lines starting with '%c' will be ignored, and an empty message aborts\n"
 "the commit.\n"
 msgstr ""
-"Introduza uma mensagem de commit, explicando por que este merge é "
+"Introduza uma mensagem de commit, explicando por que esta integração é "
 "necessário,\n"
-"sobretudo se incorpora um ramo a montante atualizado, com um ramo tópico.\n"
+"sobretudo se incorpora um ramo a montante atualizado, num ramo tópico.\n"
 "\n"
-"Linhas começadas com '%c' são ignoradas, e uma mensagem vazia\n"
+"Linhas começadas com '%c' são ignoradas e uma mensagem vazia\n"
 "aborta o commit.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "Mensagem de commit vazia."
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Maravilhoso.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
-"Falha ao realizar merge automático; corrija os conflitos e faça commit do "
+"Falha ao realizar integração automática; corrija os conflitos e submeta o "
 "resultado.\n"
 
-#: builtin/merge.c:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' não é um commit"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "Nenhum ramo atual."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "Não há um remoto para o ramo atual."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 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:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
-msgstr "Nenhum ramo remoto seguido por %s de %s"
+msgstr "Nenhum ramo de monitorização remoto seguido por %s de %s"
+
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Valor '%s' incorreto no ambiente '%s'"
 
-#: builtin/merge.c:1080
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "não foi possível fechar '%s'"
 
-#: builtin/merge.c:1207
+#: builtin/merge.c:1061
+#, c-format
+msgid "not something we can merge in %s: %s"
+msgstr "não se pode integrar em %s: %s"
+
+#: builtin/merge.c:1095
+msgid "not something we can merge"
+msgstr "não se pode integrar"
+
+#: builtin/merge.c:1162
 msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr "Não há nenhum merge para abortar (MERGE_HEAD não presente)."
+msgstr "Não há nenhuma integração para se abortar (MERGE_HEAD não presente)."
 
-#: builtin/merge.c:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr ""
-"Merge não concluído (MERGE_HEAD presente).\n"
-"Faça commit das suas alterações antes de realizar merge."
+"Não concluiu a integração (MERGE_HEAD presente).\n"
+"Submeta as suas alterações antes de integrar."
 
-#: builtin/merge.c:1230
+#: 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 não concluído (CHERRY_PICK_HEAD presente).\n"
-"Faça commit das suas alterações antes de realizar merge."
+"Submeta as suas alterações antes de integrar."
 
-#: builtin/merge.c:1233
+#: builtin/merge.c:1188
 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:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Não é possível combinar --squash e --no-ff."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Nenhum commit especificado e merge.defaultToUpstream não definido."
 
-#: builtin/merge.c:1267
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "Esmagar um commit numa cabeça vazia ainda não é suportado"
 
-#: builtin/merge.c:1269
+#: builtin/merge.c:1224
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
-"Não faz sentido efetuar commit não suscetível a avanço rápido, numa cabeça "
+"Não faz sentido submeter de modo não suscetível a avanço rápido, numa cabeça "
 "vazia"
 
-#: builtin/merge.c:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
-msgstr "%s - não é algo suscetível a merge"
+msgstr "%s - não é algo se possa integrar"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 msgid "Can merge only exactly one commit into empty head"
-msgstr "Só é possível realizar merge de exatamente um commit numa cabeça vazia"
+msgstr "Só se pode integrar exatamente um commit numa cabeça vazia"
 
-#: builtin/merge.c:1332
+#: builtin/merge.c:1287
 #, 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:1335
+#: builtin/merge.c:1290
 #, 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:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "O commit %s não tem uma assinatura GPG."
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, 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:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "integração de históricos não relacionados recusada"
+
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Já está atualizado."
+
+#: builtin/merge.c:1377
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "A atualizar %s..%s\n"
 
-#: builtin/merge.c:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
-msgstr "A tentar merge mesmo trivial no interior do índice...\n"
+msgstr "A tentar integração mesmo trivial no interior do índice...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Não.\n"
 
-#: builtin/merge.c:1500
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Já está atualizado. Sim!"
+
+#: builtin/merge.c:1456
 msgid "Not possible to fast-forward, aborting."
 msgstr "Não é possível avançar rapidamente, a abortar."
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "A recuar a árvore ao seu estado original...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
-msgstr "A tentar a estratégia de merge %s...\n"
+msgstr "A tentar a estratégia de integração %s...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
-msgstr "Nenhuma estratégia de merge conseguiu processar o merge.\n"
+msgstr "Nenhuma estratégia de integração conseguiu processar a integração.\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
-msgstr "Falha ao realizar merge com a estratégia %s.\n"
+msgstr "Falha ao integrar com a estratégia %s.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, 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:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
-"O merge automático foi bem sucedido; interrompido antes de realizar commit "
-"como pretendido\n"
+"A integração automática foi bem sucedida; interrompida antes de submeter "
+"como solicitado\n"
 
 #: builtin/merge-base.c:29
 msgid "git merge-base [-a | --all] <commit> <commit>..."
@@ -8190,26 +9552,26 @@ 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 um único merge com n pontos"
+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 aonde foi que o <commit> divergiu usando o reflog da <referência>"
+"descobrir onde foi que o <commit> divergiu usando o reflog da <referência>"
 
 #: builtin/merge-file.c:8
 msgid ""
@@ -8225,7 +9587,7 @@ msgstr "enviar resultados para a saída padrão"
 
 #: builtin/merge-file.c:34
 msgid "use a diff3 based merge"
-msgstr "usar merge baseado em diff3"
+msgstr "usar integração baseada em diff3"
 
 #: builtin/merge-file.c:35
 msgid "for conflicts, use our version"
@@ -8251,6 +9613,37 @@ msgstr "não alertar sobre conflitos"
 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]"
@@ -8272,15 +9665,14 @@ msgid "git mv [<options>] <source>... <destination>"
 msgstr "git mv [<opções>] <origem>... <destino>"
 
 #: builtin/mv.c:70
-#, fuzzy, c-format
+#, c-format
 msgid "Directory %s is in index and no submodule?"
-msgstr "O diretório %s está no índice mas não no submódulo?"
+msgstr "O diretório %s está no índice porém nenhum submódulo?"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
-"Prepare as suas alterações em .gitmodules ou esconda-as (stash) para "
-"prosseguir"
+"Prepare as suas alterações em .gitmodules ou esconda-as para prosseguir"
 
 #: builtin/mv.c:90
 #, c-format
@@ -8295,109 +9687,109 @@ msgstr "forçar mover/mudar o nome mesmo que o destino exista"
 msgid "skip move/rename errors"
 msgstr "ignorar erros ao mover/mudar o nome"
 
-#: builtin/mv.c:152
+#: builtin/mv.c:155
 #, c-format
 msgid "destination '%s' is not a directory"
 msgstr "o destino '%s' não é um diretório"
 
-#: builtin/mv.c:163
+#: builtin/mv.c:166
 #, 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:167
+#: builtin/mv.c:170
 msgid "bad source"
 msgstr "origem incorreta"
 
-#: builtin/mv.c:170
+#: builtin/mv.c:173
 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:173
+#: builtin/mv.c:176
 msgid "cannot move directory over file"
 msgstr "não é possível mover um diretório para um ficheiro"
 
-#: builtin/mv.c:182
+#: builtin/mv.c:185
 msgid "source directory is empty"
 msgstr "o diretório de origem está vazio"
 
-#: builtin/mv.c:207
+#: builtin/mv.c:210
 msgid "not under version control"
 msgstr "não está no controlo de versões"
 
-#: builtin/mv.c:210
+#: builtin/mv.c:213
 msgid "destination exists"
 msgstr "o destino já existe"
 
-#: builtin/mv.c:218
+#: builtin/mv.c:221
 #, c-format
 msgid "overwriting '%s'"
 msgstr "a substituir '%s'"
 
-#: builtin/mv.c:221
+#: builtin/mv.c:224
 msgid "Cannot overwrite"
 msgstr "Não é possível substituir"
 
-#: builtin/mv.c:224
+#: builtin/mv.c:227
 msgid "multiple sources for the same target"
 msgstr "múltiplas origens para o mesmo destino"
 
-#: builtin/mv.c:226
+#: builtin/mv.c:229
 msgid "destination directory does not exist"
 msgstr "o diretório de destino não existe"
 
-#: builtin/mv.c:233
+#: builtin/mv.c:236
 #, c-format
 msgid "%s, source=%s, destination=%s"
 msgstr "%s, origem=%s, destino=%s"
 
-#: builtin/mv.c:254
+#: builtin/mv.c:257
 #, c-format
 msgid "Renaming %s to %s\n"
 msgstr "A mudar de nome de %s para %s\n"
 
-#: builtin/mv.c:257 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 "falha ao mudar o nome de '%s'"
 
-#: builtin/name-rev.c:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<opções>] <commit>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<opções>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<opções>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "imprimir apenas nomes (sem SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "usar apenas tags para designar commits"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "usar apenas referência que correspondam ao <padrão>"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 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:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "ler da entrada padrão"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "permitir imprimir nomes 'indefinidos' (predefinição)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "desreferenciar tags na entrada (uso interno)"
 
@@ -8505,12 +9897,16 @@ msgstr "git notes remove [<objeto>]"
 
 #: builtin/notes.c:84
 msgid "git notes prune [<options>]"
-msgstr "git notes prune [<optções>]"
+msgstr "git notes prune [<opções>]"
 
 #: 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 "Escreva/edite as notas do seguinte objeto:"
+
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -8525,88 +9921,99 @@ msgstr "não foi possível ler a saída do comando 'show'"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "falha ao concluir o comando 'show' sobre o objeto '%s'"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "não foi possível criar o ficheiro '%s'"
-
-#: builtin/notes.c:193
-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: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"
 
-#: builtin/notes.c:202
+#: builtin/notes.c:203
 msgid "unable to write note object"
 msgstr "não é possível escrever o objeto de nota"
 
-#: builtin/notes.c:204
+#: 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:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "não é possível ler '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "não foi possível abrir ou ler '%s'"
 
-#: 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:880 builtin/tag.c:456
+#: 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 "Falha ao resolver '%s' numa referência válida."
+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'."
+
+#: 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'."
+
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "linha de entrada malformada: '%s'."
 
-#: builtin/notes.c:256
+#: builtin/notes.c:316
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Falha ao ler o objeto '%s'."
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "falha ao copiar notas de '%s' para '%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 "Não é possível ler os dados da nota de um objeto não-blob '%s'."
+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:362 builtin/notes.c:417 builtin/notes.c:493
-#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649
-#: builtin/notes.c:945
+#: 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 "demasiados parâmetros"
 
-#: 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 "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:396 builtin/notes.c:559
+#: 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:399 builtin/notes.c:562
+#: 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:402 builtin/notes.c:565
+#: 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:405 builtin/notes.c:568
+#: builtin/notes.c:408 builtin/notes.c:571
 msgid "reuse specified note object"
 msgstr "reutilizar o objeto de nota especificado"
 
-#: builtin/notes.c:408 builtin/notes.c:571
+#: builtin/notes.c:411 builtin/notes.c:574
 msgid "allow storing empty note"
 msgstr "permitir guardar uma nota vazia"
 
-#: builtin/notes.c:409 builtin/notes.c:480
+#: builtin/notes.c:412 builtin/notes.c:483
 msgid "replace existing notes"
 msgstr "substituir notas existentes"
 
-#: builtin/notes.c:434
+#: builtin/notes.c:437
 #, c-format
 msgid ""
 "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8615,29 +10022,29 @@ msgstr ""
 "Não é possível adicionar notas. Notas do objeto %s encontradas. Use '-f' "
 "para substituí-las."
 
-#: 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 "A substituir as notas existentes do objeto %s\n"
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:885
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "A remover a nota do objeto %s\n"
 
-#: builtin/notes.c:481
+#: builtin/notes.c:484
 msgid "read objects from stdin"
 msgstr "ler objetos da entrada padrão"
 
-#: builtin/notes.c:483
+#: 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:501
+#: builtin/notes.c:504
 msgid "too few parameters"
 msgstr "parâmetros insuficientes"
 
-#: builtin/notes.c:522
+#: builtin/notes.c:525
 #, c-format
 msgid ""
 "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -8646,12 +10053,12 @@ msgstr ""
 "Não é possível copiar notas. Notas do objeto %s encontradas. Use '-f' para "
 "substituí-las."
 
-#: builtin/notes.c:534
+#: 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:586
+#: builtin/notes.c:589
 #, c-format
 msgid ""
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -8660,15 +10067,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:767
+#: builtin/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "falha ao eliminar a referência NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "falha ao eliminar a referência NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "falha ao remover a árvore de trabalho de 'git notes merge'"
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "falha ao ler referência NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+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:713
+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:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "falha ao resolver NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "falha ao finalizar integração de notas"
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "estratégia de integração de notas %s desconhecida"
+
+#: builtin/notes.c:771
 msgid "General options"
 msgstr "Opções gerais"
 
-#: builtin/notes.c:769
+#: builtin/notes.c:773
 msgid "Merge options"
-msgstr "Opções de merge"
+msgstr "Opções de integração"
 
-#: builtin/notes.c:771
+#: builtin/notes.c:775
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
 "cat_sort_uniq)"
@@ -8676,237 +10120,280 @@ msgstr ""
 "resolver conflitos nas notas usando a estratégia indicada (manual/ours/"
 "theirs/union/cat_sort_uniq)"
 
-#: builtin/notes.c:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
-msgstr "Efetuar commit de notas não integradas"
+msgstr "A submeter notas não integradas"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
-msgstr "concluir merge de notas, fazendo commit de notas não integradas"
+msgstr "concluir integração de notas, submetendo notas não integradas"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
-msgstr "Abortar resoluções de merge das notas"
+msgstr "A abortar resolução de integração das notas"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
-msgstr "abortar merge das notas"
+msgstr "abortar integração das notas"
+
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "não é possível misturar --commit, --abort ou -s/--strategy"
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "tem de especificar uma referência de notas para integrar"
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "-s/--strategy desconhecida: %s"
 
-#: builtin/notes.c:856
+#: builtin/notes.c:860
 #, c-format
-msgid "A notes merge into %s is already in-progress at %s"
-msgstr "Merge 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:883
+#: builtin/notes.c:863
+#, c-format
+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: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 ""
+"A integração automática de notas falhou. Corrija os conflitos em %s e "
+"submeta o resultado com 'git notes merge --commit' ou aborte a integração "
+"com 'git notes merge --abort'.\n"
+
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "O objeto %s não tem nenhuma nota\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 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:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "ler nome dos objetos da entrada padrão"
 
-#: builtin/notes.c:979
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "não remover, mostrar apenas"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "reportar notas podadas"
+
+#: builtin/notes.c:983
 msgid "notes-ref"
 msgstr "notes-ref"
 
-#: builtin/notes.c:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "usar notas de <notes-ref>"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: builtin/notes.c:1019
 #, 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 ""
 "git pack-objects [<opções>...] <nome-base> [< <lista-referências> | < <lista-"
 "objetos>]"
 
-#: 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 "erro ao compactar (%d)"
 
-#: builtin/pack-objects.c:772
+#: builtin/pack-objects.c:768
+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:781
 msgid "Writing objects"
 msgstr "A escrever objetos"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 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:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "A comprimir objetos"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "versão de índice %s não suportada"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "versão de índice '%s' incorreta"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "não mostrar medidor de progresso"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "mostrar medidor de progresso"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "mostrar medidor de progresso durante a fase de escrita de objetos"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2800
 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:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "versão[,offset]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 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:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "tamanho máximo de cada ficheiro de pacote gerado"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
-msgstr "ignorar objetos emprestados do arquivo de objetos alternate"
+msgstr "ignorar objetos emprestados do arquivo de objetos sobressalentes"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "ignorar objetos compactados"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "limitar a janela de compactação por objetos"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 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:2614
+#: builtin/pack-objects.c:2815
 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:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "reutilizar deltas existentes"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "reutilizar objetos existentes"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "usar objetos OFS_DELTA"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "usar threads ao procurar pela melhor correspondência delta"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "não criar um pacote vazio"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "ler argumentos de revisão da entrada padrão"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 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:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "incluir objetos alcançáveis a partir de qualquer referência"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "incluir objetos referenciados por entradas do reflog"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "incluir objetos referenciados pelo índice"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "gerar pacote para a saída padrão"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "incluir objetos tag que refiram objetos a compactar"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "manter objetos inalcançáveis"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "hora"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "empacotar objetos soltos inalcançáveis"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "descompactar objetos inalcançáveis mais recentes que <hora>"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "criar pacotes finos"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "criar pacotes adequados para obter em repositórios pouco profundos"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "ignorar pacotes que tenham um ficheiro .keep"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "nível de compactação do pacote"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "não esconder commits introduzidos por enxertos"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 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:2661
+#: builtin/pack-objects.c:2864
 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:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "A contar objetos"
 
@@ -8934,15 +10421,11 @@ msgstr "A remover objetos duplicados"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <hora>] [--] [<head>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "não remover, mostrar apenas"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "apresentar objetos eliminados"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "expirar objetos mais antigos que <hora>"
 
@@ -8950,54 +10433,45 @@ msgstr "expirar objetos mais antigos que <hora>"
 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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
-msgstr "Opções relacionadas com merge"
+msgstr "Opções relativas a integração"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
-msgstr "incorporar alterações por rebase em vez de merge"
+msgstr "incorporar alterações por rebase em vez de integrar"
 
-#: builtin/pull.c:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "permitir avanço rápido"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "verificar se o commit tem uma assinatura GPG válida"
+#: 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:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Opções relacionadas com obtenção de objetos"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
-msgstr "número de submódulos obtidos em paralelo"
+msgstr "número de submódulos puxados em paralelo"
 
-#: builtin/pull.c:275
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Valor inválido de pull.ff: %s"
 
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Não é possível efetuar pull com rebase: tem alterações não preparadas."
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Além disso, o índice contém alterações pendentes para commit."
-
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Não é possível efetuar pull com rebase: o índice contém alterações pendentes "
-"para commit."
-
-#: builtin/pull.c:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
@@ -9005,14 +10479,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:445
+#: 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 realizar merge de entre as referências "
-"que se acabaram obter."
+"Não há nenhum candidato com o qual integrar de entre as referências que se "
+"acabaram obter."
 
-#: builtin/pull.c:446
+#: builtin/pull.c:400
 msgid ""
 "Generally this means that you provided a wildcard refspec which had no\n"
 "matches on the remote end."
@@ -9020,64 +10494,86 @@ 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:449
+#: 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 ""
-"Solicitou pull do remoto '%s', mas não especificou um ramo.\n"
-"Uma vez que este não é o remoto configurado por omissão,\n"
-"deve especificar um ramo na linha de comandos."
+"Solicitou puxar o remoto '%s', mas não especificou um ramo.\n"
+"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:454
+#: 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:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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 realizar merge."
+msgstr "Especifique o ramo com o qual pretende integrar."
 
-#: builtin/pull.c:459 builtin/pull.c:474
+#: 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:469
+#: builtin/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "<remoto>"
+
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<ramo>"
+
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
 msgstr ""
-"Se deseja definir um ramo para este ramo seguir, pode fazê-lo com:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<ramo> %s\n"
+"Se deseja definir o ramo que deve ser seguido por este ramo, pode fazê-lo "
+"com:"
 
-#: builtin/pull.c:483
+#: 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 ""
-"A configuração indica para efetuar merge com a referência '%s'\n"
-"do remoto, mas esta ainda não foi obtida."
+"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:841
+#: builtin/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "ignorado --verify-signatures para rebase"
+
+#: 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: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:870
+#: 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"
@@ -9088,7 +10584,7 @@ msgstr ""
 "a avançar a árvore de trabalho a partir do\n"
 "commit %s."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9105,11 +10601,11 @@ msgstr ""
 "$ git reset --hard\n"
 "para recuperar."
 
-#: builtin/pull.c:890
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
-msgstr "Não é possível efetuar merge de múltiplos ramos numa cabeça vazia."
+msgstr "Não é possível integrar múltiplos ramos numa cabeça vazia."
 
-#: builtin/pull.c:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Não é possível efetuar rebase sobre múltiplos ramos."
 
@@ -9189,8 +10685,7 @@ msgstr ""
 #: builtin/push.c:183
 #, c-format
 msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr ""
-"O ramo atual %s tem múltiplos ramos a montante, recusando-se a publicar."
+msgstr "O ramo atual %s tem múltiplos ramos a montante, publicação recusada."
 
 #: builtin/push.c:186
 #, c-format
@@ -9273,12 +10768,12 @@ msgstr "A publicar em %s\n"
 msgid "failed to push some refs to '%s'"
 msgstr "falha ao publicar algumas referências em '%s'"
 
-#: builtin/push.c:365
+#: builtin/push.c:366
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repositório '%s' incorreto"
 
-#: 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 "
@@ -9300,103 +10795,115 @@ msgstr ""
 "\n"
 "    git push <nome>\n"
 
-#: builtin/push.c:381
+#: builtin/push.c:385
 msgid "--all and --tags are incompatible"
 msgstr "--all e --tags são incompatíveis"
 
-#: builtin/push.c:382
+#: builtin/push.c:386
 msgid "--all can't be combined with refspecs"
 msgstr "--all não pode ser combinado com especificadores de referências"
 
-#: builtin/push.c:387
+#: builtin/push.c:391
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror e --tags são incompatíveis"
 
-#: builtin/push.c:388
+#: builtin/push.c:392
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror não pode ser combinado com especificadores de referências"
 
-#: builtin/push.c:393
+#: builtin/push.c:397
 msgid "--all and --mirror are incompatible"
 msgstr "--all e --mirror são incompatíveis"
 
-#: builtin/push.c:505
+#: builtin/push.c:515
 msgid "repository"
 msgstr "repositório"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
+#: builtin/push.c:516 builtin/send-pack.c:161
 msgid "push all refs"
 msgstr "publicar todas as referências"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
+#: builtin/push.c:517 builtin/send-pack.c:163
 msgid "mirror all refs"
 msgstr "replicar todas as referências"
 
-#: builtin/push.c:509
+#: builtin/push.c:519
 msgid "delete refs"
 msgstr "eliminar referências"
 
-#: builtin/push.c:510
+#: builtin/push.c:520
 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:513 builtin/send-pack.c:164
+#: builtin/push.c:523 builtin/send-pack.c:164
 msgid "force updates"
 msgstr "forçar atualização"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
+#: builtin/push.c:525 builtin/send-pack.c:175
 msgid "refname>:<expect"
 msgstr "nome da referência>:<esperado"
 
-#: 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 "exigir que o antigo valor da referência tenha este valor"
 
-#: builtin/push.c:519
+#: builtin/push.c:529
 msgid "control recursive pushing of submodules"
 msgstr "controlar a publicação recursiva de submódulos"
 
-#: builtin/push.c:521 builtin/send-pack.c:169
+#: builtin/push.c:531 builtin/send-pack.c:169
 msgid "use thin pack"
 msgstr "usar pacote fino"
 
-#: 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 "programa receive pack"
 
-#: builtin/push.c:524
+#: builtin/push.c:534
 msgid "set upstream for git pull/status"
 msgstr "definir o ramo a montante usado com git pull/status"
 
-#: builtin/push.c:527
+#: builtin/push.c:537
 msgid "prune locally removed refs"
 msgstr "eliminar referências removidas localmente"
 
-#: builtin/push.c:529
+#: builtin/push.c:539
 msgid "bypass pre-push hook"
 msgstr "ignorar pre-push hook"
 
-#: builtin/push.c:530
+#: builtin/push.c:540
 msgid "push missing but relevant tags"
 msgstr "publicar tags perdidas mas relevantes"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
+#: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "assinar publicação com 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 "solicitar transação atómica no servidor remoto"
 
-#: builtin/push.c:549
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "específico do servidor"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "opção para transmitir"
+
+#: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete é incompatível com --all, --mirror e --tags"
 
-#: builtin/push.c:551
+#: builtin/push.c:562
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete não faz sentido sem uma referência"
 
+#: builtin/push.c:579
+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
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
@@ -9405,8 +10912,8 @@ msgid ""
 msgstr ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --"
 "prefix=<prefixo>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-"
-"sparse-checkout] [--index-output=<ficheiro>] (--empty | <árvore1> [<árvore2> "
-"[<árvore3>]])"
+"sparse-checkout] [--index-output=<ficheiro>] (--empty | <árvore-etc1> "
+"[<árvore-etc2> [<árvore-etc3>]])"
 
 #: builtin/read-tree.c:110
 msgid "write resulting index to <file>"
@@ -9418,21 +10925,21 @@ msgstr "apenas esvaziar o índice"
 
 #: builtin/read-tree.c:115
 msgid "Merging"
-msgstr "A realizar merge"
+msgstr "A integrar"
 
 #: builtin/read-tree.c:117
 msgid "perform a merge in addition to a read"
-msgstr "realizar um merge em adição a uma leitura"
+msgstr "realizar uma integração em adição a uma leitura"
 
 #: builtin/read-tree.c:119
 msgid "3-way merge if no file level merging required"
 msgstr ""
-"realizar merge com 3 pontos se o merge ao nível dos ficheiros não for "
-"necessário"
+"integrar com 3 pontos se a integração ao nível de ficheiros não for "
+"necessária"
 
 #: builtin/read-tree.c:121
 msgid "3-way merge in presence of adds and removes"
-msgstr "realizar merge com 3 ponto na presença de adições e remoções"
+msgstr "integrar com 3 ponto na presença de adições e remoções"
 
 #: builtin/read-tree.c:123
 msgid "same as -m, but discard unmerged entries"
@@ -9448,7 +10955,7 @@ msgstr "ler a árvore em <subdiretório>/ para o índice"
 
 #: builtin/read-tree.c:128
 msgid "update working tree with merge result"
-msgstr "atualizar a árvore de trabalho com os resultados do merge"
+msgstr "atualizar a árvore de trabalho com os resultados da integração"
 
 #: builtin/read-tree.c:130
 msgid "gitignore"
@@ -9460,7 +10967,7 @@ msgstr "permitir que os ficheiros explicitamente ignorados sejam substituídos"
 
 #: builtin/read-tree.c:134
 msgid "don't check the working tree after merging"
-msgstr "não verificar a árvore de trabalho depois de efetuar merge"
+msgstr "não verificar a árvore de trabalho depois de integrar"
 
 #: builtin/read-tree.c:135
 msgid "don't update the index or the work tree"
@@ -9474,6 +10981,68 @@ msgstr "ignorar a aplicação do filtro de extração esparsa"
 msgid "debug unpack-trees"
 msgstr "depurar unpack-trees"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <git-dir>"
+
+#: 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 ""
+"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: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 ""
+"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:1883
+msgid "quiet"
+msgstr "silencioso"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Deve especificar um diretório."
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9493,7 +11062,7 @@ msgid ""
 "git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <name> <url>"
 msgstr ""
-"git remote add [-t <ramo>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"git remote add [-t <ramo>] [-m <mestre>] [-f] [--tags | --no-tags] [--"
 "mirror=<fetch|push>] <nome> <url>"
 
 #: builtin/remote.c:14 builtin/remote.c:34
@@ -9620,12 +11189,12 @@ msgstr "especificar um ramo mestre não faz sentido com --mirror"
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "especificar ramos para seguir só faz sentido com fetch mirrors"
 
-#: builtin/remote.c:190 builtin/remote.c:633
+#: builtin/remote.c:190 builtin/remote.c:629
 #, c-format
 msgid "remote %s already exists."
 msgstr "o remoto %s já existe."
 
-#: 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' não é um nome de remoto válido"
@@ -9649,18 +11218,18 @@ msgstr "(correspondente)"
 msgid "(delete)"
 msgstr "(eliminado)"
 
-#: 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 "Remoto inexistente: %s"
 
-#: builtin/remote.c:643
+#: builtin/remote.c:639
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
 msgstr ""
 "Não foi possível mudar o nome da secção de configuração de '%s' para '%s'"
 
-#: builtin/remote.c:663
+#: builtin/remote.c:659
 #, c-format
 msgid ""
 "Not updating non-default fetch refspec\n"
@@ -9672,17 +11241,17 @@ msgstr ""
 "\t%s\n"
 "\tAtualize a configuração manualmente se necessário."
 
-#: builtin/remote.c:699
+#: builtin/remote.c:695
 #, c-format
 msgid "deleting '%s' failed"
 msgstr "falha ao eliminar '%s'"
 
-#: builtin/remote.c:733
+#: builtin/remote.c:729
 #, c-format
 msgid "creating '%s' failed"
 msgstr "falha ao criar '%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:"
@@ -9696,362 +11265,386 @@ msgstr[1] ""
 "Nota: alguns ramos fora da hierarquia refs/remotes/ não foram removidos;\n"
 "para os remover, use:"
 
-#: builtin/remote.c:810
+#: builtin/remote.c:806
 #, 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:911
+#: builtin/remote.c:907
 #, 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:914
+#: builtin/remote.c:910
 msgid " tracked"
 msgstr " seguido"
 
-#: builtin/remote.c:916
+#: builtin/remote.c:912
 msgid " stale (use 'git remote prune' to remove)"
 msgstr " obsoleto (use 'git remote prune' para remover)"
 
-#: 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 inválido; não é possível realizar rebase sobre mais do que "
-"um ramo"
+"branch.%s.merge inválido; não é possível rebasear sobre mais do que um ramo"
 
-#: builtin/remote.c:967
+#: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
-msgstr "realiza rebase interativo sobre %s do remoto"
+msgstr "rebaseia interativamente sobre %s do remoto"
 
-#: builtin/remote.c:971
+#: builtin/remote.c:964
 #, c-format
-msgid " merges with remote %s"
-msgstr " realiza merge com %s do remoto"
+msgid "rebases onto remote %s"
+msgstr "rebaseia sobre %s do remoto"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    e com o remoto"
+#: builtin/remote.c:967
+#, c-format
+msgid " merges with remote %s"
+msgstr " integra com %s do remoto"
 
-#: builtin/remote.c:974
+#: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
-msgstr "realiza merge com %s do remoto"
+msgstr "integra com %s do remoto"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   e com o remoto"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    e com o %s do remoto\n"
 
-#: builtin/remote.c:1021
+#: builtin/remote.c:1016
 msgid "create"
 msgstr "criado"
 
-#: builtin/remote.c:1024
+#: builtin/remote.c:1019
 msgid "delete"
 msgstr "eliminado"
 
-#: builtin/remote.c:1028
+#: builtin/remote.c:1023
 msgid "up to date"
 msgstr "atualizado"
 
-#: builtin/remote.c:1031
+#: builtin/remote.c:1026
 msgid "fast-forwardable"
 msgstr "pode ser avançado rapidamente"
 
-#: builtin/remote.c:1034
+#: builtin/remote.c:1029
 msgid "local out of date"
 msgstr "local desatualizado"
 
-#: builtin/remote.c:1041
+#: builtin/remote.c:1036
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
 msgstr "    %-*s força em %-*s (%s)"
 
-#: builtin/remote.c:1044
+#: builtin/remote.c:1039
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
 msgstr "    %-*s publica em %-*s (%s)"
 
-#: builtin/remote.c:1048
+#: builtin/remote.c:1043
 #, c-format
 msgid "    %-*s forces to %s"
 msgstr "    %-*s força em %s"
 
-#: builtin/remote.c:1051
+#: builtin/remote.c:1046
 #, c-format
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s publica em %s"
 
-#: builtin/remote.c:1119
+#: builtin/remote.c:1114
 msgid "do not query remotes"
 msgstr "não consultar remotos"
 
-#: builtin/remote.c:1146
+#: builtin/remote.c:1141
 #, c-format
 msgid "* remote %s"
 msgstr "* remoto %s"
 
-#: builtin/remote.c:1147
+#: builtin/remote.c:1142
 #, c-format
 msgid "  Fetch URL: %s"
 msgstr "  Obter    do URL: %s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(nenhum URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  Publicar no URL: %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Ramo HEAD: %s"
 
-#: builtin/remote.c:1167
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(não consultado)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(desconhecido)"
+
+#: builtin/remote.c:1164
 #, 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:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
 msgstr[0] "  Ramo remoto:%s"
 msgstr[1] "  Ramos remotos:%s"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr " (estado não consultado)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 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:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  Referências locais serão refletidas (mirror) por 'git push'"
 
-#: builtin/remote.c:1206
+#: 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] "  Referência local configurada para 'git push'%s:"
 msgstr[1] "  Referências locais configuradas para 'git push'%s:"
 
-#: builtin/remote.c:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "definir refs/remotes/<nome>/HEAD de acordo com o remoto"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "eliminar refs/remotes/<nome>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Não é possível determinar o remoto HEAD"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Múltiplos ramos HEAD remotos. Escolha um explicitamente com:"
 
-#: builtin/remote.c:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Não foi possível eliminar %s"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "Referência inválida: %s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Não foi possível configurar %s"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s ficará suspenso!"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s ficou suspenso!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "A eliminar %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [eliminaria] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [eliminado] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "eliminar remotos depois de obter"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Remoto inexistente '%s'"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "adicionar ramo"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "nenhum remoto especificado"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "consultar URLs de publicação em vez de URLs utilizados para obter"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "retornar todos os URLs"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "o remoto '%s' não tem nenhum URL configurado"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "manipular URLs de publicação"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "adicionar URL"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "eliminar URLs"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete não faz sentido"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Padrão de URL antigo inválido: %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "URL não encontrado: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 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:1595
+#: builtin/remote.c:1591
 msgid "be verbose; must be placed before a subcommand"
 msgstr "ser verboso; deve ser colocado antes de um subcomando"
 
+#: builtin/remote.c:1622
+#, 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:159
+#: builtin/repack.c:160
 msgid "pack everything in a single pack"
 msgstr "compactar tudo num único pacote"
 
-#: builtin/repack.c:161
+#: builtin/repack.c:162
 msgid "same as -a, and turn unreachable objects loose"
 msgstr "o mesmo que -a, e soltar objetos inalcançáveis"
 
-#: builtin/repack.c:164
+#: builtin/repack.c:165
 msgid "remove redundant packs, and run git-prune-packed"
 msgstr "remover pacotes redundantes e executar git-prune-packed"
 
-#: builtin/repack.c:166
+#: builtin/repack.c:167
 msgid "pass --no-reuse-delta to git-pack-objects"
 msgstr "passar --no-reuse-delta ao git-pack-objects"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "passar --no-reuse-object ao git-pack-objects"
 
-#: builtin/repack.c:170
+#: builtin/repack.c:171
 msgid "do not run git-update-server-info"
 msgstr "não executar git-update-server-info"
 
-#: builtin/repack.c:173
+#: builtin/repack.c:174
 msgid "pass --local to git-pack-objects"
 msgstr "passar --local ao git-pack-objects"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "escrever índice de mapa de bits"
 
-#: builtin/repack.c:176
+#: builtin/repack.c:177
 msgid "approxidate"
 msgstr "aproximar"
 
-#: builtin/repack.c:177
+#: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "com -A, não soltar mais objetos além destes"
 
-#: builtin/repack.c:179
+#: builtin/repack.c:180
+msgid "with -a, repack unreachable objects"
+msgstr "com -a, reempacotar objetos inalcançáveis"
+
+#: builtin/repack.c:182
 msgid "size of the window used for delta compression"
 msgstr "dimensão da janela usada em compressão de deltas"
 
-#: builtin/repack.c:180 builtin/repack.c:184
+#: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "bytes"
 
-#: builtin/repack.c:181
+#: builtin/repack.c:184
 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:183
+#: builtin/repack.c:186
 msgid "limits the maximum delta depth"
 msgstr "limitar a profundidade máxima de delta"
 
-#: builtin/repack.c:185
+#: builtin/repack.c:188
 msgid "maximum size of each packfile"
 msgstr "tamanho máximo de cada ficheiro de pacote"
 
-#: builtin/repack.c:187
+#: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr "reempacotar objetos em pacotes marcados com .keep"
 
-#: builtin/repack.c:197
+#: builtin/repack.c:200
 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:381
+#: builtin/repack.c:204
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable e -A são incompatíveis"
+
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
-msgid "removing '%s' failed"
+msgid "failed to remove '%s'"
 msgstr "falha ao remover '%s'"
 
 #: builtin/replace.c:19
@@ -10087,7 +11680,7 @@ msgstr "mergetag incorreta no commit '%s'"
 #: builtin/replace.c:357
 #, c-format
 msgid "malformed mergetag in commit '%s'"
-msgstr "mergetag malformada no commit '%s' "
+msgstr "mergetag malformada no commit '%s'"
 
 #: builtin/replace.c:368
 #, c-format
@@ -10105,12 +11698,12 @@ msgstr "o commit original '%s' tem uma assinatura gpg."
 
 #: builtin/replace.c:402
 msgid "the signature will be removed in the replacement commit!"
-msgstr "a assinatura será removida do commit substituto!"
+msgstr "a assinatura será removida do commit suplente!"
 
 #: builtin/replace.c:408
 #, c-format
 msgid "could not write replacement commit for: '%s'"
-msgstr "não foi possível escrever o commit substituto de: '%s'"
+msgstr "não foi possível escrever o commit suplente de: '%s'"
 
 #: builtin/replace.c:432
 msgid "list replace refs"
@@ -10156,12 +11749,12 @@ 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> [--] <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>...]"
-msgstr "git reset --patch [<árvore>] [--] [<caminhos>...]"
+msgstr "git reset --patch [<árvore-etc>] [--] [<caminhos>...]"
 
 #: builtin/reset.c:34
 msgid "mixed"
@@ -10204,7 +11797,7 @@ msgstr "HEAD está agora em %s"
 #: builtin/reset.c:183
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
-msgstr "Não é possível repor de modo %s durante um merge."
+msgstr "Não é possível repor de modo %s durante uma integração."
 
 #: builtin/reset.c:276
 msgid "be quiet, only report errors"
@@ -10276,27 +11869,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:350
+#: 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:386
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
 msgstr "git rev-parse --parseopt [<opções>] -- [<argumentos>...]"
 
-#: builtin/rev-parse.c:363
+#: builtin/rev-parse.c:391
 msgid "keep the `--` passed as an arg"
-msgstr "Conservar '--' passado como argumento"
+msgstr "conservar '--' passado como argumento"
 
-#: builtin/rev-parse.c:365
+#: builtin/rev-parse.c:393
 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:396
 msgid "output in stuck long form"
 msgstr "mostrar em formato fixo e longo"
 
-#: 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"
@@ -10313,7 +11906,7 @@ msgstr ""
 
 #: builtin/revert.c:22
 msgid "git revert [<options>] <commit-ish>..."
-msgstr "git revert [<opções>] <commit-ish>..."
+msgstr "git revert [<opções>] <commit-etc>..."
 
 #: builtin/revert.c:23
 msgid "git revert <subcommand>"
@@ -10321,7 +11914,7 @@ msgstr "git revert <subcommando>"
 
 #: builtin/revert.c:28
 msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr "git cherry-pick [<opções>] <commit-ish>..."
+msgstr "git cherry-pick [<opções>] <commit-etc>..."
 
 #: builtin/revert.c:29
 msgid "git cherry-pick <subcommand>"
@@ -10346,7 +11939,7 @@ msgstr "cancelar reversão ou cherry-pick"
 
 #: builtin/revert.c:83
 msgid "don't automatically commit"
-msgstr "não efetuar commit automaticamente"
+msgstr "não submeter automaticamente"
 
 #: builtin/revert.c:84
 msgid "edit the commit message"
@@ -10358,7 +11951,7 @@ msgstr "número de pai"
 
 #: builtin/revert.c:89
 msgid "merge strategy"
-msgstr "estratégia de merge"
+msgstr "estratégia de integração"
 
 #: builtin/revert.c:90
 msgid "option"
@@ -10366,33 +11959,29 @@ msgstr "opção"
 
 #: builtin/revert.c:91
 msgid "option for merge strategy"
-msgstr "opção de estratégia de merge"
+msgstr "opção de estratégia de integração"
 
-#: builtin/revert.c:104
+#: builtin/revert.c:100
 msgid "append commit name"
 msgstr "acrescentar nome do commit"
 
-#: builtin/revert.c:106
+#: builtin/revert.c:102
 msgid "preserve initially empty commits"
 msgstr "preservar commits inicialmente vazios"
 
-#: builtin/revert.c:107
+#: builtin/revert.c:103
 msgid "allow commits with empty messages"
 msgstr "permitir commits com mensagens vazias"
 
-#: builtin/revert.c:108
+#: builtin/revert.c:104
 msgid "keep redundant, empty commits"
 msgstr "manter commits redundantes e vazios"
 
-#: builtin/revert.c:112
-msgid "program error"
-msgstr "erro do programa"
-
-#: builtin/revert.c:197
+#: builtin/revert.c:192
 msgid "revert failed"
 msgstr "falha ao reverter"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
 msgstr "falha ao efetuar cherry-pick"
 
@@ -10420,7 +12009,7 @@ msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
 "\n"
-"(use 'rm -rf' se quer mesmo removê-lo, incluindo todo o seu histórico)"
+"(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
 
 #: builtin/rm.c:230
 msgid ""
@@ -10484,12 +12073,6 @@ msgstr "permitir remoção recursiva"
 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:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Prepare as suas alterações em .gitmodules ou esconda-as (stash) para "
-"prosseguir"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10570,71 +12153,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:375
+#, 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:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "nenhuma referência corresponde com %s"
+
+#: builtin/show-branch.c:639
 msgid "show remote-tracking and local branches"
-msgstr "mostrar os ramos remotos seguidos e os ramos locais"
+msgstr "mostrar os ramos de monitorização remotos e os ramos locais"
 
-#: builtin/show-branch.c:642
+#: builtin/show-branch.c:641
 msgid "show remote-tracking branches"
-msgstr "mostrar os ramos remotos seguidos"
+msgstr "mostrar os ramos de monitorização remotos"
 
-#: builtin/show-branch.c:644
+#: builtin/show-branch.c:643
 msgid "color '*!+-' corresponding to the branch"
 msgstr "colorir '*!+-' correspondendo ao ramo"
 
-#: builtin/show-branch.c:646
+#: builtin/show-branch.c:645
 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:647
 msgid "synonym to more=-1"
 msgstr "sinónimo de more=-1"
 
-#: builtin/show-branch.c:649
+#: builtin/show-branch.c:648
 msgid "suppress naming strings"
 msgstr "suprimir a cadeias de caracteres de nomes"
 
-#: builtin/show-branch.c:651
+#: builtin/show-branch.c:650
 msgid "include the current branch"
 msgstr "incluir o ramo atual"
 
-#: builtin/show-branch.c:653
+#: builtin/show-branch.c:652
 msgid "name commits with their object names"
 msgstr "designar commits pelos seus nomes de objeto"
 
-#: builtin/show-branch.c:655
+#: builtin/show-branch.c:654
 msgid "show possible merge bases"
-msgstr "mostrar possíveis bases de merge"
+msgstr "mostrar possíveis bases de integração"
 
-#: builtin/show-branch.c:657
+#: builtin/show-branch.c:656
 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:658
 msgid "show commits in topological order"
 msgstr "mostrar commits em ordem topológica"
 
-#: builtin/show-branch.c:662
+#: builtin/show-branch.c:661
 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:663
 msgid "show merges reachable from only one tip"
-msgstr "mostrar merges alcançáveis a partir duma única ponta"
+msgstr "mostrar integrações alcançáveis a partir duma única ponta"
 
-#: builtin/show-branch.c:666
+#: builtin/show-branch.c:665
 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:668
 msgid "<n>[,<base>]"
 msgstr "<n>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 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:703
+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:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "nenhum ramo fornecido e HEAD não é válida"
+
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "a opção --reflog precisa do nome de um ramo"
+
+#: 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] "apenas %d entrada podem ser mostradas neste momento."
+msgstr[1] "apenas %d entradas podem ser mostradas neste momento."
+
+#: builtin/show-branch.c:737
+#, c-format
+msgid "no such ref %s"
+msgstr "referência inexistente %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] "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:833
+#, c-format
+msgid "'%s' is not a valid ref."
+msgstr "'%s' não é uma referência válida."
+
+#: builtin/show-branch.c:836
+#, 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 | --"
@@ -10698,84 +12336,225 @@ 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:73 builtin/submodule--helper.c:161
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr "Referência inexistente: %s"
+
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Esperava-se um nome completo de uma referência, obteve-se %s"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "não é possível tirar um componente do URL '%s'"
+
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "âncora alternativa para caminhos relativos"
 
-#: builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<caminho>] [<caminho>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, 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:369
+#, 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:373
+#, 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:383
+#, 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:390
+#, 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:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Suprimir a saída ao inicializar um submódulo"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<caminho>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <caminho>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, 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:164
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "o submódulo '%s' não pode adicionar sobressalente: %s"
+
+#: builtin/submodule--helper.c:563
+#, 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:570
+#, 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:593
 msgid "where the new submodule will be cloned to"
 msgstr "sítio para aonde o novo submódulo será clonado"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "nome do novo submódulo"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url donde clonar o submódulos"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "profundidade de clones rasos"
 
-#: builtin/submodule--helper.c:182
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "forçar progresso da clonagem"
+
+#: builtin/submodule--helper.c:613
 msgid ""
 "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<caminho>] [--quiet] [--reference "
-"<repositório>] [--name <nome>] [--url <url>][--depth <profundidade>] [--] "
-"[<caminho>...]"
+"<repositório>] [--name <nome>] [--depth <depth>] --url <url> --path <caminho>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "não foi possível criar o diretório '%s'"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
-msgstr "falha ao clonar '%s' no caminho do submódulo '%s'"
+msgstr "falha ao clonar '%s' no caminho de submódulo '%s'"
 
-#: builtin/submodule--helper.c:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "não é possível abrir o ficheiro '%s'"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "não é possível fechar o ficheiro %s"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
-msgstr "não foi possível obter o o diretório do submódulo de '%s'"
+msgstr "não foi possível obter o diretório do submódulo de '%s'"
+
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "Caminho de submódulo '%s' não inicializado"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Pretendia usar 'update --init'?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "A ignorar submódulo %s não integrado"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "A ignorar submódulo '%s'"
+
+#: builtin/submodule--helper.c:913
+#, c-format
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Falha ao clonar '%s'. Nova tentativa agendada"
+
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr "Falha ao clonar '%s' pela segunda vez, abortado"
+
+#: builtin/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr "caminho para a árvore de trabalho"
+
+#: builtin/submodule--helper.c:948
+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:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout ou none"
+
+#: builtin/submodule--helper.c:956
+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:959
+msgid "parallel jobs"
+msgstr "trabalhos em paralelo"
+
+#: builtin/submodule--helper.c:961
+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:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+#: builtin/submodule--helper.c:962
+msgid "don't print cloning progress"
+msgstr "não imprimir progresso da clonagem"
+
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<caminho>] [<caminho>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "valor incorreto no parâmetro update"
+
+#: 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 ""
-"fatal: o subcomando submodule--helper deve ser invocado com um subcomando"
+"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:1100
+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:274
+#: builtin/submodule--helper.c:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "fatal: '%s' não é um subcomando de submodule--helper válido"
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "'%s' não é um subcomando válido de submodule--helper"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
@@ -10830,27 +12609,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <nome-da-tag>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "o nome da tag é demasiado longo: %.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "tag '%s' não encontrada."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Tag '%s' eliminada (era %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "não foi possível validar a tag '%s'"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -10863,7 +12637,7 @@ msgstr ""
 "  %s\n"
 "Linha começadas com '%c' serão ignoradas.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -10960,11 +12734,11 @@ msgstr "imprimir apenas tags que contenham o commit"
 
 #: builtin/tag.c:364
 msgid "print only tags that are merged"
-msgstr "imprimir apenas as tags que foram incorporadas"
+msgstr "imprimir apenas as tags que foram integradas"
 
 #: builtin/tag.c:365
 msgid "print only tags that are not merged"
-msgstr "imprimir apenas as tags que não foram incorporadas"
+msgstr "imprimir apenas as tags que não foram integradas"
 
 #: builtin/tag.c:370
 msgid "print only tags of the object"
@@ -10994,26 +12768,26 @@ msgstr "as opções --merged e --no-merged só são permitidas com -l"
 msgid "only one -F or -m option is allowed."
 msgstr "só é permitido um opção -F ou -m."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "demasiado parâmetros"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' não é um nome de tag válido."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "a tag '%s' já existe"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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"
 
@@ -11025,7 +12799,7 @@ msgstr "falha ao criar o diretório %s"
 #: builtin/update-index.c:85
 #, c-format
 msgid "failed to stat %s"
-msgstr "falha ao efetuar stat de %s"
+msgstr "falha ao invocar stat de %s"
 
 #: builtin/update-index.c:95
 #, c-format
@@ -11040,7 +12814,7 @@ msgstr "falha ao eliminar o ficheiro %s"
 #: builtin/update-index.c:110 builtin/update-index.c:212
 #, c-format
 msgid "failed to delete directory %s"
-msgstr "falha ao criar o diretório %s"
+msgstr "falha ao eliminar o diretório %s"
 
 #: builtin/update-index.c:133
 #, c-format
@@ -11083,143 +12857,151 @@ 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 [<opções>] [--] [<ficheiro>...]"
 
-#: builtin/update-index.c:930
+#: builtin/update-index.c:919
 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:922
 msgid "refresh: ignore submodules"
 msgstr "refrescar: ignorar submódulos"
 
-#: builtin/update-index.c:936
+#: builtin/update-index.c:925
 msgid "do not ignore new files"
 msgstr "não ignorar novos ficheiros"
 
-#: builtin/update-index.c:938
+#: builtin/update-index.c:927
 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:929
 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:931
 msgid "refresh even if index contains unmerged entries"
-msgstr "refrescar mesmo que o índice contenha entradas não incorporadas"
+msgstr "refrescar mesmo que o índice contenha entradas não integradas"
 
-#: builtin/update-index.c:945
+#: builtin/update-index.c:934
 msgid "refresh stat information"
 msgstr "refrescar informação de stat"
 
-#: builtin/update-index.c:949
+#: builtin/update-index.c:938
 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:942
 msgid "<mode>,<object>,<path>"
 msgstr "<modo>,<objeto>,<caminho>"
 
-#: builtin/update-index.c:954
+#: builtin/update-index.c:943
 msgid "add the specified entry to the index"
 msgstr "adicionar o elemento especificado ao índice"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
-
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "substituir o bit executável dos ficheiros listados"
-
-#: builtin/update-index.c:963
+#: builtin/update-index.c:952
 msgid "mark files as \"not changing\""
 msgstr "marcar ficheiros como \"não alterados\""
 
-#: builtin/update-index.c:966
+#: builtin/update-index.c:955
 msgid "clear assumed-unchanged bit"
 msgstr "limpar o bit assumed-unchanged"
 
-#: builtin/update-index.c:969
+#: builtin/update-index.c:958
 msgid "mark files as \"index-only\""
 msgstr "marcar ficheiros como \"únicos do índice\""
 
-#: builtin/update-index.c:972
+#: builtin/update-index.c:961
 msgid "clear skip-worktree bit"
 msgstr "limpar o bit ignorar-árvore-de-trabalho"
 
-#: builtin/update-index.c:975
+#: builtin/update-index.c:964
 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:966
 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:968
 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:970
 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:974
 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:978
 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:982
 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:986
 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:989
 msgid "report actions to standard output"
 msgstr "mostrar ações na saída padrão"
 
-#: builtin/update-index.c:1002
+#: builtin/update-index.c:991
 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:995
 msgid "write index in this format"
 msgstr "escrever o índice neste formato"
 
-#: builtin/update-index.c:1008
+#: builtin/update-index.c:997
 msgid "enable or disable split index"
 msgstr "ativar ou desativar a divisão do índice"
 
-#: builtin/update-index.c:1010
+#: builtin/update-index.c:999
 msgid "enable/disable untracked cache"
 msgstr "ativar ou desativar cache não controlada"
 
-#: builtin/update-index.c:1012
+#: builtin/update-index.c:1001
 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:1003
 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:1119
+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:1123
 msgid "Untracked cache disabled"
 msgstr "A cache não controlada está desativada"
 
-#: 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 está definida como false; remova ou altere-a se pretende "
+"mesmo ativar a cache não controlada"
+
+#: builtin/update-index.c:1135
 #, c-format
 msgid "Untracked cache enabled for '%s'"
 msgstr "A cache não controlada de '%s' foi ativada."
@@ -11245,8 +13027,7 @@ msgstr "eliminar a referência"
 #: builtin/update-ref.c:365
 msgid "update <refname> not the one it points to"
 msgstr ""
-"atualizar a referência <nome-da-referência>, e não a referência aponta por "
-"esta"
+"atualizar a referência <nome-da-referência>, não a referência que esta aponta"
 
 #: builtin/update-ref.c:366
 msgid "stdin has NUL-terminated arguments"
@@ -11272,7 +13053,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:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "imprimir informação do gpg em bruto"
 
@@ -11292,7 +13073,7 @@ msgstr "mostrar apenas estatísticas"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <tag>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "imprimir conteúdo da tag"
 
@@ -11301,80 +13082,111 @@ msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<opções>] <caminho> [<ramo>]"
 
 #: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<opções>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<opções>] <caminho>"
+
+#: builtin/worktree.c:18
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<opções>]"
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<opções>]"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <caminho>"
 
-#: builtin/worktree.c:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "A remover worktrees/%s: diretório inválido"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "A remover worktrees/%s: o ficheiro gitdir não existe"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "A remover worktrees/%s: não é possível ler o ficheiro gitdir (%s)"
 
-#: builtin/worktree.c:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "A remover worktrees/%s: ficheiro gitdir inválido"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr ""
 "A remover worktrees/%s: o ficheiro gitdir aponta para uma localização "
 "inexistente"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "falha ao remover: %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' já existe"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "não foi possível criar o diretório de '%s'"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "A preparar %s (identificador %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 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:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "criar um novo ramo"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "criar ou repor um ramo"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "destacar HEAD no commit indicado"
+#: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "povoar a nova árvore de trabalho"
+
+#: builtin/worktree.c:337
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "-b, -B e --detach são mutuamente exclusivos"
+
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "razão de trancar"
+
+#: builtin/worktree.c:482 builtin/worktree.c:515
+#, 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
+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
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "'%s' já está trancada, razão: %s"
+
+#: builtin/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "'%s' já está trancada"
 
-#: builtin/worktree.c:329
-msgid "-b, -B, and --detach are mutually exclusive"
-msgstr "-b, -B e --detach são mutuamente exclusivos"
+#: builtin/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "'%s' não está trancada"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
@@ -11392,7 +13204,41 @@ msgstr "escrever objeto árvore do subdiretório <prefixo>"
 msgid "only useful for debugging"
 msgstr "apenas útil para depuração"
 
-#: credential-cache--daemon.c:262
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<opções>] <dir>"
+
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "terminar depois de uma única troca de pedido/resposta"
+
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "sair imediatamente depois do anúncio inicial da referência"
+
+#: upload-pack.c:1032
+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:1034
+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"
 
@@ -11406,9 +13252,13 @@ msgstr ""
 "guias de conceitos. Consulte 'git help <comando>' ou 'git help <conceito>'\n"
 "para ler sobre um subcomando ou conceito específico."
 
-#: http.c:321
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Não é suportado delegar controlo com cURL < 7.22.0"
+
+#: http.c:351
 msgid "Public key pinning not supported with cURL < 7.44.0"
-msgstr ""
+msgstr "Não é suportado afixar chaves públicas com cURL < 7.44.0"
 
 #: common-cmds.h:9
 msgid "start a working area (see also: git help tutorial)"
@@ -11473,7 +13323,7 @@ msgstr "Criar um repositório Git vazio ou reinicializar um já existente"
 
 #: common-cmds.h:27
 msgid "Show commit logs"
-msgstr "Mostrado logs de commits"
+msgstr "Mostrar histórico de commits"
 
 #: common-cmds.h:28
 msgid "Join two or more development histories together"
@@ -11523,76 +13373,77 @@ 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"
 
-#: rerere.h:38
+#: rerere.h:40
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
 "atualizar o índice com resoluções de conflitos reutilizadas se possível"
 
-#: git-bisect.sh:55
+#: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
 msgstr "Deve começar por executar \"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 "Quer que o Git o faça por si [Y/n]? "
 
-#: git-bisect.sh:122
+#: git-bisect.sh:121
 #, sh-format
 msgid "unrecognised option: '$arg'"
 msgstr "opção não reconhecida: '$arg'"
 
-#: git-bisect.sh:126
+#: git-bisect.sh:125
 #, sh-format
 msgid "'$arg' does not appear to be a valid revision"
 msgstr "'$arg' não parecer ser uma revisão válida"
 
-#: git-bisect.sh:155
+#: git-bisect.sh:154
 msgid "Bad HEAD - I need a HEAD"
 msgstr "HEAD incorreta - é necessário uma HEAD"
 
-#: git-bisect.sh:168
+#: git-bisect.sh:167
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
 msgstr ""
 "Falha ao extrair '$start_head'. Tente 'git bisect reset <ramo-válido>'."
 
-#: git-bisect.sh:178
+#: git-bisect.sh:177
 msgid "won't bisect on cg-seek'ed tree"
-msgstr "não é possível bisseccionar numa árvore \"cg-seek'ed\""
+msgstr "não é possível bissetar numa árvore \"cg-seek'ed\""
 
-#: git-bisect.sh:182
+#: git-bisect.sh:181
 msgid "Bad HEAD - strange symbolic ref"
 msgstr "HEAD incorreta - referência simbólica desconhecida"
 
-#: git-bisect.sh:234
+#: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Argumento de bisect_write incorreto: $state"
 
-#: git-bisect.sh:263
+#: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Revisão incorreta na entrada: $arg"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Invoque 'bisect_state' com pelo menos um argumento."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Revisão incorreta na entrada: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
@@ -11607,7 +13458,7 @@ msgstr "'git bisect $TERM_BAD' só leva um argumento."
 #: git-bisect.sh:322
 #, sh-format
 msgid "Warning: bisecting only with a $TERM_BAD commit."
-msgstr "Aviso: a bisseccionar só com um commit $TERM_BAD."
+msgstr "Aviso: a bissetar só com um commit $TERM_BAD."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
@@ -11638,7 +13489,7 @@ msgstr ""
 
 #: git-bisect.sh:414 git-bisect.sh:546
 msgid "We are not bisecting."
-msgstr "Não estamos a bisseccionar."
+msgstr "Não se está a bissetar."
 
 #: git-bisect.sh:421
 #, sh-format
@@ -11678,12 +13529,12 @@ msgid ""
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
-"falha bisseccionar:\n"
+"falha ao bissetar:\n"
 "código de saída $res de '$command' é < 0 ou >= 128"
 
 #: git-bisect.sh:525
 msgid "bisect run cannot continue any more"
-msgstr "não é possível continuar a bisseccionar"
+msgstr "não é possível continuar a bissetar"
 
 #: git-bisect.sh:531
 #, sh-format
@@ -11691,7 +13542,7 @@ msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr ""
-"falha ao bisseccionar:\n"
+"falha ao bissetar:\n"
 "'bisect_state $state' retornou com o código de erro $res"
 
 #: git-bisect.sh:538
@@ -11721,7 +13572,7 @@ msgstr "não é possível alterar o significado do termo '$term'"
 #, sh-format
 msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
 msgstr ""
-"Comando inválido: bissecção em curso usando os termo $TERM_BAD/$TERM_GOOD."
+"Comando inválido: está-se a bissetar usando os termos $TERM_BAD/$TERM_GOOD."
 
 #: git-bisect.sh:636
 msgid "no terms defined"
@@ -11736,7 +13587,47 @@ msgstr ""
 "argumento inválido $arg de 'git bisect terms'.\n"
 "Opções suportadas: --term-good|--term-old e --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 ""
+"Erro: As suas alterações locais nos seguintes ficheiros seriam substituídas "
+"ao integrar"
+
+#: git-merge-octopus.sh:61
+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 se deviria estar a fazer um polvo."
+
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Não é possível encontrar commit comum com $pretty_name"
+
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Já está atualizado com $pretty_name"
+
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "A avançar rapidamente para: $pretty_name"
+
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "A tentar integração simples com $pretty_name"
+
+#: git-merge-octopus.sh:102
+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
 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"
@@ -11748,63 +13639,59 @@ msgstr ""
 "Para extrair o ramo original e interromper o rebase, execute \"git rebase --"
 "abort\"."
 
-#: git-rebase.sh:165
+#: git-rebase.sh:156 git-rebase.sh:395
+#, 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 "Autostash aplicado."
+msgstr "Pilha automática (autostash) aplicada."
 
-#: git-rebase.sh:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Não é possível guardar $stash_sha1"
 
-#: git-rebase.sh:169
+#: 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 autostash.\n"
-"As suas alterações estão guardadas no stash.\n"
+"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:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "Rebase recusado pelo hook pre-rebase."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 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:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "A opção --exec deve ser usada com a opção --interactive"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Rebase não está em curso?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 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:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Não é possível ler HEAD"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
-"Deve editar todos os conflitos do merge e\n"
-"marcá-los como resolvidos usando git add"
+"Deve editar todos os conflitos da integração\n"
+"marcá-los como resolvidos usando git add"
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Não foi possível voltar para $head_name"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11825,98 +13712,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:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "$upstream_name a montante inválido"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
-msgstr "$onto_name: há mais do que uma base de merge"
+msgstr "$onto_name: há mais do que uma base de integração"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
-msgstr "$onto_name: não há nenhuma base de merge"
+msgstr "$onto_name: não há nenhuma base de integração"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, 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:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "fatal: ramo inexistente: $branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
-msgstr "Não é possível efetuar autostash"
+msgstr "Não é possível empilhar automaticamente (autostash)"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
-msgstr "Autostash criado: $stash_abbrev"
+msgstr "Pilha automática (autostash) criada: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
-msgstr "Faça commit ou stash delas."
+msgstr "Submeta ou esconda-as."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "O ramo atual $branch_name está atualizado."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, 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:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Alterações de $mb para $onto:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 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:623
+#: git-rebase.sh:620
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
 msgstr "$branch_name avançado rapidamente para $onto_name."
 
-#: git-stash.sh:51
+#: git-stash.sh:50
 msgid "git stash clear with parameters is unimplemented"
 msgstr "não está implementado git stash clear com parâmetros"
 
-#: git-stash.sh:74
+#: git-stash.sh:73
 msgid "You do not have the initial commit yet"
 msgstr "O commit inicial ainda não existe"
 
-#: git-stash.sh:89
+#: git-stash.sh:88
 msgid "Cannot save the current index state"
 msgstr "Não é possível guardar o estado atual do índice"
 
-#: git-stash.sh:124 git-stash.sh:137
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Não é possível guardar os ficheiros não controlados"
+
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Não é possível guardar o estado atual da árvore de trabalho"
 
-#: git-stash.sh:141
+#: git-stash.sh:140
 msgid "No changes selected"
 msgstr "Nenhuma alteração selecionada"
 
-#: git-stash.sh:144
+#: git-stash.sh:143
 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:157
+#: git-stash.sh:156
 msgid "Cannot record working tree state"
 msgstr "Não é possível gravar o estado da árvore de trabalho"
 
-#: git-stash.sh:189
+#: git-stash.sh:188
 #, sh-format
 msgid "Cannot update $ref_stash with $w_commit"
 msgstr "Não é possível atualizar $ref_stash com $w_commit"
@@ -11931,7 +13822,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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -11940,374 +13831,1144 @@ msgstr ""
 "erro: opção desconhecida de 'stash save': $option\n"
 "      Para fornecer uma mensagem, use 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 ""
+"Não é possível usar --patch e --include-untracked ou --all ao mesmo tempo"
+
+#: git-stash.sh:259
 msgid "No local changes to save"
 msgstr "Não há alterações locais para guardar"
 
-#: git-stash.sh:264
+#: git-stash.sh:263
 msgid "Cannot initialize stash"
-msgstr "Não é possível inicializar o stash"
+msgstr "Não é possível inicializar a pilha"
 
-#: git-stash.sh:268
+#: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Não é possível guardar o estado atual"
 
-#: git-stash.sh:286
+#: git-stash.sh:268
+#, 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
 msgid "Cannot remove worktree changes"
 msgstr "Não é possível remover as alterações da árvore de trabalho"
 
-#: git-stash.sh:405
+#: git-stash.sh:403
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "opção desconhecido: $opt"
 
-#: git-stash.sh:415
+#: git-stash.sh:416
 msgid "No stash found."
-msgstr "Nenhum stash encontrado."
+msgstr "Nenhuma pilha encontrada."
 
-#: git-stash.sh:422
+#: git-stash.sh:423
 #, sh-format
 msgid "Too many revisions specified: $REV"
 msgstr "Demasiadas revisões especificadas: $REV"
 
-#: git-stash.sh:428
+#: git-stash.sh:438
 #, sh-format
 msgid "$reference is not a valid reference"
 msgstr "$reference não é uma referência válida"
 
-#: git-stash.sh:456
+#: git-stash.sh:466
 #, sh-format
 msgid "'$args' is not a stash-like commit"
-msgstr "'$args' não é um commit do tipo stash"
+msgstr "'$args' não é um commit semelhante a pilha"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
-msgstr "'$args' não é uma referência de stash"
+msgstr "'$args' não é uma referência de pilha"
 
-#: git-stash.sh:475
+#: git-stash.sh:485
 msgid "unable to refresh index"
 msgstr "não foi possível refrescar o índice"
 
-#: git-stash.sh:479
+#: git-stash.sh:489
 msgid "Cannot apply a stash in the middle of a merge"
-msgstr "Não é possível aplicar um stash durante um merge"
+msgstr "Não é possível aplicar uma pilha durante uma integração"
 
-#: git-stash.sh:487
+#: git-stash.sh:497
 msgid "Conflicts in index. Try without --index."
 msgstr "Conflitos no índice. Tente sem --index."
 
-#: git-stash.sh:489
+#: git-stash.sh:499
 msgid "Could not save index tree"
 msgstr "Não foi possível guardar árvore do índice"
 
-#: git-stash.sh:523
+#: git-stash.sh:508
+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:533
 msgid "Cannot unstage modified files"
-msgstr "Não é possível retirar os ficheiros modificado do índice"
+msgstr "Não é possível despreparar os ficheiros modificado"
 
-#: git-stash.sh:538
+#: git-stash.sh:548
 msgid "Index was not unstashed."
 msgstr "O índice não foi reposto."
 
-#: git-stash.sh:561
+#: git-stash.sh:562
+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:571
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "A descartar ${REV} ($s)"
 
-#: git-stash.sh:562
+#: git-stash.sh:572
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
-msgstr "${REV}: Não foi possível descartar elemento do stash"
+msgstr "${REV}: Não foi possível descartar elemento da pilha"
 
-#: git-stash.sh:570
+#: git-stash.sh:580
 msgid "No branch name specified"
 msgstr "Nenhum nome de ramo especificado"
 
-#: git-stash.sh:642
+#: git-stash.sh:652
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(Para os restaurar execute \"git stash apply\")"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "não é possível tirar um componente do URL '$remoteurl'"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 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:291
+#: git-submodule.sh:194
 #, 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 ./|../"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "'$sm_path' já existe no índice"
+
+#: git-submodule.sh:215
+#, 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 ""
+"O seguinte caminho foi ignorado por um ficheiro .gitignore:\n"
+"$sm_path\n"
+"Use -f se pretende mesmo adicioná-lo."
+
+#: git-submodule.sh:233
+#, 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:235
+#, 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:243
+#, 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:245
+#, 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 ""
+"Se quer reutilizar este diretório git local em vez de clonar de novo de\n"
+"  $realrepo\n"
+"use a opção '--force'. Se o diretório git local não é o repo correto\n"
+"ou não tem a certeza o que isto significa escolha outro nome com a opção '--"
+"name'."
+
+#: git-submodule.sh:251
+#, 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:263
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Não foi possível extrair o submódulo '$sm_path'"
+
+#: git-submodule.sh:268
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "Falha ao adicionar o submódulo '$sm_path'"
+
+#: git-submodule.sh:277
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "Falha ao registar o submódulo '$sm_path'"
+
+#: git-submodule.sh:324
+#, sh-format
+msgid "Entering '$displaypath'"
+msgstr "A entrar em '$displaypath'"
+
+#: git-submodule.sh:344
+#, 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:415
+#, sh-format
+msgid "pathspec and --all are incompatible"
+msgstr "especificador de caminho e --all são incompatíveis"
+
+#: git-submodule.sh:420
+#, 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: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 ""
+"A árvore de trabalho do submódulo '$displaypath' contem um diretório .git\n"
+"(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
+
+#: git-submodule.sh:448
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr ""
+"A árvore de trabalho do submódulo '$displaypath' contém alterações locais; "
+"use '-f' para as descartar"
+
+#: git-submodule.sh:451
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "Diretório '$displaypath' limpo"
+
+#: git-submodule.sh:452
+#, 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:455
+#, 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:464
+#, 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:617
+#, 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:627
+#, 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:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr ""
+"Não foi possível encontrar a revisão atual ${remote_name}/${branch} no "
+"caminho de submódulo '$sm_path'"
+
+#: git-submodule.sh:650
+#, 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:656
+#, sh-format
+msgid ""
+"Fetched in submodule path '$displaypath', but it did not contain $sha1. "
+"Direct fetching of that commit failed."
+msgstr ""
+"Obteve-se no caminho de submódulo '$displaypath', mas não continha $sha1. "
+"Falha ao obter aquele commit diretamente."
+
+#: git-submodule.sh:663
+#, 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:664
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Caminho de submódulo '$displaypath': '$sha1' extraído"
+
+#: git-submodule.sh:668
+#, 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:669
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Caminho de submódulo '$displaypath': rebase concluído em '$sha1'"
+
+#: git-submodule.sh:674
+#, 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:675
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "Caminho de submódulo '$displaypath': integrado em '$sha1'"
+
+#: git-submodule.sh:680
+#, 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:681
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Caminho de submódulo '$displaypath': '$command $sha1'"
+
+#: git-submodule.sh:712
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "Falha ao percorrer o caminho de submódulo '$displaypath'"
+
+#: git-submodule.sh:820
+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:872
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "modo inesperado $mod_dst"
+
+#: git-submodule.sh:892
+#, 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:895
+#, 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:898
+#, 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:1045
+#, 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:1112
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "A sincronizar o URL do submódulo '$displaypath'"
+
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "Consulte git-${cmd}(1) para obter mais detalhes."
+
+#: git-rebase--interactive.sh:131
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "A rebasear ($new_count/$total)"
+
+#: 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"
+msgstr ""
+"\n"
+"Comandos:\n"
+" p, pick = usar commit\n"
+" r, reword = usar commit, mas editar a mensagem de commit\n"
+" e, edit = usar commit, mas parar para emendar\n"
+" s, squash = usar commit, mas fundir com o commit anterior\n"
+" f, fixup = como \"squash\", mas descartar a mensagem deste commit\n"
+" x, exec = executar o comando (o resto da linha) usando a shell\n"
+" d, drop = remover commit\n"
+"\n"
+"Estas linhas pode ser reordenadas; são executadas de cima para baixo.\n"
+
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"Não remover nenhum linha. Use 'drop' explicitamente para remover um commit.\n"
+
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Se remover uma linha daqui AQUELE COMMIT SERÁ PERDIDO.\n"
+
+#: git-rebase--interactive.sh:202
+#, 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 ""
+"Pode emendar o commit agora, com\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Assim que estiver satisfeito com as alterações, execute\n"
+"\n"
+"\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:227
+#, 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
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Nome de commit inválido: $sha1"
+
+#: git-rebase--interactive.sh:308
+msgid "Cannot write current commit's replacement sha1"
+msgstr "Não é possível escrever o sha1 substituto do commit"
+
+#: git-rebase--interactive.sh:360
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Avanço-rápido para $sha1"
+
+#: git-rebase--interactive.sh:362
 #, sh-format
-msgid "'$sm_path' already exists in the index"
-msgstr "'$sm_path' já existe no índice"
+msgid "Cannot fast-forward to $sha1"
+msgstr "Não é possível avançar rapidamente para $sha1"
 
-#: git-submodule.sh:312
+#: git-rebase--interactive.sh:371
 #, 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 ""
-"O seguinte caminho foi ignorado por um ficheiro .gitignore:\n"
-"$sm_path\n"
-"Use -f se pretende mesmo adicioná-lo."
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Não é possível mover HEAD para $first_parent"
 
-#: git-submodule.sh:330
+#: git-rebase--interactive.sh:376
 #, sh-format
-msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "A adicionar repositório existente em '$sm_path' ao índice"
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Recusa-se a esmagar uma integração: $sha1"
 
-#: git-submodule.sh:332
+#: git-rebase--interactive.sh:390
 #, 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"
+msgid "Error redoing merge $sha1"
+msgstr "Erro ao refazer integração $sha1"
 
-#: git-submodule.sh:340
+#: git-rebase--interactive.sh:398
 #, 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:"
+msgid "Could not pick $sha1"
+msgstr "Não foi possível apanhar $sha1"
 
-#: git-submodule.sh:342
+#: git-rebase--interactive.sh:407
 #, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
-"Se deseja reutilizar este diretório git local em vez de clonar de novo de"
+msgid "This is the commit message #${n}:"
+msgstr "Esta é a mensagem de commit nº${n}:"
 
-#: git-submodule.sh:344
+#: git-rebase--interactive.sh:412
 #, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"use a opção '--force'. Se o diretório git local não é o repositório correto"
+msgid "The commit message #${n} will be skipped:"
+msgstr "A mensagem de commit nº${n} será ignorada:"
 
-#: git-submodule.sh:345
+#: git-rebase--interactive.sh:423
 #, sh-format
-msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-"ou não tem a certeza do que isto significa, escolha outro nome com a opção "
-"'--name'."
+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-submodule.sh:347
+#: git-rebase--interactive.sh:431
 #, sh-format
-msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr "A reativar o diretório git local do submódulo '$sm_name'."
+msgid "Cannot write $fixup_msg"
+msgstr "Não é possível escrever $fixup_msg"
 
-#: git-submodule.sh:359
+#: git-rebase--interactive.sh:434
+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
 #, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Não foi possível extrair o submódulo '$sm_path'"
+msgid "Could not apply $sha1... $rest"
+msgstr "Não foi possível aplicar $sha1... $rest"
 
-#: git-submodule.sh:364
+#: git-rebase--interactive.sh:549
 #, sh-format
-msgid "Failed to add submodule '$sm_path'"
-msgstr "Falha ao adicionar o submódulo '$sm_path'"
+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 ""
+"Não foi possível emendar o commit depois de apanhar com sucesso $sha1... "
+"$rest\n"
+"Deve-se provavelmente a uma mensagem de commit vazia ou o pre-commit hook "
+"falhou.\n"
+"Se o pre-commit hook falhou, pode precisar de resolver o problema ante de "
+"poder\n"
+"reformular a mensagem do commit."
+
+#: git-rebase--interactive.sh:564
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Parou em $sha1_abbrev... $rest"
 
-#: git-submodule.sh:373
+#: git-rebase--interactive.sh:579
 #, sh-format
-msgid "Failed to register submodule '$sm_path'"
-msgstr "Falha ao registar o submódulo '$sm_path'"
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "Não é possível efetuar '$squash_style' sem um commit anterior"
 
-#: git-submodule.sh:417
+#: git-rebase--interactive.sh:621
 #, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "A entrar em '$prefix$displaypath'"
+msgid "Executing: $rest"
+msgstr "A executar: $rest"
 
-#: git-submodule.sh:437
+#: git-rebase--interactive.sh:629
 #, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
+msgid "Execution failed: $rest"
+msgstr "Falha ao executar: $rest"
+
+#: git-rebase--interactive.sh:631
+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
+msgid ""
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"Interrompido em '$prefix$displaypath'; o script retornou um valor diferente "
-"de zero."
+"Pode corrigir o problema e executar\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-submodule.sh:483
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:646
 #, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr "Nenhum URL encontrado no submódulo '$displaypath' em .gitmodules"
+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 ""
+"Executado com sucesso: $rest\n"
+"mas deixou alterações no índice e/ou na árvore de trabalho\n"
+"Submeta ou esconda as alterações e execute\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-submodule.sh:492
+#: git-rebase--interactive.sh:657
 #, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Falha ao registar o URL do submódulo '$displaypath'"
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Comando desconhecido: $command $sha1 $rest"
 
-#: git-submodule.sh:494
-#, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "Submódulo '$name' ($url) registado em '$displaypath'"
+#: git-rebase--interactive.sh:658
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Corrija-o usando 'git rebase --edit-todo'."
 
-#: git-submodule.sh:511
+#: git-rebase--interactive.sh:693
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr "Falha ao registar o modo de atualização do submódulo em '$displaypath'"
+msgid "Successfully rebased and updated $head_name."
+msgstr "$head_name rebaseado e atualizado com sucesso."
 
-#: git-submodule.sh:549
-#, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Use '.' se pretende mesmo anular a inicialização todos os submódulos"
+#: git-rebase--interactive.sh:740
+msgid "Could not skip unnecessary pick commands"
+msgstr "Não foi possível saltar comandos pick desnecessários"
 
-#: git-submodule.sh:566
+#: git-rebase--interactive.sh:898
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
 msgstr ""
-"A árvore de trabalho do submódulo em '$displaypath' contém um diretório .git"
+"Aviso: falta o SHA-1 ou a seguinte linha não tem um commit:\n"
+" - $line"
 
-#: git-submodule.sh:567
+#: git-rebase--interactive.sh:931
 #, sh-format
 msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
 msgstr ""
-"(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
+"Aviso: o comando não é reconhecido na seguinte linha:\n"
+" - $line"
 
-#: git-submodule.sh:573
-#, sh-format
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "não foi possível destacar HEAD"
+
+#: git-rebase--interactive.sh:1008
 msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
-"A árvore de trabalho do submódulo em '$displaypath' contém alterações "
-"locais; use '-f' para as descartar"
+"Aviso: alguns commits podem ter sido descartados acidentalmente.\n"
+"Commits descartados (mais novo para o mais velho):"
 
-#: git-submodule.sh:576
-#, sh-format
-msgid "Cleared directory '$displaypath'"
-msgstr "Diretório '$displaypath' limpo"
+#: 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."
+msgstr ""
+"Para evitar esta mensagem, use \"drop\" para remover um commit "
+"explicitamente.\n"
+"\n"
+"Use 'git config rebase.missingCommitsCheck' para mudar o nível de avisos.\n"
+"O comportamentos possíveis são: ignore, warn, error."
 
-#: git-submodule.sh:577
+#: git-rebase--interactive.sh:1027
 #, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
 msgstr ""
-"Não foi possível remover a árvore de trabalho do submódulo em '$displaypath'"
+"Definição $check_level desconhecida da opção rebase.missingCommitsCheck. "
+"Ignorado."
 
-#: git-submodule.sh:580
-#, 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-rebase--interactive.sh:1044
+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
+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
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Não foi possível remover CHERRY_PICK_HEAD"
 
-#: git-submodule.sh:589
+#: git-rebase--interactive.sh:1074
 #, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+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 ""
-"O registo do submódulo '$name' ($url) foi removido do caminho '$displaypath'"
+"Tem alterações preparadas na árvore de trabalho.\n"
+"Se tenciona esmagar estas alterações\n"
+"no commit anterior, execute:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Se tenciona pô-las num novo commit, execute:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"Em ambos os casos, quando estiver pronto, continue com:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: git-submodule.sh:723
-#, sh-format
+#: git-rebase--interactive.sh:1091
+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
 msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
 msgstr ""
-"Submódulo em '$displaypath' não inicializado\n"
-"Talvez queira usar 'update --init'?"
+"Tem alterações por submeter na árvore de trabalho. Submeta-as primeiro\n"
+"e execute 'git rebase --continue' de novo."
 
-#: git-submodule.sh:736
-#, sh-format
-msgid "Unable to find current revision in submodule path '$displaypath'"
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+msgid "Could not commit staged changes."
+msgstr "Não foi possível submeter as alterações preparadas."
+
+#: 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"
 msgstr ""
-"Não foi possível encontrar a revisão atual no submódulo em '$displaypath'"
+"\n"
+"Está a editar o ficheiro de tarefa de um rebase interativo em curso.\n"
+"Para continuar o rebase depois de editar, execute:\n"
+"    git rebase --continue\n"
+"\n"
 
-#: git-submodule.sh:745
-#, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr "Não foi possível obter no submódulo '$sm_path'"
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "Não foi possível executar o editor"
 
-#: git-submodule.sh:768
+#: git-rebase--interactive.sh:1150
 #, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr "Não é possível obter no submódulo '$displaypath'"
+msgid "Could not checkout $switch_to"
+msgstr "Não foi possível extrair $switch_to"
 
-#: git-submodule.sh:788
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Não foi possível extrair '$sha1' no submódulo em '$displaypath'"
+#: git-rebase--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "Sem HEAD?"
 
-#: git-submodule.sh:789
+#: git-rebase--interactive.sh:1156
 #, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Submódulo em '$displaypath': '$sha1' extraído"
+msgid "Could not create temporary $state_dir"
+msgstr "Não foi possível criar $state_dir temporário"
+
+#: git-rebase--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "Não foi possível marcar como interativo"
 
-#: git-submodule.sh:793
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+msgid "Could not init rewritten commits"
+msgstr "Não foi possível inicializar commits reescritos"
+
+#: git-rebase--interactive.sh:1273
 #, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+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:1278
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
 msgstr ""
-"Não foi possível efetuar rebase de '$sha1' no submódulo em '$displaypath'"
+"\n"
+"No entanto, se remover tudo, o rebase será abortado.\n"
+"\n"
 
-#: git-submodule.sh:794
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Submódulo em '$displaypath': rebase concluído em '$sha1'"
+#: git-rebase--interactive.sh:1285
+msgid "Note that empty commits are commented out"
+msgstr "Note que commits vazios são comentados"
 
-#: git-submodule.sh:799
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
-msgstr "Não é possível efetuar merge de '$sha1' no submódulo em '$displaypath'"
+msgid "usage: $dashless $USAGE"
+msgstr "utilização: $dashless $USAGE"
 
-#: git-submodule.sh:800
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr "Submódulo em '$displaypath': merge em '$sha1' concluído"
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"Não é possível mudar de diretório para $cdup, o topo da árvore de trabalho"
 
-#: git-submodule.sh:805
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr "Falha ao executar '$command $sha1' no submódulo em '$prefix$sm_path'"
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr "fatal: $program_name não pode ser usado sem uma árvore de trabalho."
 
-#: git-submodule.sh:806
-#, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Submódulo em '$prefix$sm_path': '$command $sha1'"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "Não é possível rebasear: tem alterações não preparadas."
 
-#: git-submodule.sh:836
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
-msgstr "Falha ao percorrer o submódulo em '$displaypath'"
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
+msgstr "Não é possível reescrever ramos: tem alterações não preparadas."
 
-#: git-submodule.sh:944
-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-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-submodule.sh:996
+#: git-sh-setup.sh:229
 #, sh-format
-msgid "unexpected mode $mod_dst"
-msgstr "modo inesperado $mod_dst"
+msgid "Cannot $action: You have unstaged changes."
+msgstr "Não é possível efetuar $action: tem alterações não preparadas."
 
-#: git-submodule.sh:1016
-#, 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-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
+msgstr "Não é possível rebasear: o índice contém alterações não submetidas."
 
-#: git-submodule.sh:1019
-#, 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-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-submodule.sh:1022
+#: git-sh-setup.sh:248
 #, 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"
+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-submodule.sh:1047
-msgid "blob"
-msgstr "blob"
+#: 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-submodule.sh:1165
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr "Falha ao percorrer recursivamente o submódulo em '$sm_path'"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
+msgstr ""
+"Precisa de executar este comando a partir do topo da árvore de trabalho."
 
-#: git-submodule.sh:1229
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "A sincronizar o URL do submódulo em '$displaypath'"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Não é possível determinar o caminho absoluto do diretório git"
+
+#~ 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"
+
+#~ msgid "bad numeric config value '%s' for '%s' in blob %s: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto no blob %s: unidade "
+#~ "inválida"
+
+#~ msgid "bad numeric config value '%s' for '%s' in file %s: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto no ficheiro %s: "
+#~ "unidade inválida"
+
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in standard input: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto na entrada padrão: "
+#~ "unidade inválida"
+
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in submodule-blob %s: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto no submódulo-blob %s: "
+#~ "unidade inválida"
+
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in command line %s: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto na linha de comandos "
+#~ "%s: unidade inválida"
+
+#~ msgid "bad numeric config value '%s' for '%s' in %s: invalid unit"
+#~ msgstr ""
+#~ "valor numérico '%s' da configuração '%s' incorreto em %s: unidade inválida"
+
+#~ msgid "This is the 2nd commit message:"
+#~ msgstr "Esta é a 2ª mensagem de commit:"
+
+#~ msgid "This is the 3rd commit message:"
+#~ msgstr "Esta é a 3ª mensagem de commit:"
+
+#~ msgid "This is the 4th commit message:"
+#~ msgstr "Esta é a 4ª mensagem de commit:"
+
+#~ msgid "This is the 5th commit message:"
+#~ msgstr "Esta é a 5ª mensagem de commit:"
+
+#~ msgid "This is the 6th commit message:"
+#~ msgstr "Esta é a 6ª mensagem de commit:"
+
+#~ msgid "This is the 7th commit message:"
+#~ msgstr "Esta é a 7ª mensagem de commit:"
+
+#~ msgid "This is the 8th commit message:"
+#~ msgstr "Esta é a 8ª mensagem de commit:"
+
+#~ msgid "This is the 9th commit message:"
+#~ msgstr "Esta é a 9ª mensagem de commit:"
+
+#~ msgid "This is the 10th commit message:"
+#~ msgstr "Esta é a 10ª mensagem de commit:"
+
+#~ msgid "This is the ${n}th commit message:"
+#~ msgstr "Esta é a ${n}ª mensagem de commit:"
+
+#~ msgid "This is the ${n}st commit message:"
+#~ msgstr "Está é a ${n}ª mensagem de commit:"
+
+#~ msgid "This is the ${n}nd commit message:"
+#~ msgstr "Esta é a ${n}ª mensagem de commit:"
+
+#~ msgid "This is the ${n}rd commit message:"
+#~ msgstr "Esta é a ${n}ª mensagem de commit:"
+
+#~ msgid "The 1st commit message will be skipped:"
+#~ msgstr "A 1ª mensagem de commit será ignorada:"
+
+#~ msgid "The 2nd commit message will be skipped:"
+#~ msgstr "A 2ª mensagem de commit será ignorada:"
+
+#~ msgid "The 3rd commit message will be skipped:"
+#~ msgstr "A 3ª mensagem de commit será ignorada:"
+
+#~ msgid "The 4th commit message will be skipped:"
+#~ msgstr "A 4ª mensagem de commit será ignorada:"
+
+#~ msgid "The 5th commit message will be skipped:"
+#~ msgstr "A 5ª mensagem de commit será ignorada:"
+
+#~ msgid "The 6th commit message will be skipped:"
+#~ msgstr "A 6ª mensagem de commit será ignorada:"
+
+#~ msgid "The 7th commit message will be skipped:"
+#~ msgstr "A 7ª mensagem de commit será ignorada:"
+
+#~ msgid "The 8th commit message will be skipped:"
+#~ msgstr "A 8ª mensagem de commit será ignorada:"
+
+#~ msgid "The 9th commit message will be skipped:"
+#~ msgstr "A 9ª mensagem de commit será ignorada:"
+
+#~ msgid "The 10th commit message will be skipped:"
+#~ msgstr "A 10ª mensagem de commit será ignorada:"
+
+#~ msgid "The ${n}th commit message will be skipped:"
+#~ msgstr "A ${n}ª mensagem de commit será ignorada:"
+
+#~ msgid "The ${n}st commit message will be skipped:"
+#~ msgstr "A ${n}ª mensagem de commit será ignorada:"
+
+#~ msgid "The ${n}nd commit message will be skipped:"
+#~ msgstr "A ${n}ª mensagem de commit será ignorada:"
+
+#~ msgid "The ${n}rd commit message will be skipped:"
+#~ msgstr "A ${n}ª mensagem de commit será ignorada:"
+
+#~ msgid "could not run gpg."
+#~ msgstr "não foi possível executar gpg."
+
+#~ msgid "gpg did not accept the data"
+#~ msgstr "gpg não aceitou os dados"
+
+#~ msgid "unsupported object type in the tree"
+#~ msgstr "tipo de objeto sem suporte encontrado na árvore"
+
+#~ msgid "Fatal merge failure, shouldn't happen."
+#~ msgstr "Falha de integração fatal, não devia acontecer."
+
+#~ msgid "Unprocessed path??? %s"
+#~ msgstr "Caminho não processado??? %s"
+
+#~ msgid "Error wrapping up %s"
+#~ msgstr "Erro ao rematar %s."
+
+#~ msgid "Cannot %s during a %s"
+#~ msgstr "Não foi possível efetuar %s durante %s"
+
+#~ msgid "Can't cherry-pick into empty head"
+#~ msgstr "Não é possível efetuar cherry-pick numa cabeça vazia"
+
+#~ 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"
+
+#~ msgid "corrupt index file"
+#~ msgstr "ficheiro de índice corrompido"
+
+#~ msgid "detach the HEAD at named commit"
+#~ msgstr "destacar HEAD no commit indicado"
+
+#~ msgid "Checking connectivity... "
+#~ msgstr "A verificar a conectividade... "
+
+#~ msgid "  (unable to update local ref)"
+#~ msgstr "  (não é possível atualizar a referência local)"
+
+#~ msgid "Reinitialized existing"
+#~ msgstr "existente reinicializado"
+
+#~ msgid "Initialized empty"
+#~ msgstr "vazio inicializado"
+
+#~ msgid " shared"
+#~ msgstr " partilhado"
+
+#~ msgid "Verify that the named commit has a valid GPG signature"
+#~ msgstr "verificar se o commit tem uma assinatura GPG válida"
+
+#~ msgid "Writing SQUASH_MSG"
+#~ msgstr "A escrever SQUASH_MSG"
+
+#~ msgid "Finishing SQUASH_MSG"
+#~ msgstr "A concluir SQUASH_MSG"
+
+#~ msgid "   and with remote"
+#~ msgstr "   e com o remoto"
+
+#~ msgid "removing '%s' failed"
+#~ msgstr "falha ao remover '%s'"
+
+#~ msgid "program error"
+#~ msgstr "erro do programa"
+
+#~ msgid "Please call 'bisect_state' with at least one argument."
+#~ msgstr "Invoque 'bisect_state' com pelo menos um argumento."
+
+#~ msgid ""
+#~ "If you want to reuse this local git directory instead of cloning again "
+#~ "from"
+#~ msgstr ""
+#~ "Se deseja reutilizar este diretório git local em vez de clonar de novo de"
+
+#~ msgid ""
+#~ "use the '--force' option. If the local git directory is not the correct "
+#~ "repo"
+#~ msgstr ""
+#~ "use a opção '--force'. Se o diretório git local não é o repositório "
+#~ "correto"
+
+#~ msgid ""
+#~ "or you are unsure what this means choose another name with the '--name' "
+#~ "option."
+#~ msgstr ""
+#~ "ou se não tem a certeza do que isto significa, escolha outro nome com a "
+#~ "opção '--name'."
+
+#~ msgid "Submodule work tree '$displaypath' contains a .git directory"
+#~ msgstr ""
+#~ "A árvore de trabalho do submódulo '$displaypath' contém um diretório .git"
+
+#~ msgid ""
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "(use 'rm -rf' se pretende mesmo removê-lo, incluindo todo o seu histórico)"
+
+#~ msgid "'%s': %s"
+#~ msgstr "'%s': %s"
+
+#~ 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"
+
+#~ msgid "    git branch --set-upstream-to %s\n"
+#~ msgstr "    git branch --set-upstream-to %s\n"
+
+#~ msgid "cannot open %s: %s\n"
+#~ msgstr "não é possível abrir %s: %s\n"
+
+#~ msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+#~ msgstr ""
+#~ "Prepare as suas alterações em .gitmodules ou esconda-as (stash) para "
+#~ "prosseguir"
+
+#~ msgid "could not verify the tag '%s'"
+#~ msgstr "não foi possível validar a tag '%s'"
+
+#~ msgid "failed to remove: %s"
+#~ msgstr "falha ao remover: %s"
+
+#~ msgid "The --exec option must be used with the --interactive option"
+#~ msgstr "A opção --exec deve ser usada com a opção --interactive"
+
+#~ msgid ""
+#~ "Submodule path '$displaypath' not initialized\n"
+#~ "Maybe you want to use 'update --init'?"
+#~ msgstr ""
+#~ "Submódulo em '$displaypath' não inicializado\n"
+#~ "Talvez queira usar 'update --init'?"
 
 #~ msgid "unable to parse format"
 #~ msgstr "não foi possível analisar o formato"
@@ -12369,9 +15030,6 @@ msgstr "A sincronizar o URL do submódulo em '$displaypath'"
 #~ msgid "Could not append '%s'"
 #~ msgstr "Não foi possível acrescentar '%s'"
 
-#~ msgid "Could not set '%s'"
-#~ msgstr "Não foi possível definir '%s'"
-
 #~ msgid "Missing author: %s"
 #~ msgstr "Autor em falta: %s"
 
@@ -12434,8 +15092,5 @@ msgstr "A sincronizar o URL do submódulo em '$displaypath'"
 #~ 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 c0a838b33bbae316f8f7030c8b9025abb56f43b2..a92ddcf08df3ea4a47105c281a10ba83d8c1468f 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -4,14 +4,14 @@
 # 
 # Translators:
 # Dimitriy Ryazantcev <DJm00n@mail.ru>, 2014-2016
-# insolor <insolor@gmail.com>, 2014
-# insolor <insolor@gmail.com>, 2014
+# insolor, 2014
+# insolor, 2014
 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-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-15 18:54+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,641 +25,1730 @@ 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:1226
+#: 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:1232
-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:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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:78
-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
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "удаленный файл все еще имеет содержимое"
+
+#: apply.c:1795
 #, c-format
-msgid "Branch %s set up to track remote branch %s from %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð²Ð½ÐµÑ\88нÑ\8eÑ\8e Ð²ÐµÑ\82кÑ\83 %s Ð¸Ð· %s."
+msgid "corrupt patch at line %d"
+msgstr "паÑ\82Ñ\87 Ð¿Ð¾Ð²Ñ\80ежден Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: branch.c:98
+#: apply.c:1832
 #, 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 "new file %s depends on old contents"
+msgstr "новÑ\8bй Ñ\84айл %s Ð·Ð°Ð²Ð¸Ñ\81иÑ\82 Ð¾Ñ\82 Ñ\81Ñ\82аÑ\80ого Ñ\81одеÑ\80жимого"
 
-#: branch.c:99
+#: apply.c:1834
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "Ветка %s отслеживает локальную ветку %s."
+msgid "deleted file %s still has contents"
+msgstr "удаленный файл %s все еще имеет содержимое"
 
-#: branch.c:104
+#: apply.c:1837
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "Ветка %s отслеживает внешнюю ссылку %s перемещением."
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
 
-#: branch.c:105
+#: apply.c:1984
 #, c-format
-msgid "Branch %s set up to track remote ref %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð²Ð½ÐµÑ\88нÑ\8eÑ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s."
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "повÑ\80ежденнÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
 
-#: branch.c:109
+#: apply.c:2021
 #, 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 "unrecognized binary patch at line %d"
+msgstr "неопознаннÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: branch.c:110
+#: apply.c:2182
 #, c-format
-msgid "Branch %s set up to track local ref %s."
-msgstr "Ð\92еÑ\82ка %s Ð¾Ñ\82Ñ\81леживаеÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83 %s."
+msgid "patch with only garbage at line %d"
+msgstr "паÑ\82Ñ\87 Ñ\81 Ð¼Ñ\83Ñ\81оÑ\80ом Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Не удалось записать настройки вышестоящей ветки"
+#: apply.c:2274
+#, c-format
+msgid "unable to read symlink %s"
+msgstr "не удалось прочитать символьную ссылку %s"
 
-#: branch.c:156
+#: apply.c:2278
 #, 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 "unable to open or read %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¿Ñ\80оÑ\87еÑ\81Ñ\82Ñ\8c %s"
 
-#: branch.c:185
+#: apply.c:2931
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "«%s» не является действительным именем ветки."
+msgid "invalid start of line: '%c'"
+msgstr "неправильное начало строки: «%c»"
 
-#: branch.c:190
+#: apply.c:3050
 #, c-format
-msgid "A branch named '%s' already exists."
-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:198
-msgid "Cannot force update the current branch."
-msgstr "Не удалось принудительно обновить текущую ветку."
+#: apply.c:3062
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "Контекст сужен до (%ld/%ld), чтобы применить фрагмент на %d строке"
 
-#: branch.c:218
+#: apply.c:3068
 #, c-format
 msgid ""
-"Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr "Не удалось настроить информацию отслеживания; стартовая точка «%s» не является веткой."
+"while searching for:\n"
+"%.*s"
+msgstr "при поиске:\n%.*s"
 
-#: branch.c:220
+#: apply.c:3090
 #, 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 "missing binary patch data for '%s'"
+msgstr "пÑ\80опÑ\83Ñ\89енÑ\8b Ð´Ð°Ð½Ð½Ñ\8bе Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð°Ñ\82Ñ\87а Ð´Ð»Ñ\8f Â«%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» — чтобы сохранить настройку вышестоящего репозитория для отправки."
+#: apply.c:3098
+#, c-format
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "невозможно выполнить reverse-apply для двоичного патча, без обращения изменений блока «%s»"
 
-#: branch.c:266
+#: apply.c:3144
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имое Ð¸Ð¼Ñ\8f Ð¾Ð±Ñ\8aекÑ\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:286
+#: apply.c:3154
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Неоднозначное имя объекта: «%s»."
+msgid ""
+"the patch applies to '%s' (%s), which does not match the current contents."
+msgstr "патч применятся к файлу «%s» (%s), но его текущее содержимое не соотвествует ожидаемому."
 
-#: branch.c:291
+#: apply.c:3162
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Ð\9dедопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\82оÑ\87ка Ð²ÐµÑ\82ки: Â«%s»."
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "паÑ\82Ñ\87 Ð¿Ñ\80именÑ\8fеÑ\82Ñ\81Ñ\8f Ðº Ð¿Ñ\83Ñ\81Ñ\82омÑ\83 Ñ\84айлÑ\83 Â«%s», Ð½Ð¾ Ñ\84айл Ð½Ðµ Ð¿Ñ\83Ñ\81Ñ\82ой"
 
-#: branch.c:344
+#: apply.c:3180
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "«%s» уже находится на «%s»"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "не удалось прочитать необходимую посылку %s для «%s»"
 
-#: bundle.c:34
+#: apply.c:3193
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "«%s» не похож на файл пакета версии 2"
+msgid "binary patch does not apply to '%s'"
+msgstr "не удалось применить двоичный патч к «%s»"
 
-#: bundle.c:61
+#: apply.c:3199
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "неопознаннÑ\8bй Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº: %s%s (%d)"
+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)"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3220
 #, 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:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "сбой инициализации прохода по редакциям"
+msgid "patch failed: %s:%ld"
+msgstr "ошибка применения изменений: %s:%ld"
 
-#: bundle.c:185
+#: apply.c:3342
 #, 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 "cannot checkout %s"
+msgstr "не удалось переключить состояние на %s"
 
-#: bundle.c:194
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, 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 ссылок:"
-
-#: 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"
+msgid "failed to read %s"
+msgstr "не удалось прочитать %s"
 
-#: bundle.c:353
+#: apply.c:3398
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "Ñ\81Ñ\81Ñ\8bлка Â«%s» Ð¸Ñ\81клÑ\8eÑ\87ена Ð² Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вии Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fми rev-list"
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "Ñ\87Ñ\82ение Ð¸Ð· Â«%s» Ð·Ð° Ñ\81имволиÑ\87еÑ\81кой Ñ\81Ñ\81Ñ\8bлкой"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3427 apply.c:3667
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "неопознанный аргумент: %s"
-
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Отклонение создания пустого пакета."
+msgid "path %s has been renamed/deleted"
+msgstr "путь %s был переименован/удален"
 
-#: bundle.c:459
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "cannot create '%s'"
-msgstr "не удалось создать «%s»"
-
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "критическая ошибка index-pack"
+msgid "%s: does not exist in index"
+msgstr "%s: нет в индексе"
 
-#: color.c:275
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "недопустимое значение цвета: %.*s"
+msgid "%s: does not match index"
+msgstr "%s: не совпадает с индексом"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
-#, c-format
-msgid "could not parse %s"
-msgstr "не удалось разобрать %s"
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "в репозитории отсутствует необходимый двоичный объект для отката к трёхходовому слиянию."
 
-#: commit.c:42
+#: apply.c:3557
 #, 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 "Falling back to three-way merge...\n"
+msgstr "Откат к трёхходовому слиянию…\n"
 
-#: config.c:475 config.c:477
+#: apply.c:3573 apply.c:3577
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "оÑ\88ибка Ð² %d Ñ\81Ñ\82Ñ\80оке Ñ\84айла ÐºÐ¾Ð½Ñ\84игÑ\83Ñ\80аÑ\86ии Ð² %s %s"
+msgid "cannot read the current contents of '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ее Ñ\81одеÑ\80жимое Â«%s»"
 
-#: config.c:593
+#: apply.c:3589
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s» Ð² %s %s: %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"
 
-#: config.c:595
+#: apply.c:3603
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "непÑ\80авилÑ\8cное Ñ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение Â«%s» Ð´Ð»Ñ\8f Â«%s»: %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\80именен Ðº Â«%s» Ñ\81 ÐºÐ¾Ð½Ñ\84ликÑ\82ами.\n"
 
-#: config.c:680
+#: apply.c:3608
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "сбой разворачивания пути каталога пользователя: «%s»"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Патч применен к «%s» без ошибок.\n"
 
-#: config.c:758 config.c:769
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr "неправильный уровень сжатия zlib %d"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "патч удаления не удалил содержимое файла"
 
-#: config.c:891
+#: apply.c:3706
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "недопустимый режим создания объекта: %s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "не удалось разобрать конфигурацию из командной строки"
-
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "произошла неизвестная ошибка при чтении файлов конфигурации"
+msgid "%s: wrong type"
+msgstr "%s: неправильный тип"
 
-#: config.c:1629
+#: apply.c:3708
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "не удалось разобрать «%s» в конфигурации из командной строки"
+msgid "%s has type %o, expected %o"
+msgstr "%s имеет тип %o, а ожидался %o"
 
-#: config.c:1631
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "неправильная переменная конфигурации «%s» в файле «%s» на строке %d"
+msgid "invalid path '%s'"
+msgstr "неправильный путь «%s»"
 
-#: config.c:1690
+#: apply.c:3917
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s имеет несколько значений"
+msgid "%s: already exists in index"
+msgstr "%s: уже содержится в индексе"
 
-#: config.c:2226
+#: apply.c:3920
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Не удалось установить «%s» в «%s»"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Не удалось запустить «git rev-list»"
+msgid "%s: already exists in working directory"
+msgstr "%s: уже содержится в рабочем каталоге"
 
-#: connected.c:89
+#: apply.c:3940
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "сбой записи в rev-list: %s"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o)"
 
-#: connected.c:97
+#: apply.c:3945
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "сбой закрытия стандартного ввода у rev-list: %s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "в будущем"
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o) для %s"
 
-#: date.c:101
+#: apply.c:3965
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu секунду назад"
-msgstr[1] "%lu секунды назад"
-msgstr[2] "%lu секунд назад"
-msgstr[3] "%lu секунд назад"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "затронутый файл «%s» находится за символической ссылкой"
 
-#: date.c:108
+#: apply.c:3969
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu минуту назад"
-msgstr[1] "%lu минуты назад"
-msgstr[2] "%lu минут назад"
-msgstr[3] "%lu минут назад"
+msgid "%s: patch does not apply"
+msgstr "%s: не удалось применить патч"
 
-#: date.c:115
+#: apply.c:3984
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu час назад"
-msgstr[1] "%lu часа назад"
-msgstr[2] "%lu часов назад"
-msgstr[3] "%lu часов назад"
+msgid "Checking patch %s..."
+msgstr "Проверка патча %s…"
 
-#: date.c:122
+#: apply.c:4075
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu день назад"
-msgstr[1] "%lu дня назад"
-msgstr[2] "%lu дней назад"
-msgstr[3] "%lu дней назад"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "информация об sha1 отсутствует или бесполезна для подмодуля %s"
 
-#: date.c:128
+#: apply.c:4082
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu неделю назад"
-msgstr[1] "%lu недели назад"
-msgstr[2] "%lu недель назад"
-msgstr[3] "%lu недель назад"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "изменен режим для %s, который не находится в текущем HEAD"
 
-#: date.c:135
+#: apply.c:4085
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu месяц назад"
-msgstr[1] "%lu месяца назад"
-msgstr[2] "%lu месяцев назад"
-msgstr[3] "%lu месяцев назад"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "информация об sha1 отсутствует или бесполезна (%s)."
 
-#: date.c:146
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu год"
-msgstr[1] "%lu года"
-msgstr[2] "%lu лет"
-msgstr[3] "%lu лет"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "сбой make_cache_entry для пути «%s»"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4094
 #, 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 "could not add %s to temporary index"
+msgstr "не удалось добавить %s во временный индекс"
 
-#: date.c:154 date.c:159
+#: apply.c:4104
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu год назад"
-msgstr[1] "%lu года назад"
-msgstr[2] "%lu лет назад"
-msgstr[3] "%lu лет назад"
+msgid "could not write temporary index to %s"
+msgstr "не удалось записать временный индкекс в %s"
 
-#: diffcore-order.c:24
+#: apply.c:4242
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "сбой чтения orderfile «%s»"
-
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Выполняется неточное определение переименования"
+msgid "unable to remove %s from index"
+msgstr "не удалось удалить %s из индекса"
 
-#: diff.c:115
+#: apply.c:4277
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
+msgid "corrupt patch for submodule %s"
+msgstr "поврежденный патч для подмодуля %s"
 
-#: diff.c:120
+#: apply.c:4283
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80 dirstat: Â«%s»\n"
+msgid "unable to stat newly created file '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Ð´Ð»Ñ\8f Ñ\81озданного Ñ\84айла Â«%s»"
 
-#: diff.c:215
+#: apply.c:4291
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Ð\9dеизвеÑ\81Ñ\82ное Ð·Ð½Ð°Ñ\87ениÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменной Â«diff.submodule»: Â«%s»"
+msgid "unable to create backing store for newly created file %s"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð²Ñ\81помогаÑ\82елÑ\8cнÑ\8bй Ñ\84айл Ð´Ð»Ñ\8f Ñ\81озданного Ñ\84айла %s"
 
-#: diff.c:267
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
+msgid "unable to add cache entry for %s"
+msgstr "не удалось создать запись в кэше для %s"
 
-#: diff.c:2997
+#: apply.c:4338
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "критическая ошибка при внешнем сравнении, останов на %s"
-
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow требует ровно одной спецификации пути"
+msgid "failed to write to '%s'"
+msgstr "не удалось записать в «%s»"
 
-#: diff.c:3556
+#: apply.c:4342
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
+msgid "closing file '%s'"
+msgstr "закрытие файла «%s»"
 
-#: diff.c:3570
+#: apply.c:4412
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Сбой разбора параметра опции --submodule: «%s»"
-
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "не удалось получить имя ядра и информацию"
-
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
-
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "не удалось запустить gpg."
+msgid "unable to write file '%s' mode %o"
+msgstr "не удалось записать файл «%s» с режимом доступа %o"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg не принял данные"
+#: apply.c:4510
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "Патч %s применен без ошибок."
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg не удалось подписать данные"
+#: apply.c:4518
+msgid "internal error"
+msgstr "внутренняя ошибка"
 
-#: gpg-interface.c:222
+#: apply.c:4521
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "не удалось создать временный файл «%s»: %s"
+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 отказами…"
 
-#: gpg-interface.c:225
+#: apply.c:4532
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "Ñ\81бой Ð·Ð°Ð¿Ð¸Ñ\81и Ð¾Ñ\82Ñ\81оединенной Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81и Ð² Â«%s»: %s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "Ñ\83Ñ\81еÑ\87ение Ð¸Ð¼ÐµÐ½Ð¸ .rej Ñ\84айла Ð´Ð¾ %.*s.rej"
 
-#: grep.c:1718
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "«%s»: не удалось прочесть %s"
+msgid "cannot open %s"
+msgstr "не удалось открыть %s"
 
-#: grep.c:1735
+#: apply.c:4554
 #, c-format
-msgid "'%s': %s"
-msgstr "«%s»: %s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Блок №%d применен без ошибок."
 
-#: grep.c:1746
+#: apply.c:4558
 #, c-format
-msgid "'%s': short read %s"
-msgstr "«%s»: слишком мало данных прочитано %s"
+msgid "Rejected hunk #%d."
+msgstr "Блок №%d отклонен."
 
-#: help.c:205
+#: apply.c:4668
 #, c-format
-msgid "available git commands in '%s'"
-msgstr "доÑ\81Ñ\82Ñ\83пнÑ\8bе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\8b git Ð² Â«%s»"
+msgid "Skipped patch '%s'."
+msgstr "Ð\9fаÑ\82Ñ\87 Â«%s» Ð¿Ñ\80опÑ\83Ñ\89ен."
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
+#: apply.c:4676
+msgid "unrecognized input"
+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»."
+
+#: branch.c:344
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "«%s» уже находится на «%s»"
+
+#: branch.c:363
+#, c-format
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD рабочего каталога %s не обновлён"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "«%s» не похож на файл пакета версии 2"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "неопознанный заголовок: %s%s (%d)"
+
+#: bundle.c:87 sequencer.c:963 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: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 "сбой инициализации прохода по редакциям"
+
+#: bundle.c:185
+#, 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 "Пакет содержит полную историю."
+
+#: bundle.c:194
+#, 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 ссылок:"
+
+#: 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"
+
+#: 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:165 builtin/log.c:1572 builtin/shortlog.c:273
+#, 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: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"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s не является коммитом!"
+
+#: commit.c:1514
+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сообщений, которую использует ваш проект.\n"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "память исчерпана"
+
+#: config.c:516
+#, c-format
+msgid "bad config line %d in blob %s"
+msgstr "ошибка в %d строке двоичного объекта %s"
+
+#: config.c:520
+#, c-format
+msgid "bad config line %d in file %s"
+msgstr "ошибка в %d строке файла %s"
+
+#: config.c:524
+#, c-format
+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» в конфигурации из командной строки"
+
+#: 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"
+"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"
+
+#: 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 будет заменен на LF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
+
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF будет заменен на LF в %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 будет заменен на CRLF в %s.\nФайл будет иметь свои оригинальные концы строк в рашей рабочей копии."
+
+#: convert.c:215
+#, c-format
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF будет заменен на CRLF в %s"
+
+#: date.c:97
+msgid "in the future"
+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 недель назад"
+
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu месяц назад"
+msgstr[1] "%lu месяца назад"
+msgstr[2] "%lu месяцев назад"
+msgstr[3] "%lu месяцев назад"
+
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu год"
+msgstr[1] "%lu года"
+msgstr[2] "%lu лет"
+msgstr[3] "%lu лет"
+
+#. 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 месяцев назад"
+
+#: date.c:156 date.c:161
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu год назад"
+msgstr[1] "%lu года назад"
+msgstr[2] "%lu лет назад"
+msgstr[3] "%lu лет назад"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "сбой чтения orderfile «%s»"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Выполняется неточное определение переименования"
+
+#: diff.c:62
+#, c-format
+msgid "option '%s' requires a value"
+msgstr "параметр «%s» требует указания значения"
+
+#: diff.c:124
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  Сбой разбора величины среза (cut-off) у dirstat «%s»\n"
+
+#: diff.c:129
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "Неизвестный параметр dirstat: «%s»\n"
+
+#: diff.c:283
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Неизвестное значения для переменной «diff.submodule»: «%s»"
+
+#: diff.c:346
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr "Найдены ошибки в переменной «diff.dirstat»:\n%s"
+
+#: diff.c:3087
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "критическая ошибка при внешнем сравнении, останов на %s"
+
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, --check и -s нельзя использовать одновременно"
+
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow требует ровно одной спецификации пути"
+
+#: diff.c:3665
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr "Сбой разбора параметра опции --dirstat/-X :\n%s"
+
+#: diff.c:3679
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Сбой разбора параметра опции --submodule: «%s»"
+
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "неточное определение переименования было пропущено из-за слишком большого количества файлов."
+
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "найдены только копии из измененных путей из-за слишком большого количества файлов."
+
+#: diff.c:4706
+#, c-format
+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 "Кэш неотслеживаемых файлов отключен на этой системе или в этом месте."
+
+#: 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 "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: ожидается ACK/NAK, а получено «%s»"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc требует multi_ack_detailed"
+
+#: fetch-pack.c:381
+#, c-format
+msgid "invalid shallow line: %s"
+msgstr "неправильная строка частичного получения: %s"
+
+#: fetch-pack.c:387
+#, c-format
+msgid "invalid unshallow line: %s"
+msgstr "неправильная строка полного получения: %s"
+
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "объект не найден: %s"
+
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "ошибка в объекте: %s"
+
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "частичный клон не найден: %s"
+
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "ожидалось shallow/unshallow, а получено %s"
+
+#: fetch-pack.c:436
+#, c-format
+msgid "got %s %d %s"
+msgstr "получено %s %d %s"
+
+#: fetch-pack.c:450
+#, c-format
+msgid "invalid commit %s"
+msgstr "недопустимый коммит %s"
+
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "останавливаю дальнейшие попытки"
+
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "готово"
+
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "получено %s (%d) %s"
+
+#: fetch-pack.c:551
+#, c-format
+msgid "Marking %s as complete"
+msgstr "Помечаю %s как завершенный"
+
+#: fetch-pack.c:697
+#, c-format
+msgid "already have %s (%s)"
+msgstr "уже есть %s (%s)"
+
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: не удалось запустить программу разбора данных"
+
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "ошибка протокола: неправильный заголовок потока"
+
+#: fetch-pack.c:799
+#, c-format
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: не удалось запустить программу %s"
+
+#: fetch-pack.c:815
+#, c-format
+msgid "%s failed"
+msgstr "%s завершен с ошибкой"
+
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "произошла  ошибка в  программе разбора данных"
+
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Сервер не поддерживает клиентов с частичным клонированием"
+
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Сервер поддерживает multi_ack_detailed"
+
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Сервер поддерживает no-done"
+
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Сервер поддерживает multi_ack"
+
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Сервер поддерживает side-band-64k"
+
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Сервер поддерживает side-band"
+
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Сервер поддерживает allow-tip-sha1-in-want"
+
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Сервер поддерживает allow-reachable-sha1-in-want"
+
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Сервер поддерживает ofs-delta"
+
+#: fetch-pack.c:890
+#, c-format
+msgid "Server version is %.*s"
+msgstr "Версия сервера %.*s"
+
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Сервер не поддерживает --shallow-since"
+
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Сервер не поддерживает --shallow-exclude"
+
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Сервер не поддерживает --deepen"
+
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "не общих коммитов"
+
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: ошибка при получении данных."
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "нет соотвествующего внешнего указателя на ветку"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg не удалось подписать данные"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "не удалось создать временный файл"
+
+#: gpg-interface.c:217
+#, c-format
+msgid "failed writing detached signature to '%s'"
+msgstr "сбой записи отсоединенной подписи в «%s»"
+
+#: grep.c:1782
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "«%s»: не удалось прочесть %s"
+
+#: 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»"
+
+#: grep.c:1810
+#, c-format
+msgid "'%s': short read"
+msgstr "«%s»: слишком мало данных прочитано"
+
+#: help.c:203
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "доступные команды git в «%s»"
+
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
 msgstr "команды git, доступные в других местах вашего $PATH"
 
-#: help.c:244
+#: help.c:241
 msgid "These are common Git commands used in various situations:"
 msgstr "Стандартные команды Git используемые в различных ситуациях:"
 
-#: help.c:309
+#: help.c:306
 #, 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, но нам не удалось ее запустить. Возможно, git-%s  не работает?"
 
-#: help.c:366
+#: help.c:361
 msgid "Uh oh. Your system reports no Git commands at all."
 msgstr "Ой-ёй! Ваша система не сообщает ни о каких командах Git вообще."
 
-#: help.c:388
+#: help.c:383
 #, 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»"
 
-#: help.c:393
+#: help.c:388
 #, c-format
 msgid "in %0.1f seconds automatically..."
 msgstr "через %0.1f секунд автоматически…"
 
-#: help.c:400
+#: help.c:395
 #, 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
+#: help.c:399 help.c:465
 msgid ""
 "\n"
 "Did you mean this?"
@@ -671,246 +1760,264 @@ msgstr[1] "\nВозможно, вы имели в виду что-то из эт
 msgstr[2] "\nВозможно, вы имели в виду что-то из этого?"
 msgstr[3] "\nВозможно, вы имели в виду что-то из этого?"
 
-#: help.c:460
+#: help.c:461
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %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"
+
+#: 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с ошибкой в этом репозитории: \nудалите файл вручную для продолжения."
+
+#: lockfile.c:160
+#, 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:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
+#: 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 "не удалось записать новый файл индекса"
 
-#: merge-recursive.c:189
-#, c-format
+#: merge-recursive.c:209
 msgid "(bad commit)\n"
 msgstr "(плохой коммит)\n"
 
-#: merge-recursive.c:209
+#: merge-recursive.c:231
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
 msgstr "сбой addinfo_cache для пути «%s»"
 
-#: merge-recursive.c:270
+#: merge-recursive.c:301
 msgid "error building trees"
 msgstr "ошибка при построении деревьев"
 
-#: merge-recursive.c:689
+#: merge-recursive.c:720
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "не удалось создать путь «%s»%s"
 
-#: merge-recursive.c:700
+#: merge-recursive.c:731
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Удаление %s, чтобы освободить место для подкаталогов\n"
 
-#: merge-recursive.c:714 merge-recursive.c:735
+#: merge-recursive.c:745 merge-recursive.c:764
 msgid ": perhaps a D/F conflict?"
 msgstr ": возможно, конфликт каталогов/файлов?"
 
-#: merge-recursive.c:725
+#: merge-recursive.c:754
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "отказ потери неотслеживаемого файла в «%s»"
 
-#: merge-recursive.c:765
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "невозможно прочитать объект %s «%s»"
 
-#: merge-recursive.c:767
+#: merge-recursive.c:798
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "ожидается двоичный объект для %s «%s»"
 
-#: merge-recursive.c:790 builtin/clone.c:374
+#: merge-recursive.c:822
 #, c-format
-msgid "failed to open '%s'"
-msgstr "не удалось открыть «%s»"
+msgid "failed to open '%s': %s"
+msgstr "не удалось открыть «%s»: %s"
 
-#: merge-recursive.c:798
+#: merge-recursive.c:833
 #, c-format
-msgid "failed to symlink '%s'"
-msgstr "не удалось создать символьную ссылку «%s»"
+msgid "failed to symlink '%s': %s"
+msgstr "не удалось создать символьную ссылку «%s»: %s"
 
-#: merge-recursive.c:801
+#: merge-recursive.c:838
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "не понятно, что делать с %06o %s «%s»"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:978
 msgid "Failed to execute internal merge"
 msgstr "Не удалось запустить внутреннее слияние"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:982
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Не удалось добавить %s в базу данных"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "объект неподдерживаемого типа в дереве"
-
-#: merge-recursive.c:1034 merge-recursive.c:1048
+#: merge-recursive.c:1081 merge-recursive.c:1095
 #, 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 оставлена в дереве."
 
-#: merge-recursive.c:1040 merge-recursive.c:1053
+#: merge-recursive.c:1087 merge-recursive.c:1100
 #, 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:1094
+#: merge-recursive.c:1143
 msgid "rename"
 msgstr "переименование"
 
-#: merge-recursive.c:1094
+#: merge-recursive.c:1143
 msgid "renamed"
 msgstr "переименовано"
 
-#: merge-recursive.c:1150
+#: merge-recursive.c:1200
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s — это каталог в %s, добавляем как %s вместо этого"
 
-#: merge-recursive.c:1172
+#: 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"
 
-#: merge-recursive.c:1177
+#: merge-recursive.c:1230
 msgid " (left unresolved)"
 msgstr " (оставлено неразрешенным)"
 
-#: merge-recursive.c:1231
+#: merge-recursive.c:1292
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr "КОНФЛИКТ (переименование/переименование): Переименование «%s»→«%s» в ветке «%s» и переименование «%s»→«%s» в ветке «%s»"
 
-#: merge-recursive.c:1261
+#: merge-recursive.c:1325
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Переименовываю %s в %s и %s в %s вместо этого"
 
-#: merge-recursive.c:1460
+#: merge-recursive.c:1531
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "КОНФЛИКТ (переименование/добавление): Переименование «%s»→«%s» в ветке «%s» и добавление «%s» в ветке «%s»"
 
-#: merge-recursive.c:1470
+#: merge-recursive.c:1546
 #, c-format
 msgid "Adding merged %s"
 msgstr "Добавление слитого %s"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Добавление вместо этого как %s"
 
-#: merge-recursive.c:1526
+#: merge-recursive.c:1610
 #, c-format
 msgid "cannot read object %s"
 msgstr "невозможно прочитать объект «%s»"
 
-#: merge-recursive.c:1529
+#: merge-recursive.c:1613
 #, c-format
 msgid "object %s is not a blob"
 msgstr "объект %s не является двоичным объектом"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modify"
 msgstr "изменение"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1666
 msgid "modified"
 msgstr "изменено"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1676
 msgid "content"
 msgstr "содержимое"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1683
 msgid "add/add"
 msgstr "добавление/добавление"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1718
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Пропуск %s (слиты одинаковые изменения как существующие)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1732
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Автослияние %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
+#: merge-recursive.c:1736 git-submodule.sh:924
 msgid "submodule"
 msgstr "подмодуль"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1737
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "КОНФЛИКТ (%s): Конфликт слияния в %s"
 
-#: merge-recursive.c:1737
+#: merge-recursive.c:1831
 #, c-format
 msgid "Removing %s"
 msgstr "Удаление %s"
 
-#: merge-recursive.c:1762
+#: merge-recursive.c:1857
 msgid "file/directory"
 msgstr "файл/каталог"
 
-#: merge-recursive.c:1768
+#: merge-recursive.c:1863
 msgid "directory/file"
 msgstr "каталог/файл"
 
-#: merge-recursive.c:1773
+#: merge-recursive.c:1868
 #, c-format
 msgid ""
 "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr "КОНФЛИКТ (%s): Уже существует каталог с именем «%s» в «%s». Добавление «%s» как «%s»"
 
-#: merge-recursive.c:1783
+#: merge-recursive.c:1877
 #, c-format
 msgid "Adding %s"
 msgstr "Добавление %s"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Критическая ошибка слияния, такого не должно случаться."
-
-#: merge-recursive.c:1819
+#: merge-recursive.c:1914
 msgid "Already up-to-date!"
 msgstr "Уже обновлено!"
 
-#: merge-recursive.c:1828
+#: merge-recursive.c:1923
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "сбой слияния деревьев «%s» и «%s»"
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Необработанный путь??? %s"
-
-#: merge-recursive.c:1906
+#: merge-recursive.c:2006
 msgid "Merging:"
 msgstr "Слияние:"
 
-#: merge-recursive.c:1919
+#: merge-recursive.c:2019
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
@@ -919,19 +2026,31 @@ msgstr[1] "найдено %u общих предка:"
 msgstr[2] "найдено %u общих предков:"
 msgstr[3] "найдено %u общих предков:"
 
-#: merge-recursive.c:1956
+#: merge-recursive.c:2058
 msgid "merge returned no commit"
 msgstr "слияние не вернуло коммит"
 
-#: merge-recursive.c:2013
+#: merge-recursive.c:2121
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Не удалось разобрать объект «%s»"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
 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 "Нельзя закоммитить неинициализированное или не имеющее ссылок дерево заметок"
@@ -958,28 +2077,28 @@ msgstr "Неправильное значение переменной %s: «%s
 msgid "unable to parse object: %s"
 msgstr "не удалось разобрать объект: %s"
 
-#: parse-options.c:570
+#: parse-options.c:572
 msgid "..."
 msgstr "…"
 
-#: parse-options.c:588
+#: parse-options.c:590
 #, c-format
 msgid "usage: %s"
 msgstr "использование: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
-#: parse-options.c:592
+#: parse-options.c:594
 #, c-format
 msgid "   or: %s"
 msgstr "          или: %s"
 
-#: parse-options.c:595
+#: parse-options.c:597
 #, c-format
 msgid "    %s"
 msgstr "            %s"
 
-#: parse-options.c:629
+#: parse-options.c:631
 msgid "-NUM"
 msgstr "-КОЛИЧЕСТВО"
 
@@ -988,7 +2107,7 @@ msgstr "-КОЛИЧЕСТВО"
 msgid "malformed object name '%s'"
 msgstr "Неправильное имя объекта «%s»"
 
-#: path.c:752
+#: path.c:826
 #, c-format
 msgid "Could not make %s writable by group"
 msgstr "Не удалось предоставить доступ к %s на запись"
@@ -1042,56 +2161,57 @@ msgstr "Спецификация пути «%s» в подмодуле «%.*s»"
 msgid "%s: pathspec magic not supported by this command: %s"
 msgstr "%s: магические слова в спецификации пути не поддерживаются командой: %s"
 
-#: pathspec.c:433
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please"
+" use . instead if you meant to match all paths"
+msgstr "пустые строки как спецификаторы пути будут сделаны недопустимыми в следующих версиях. используйте вместо них «.», что значит соотвествие всем путям"
+
+#: pathspec.c:440
 #, c-format
 msgid "pathspec '%s' is beyond a symbolic link"
 msgstr "спецификация пути «%s» находится за символической ссылкой"
 
-#: pathspec.c:442
+#: pathspec.c:449
 msgid ""
 "There is nothing to exclude from by :(exclude) patterns.\n"
 "Perhaps you forgot to add either ':/' or '.' ?"
 msgstr "Не указан шаблон для исключения с помощью :(exclude).\nВозможно, вы забыли «:/» или «.» ?"
 
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "не удалось разобрать формат для --pretty"
-
-#: progress.c:235
-msgid "done"
-msgstr "готово"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "не удалось разобрать формат для --pretty"
 
-#: read-cache.c:1281
+#: read-cache.c:1315
 #, c-format
 msgid ""
 "index.version set, but the value is invalid.\n"
 "Using version %i"
 msgstr "index.version указан, но значение недействительное.\nИспользую версию %i"
 
-#: read-cache.c:1291
+#: read-cache.c:1325
 #, c-format
 msgid ""
 "GIT_INDEX_VERSION set, but the value is invalid.\n"
 "Using version %i"
 msgstr "GIT_INDEX_VERSION указан, но значение недействительное.\nИспользую версию %i"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: refs.c:576 builtin/merge.c:840
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Не удалось открыть «%s» для записи"
 
-#: refs/files-backend.c:2374
+#: refs/files-backend.c:2481
 #, c-format
 msgid "could not delete reference %s: %s"
 msgstr "не удалось удалить ссылку %s: %s"
 
-#: refs/files-backend.c:2377
+#: refs/files-backend.c:2484
 #, c-format
 msgid "could not delete references: %s"
 msgstr "не удалось удалить ссылки: %s"
 
-#: refs/files-backend.c:2386
+#: refs/files-backend.c:2493
 #, c-format
 msgid "could not remove reference %s"
 msgstr "не удалось удалить ссылки %s"
@@ -1220,32 +2340,32 @@ msgstr "игнорирую ссылку с неправильным именем
 msgid "ignoring broken ref %s"
 msgstr "игнорирую неправильную ссылку %s"
 
-#: ref-filter.c:1651
+#: ref-filter.c:1633
 #, c-format
 msgid "format: %%(end) atom missing"
 msgstr "format: пропущена частица %%(end)"
 
-#: ref-filter.c:1705
+#: ref-filter.c:1687
 #, c-format
 msgid "malformed object name %s"
 msgstr "неправильное имя объекта %s"
 
-#: remote.c:745
+#: remote.c:746
 #, c-format
 msgid "Cannot fetch both %s and %s to %s"
 msgstr "Нельзя извлечь одновременно %s и %s в %s"
 
-#: remote.c:749
+#: remote.c:750
 #, c-format
 msgid "%s usually tracks %s, not %s"
 msgstr "%s обычно отслеживает %s, а не %s"
 
-#: remote.c:753
+#: remote.c:754
 #, c-format
 msgid "%s tracks both %s and %s"
 msgstr "%s отслеживает и %s и %s"
 
-#: remote.c:761
+#: remote.c:762
 msgid "Internal error"
 msgstr "Внутренняя ошибка"
 
@@ -1300,1976 +2420,1832 @@ msgstr "Ваша ветка базируется на «%s», но вышест
 msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
 msgstr "(для исправления запустите «git branch --unset-upstream»)\n"
 
-#: remote.c:2080
-#, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Ваша ветка обновлена в соответствии с «%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] "Ваша ветка опережает «%s» на %d коммит.\n"
-msgstr[1] "Ваша ветка опережает «%s» на %d коммита.\n"
-msgstr[2] "Ваша ветка опережает «%s» на %d коммитов.\n"
-msgstr[3] "Ваша ветка опережает «%s» на %d коммитов.\n"
-
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (используйте «git push», чтобы опубликовать ваши локальные коммиты)\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] "Ваша ветка отстает от «%s» на %d коммит и может быть перемотана вперед.\n"
-msgstr[1] "Ваша ветка отстает от «%s» на %d коммита и может быть перемотана вперед.\n"
-msgstr[2] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
-msgstr[3] "Ваша ветка отстает от «%s» на %d коммитов и может быть перемотана вперед.\n"
-
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (используйте «git pull», чтобы обновить вашу локальную ветку)\n"
-
-#: remote.c:2104
-#, 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"
-msgstr[2] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
-msgstr[3] "Ваша ветка и «%s» разделились\nи теперь имеют %d и %d разных коммитов в каждой соответственно.\n"
-
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (используйте «git pull», чтобы слить внешнюю ветку в вашу)\n"
-
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "похоже, ваша текущая ветка повреждена"
-
-#: revision.c:2134
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "ваша текущая ветка «%s» еще не содержит ни одного коммита"
-
-#: revision.c:2328
-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:295
-msgid "failed to sign the push certificate"
-msgstr "сбой подписания сертификата отправки"
-
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
-
-#: send-pack.c:406
-msgid ""
-"not sending a push certificate since the receiving end does not support "
-"--signed push"
-msgstr "не отправляем сертификат для отправки, так как принимающая сторона не поддерживает отправку с опцией --signed"
-
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "принимающая сторона не поддерживает отправку с опцией --atomic"
-
-#: 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 <пути>»"
-
-#: 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»"
-
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
-#, c-format
-msgid "Could not write to %s"
-msgstr "Не удалось записать в %s"
-
-#: sequencer.c:193
-#, 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 "Сделайте коммит или спрячьте ваши изменения для продолжения."
-
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
-#, 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"
-
-#: sequencer.c:390
-#, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Не удалось разобрать коммит %s\n"
-
-#: sequencer.c:395
-#, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Не удалось разобрать родительскую коммит %s\n"
-
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Ваш файл индекса не слит."
-
-#: sequencer.c:479
-#, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "Коммит %s — это коммит-слияние, но опция -m не указана."
-
-#: sequencer.c:487
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "У коммита %s нет предка %d"
-
-#: sequencer.c:491
-#, 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:504
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: не удалось разобрать родительский коммит для %s"
-
-#: sequencer.c:508
-#, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Не удалось получить сообщение коммита для %s"
-
-#: sequencer.c:594
-#, c-format
-msgid "could not revert %s... %s"
-msgstr "не удалось возвратить коммит %s… %s"
-
-#: sequencer.c:595
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "не удалось применить коммит %s… %s"
-
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "передан пустой набор коммитов"
-
-#: sequencer.c:638
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: сбой чтения индекса"
-
-#: sequencer.c:642
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: сбой обновления индекса"
-
-#: sequencer.c:702
-#, c-format
-msgid "Cannot %s during a %s"
-msgstr "Не удалось %s во время %s"
-
-#: sequencer.c:724
-#, c-format
-msgid "Could not parse line %d."
-msgstr "Не удалось разобрать строку %d."
-
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Коммиты не разобраны."
-
-#: sequencer.c:741
-#, c-format
-msgid "Could not open %s"
-msgstr "Не удалось открыть %s"
-
-#: sequencer.c:745
-#, c-format
-msgid "Could not read %s."
-msgstr "Не удалось прочитать %s."
-
-#: sequencer.c:752
-#, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Непригодная для использования карта с инструкциями: %s"
-
-#: sequencer.c:782
-#, c-format
-msgid "Invalid key: %s"
-msgstr "Недействительный ключ: %s"
-
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
-#, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Неправильное значение %s: %s"
-
-#: sequencer.c:795
-#, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Повреждённая карта с опциями: %s"
-
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "отбор лучшего или возврат коммита уже выполняется"
-
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "попробуйте «git cherry-pick (--continue | --quit | --abort)»"
-
-#: sequencer.c:819
-#, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Не удалось создать каталог для указателя следования коммитов %s"
-
-#: sequencer.c:835 sequencer.c:917
-#, c-format
-msgid "Error wrapping up %s."
-msgstr "Ошибка оборачивания %s."
-
-#: sequencer.c:854 sequencer.c:987
-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 "нельзя отменить изменения с ветки, которая еще не создана"
-
-#: sequencer.c:878 builtin/apply.c:4287
-#, c-format
-msgid "cannot open %s: %s"
-msgstr "не удалось открыть %s: %s"
-
-#: sequencer.c:881
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "не удалось прочитать %s: %s"
-
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "неожиданный конец файла"
-
-#: sequencer.c:888
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "сохраненный файл с HEAD перед отбором лучшего «%s» поврежден"
-
-#: sequencer.c:910
-#, c-format
-msgid "Could not format %s."
-msgstr "Не удалось отформатировать %s."
-
-#: sequencer.c:1055
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: не удалось отобрать %s"
-
-#: sequencer.c:1058
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s: плохая редакция"
-
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "Нельзя возвратить изначальный коммит"
-
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Нельзя отобрать лучшее в пустую ветку"
-
-#: setup.c:246
-#, c-format
-msgid "failed to read %s"
-msgstr "не удалось прочитать %s"
-
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
-
-#: sha1_file.c:2459
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "сдвиг до начала индекса пакета для %s (повреждён индекс?)"
-
-#: sha1_file.c:2463
-#, 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"
-"\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»"
-
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
-
-#: submodule.c:66 submodule.c:100
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "Не удалось найти раздел в .gitmodules, где путь равен %s"
-
-#: submodule.c:74
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr " Не удалось обновить .gitmodules запись %s"
-
-#: submodule.c:107
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Не удалось удалить запись в .gitmodules для %s"
-
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "сбой индексирования обновленного .gitmodules"
-
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "сбой при запуске команды завершителя «%s»"
-
-#: 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 "неизвестное значение «%s» для ключа «%s»"
-
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "больше одного %s"
-
-#: 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:203
-msgid "Checking out files"
-msgstr "РаÑ\81паковка Ñ\84айлов"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "опÑ\86иÑ\8e --first-parent Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно Ñ\81 --bisect"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "Неправильная имя URL схемы или пропущен суффикс «://»"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "сбой открытия /dev/null"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: run-command.c:108
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "неправильная управляющая последовательность %XX"
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) сбой"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "пропущено имя сервера и схема доступа не «file:»"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "сбой подписания сертификата отправки"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "URL со схемой «file:» не может содержать номер порта"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "принимающая сторона не поддерживает отправку с опцией --signed"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "неправильные символы в имени сервера"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support "
+"--signed push"
+msgstr "не отправляем сертификат для отправки, так как принимающая сторона не поддерживает отправку с опцией --signed"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "непÑ\80авилÑ\8cнÑ\8bй Ð½Ð¾Ð¼ÐµÑ\80 Ð¿Ð¾Ñ\80Ñ\82а"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "пÑ\80инимаÑ\8eÑ\89аÑ\8f Ñ\81Ñ\82оÑ\80она Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¾Ñ\82пÑ\80авкÑ\83 Ñ\81 Ð¾Ð¿Ñ\86ией --atomic"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð¿Ñ\83Ñ\82и Â«..»"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "пÑ\80инимаÑ\8eÑ\89аÑ\8f Ñ\81Ñ\82оÑ\80она Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82 Ð¾Ñ\82пÑ\80авкÑ\83 Ñ\81 Ð¾Ð¿Ñ\86иÑ\8fми"
 
-#: wrapper.c:222 wrapper.c:381
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "не удалось открыть «%s» для чтения и записи"
+#: sequencer.c:171
+msgid "revert"
+msgstr "обратить изменения"
 
-#: wrapper.c:224 wrapper.c:383
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "не удалось открыть «%s» для записи"
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "копировать коммит"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ñ\87Ñ\82ениÑ\8f"
+#: sequencer.c:228
+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и>»"
 
-#: wrapper.c:611
-#, c-format
-msgid "unable to access '%s': %s"
-msgstr "«%s» недоступно: %s"
+#: sequencer.c:231
+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»"
 
-#: wrapper.c:632
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "unable to access '%s'"
-msgstr "«%s» недоступно"
-
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "не удалось получить текущий рабочий каталог"
+msgid "could not lock '%s'"
+msgstr "не удалось заблокировать «%s»"
 
-#: wrapper.c:667
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid "could not open %s for writing"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c Â«%s» Ð´Ð»Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81и"
+msgid "could not write to '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð² Â«%s»"
 
-#: wrapper.c:678 builtin/am.c:410
+#: sequencer.c:251
 #, c-format
-msgid "could not write to %s"
-msgstr "не удалось записать в %s"
+msgid "could not write eol to '%s'"
+msgstr "не удалось записать eol в «%s»"
 
-#: wrapper.c:684
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "could not close %s"
-msgstr "не удалось закрыть %s"
-
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Не слитые пути:"
+msgid "failed to finalize '%s'."
+msgstr "не удалось завершить «%s»."
 
-#: wt-status.c:176 wt-status.c:203
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
+msgid "could not read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
+#: sequencer.c:305
+#, c-format
+msgid "your local changes would be overwritten by %s."
+msgstr "ваши локальные изменения будут перезаписаны %s."
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "для продолжения закоммитьте ваши изменения или спрячьте их."
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы пометить выбранное разрешение конфликта)"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: перемотка вперед"
 
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: Не удалось записать файл индекса"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð²ÐºÐ»Ñ\8eÑ\87енÑ\8b Ð² ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82:"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\80аÑ\81познаÑ\82Ñ\8c HEAD ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82\n"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82Ñ\8c Ð´ÐµÑ\80ево ÐºÑ\8dÑ\88а\n"
 
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
+#: sequencer.c:483
+#, 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 "у вас имеются проиндексированные изменения в рабочем каталоге. Если эти изменения должны быть объеденены с предыдущим коммитом, то запустите:\n\n  git commit --amend %s\n\nЕсли же они должны быть помещены в новый коммит, то запустите:\n\n  git commit %s\n\nВ любом случае, после того как вы закончите, продолжить перемещение можно выполнив:\n\n  git rebase --continue\n"
 
-#: wt-status.c:221
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "не удалось разобрать коммит %s\n"
 
-#: wt-status.c:222
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working "
-"directory)"
-msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
+#: sequencer.c:572
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "не удалось разобрать родительский коммит %s\n"
 
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "ваш индекс не слит."
 
-#: wt-status.c:236
+#: sequencer.c:675
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
+msgid "commit %s is a merge but no -m option was given."
+msgstr "коммит %s — это коммит-слияние, но опция -m не указана."
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "оба удалены:"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "у коммита %s нет предка %d"
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "добавлено нами:"
+#: sequencer.c:687
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "основная ветка указана, но коммит %s не является слиянием."
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "удалено ими:"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: не удалось разобрать родительский коммит для %s"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "добавлено ими:"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "не удалось получить сообщение коммита для %s"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "удалено нами:"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "не удалось обратить изменения коммита %s… %s"
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "оба добавлены:"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "не удалось применить коммит %s… %s"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "оба Ð¸Ð·Ð¼ÐµÐ½Ñ\8b:"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "пеÑ\80едан Ð¿Ñ\83Ñ\81Ñ\82ой Ð½Ð°Ð±Ð¾Ñ\80 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
-#: wt-status.c:265
+#: sequencer.c:843
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "ошибка: необработанный статус не слитых изменений %x"
+msgid "git %s: failed to read the index"
+msgstr "git %s: сбой чтения индекса"
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "новый файл:"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: сбой обновления индекса"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "скопировано:"
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "неправильная строка %d: %.*s"
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "удалено:"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "коммиты не разобраны."
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "изменено:"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "не удалось прочитать «%s»."
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "переименовано:"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "непригодная для использования карта с инструкциями: «%s»"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "изменен Ñ\82ип:"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "нелÑ\8cзÑ\8f Ñ\81копиÑ\80оваÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð¾ Ð²Ñ\80емÑ\8f Ð¿Ñ\80оÑ\86еÑ\81Ñ\81а Ð¾Ð±Ñ\80аÑ\89ениÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "неизвеÑ\81Ñ\82но:"
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "нелÑ\8cзÑ\8f Ð¾Ð±Ñ\80аÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ð²Ð¾ Ð²Ñ\80емÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а."
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "не слитые:"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "недействительный ключ: %s"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "новые коммиты, "
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "неправильное значение %s: %s"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "изменено содержимое, "
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "испорченная карта с опциями: «%s»"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "неоÑ\82Ñ\81леживаемое Ñ\81одеÑ\80жимое, "
+#: 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:390
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "попробуйте «git cherry-pick (--continue | --quit | --abort)»"
+
+#: sequencer.c:1106
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "оÑ\88ибка: Ð½ÐµÐ¾Ð±Ñ\80абоÑ\82аннÑ\8bй Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ %c"
+msgid "could not create sequencer directory '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c ÐºÐ°Ñ\82алог Ð´Ð»Ñ\8f Ñ\83казаÑ\82елÑ\8f Ñ\81ледованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов Â«%s»"
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Ð\98змененнÑ\8bе, Ð½Ð¾ Ð½Ðµ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8bе Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли:"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c HEAD"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Ð\98зменениÑ\8f Ð² Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8fÑ\85, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\83дÑ\83Ñ\82 Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\87енÑ\8b:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "копиÑ\80ование Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а Ñ\83же Ð²Ñ\8bполнÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f"
 
-#: wt-status.c:837
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
-msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "не удалось определить HEAD"
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "У Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð½Ðµ Ñ\81лиÑ\82Ñ\8bе Ð¿Ñ\83Ñ\82и."
+#: 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:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (разрешите конфликты, затем запустите «git commit»)"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "не удалось открыть «%s»"
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "Все конфликты исправлены, но вы все еще в процессе слияния."
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "не удалось прочитать «%s»: %s"
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (используйте «git commit», чтобы завершить слияние)"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "неожиданный конец файла"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Вы в процессе сессии am."
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "сохраненный файл с HEAD перед копированием коммита «%s» поврежден"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "Текущий патч пустой."
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: не удалось скопировать коммит %s"
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: плохая редакция"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "нельзя возвратить изначальный коммит"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
+#: 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:1105
-msgid "No commands done."
-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:1108
+#: setup.c:223
 #, 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 ""
+"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:1119
+#: setup.c:468
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (смотрите дополнительно в файле %s)"
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Ожидаемая версия git репозитория <= %d, а обнаружена %d"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Ð\9aоманд Ð±Ð¾Ð»Ñ\8cÑ\88е Ð½Ðµ Ð¾Ñ\81Ñ\82алоÑ\81Ñ\8c."
+#: 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:1127
+#: setup.c:762
 #, 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 "Not a git repository (or any of the parent directories): %s"
+msgstr "Не найден git репозитоий (или один из его каталогов): %s"
 
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "Не удалось вернуться в текущий рабочий каталог"
 
-#: wt-status.c:1148
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Не удалось прочитать текущий рабочий каталог"
+
+#: setup.c:920
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас перемещаете ветку «%s» над «%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 "Не найден git репозитоий (или один из его каталогов вплоть до точки монтирования %s)\nОстанавливаю поиск на границе файловой системы (так как GIT_DISCOVERY_ACROSS_FILESYSTEM не установлен)."
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Вы сейчас перемещаете ветку."
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "Перейти в «%s/..»"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
+#: 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:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "путь «%s» не существует"
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "ссылаемый репозиторий «%s» не является локальным."
 
-#: wt-status.c:1181
+#: sha1_file.c:511
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки  «%s» над «%s»."
+msgid "reference repository '%s' is shallow"
+msgstr "ссылаемый репозиторий «%s» является частичным"
 
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Вы сейчас разделяете коммит при перемещении ветки."
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "ссылаемый репозиторий «%s» является сращенным"
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "сдвиг до конца файла пакета (возможно, повреждён файл .idx?)"
 
-#: wt-status.c:1193
+#: sha1_file.c:2592
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "Вы сейчас редактируете коммит при перемещении ветки  «%s» над «%s»."
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "сдвиг до начала индекса пакета для %s (повреждён индекс?)"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "Вы сейчас редактируете коммит при перемещении ветки."
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "сдвиг за пределами индекса пакета для %s (обрезан индекс?)"
 
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "сокращённый SHA1 идентификатор %s неоднозначен"
 
-#: wt-status.c:1203
-msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Возможно, вы имели в виду:"
 
-#: wt-status.c:1213
-#, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Вы сейчас отбираете лучший коммит %s."
+#: 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:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr "Не удалось изменить не слитый .gitmodules, сначала разрешите конфликты"
 
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "Не удалось найти раздел в .gitmodules, где путь равен %s"
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (используйте «git cherry-pick --abort», чтобы отменить операцию отбора лучшего)"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr " Не удалось обновить .gitmodules запись %s"
 
-#: wt-status.c:1232
+#: submodule.c:109
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 %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:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "сбой индексирования обновленного .gitmodules"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "нельзя использовать отприцательные значения для submodule.fetchJobs"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (используйте «git revert --abort», чтобы отменить операцию возврата)"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "неправильное значение %s"
 
-#: wt-status.c:1253
+#: trailer.c:238
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "Вы сейчас в процессе двоичного поиска, начатого с ветки «%s»."
+msgid "running trailer command '%s' failed"
+msgstr "сбой при запуске команды завершителя «%s»"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "Вы сейчас в процессе двоичного поиска."
+#: 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:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "больше одного %s"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "На ветке "
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "пустая последняя лексема в завершителе «%.*s»"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "интерактивное перемещение в процессе; над "
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "не удалось прочитать входной файл «%s»"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "пеÑ\80емеÑ\89ение Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е; Ð½Ð°Ð´ "
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¸Ð· Ñ\81Ñ\82андаÑ\80Ñ\82ного Ð²Ð²Ð¾Ð´Ð°"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD отделён на "
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "не удалось выполнить stat для %s"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD отделён начиная с "
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "файл %s не является обычным файлом"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Сейчас ни на одной из веток"
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "файл %s не доступен на запись пользователю"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "Ð\9dаÑ\87алÑ\8cнÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð²Ñ\80еменнÑ\8bй Ñ\84айл"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Неотслеживаемые файлы"
+#: trailer.c:983
+#, c-format
+msgid "could not rename temporary file to %s"
+msgstr "не удалось переименовать временный файл в %s"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "Игнорируемые файлы"
+#: transport.c:62
+#, c-format
+msgid "Would set upstream of '%s' to '%s' of '%s'\n"
+msgstr "Будет установлен вышестоящий репозиторий для «%s» на «%s» с «%s»\n"
+
+#: transport.c:151
+#, c-format
+msgid "transport: invalid depth option '%s'"
+msgstr "транспорт: неправильный параметр глубины «%s»"
 
-#: wt-status.c:1494
+#: transport.c:817
 #, 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 submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr "Подмодули по указанным путям содержат изменения, которые не найдены ни на одном из внешних репозиториев:\n"
 
-#: wt-status.c:1500
+#: transport.c:821
 #, c-format
-msgid "Untracked files not listed%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"
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
+#: transport.c:829
+msgid "Aborting."
+msgstr "Прерываю."
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Нет изменений"
+#: transport-helper.c:1075
+#, c-format
+msgid "Could not read ref %s"
+msgstr "Не удалось прочитать ссылку %s"
+
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "слишком  короткий объект дерева"
 
-#: wt-status.c:1513
+#: 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:64
 #, 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 ""
+"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:1516
+#: unpack-trees.c:66
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "нет изменений добавленных для коммита\n"
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при переключении на состояние:\n%%s"
 
-#: wt-status.c:1519
+#: unpack-trees.c:69
 #, 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"
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%sPlease commit your changes or stash them before you merge."
+msgstr "Ð\92аÑ\88и Ð»Ð¾ÐºÐ°Ð»Ñ\8cнÑ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ñ\83казаннÑ\8bÑ\85 Ñ\84айлаÑ\85 Ð±Ñ\83дÑ\83Ñ\82 Ð¿ÐµÑ\80езапиÑ\81анÑ\8b Ð¿Ñ\80и Ñ\81лиÑ\8fнии:\n%%sСделайÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¸Ð»Ð¸ Ñ\81пÑ\80Ñ\8fÑ\87Ñ\8cÑ\82е Ð²Ð°Ñ\88и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¿ÐµÑ\80ед Ñ\81лиÑ\8fнием Ð²ÐµÑ\82ок."
 
-#: wt-status.c:1522
+#: unpack-trees.c:71
 #, 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 merge:\n"
+"%%s"
+msgstr "Ваши локальные изменения в указанных файлах будут перезаписаны при слиянии:\n%%s"
 
-#: wt-status.c:1525
+#: unpack-trees.c:74
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
+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:1528 wt-status.c:1533
+#: unpack-trees.c:76
 #, c-format
-msgid "nothing to commit\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:1531
+#: unpack-trees.c:81
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr "Обновление указанных каталогов приведет к потере неотслеживаемых файлов в них:\n%s"
 
-#: wt-status.c:1535
+#: unpack-trees.c:85
 #, c-format
-msgid "nothing to commit, working directory clean\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:1642
-msgid "Initial commit on "
-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:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (нет ветки)"
+#: 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:1675
-msgid "gone"
-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:1677 wt-status.c:1685
-msgid "behind "
-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:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "впереди "
+#: unpack-trees.c:97
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут удалены при %s:\n%%s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: unpack-trees.c:102
 #, c-format
-msgid "failed to unlink '%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Переместите эти файлы или удалите их перед переключением веток."
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<опции>] [--] <спецификация-пути>…"
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by checkout:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при переключении на состояние:\n%%s"
 
-#: builtin/add.c:65
+#: unpack-trees.c:107
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "неожиданный статус различий %c"
+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:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "сбой при обновлении файлов"
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при слиянии:\n%%s"
 
-#: builtin/add.c:80
+#: unpack-trees.c:112
 #, c-format
-msgid "remove '%s'\n"
-msgstr "удалить «%s»\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."
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Непроиндексированные изменения после обновления индекса:"
+#: unpack-trees.c:114
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr "Указанные неотслеживаемые файлы в рабочем каталоге будут перезаписаны при %s:\n%%s"
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Не удалось прочитать индекс"
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Запись «%s» частично совпадает с «%s».  Не удалось назначить соответствие."
 
-#: builtin/add.c:205
+#: unpack-trees.c:124
 #, 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:209
-msgid "Could not write patch"
-msgstr "Не удалось записать патч"
+#: unpack-trees.c:126
+#, c-format
+msgid ""
+"The following working tree files would be overwritten by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут перезаписаны при обновлении частичного состояния:\n%s"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "сбой при редактировании патча"
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout update:\n"
+"%s"
+msgstr "Указанные файлы из рабочего каталога будут удалены при обновлении частичного состояния:\n%s"
 
-#: builtin/add.c:215
+#: unpack-trees.c:205
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat Ð´Ð»Ñ\8f Â«%s»"
+msgid "Aborting\n"
+msgstr "Ð\9fÑ\80еÑ\80Ñ\8bваÑ\8e\n"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Пустой патч. Операция прервана."
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "Распаковка файлов"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "Неправильная имя URL схемы или пропущен суффикс «://»"
 
-#: builtin/add.c:222
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80имениÑ\82Ñ\8c Â«%s»"
+msgid "invalid %XX escape sequence"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\83пÑ\80авлÑ\8fÑ\8eÑ\89аÑ\8f Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c %XX"
 
-#: 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"
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "пÑ\80опÑ\83Ñ\89ено Ð¸Ð¼Ñ\8f Ñ\81еÑ\80веÑ\80а Ð¸ Ñ\81Ñ\85ема Ð´Ð¾Ñ\81Ñ\82Ñ\83па Ð½Ðµ Â«file:»"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "пробный запуск"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "URL со схемой «file:» не может содержать номер порта"
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "быть многословнее"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "неправильные символы в имени сервера"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "инÑ\82еÑ\80акÑ\82ивнÑ\8bй Ð²Ñ\8bбоÑ\80"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "непÑ\80авилÑ\8cнÑ\8bй Ð½Ð¾Ð¼ÐµÑ\80 Ð¿Ð¾Ñ\80Ñ\82а"
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "инÑ\82еÑ\80акÑ\82ивнÑ\8bй Ð²Ñ\8bбоÑ\80 Ð±Ð»Ð¾ÐºÐ¾Ð²"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ñ\87аÑ\81Ñ\82Ñ\8c Ð¿Ñ\83Ñ\82и Â«..»"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "отредактировать текущий файл различий и применить его"
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "не удалось прочитать «%s»"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "разрешить добавление игнорируемых иначе файлов"
+#: wrapper.c:222 wrapper.c:392
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "не удалось открыть «%s» для чтения и записи"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "обновить отслеживаемые файлы"
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "не удалось открыть «%s» для записи"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-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:258
-msgid "add changes from all tracked and untracked files"
-msgstr "добавить изменения из всех отслеживаемых и неотслеживаемых файлов"
+#: wrapper.c:605 wrapper.c:626
+#, c-format
+msgid "unable to access '%s'"
+msgstr "«%s» недоступно"
 
-#: builtin/add.c:261
-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)"
+#: 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:263
-msgid "don't add, only refresh the index"
-msgstr "не добавлять, только обновить индекс"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "не удалось записать в %s"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr "пропускать файлы, которые не могут быть добавлены из-за ошибок"
+#: wrapper.c:660
+#, c-format
+msgid "could not close %s"
+msgstr "не удалось закрыть %s"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "удостовериться, что даже недостающие файлы будут проигнорированы при  пробном запуске"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Не слитые пути:"
 
-#: builtin/add.c:287
+#: wt-status.c:178 wt-status.c:205
 #, 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 "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (используйте «git reset %s <файл>…», чтобы убрать из индекса)"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A и -u нельзя использовать одновременно"
+#: wt-status.c:180 wt-status.c:207
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Опция --ignore-missing может использоваться только вместе с --dry-run"
+#: wt-status.c:184
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/add.c:352
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Ничего не указано, ничего не добавлено.\n"
+#: 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:353
-#, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Возможно, вы имели в виду «git add .»?\n"
+#: wt-status.c:188
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (используйте «git rm <файл>…», чтобы пометить разрешение конфликта)"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "файл индекса поврежден"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Изменения, которые будут включены в коммит:"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 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:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Ð\98зменениÑ\8f, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð² Ð¸Ð½Ð´ÐµÐºÑ\81е Ð´Ð»Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
-#, c-format
-msgid "could not read '%s'"
-msgstr "не удалось прочитать «%s»"
+#: wt-status.c:221
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add <файл>…», чтобы добавить файл в индекс)"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "не удалось разобрать сценарий авторства"
+#: wt-status.c:223
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (используйте «git add/rm <файл>…», чтобы добавить или удалить файл из индекса)"
 
-#: builtin/am.c:507
-#, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "«%s» был удален перехватчиком applypatch-msg"
+#: wt-status.c:224
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working "
+"directory)"
+msgstr "  (используйте «git checkout -- <файл>…», чтобы отменить изменения\n   в рабочем каталоге)"
 
-#: builtin/am.c:548 builtin/notes.c:300
-#, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Неправильная строка ввода: «%s»."
+#: wt-status.c:226
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr "  (сделайте коммит или отмените изменения в неотслеживаемом или измененном содержимом в подмодулях)"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: wt-status.c:238
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Не удалось скопировать заметку из «%s» в «%s»"
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (используйте «git %s <файл>…», чтобы добавить в то, что будет включено в коммит)"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "сбой при выполнении fseek"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "оба удалены:"
 
-#: builtin/am.c:772 builtin/am.c:860
-#, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "не удалось открыть «%s» для чтения: %s"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "добавлено нами:"
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "не удалось открыть «%s» для записи: %s"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "удалено ими:"
 
-#: builtin/am.c:788
-#, c-format
-msgid "could not parse patch '%s'"
-msgstr "не удалось разобрать патч «%s»"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "добавлено ими:"
 
-#: builtin/am.c:853
-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:901
-msgid "invalid timestamp"
-msgstr "недопÑ\83Ñ\81Ñ\82имаÑ\8f Ð¼ÐµÑ\82ка Ð´Ð°Ñ\82Ñ\8b/вÑ\80емени"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "оба Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b:"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "недопÑ\83Ñ\81Ñ\82имаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð´Ð°Ñ\82Ñ\8b"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "оба Ð¸Ð·Ð¼ÐµÐ½Ñ\8b:"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "недопÑ\83Ñ\81Ñ\82имое Ñ\81меÑ\89ение Ñ\87аÑ\81ового Ð¿Ð¾Ñ\8fÑ\81а"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "новÑ\8bй Ñ\84айл:"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Сбой определения формата патча."
+#: wt-status.c:277
+msgid "copied:"
+msgstr "скопировано:"
 
-#: builtin/am.c:1001 builtin/clone.c:378
-#, 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 "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\80азделиÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87и Ð½Ð° Ñ\87аÑ\81Ñ\82и."
+#: wt-status.c:281
+msgid "modified:"
+msgstr "изменено:"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ð¸Ð½Ð´ÐµÐºÑ\81"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "пеÑ\80еименовано:"
 
-#: 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 "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\83Ñ\81Ñ\82. Ð\92озможно, Ð¾Ð½ Ð±Ñ\8bл Ð½ÐµÐ¿Ñ\80авилÑ\8cно Ñ\80азделÑ\91н?"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "новÑ\8bе ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b"
 
-#: builtin/am.c:1402 builtin/log.c:1350
-#, 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:1631
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "Ð\92 Ñ\80епозиÑ\82оÑ\80ии Ð¾Ñ\82Ñ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\82 Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bе Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð½ÐµÐ¾Ð±Ñ\85одимÑ\8bе Ð´Ð»Ñ\8f Ð¾Ñ\82каÑ\82а Ðº Ñ\82Ñ\80еÑ\85Ñ\85одовомÑ\83 Ñ\81лиÑ\8fниÑ\8e."
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Ð\98змененнÑ\8bе, Ð½Ð¾ Ð½Ðµ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\8bе Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли:"
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Использую индекс для реконструкции базового дерева…"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Изменения в подмодулях, которые будут закоммичены:"
 
-#: builtin/am.c:1652
+#: wt-status.c:901
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
-msgstr "Вы вручную изменяли патч?\nОн не накладывается без ошибок на двоичные объекты, записанные в его заголовке."
-
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr "Не трогайте строку выше этой.\nВсё, что ниже — будет удалено."
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ñ\81лиÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f."
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "У Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð½Ðµ Ñ\81лиÑ\82Ñ\8bе Ð¿Ñ\83Ñ\82и."
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree не удалось записать дерево"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (разрешите конфликты, затем запустите «git commit»)"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "применение к пустой истории"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (используйте «git merge --abort», чтобы остановить операцию слияния)"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "сбой записи объекта коммита"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Все конфликты исправлены, но вы все еще в процессе слияния."
 
-#: builtin/am.c:1749 builtin/am.c:1753
-#, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "нельзя продолжнить: %s не существует "
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (используйте «git commit», чтобы завершить слияние)"
 
-#: builtin/am.c:1769
-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: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:1774
-msgid "Commit Body is:"
-msgstr "Тело ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а:"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "ТекÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87 Ð¿Ñ\83Ñ\81Ñ\82ой."
 
-#. 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:1784
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "Применить? [y] - да/[n] - нет/[e] - редактировать/[v] - просмотреть патч/[a] - применить всё: "
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git am --continue»)"
 
-#: builtin/am.c:1834
-#, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Индекс не пустой: нельзя применять патчи (в индексе: %s)"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (используйте «git am --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:1869 builtin/am.c:1941
-#, c-format
-msgid "Applying: %.*s"
-msgstr "Применение: %.*s"
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (используйте «git am --abort», чтобы восстановить оригинальную ветку)"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Ð\9dеÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ â\80\94 Ð\9fаÑ\82Ñ\87 Ñ\83же Ð¿Ñ\80именен."
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Ð\9aомандÑ\8b Ð½Ðµ Ð²Ñ\8bполненÑ\8b."
 
-#: builtin/am.c:1893
+#: wt-status.c:1175
 #, 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 команды выполнено):"
+msgstr[2] "Последняя команда выполнена (%d команд выполнено):"
+msgstr[3] "Последняя команда выполнена (%d команд выполнено):"
 
-#: builtin/am.c:1899
+#: wt-status.c:1186
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "Копию изменений, которые не удалось применить, вы можете найти в: %s"
-
-#: builtin/am.c:1944
-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Если ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
+msgid "  (see more in file %s)"
+msgstr "  (смотрите дополнительно в файле %s)"
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr "У вас все еще имеются не слитые пути в индексе.\nВозможно, вы забыли вызвать «git add»?"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Команд больше не осталось."
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: wt-status.c:1194
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Не удалось разобрать объект «%s»."
-
-#: builtin/am.c:2111
-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 команды осталось):"
+msgstr[2] "Следующая команда для выполнения (%d команд осталось):"
+msgstr[3] "Следующая команда для выполнения (%d команд осталось):"
 
-#: builtin/am.c:2145
-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:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (используйте «git rebase --edit-todo», чтобы просмотреть и изменить)"
 
-#: builtin/am.c:2206
+#: wt-status.c:1215
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Неправильное значение для --patch-format: %s"
-
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<опции>] [(<mbox>|<Maildir>)…]"
-
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<опции>] (--continue | --skip | --abort)"
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас перемещаете ветку «%s» над «%s»."
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "запÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ð² Ð¸Ð½Ñ\82еÑ\80акÑ\82ивном Ñ\80ежиме"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð¿ÐµÑ\80емеÑ\89аеÑ\82е Ð²ÐµÑ\82кÑ\83."
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "историческая опция — ничего не делает"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git rebase --continue»)"
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (используйте «git rebase --skip», чтобы пропустить этот патч)"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "тихий режим"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (используйте «git rebase --abort», чтобы перейти на оригинальную ветку)"
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
-msgstr "добавить строку Signed-off-by к сообщению коммита"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git rebase --continue»)"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "перекодировать в utf8 (по умолчанию)"
+#: 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:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -k Ð² git-mailinfo"
+#: 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:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "передать флаг -b в git-mailinfo"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "(Как только ваш рабочий каталог будет чистый, запустите «git rebase --continue»)"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "передать флаг -m в git-mailinfo"
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "Вы сейчас редактируете коммит при перемещении ветки  «%s» над «%s»."
 
-#: builtin/am.c:2264
-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: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:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "не передавать --keep-cr флаг в git-mailsplit вне зависимости от am.keepcr"
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (используйте «git commit --amend», чтобы исправить текущий коммит)"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "обрезать все до строки обрезки"
+#: wt-status.c:1270
+msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (используйте «git rebase --continue», когда будете довольны изменениями)"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "действие"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Вы копируете коммит %s."
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "передать его в git-apply"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "корень"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git cherry-pick --continue»)"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "путь"
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (используйте «git cherry-pick --abort», чтобы отменить копирования коммита)"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Вы сейчас обращаете изменения коммита %s."
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "количество"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (разрешите конфликты, затем запустите «git revert --continue»)"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "формат"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (все конфликты разрешены: запустите «git revert --continue»)"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "формат, в котором находятся патчи"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "переопределить сообщение об ошибке, если не удалось наложить изменения"
+#: wt-status.c:1320
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "Вы сейчас в процессе двоичного поиска, начатого с ветки «%s»."
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ñ\80именение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð¿Ð¾Ñ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84иликÑ\82а"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Ð\92Ñ\8b Ñ\81ейÑ\87аÑ\81 Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð´Ð²Ð¾Ð¸Ñ\87ного Ð¿Ð¾Ð¸Ñ\81ка."
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "синоним для --continue"
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (используйте «git bisect reset», чтобы вернуться на исходную ветку)"
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "пÑ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "Ð\9dа Ð²ÐµÑ\82ке "
 
-#: builtin/am.c:2313
-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:1530
+msgid "interactive rebase in progress; onto "
+msgstr "инÑ\82еÑ\80акÑ\82ивное Ð¿ÐµÑ\80емеÑ\89ение Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е; Ð½Ð°Ð´ "
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "соврать о дате коммитера"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "перемещение в процессе; над "
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "использовать текущее время как время авторства"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD отделён на "
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "key-id"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD отделён начиная с "
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "подпиÑ\81аÑ\82Ñ\8c ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8b Ñ\81 Ð¿Ð¾Ð¼Ð¾Ñ\89Ñ\8cÑ\8e GPG"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "СейÑ\87аÑ\81 Ð½Ð¸ Ð½Ð° Ð¾Ð´Ð½Ð¾Ð¹ Ð¸Ð· Ð²ÐµÑ\82ок"
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(внутреннее использование для git-rebase)"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Начальный коммит"
 
-#: builtin/am.c:2340
-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. Пожалуйста, не используйте ее."
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Неотслеживаемые файлы"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "сбой чтения индекса"
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Игнорируемые файлы"
 
-#: builtin/am.c:2362
+#: wt-status.c:1580
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
+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:2386
+#: wt-status.c:1586
 #, c-format
-msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
-msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
+msgid "Untracked files not listed%s"
+msgstr "Неотслеживаемые файлы не показаны%s"
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Операция разрешения конфликтов не в процессе выполнения, не продолжаем."
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr "(используйте опцию «-u», чтобы показать неотслеживаемые файлы)"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<опции>] [<патч>…]"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Нет изменений"
 
-#: builtin/apply.c:111
+#: wt-status.c:1599
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "неопознанная опция для пробелов «%s»"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr "нет изменений добавленных для коммита\n(используйте «git add» и/или «git commit -a»)\n"
 
-#: builtin/apply.c:126
+#: wt-status.c:1602
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "неопознанная опция для игнорирования пробелов «%s»"
+msgid "no changes added to commit\n"
+msgstr "нет изменений добавленных для коммита\n"
 
-#: builtin/apply.c:818
+#: wt-status.c:1605
 #, c-format
-msgid "Cannot prepare timestamp regexp %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:827
+#: wt-status.c:1608
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec возвратил %d для ввода: %s"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "ничего не добавлено в коммит, но есть неотслеживаемые файлы\n"
 
-#: builtin/apply.c:908
+#: wt-status.c:1611
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "не удалось найти имя файла в строке патча %d"
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "нечего коммитить (создайте/скопируйте файлы, затем запустите «git add», чтобы отслеживать их)\n"
 
-#: builtin/apply.c:940
+#: wt-status.c:1614 wt-status.c:1619
 #, 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"
+msgid "nothing to commit\n"
+msgstr "нечего коммитить\n"
 
-#: builtin/apply.c:944
+#: wt-status.c:1617
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся новое имя файла на строке %d"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "нечего коммитить (используйте опцию «-u», чтобы показать неотслеживаемые файлы)\n"
 
-#: builtin/apply.c:945
+#: wt-status.c:1621
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply: плохой git-diff — не согласующееся старое имя файла на строке %d"
+msgid "nothing to commit, working tree clean\n"
+msgstr "нечего коммитить, нет изменений в рабочем каталоге\n"
+
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Начальный коммит на "
+
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (нет ветки)"
+
+#: wt-status.c:1761
+msgid "gone"
+msgstr "исчез"
+
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "позади"
 
-#: builtin/apply.c:952
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "впереди "
+
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply: плохой git-diff  — ожидалось /dev/null на строке %d"
+msgid "cannot %s: You have unstaged changes."
+msgstr "не удалось выполнить %s: У вас есть непроиндексированные изменения."
+
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "к тому же, в вашем индексе есть незакоммиченные изменения."
 
-#: builtin/apply.c:1415
+#: wt-status.c:2278
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: не ожидаемая строка: %.*s"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "не удалось выполнить %s: В вашем индексе есть незакоммиченные изменения."
 
-#: builtin/apply.c:1472
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "Ñ\84Ñ\80агменÑ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð±ÐµÐ· Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
+msgid "failed to unlink '%s'"
+msgstr "Ñ\81бой Ð¾Ñ\82Ñ\81оединениÑ\8f Â«%s»"
 
-#: builtin/apply.c:1489
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<опции>] [--] <спецификация-пути>…"
+
+#: builtin/add.c:80
 #, 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)"
+msgid "unexpected diff status %c"
+msgstr "неожиданный статус различий %c"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "новый файл зависит от старого содержимого"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "сбой при обновлении файлов"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-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:840
+msgid "Could not read the index"
+msgstr "Не удалось прочитать индекс"
 
-#: builtin/apply.c:1683
+#: builtin/add.c:220
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "патч поврежден на строке %d"
+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/apply.c:1719
+#: builtin/add.c:230
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "новый файл %s зависит от старого содержимого"
+msgid "Could not stat '%s'"
+msgstr "Не удалось выполнить stat для «%s»"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Пустой патч. Операция прервана."
 
-#: builtin/apply.c:1721
+#: builtin/add.c:237
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "удаленный файл %s все еще имеет содержимое"
+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: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/add.c:269
+msgid "interactive picking"
+msgstr "интерактивный выбор"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 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:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "переопределить бит выполнения на указанных файлах"
+
+#: builtin/add.c:305
+#, c-format
+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:1724
+#: builtin/add.c:359
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** предупреждение: файл %s становится пустым, но не удаляется"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "параметр --chmod «%s» должен быть -x или +x"
 
-#: builtin/apply.c:1870
+#: builtin/add.c:374
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "повÑ\80ежденнÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d: %.*s"
+msgid "Nothing specified, nothing added.\n"
+msgstr "Ð\9dиÑ\87его Ð½Ðµ Ñ\83казано, Ð½Ð¸Ñ\87его Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾.\n"
 
-#: builtin/apply.c:1899
+#: builtin/add.c:375
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "неопознаннÑ\8bй Ð´Ð²Ð¾Ð¸Ñ\87нÑ\8bй Ð¿Ð°Ñ\82Ñ\87 Ð½Ð° Ñ\81Ñ\82Ñ\80оке %d"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Ð\92озможно, Ð²Ñ\8b Ð¸Ð¼ÐµÐ»Ð¸ Ð² Ð²Ð¸Ð´Ñ\83 Â«git add .»?\n"
 
-#: builtin/apply.c:2050
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "патч с мусором на строке %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:2140
-#, c-format
-msgid "unable to read symlink %s"
-msgstr "не удалось прочитать символьную ссылку %s"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "не удалось разобрать сценарий авторства"
 
-#: builtin/apply.c:2144
+#: builtin/am.c:491
 #, c-format
-msgid "unable to open or read %s"
-msgstr "не удалось открыть или прочесть %s"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "«%s» был удален перехватчиком applypatch-msg"
 
-#: builtin/apply.c:2777
+#: builtin/am.c:532
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "непÑ\80авилÑ\8cное Ð½Ð°Ñ\87ало Ñ\81Ñ\82Ñ\80оки: Â«%c»"
+msgid "Malformed input line: '%s'."
+msgstr "Ð\9dепÑ\80авилÑ\8cнаÑ\8f Ñ\81Ñ\82Ñ\80ока Ð²Ð²Ð¾Ð´Ð°: Â«%s»."
 
-#: builtin/apply.c:2896
+#: builtin/am.c:569
 #, 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 "Failed to copy notes from '%s' to '%s'"
+msgstr "Не удалось скопировать заметку из «%s» в «%s»"
 
-#: builtin/apply.c:2908
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Контекст сужен до (%ld/%ld), чтобы применить фрагмент на %d строке"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "сбой при выполнении fseek"
 
-#: builtin/apply.c:2914
+#: builtin/am.c:775
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr "при поиске:\n%.*s"
+msgid "could not parse patch '%s'"
+msgstr "не удалось разобрать патч «%s»"
 
-#: builtin/apply.c:2934
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "пропущены данные двоичного патча для «%s»"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Только серия патчей StGIT может быть применена за раз"
 
-#: builtin/apply.c:3035
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "не удалось применить двоичный патч к «%s»"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "недопустимая метка даты/времени"
 
-#: builtin/apply.c:3041
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "после применения двоичного патча для «%s» был получен неправильный результат (ожидалось %s, получено %s)"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "недопустимая строка даты"
 
-#: builtin/apply.c:3062
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "ошибка применения изменений: %s:%ld"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "недопустимое смещение часового пояса"
 
-#: builtin/apply.c:3186
-#, c-format
-msgid "cannot checkout %s"
-msgstr "не удалось перейти на %s"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Сбой определения формата патча."
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "read of %s failed"
-msgstr "оÑ\88ибка Ñ\87Ñ\82ениÑ\8f %s"
+msgid "failed to create directory '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c ÐºÐ°Ñ\82алог Â«%s»"
 
-#: builtin/apply.c:3239
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "чтение из «%s» за символической ссылкой"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Не удалось разделить патчи на части."
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "путь %s был переименован/удален"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "не удалось записать индекс"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: 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:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: 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:3357 builtin/apply.c:3511
+#: 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:3459
-msgid "removal patch leaves file contents"
-msgstr "паÑ\82Ñ\87 Ñ\83далениÑ\8f Ð½Ðµ Ñ\83далил Ñ\81одеÑ\80жимое Ñ\84айла"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Ð\9fаÑ\82Ñ\87 Ð¿Ñ\83Ñ\81Ñ\82. Ð\92озможно, Ð¾Ð½ Ð±Ñ\8bл Ð½ÐµÐ¿Ñ\80авилÑ\8cно Ñ\80азделÑ\91н?"
 
-#: builtin/apply.c:3528
+#: 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:3530
+#: 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:3689 builtin/apply.c:3691
-#, 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 "В репозитории отсутствуют двоичные объекты, необходимые для отката к трехходовому слиянию."
 
-#: builtin/apply.c:3746
-#, 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:3749
-#, 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:3769
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o)"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "Откат к применению изменений к базовому коммиту с помощью трехходового слияния…"
 
-#: builtin/apply.c:3774
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr "новый режим доступа (%o) для %s не соответствует старому режиму доступа (%o) для %s"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Не удалось слить изменения."
 
-#: builtin/apply.c:3794
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "затронутый файл «%s» находится за символической ссылкой"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree не удалось записать дерево"
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: не удалось применить патч"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "применение к пустой истории"
 
-#: builtin/apply.c:3812
-#, c-format
-msgid "Checking patch %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:3905 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 "сбой make_cache_entry для пути «%s»"
+msgid "cannot resume: %s does not exist."
+msgstr "нельзя продолжнить: %s не существует "
 
-#: builtin/apply.c:4048
-#, 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 "не удалось использовать интерактивное поведение, без stdin подключенного к терминалу."
 
-#: builtin/apply.c:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "поврежденный патч для подмодуля %s"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Тело коммита:"
 
-#: builtin/apply.c:4081
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "не удалось выполнить stat для созданного файла «%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:4086
+#: builtin/am.c:1824
 #, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð²Ñ\81помогаÑ\82елÑ\8cнÑ\8bй Ñ\84айл Ð´Ð»Ñ\8f Ñ\81озданного Ñ\84айла %s"
+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:4089 builtin/apply.c:4197
+#: builtin/am.c:1861 builtin/am.c:1933
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ñ\81оздаÑ\82Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð² ÐºÑ\8dÑ\88е Ð´Ð»Ñ\8f %s"
+msgid "Applying: %.*s"
+msgstr "Ð\9fÑ\80именение: %.*s"
 
-#: builtin/apply.c:4122
-#, c-format
-msgid "closing file '%s'"
-msgstr "закрытие файла «%s»"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Нет изменений — Патч уже применен."
 
-#: builtin/apply.c:4171
+#: builtin/am.c:1885
 #, 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 "Patch failed at %s %.*s"
+msgstr "Ð\9eÑ\88ибка Ð¿Ñ\80именениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð½Ð° %s %.*s"
 
-#: builtin/apply.c:4258
+#: builtin/am.c:1891
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Ð\9fаÑ\82Ñ\87 %s Ð¿Ñ\80именен Ð±ÐµÐ· Ð¾Ñ\88ибок."
+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"
 
-#: builtin/apply.c:4266
-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Если ничего не осталось для индексации, то, скорее всего, что-то другое уже сделало те же изменения; возможно, вам следует пропустить этот патч."
 
-#: builtin/apply.c:4269
-#, 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 отказами…"
+#: 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:4279
+#: 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 "усечение имени .rej файла до %.*s.rej"
+msgid "Could not parse object '%s'."
+msgstr "Не удалось разобрать объект «%s»."
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Блок №%d применен без ошибок."
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "не удалось очистить индекс"
 
-#: builtin/apply.c:4303
-#, c-format
-msgid "Rejected hunk #%d."
-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 "Похоже, что вы переместили HEAD с момента последней ошибки выполнения «am».\nПеремотка на ORIG_HEAD не выполняется"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "не распознанный ввод"
+#: builtin/am.c:2200
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Неправильное значение для --patch-format: %s"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "не удалось прочитать файл индекса"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<опции>] [(<mbox> | <Maildir>)…]"
 
-#: builtin/apply.c:4507
-msgid "don't apply changes matching the given path"
-msgstr "не применять изменения по указанному пути"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<опции>] (--continue | --skip | --abort)"
 
-#: builtin/apply.c:4510
-msgid "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:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "удалить <количество> ведущих косых черт из традиционных путей списка изменений"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "историческая опция — ничего не делает"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "игнорировать добавления, сделанные этим патчем"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "разрешить откатиться к трехходовому слиянию, если нужно"
 
-#: builtin/apply.c:4518
-msgid "instead of applying the patch, output diffstat for the input"
-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:4522
-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: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 "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: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, see if the patch is applicable"
-msgstr "вмеÑ\81Ñ\82о Ð¿Ñ\80именениÑ\8f Ð¿Ð°Ñ\82Ñ\87а Ð¿Ñ\80овеÑ\80иÑ\82Ñ\8c Ð¿Ð¾Ð´Ñ\85одиÑ\82 Ð»Ð¸ Ð¾Ð½"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "пеÑ\80едаÑ\82Ñ\8c Ñ\84лаг -k Ð² git-mailinfo"
 
-#: builtin/apply.c:4528
-msgid "make sure the patch is applicable to the current index"
-msgstr "проверить, что патч применяется к текущему индексу"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "передать флаг -b в git-mailinfo"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "применить патч, не изменяя рабочий каталог"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "передать флаг -m в git-mailinfo"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-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 "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: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 "attempt three-way merge if a patch does not apply"
-msgstr "попÑ\8bÑ\82аÑ\82Ñ\8cÑ\81Ñ\8f Ñ\81делаÑ\82Ñ\8c Ñ\82Ñ\80еÑ\85Ñ\85одовое Ñ\81лиÑ\8fние, ÐµÑ\81ли Ð¿Ð°Ñ\82Ñ\87 Ð½Ðµ Ð¿Ñ\80именÑ\8fеÑ\82Ñ\81Ñ\8f"
+#: 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 "build a temporary index based on embedded index information"
-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:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-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
-msgid "ensure at least <n> lines of context match"
-msgstr "удостовериться, что по крайней мере <n> строк контекста совпадают"
+#: 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 "detect new or modified lines that have whitespace errors"
-msgstr "определять новые или модифицированные строки, у которых есть ошибки в пробельных символах"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "формат, в котором находятся патчи"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "игноÑ\80иÑ\80оваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð¿Ñ\80обелÑ\8cнÑ\8bÑ\85 Ñ\81имволаÑ\85 Ð¿Ñ\80и Ð¿Ð¾Ð¸Ñ\81ке ÐºÐ¾Ð½Ñ\82екÑ\81Ñ\82а"
+#: 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:4554
-msgid "apply the patch in reverse"
-msgstr "пÑ\80имениÑ\82Ñ\8c Ð¿Ð°Ñ\82Ñ\87 Ñ\81 Ð¾Ð±Ñ\80аÑ\89ением Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ñ\80именение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð¿Ð¾Ñ\81ле Ñ\80азÑ\80еÑ\88ениÑ\8f ÐºÐ¾Ð½Ñ\84иликÑ\82а"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "не ожидать как минимум одной строки контекста"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "синоним для --continue"
 
-#: builtin/apply.c:4558
-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:2304
+msgid "skip the current patch"
+msgstr "пÑ\80опÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ий Ð¿Ð°Ñ\82Ñ\87"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "разрешить перекрывающиеся блоки изменений"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "восстановить оригинальную ветку и отменить операцию применения изменений."
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82но Ð¾Ð¿Ñ\80еделеннÑ\8bе Ð¿Ñ\80опÑ\83Ñ\89еннÑ\8bе Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bе Ñ\81Ñ\82Ñ\80оки Ð² ÐºÐ¾Ð½Ñ\86е Ñ\84айла"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "Ñ\81овÑ\80аÑ\82Ñ\8c Ð¾ Ð´Ð°Ñ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82еÑ\80а"
 
-#: builtin/apply.c:4566
-msgid "do not trust the line counts in the hunk headers"
-msgstr "не Ð´Ð¾Ð²ÐµÑ\80Ñ\8fÑ\82Ñ\8c ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82вÑ\83 Ñ\81Ñ\82Ñ\80ок Ð¸Ð· Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Ð±Ð»Ð¾ÐºÐ° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "иÑ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82екÑ\83Ñ\89ее Ð²Ñ\80емÑ\8f ÐºÐ°Ðº Ð²Ñ\80емÑ\8f Ð°Ð²Ñ\82оÑ\80Ñ\81Ñ\82ва"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-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:4591
-msgid "--3way outside a repository"
-msgstr "--3way вне репозитория"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "подписать коммиты с помощью GPG"
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index вне репозитория"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(внутреннее использование для git-rebase)"
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached вне репозитория"
+#: 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:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "не удалось открыть патч «%s»"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "сбой чтения индекса"
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2356
 #, 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 "previous rebase directory %s still exists but mbox given."
+msgstr "предыдущий каталог перемещения %s еще существует, но передан mbox."
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
+#: builtin/am.c:2380
 #, 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 строк добавили ошибки в пробельных символах."
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr "Найден забытый каталог %s.\nИспользуйте «git am --abort», чтобы удалить его."
+
+#: 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
@@ -3326,498 +4302,575 @@ 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:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "Показать записи авторства постепенно, в процессе нахождения"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "Не показывать SHA-1 для коммитов, не входящих в границы запроса (По умолчанию: отключено)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "Не воспринимать корневые коммиты как граничные (По умолчанию: отключено)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "Показать статистику расходов на выполнение запроса"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "Принудительно выводить прогресс выполнения"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "Показать оценку для записей авторства"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "Показать оригинальное имя файла (По умолчанию: автоматически)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "Показать оригинальные номера строк (По умолчанию: отключено)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "Показать в формате для программного разбора"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "Показать в машиночитаемом формате, с построчной информацией о коммите"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "Использовать такой же формат вывода, как и git-annotate (По умолчанию: отключено)"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "Показать необработанные временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "Показать длинный SHA1 идентификатор коммита (По умолчанию: отключено)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "Не показывать имя автора и временные метки (По умолчанию: отключено)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr "Показать почту автора вместо имени (По умолчанию: отключено)"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "Игнорировать различия в пробелах"
 
-#: builtin/blame.c:2546
+#: 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:2547
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "Использовать редакции из <файла> вместо вызова git-rev-list"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "Использовать содержимое <файла> как финальный снимок"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "мин-длина"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "Найти копирование строк в пределах и между файлами"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "Найти перемещения строк в пределах и между файлами"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "начало,конец"
 
-#: builtin/blame.c:2551
+#: 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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "4 года и 11 месяцев назад"
 
-#: builtin/branch.c:25
+#: 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]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<опции>] [-l] [-f] <имя-ветки> [<точка-начала>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<опции>] [-r] (-d | -D) <имя-ветки>…"
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<опции>] (-m | -M) [<старая-ветка>] <новая-ветка>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<опции>] [-r | -a] [--points-at]"
 
-#: builtin/branch.c:142
+#: 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», которая была слита с\n         «%s», но не слита с HEAD."
 
-#: builtin/branch.c:146
+#: 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."
 
-#: builtin/branch.c:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Не удалось найти объект коммита для «%s»"
 
-#: builtin/branch.c:164
+#: 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»."
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "Не удалось обновить файл конфигурации"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "нельзя использовать одновременно ключи -a и -d"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Не удалось найти объект коммита для HEAD"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Нельзя удалить ветку «%s», так как вы сейчас на ней находитесь."
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Нельзя удалить ветку «%s» т.к. она активна на «%s»"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "внешняя отслеживаемая ветка «%s» не найдена."
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "ветка «%s» не найдена."
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "Ошибка удаления внешней отслеживаемой ветки «%s»"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Ошибка удаления ветки «%s»"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "Внешняя отслеживаемая ветка %s удалена (была %s).\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Ветка %s удалена (была %s).\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: пропал]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: позади %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[позади %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: впереди %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[впереди %d]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: впереди %d, позади %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[впереди %d, позади %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** недействительная ссылка ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(нет ветки, перемещение %s)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(нет ветки, двоичный поиск начат на %s)"
 
-#: builtin/branch.c:375
+#. 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 отделён на %s)"
 
-#: builtin/branch.c:378
+#. 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 отделён начиная с %s)"
 
-#: builtin/branch.c:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(нет ветки)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "Производится перемещение ветки %s на %s"
+
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "Производится двоичный поиск в ветке %s на %s"
+
+#: builtin/branch.c:563
 msgid "cannot rename the current branch while not on any."
 msgstr "невозможно переименовать текущую ветку, если вы не находитесь ни на одной из них."
 
-#: builtin/branch.c:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Недействительное имя ветки: «%s»"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "Сбой переименования ветки"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Переименована неправильно названная ветка «%s»"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Ветка переименована в %s, но HEAD не обновлен!"
 
-#: builtin/branch.c:564
+#: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Ветка переименована, но произошел сбой обновления файла конфигурации"
 
-#: builtin/branch.c:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "не удалось записать шаблон описания ветки: %s"
+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:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Общие параметры"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "показывать хэш-сумму и тему, укажите дважды для вышестоящей ветки"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "не выводить информационные сообщения"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "установить режим отслеживания вышестоящей ветки (см. git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "изменить информацию о вышестоящей ветке"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "вышестоящая"
+
+#: builtin/branch.c:659
+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 "использовать цветной вывод"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "выполнить действия на отслеживаемых внешних ветках"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "вывод только веток, которые содержат коммит"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "Специфичные для git-branch действия:"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "показать список и отслеживаемых и локальных веток"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "удалить полностью слитую ветку"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "удалить ветку (даже никуда не слитую)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "переместить/переименовать ветки и ее журнал ссылок"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "переместить/переименовать ветку, даже если целевое имя уже существует"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "показать список имен веток"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "создать журнал ссылок ветки"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "изменить описание ветки"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "принудительное создание, перемещение или удаление ветки"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "вывод только слитых веток"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "вывод только не слитых веток"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "показать список веток по столбцам"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "ключ"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "имя поля, по которому выполнить сортировку"
 
-#: builtin/branch.c:650 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 "объект"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "вывод только веток, определенного объекта"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Не удалось определить HEAD как действительную ссылку."
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD не найден в refs/heads!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column и --verbose нельзя использовать одновременно"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "требуется имя ветки"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "Нельзя дать описание отделённому HEAD"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "нельзя изменить описание более одной ветки за раз"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "Еще нет коммита на ветке «%s»."
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "Нет ветки с именем «%s»."
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "слишком много веток для операции переименования"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "слишком много веток для указания новых вышестоящих"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, c-format
 msgid ""
 "could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr "невозможно установить вышестоящий репозиторий для HEAD на %s, так как он не указывает ни на одну ветку."
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "нет такой ветки «%s»"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "ветка «%s» не существует"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "слишком много веток для убирания вышестоящих"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "невозможно убрать вышестоящий репозиторий для HEAD, так как он не указывает ни на одну ветку."
 
-#: builtin/branch.c:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "Ветка «%s» не имеет информации о вышестоящей ветке"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "не имеет смысла создавать «HEAD» вручную"
 
-#: builtin/branch.c:810
+#: 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» не имеют смысла с указанием имени ветки"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:849
 #, c-format
 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/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -3825,16 +4878,6 @@ msgid ""
 "\n"
 msgstr "\nЕсли вы хотите, чтобы «%s» отслеживала «%s», сделайте следующее:\n\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -3848,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"
 
@@ -3922,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 "прочитать имена файлов из стандартного ввода"
 
@@ -3930,7 +4987,7 @@ msgstr "прочитать имена файлов из стандартного
 msgid "terminate input and output records by a NUL character"
 msgstr "окончание ввода и вывода записей по НУЛЕВОМУ символу"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "не выводить прогресс выполнения"
 
@@ -3993,7 +5050,7 @@ msgstr "индекс должен быть между 1 и 3 или all"
 
 #: builtin/checkout-index.c:160
 msgid "check out all files in the index"
-msgstr "пеÑ\80ейÑ\82и на состояние всех файлов из индекса"
+msgstr "пеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на состояние всех файлов из индекса"
 
 #: builtin/checkout-index.c:161
 msgid "force overwrite of existing files"
@@ -4020,8 +5077,9 @@ msgid "write the content to temporary files"
 msgstr "записать содержимое во временные файлы"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "строка"
 
@@ -4071,79 +5129,75 @@ msgstr "путь «%s»: не удалось слить"
 msgid "Unable to add merge result for '%s'"
 msgstr "Не удалось добавить результат слияния «%s»"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "«%s» нельзя использовать одновременно с %s"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "Нельзя обновлять пути и переключаться на ветку «%s» одновременно."
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "файл индекса поврежден"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "путь «%s» не слит"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "сначала нужно разрешить конфликты в вашем текущем индексе"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Не удалось создать журнал ссылок для «%s»: %s\n"
 
-#: builtin/checkout.c:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD сейчас на"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "не удалось обновить HEAD"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Сброс ветки «%s»\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Уже на «%s»\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Переключение и сброс ветки «%s»\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Переключено на новую ветку «%s»\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Переключено на ветку «%s»\n"
 
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " … и еще %d.\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4160,7 +5214,7 @@ msgstr[1] "Предупреждение: вы оставляете позади
 msgstr[2] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 msgstr[3] "Предупреждение: вы оставляете позади %d коммитов не соединенные ни с одной из ваших веток:\n\n%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4179,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:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "внутренняя ошибка при хождении по редакциям"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "Предыдущая позиция HEAD была"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "Вы находитесь на еще не созданной ветке"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "ожидается только одна ссылка, а передано %d."
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "неправильная ссылка: %s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "в дереве нет такой ссылки: %s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "нельзя использовать пути при переключении веток"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "нельзя использовать «%s» при переключении веток"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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:1104
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Нельзя переключить ветку на не коммит «%s»"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
-msgstr "Ñ\81оздаÑ\82Ñ\8c Ð¸ Ð¿ÐµÑ\80ейÑ\82и на новую ветку"
+msgstr "Ñ\81оздаÑ\82Ñ\8c Ð¸ Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на новую ветку"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
-msgstr "Ñ\81оздаÑ\82Ñ\8c\81бÑ\80оÑ\81иÑ\82Ñ\8c Ð¸ Ð¿ÐµÑ\80ейÑ\82и на новую ветку"
+msgstr "Ñ\81оздаÑ\82Ñ\8c\81бÑ\80оÑ\81иÑ\82Ñ\8c Ð¸ Ð¿ÐµÑ\80клÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на новую ветку"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "создать журнал ссылок для новой ветки"
 
-#: builtin/checkout.c:1142
-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:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "установить информацию о вышестоящей ветке для новой ветки"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "новая-ветка"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "новая ветка без родителей"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
-msgstr "пеÑ\80ейÑ\82и на нашу версию для не слитых файлов"
+msgstr "пеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на нашу версию для не слитых файлов"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
-msgstr "пеÑ\80ейÑ\82и на их версию для не слитых файлов"
+msgstr "пеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на их версию для не слитых файлов"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
-msgstr "принудительный переход (отбрасывает все локальные изменения)"
+msgstr "принудительное переключение на состояние (отбрасывает все локальные изменения)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "выполнить трехходовое слияние с новой веткой"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "обновить игнорируемые файлы (по умолчанию)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "стиль"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "стиль конфликтов слияния (merge или diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "не ограничивать спецификаторы пути только частичными записями"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
-msgstr "пересмотр «git checkout <no-such-branch>»"
+msgstr "пересмотр «git checkout <нет-такой-ветки>»"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "не проверять, что другое дерево уже содержит указанную ссылку"
 
-#: builtin/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b, -B и --orphan нельзя использовать одновременно"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track требует имя ветки"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "Пропущено имя ветки; попробуйте -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "неправильная спецификация пути"
 
-#: builtin/checkout.c:1258
+#: 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», что не может быть определено как коммит?"
+msgstr "Нельзя обновить пути и одновременно переключиться на ветку «%s».\nВы хотели переключиться на «%s», что не может быть определено как коммит?"
 
-#: builtin/checkout.c:1263
+#: 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4466,8 +5520,8 @@ msgstr "интерактивная очистка"
 msgid "remove whole directories"
 msgstr "удалить каталоги полностью"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "шаблон"
 
@@ -4503,286 +5557,306 @@ msgstr "clean.requireForce установлен по умолчанию как t
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<опции>] [--] <репозиторий> [<каталог>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "не переключать рабочую копию на HEAD"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "создать голый репозиторий"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "создать зеркало репозитория (включает в себя и параметр bare)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "для клонирования из локального репозитория"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "не использовать жесткие ссылки, всегда копировать файлы"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "настроить как общедоступный репозиторий"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "инициализировать подмодули в клоне"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "количество подмодулей, которые будут клонированы парралельно"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "каталог-шаблонов"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "каталог, шаблоны из которого будут использованы"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
+#: 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:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "используйте --reference только при клонировании"
 
-#: builtin/clone.c:82 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:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "использовать <имя> вместо «origin» для отслеживания вышестоящего репозитория"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
-msgstr "пеÑ\80ейÑ\82и на <ветку>, вместо HEAD внешнего репозитория"
+msgstr "пеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на <ветку>, вместо HEAD внешнего репозитория"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "путь к git-upload-pack на внешнем репозитории"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "глубина"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "сделать частичный клон указанной глубины"
 
-#: builtin/clone.c:91
+#: 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:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "все склонированные подмодули будут частичными клонами"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "каталог-git"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "разместить каталог git отдельно от рабочей копии"
 
-#: builtin/clone.c:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "ключ=значение"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "установить параметры внутри нового репозитория"
 
-#: builtin/clone.c:96 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:98 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:239
+#: 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:305
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "ссылаемый репозиторий «%s» как связанное состояние, пока не поддерживается."
-
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "ссылаемый репозиторий «%s» не является локальным."
-
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "ссылаемый репозиторий «%s» является частичным"
-
-#: builtin/clone.c:315
+#: 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:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c stat «%s»"
+msgid "failed to open '%s'"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82кÑ\80Ñ\8bÑ\82Ñ\8c «%s»"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s уже существует и не является каталогом"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "не удалось выполнить stat %s\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "не удалось создать ссылку «%s»"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "не удалось копировать файл в «%s»"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "готово.\n"
 
-#: builtin/clone.c:459
+#: 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"
+msgstr "Клонирование прошло успешно, но во время переключения состояния произошла ошибка.\nС помощь команды «git status» вы можете просмотреть, какие файлы были обновлены, а повторить попытку переключения на ветку с помощью «git checkout -f HEAD»\n"
 
-#: builtin/clone.c:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "Не удалось найти внешнюю ветку %s для клонирования."
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Проверка соединения… "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "внешний репозиторий прислал не все необходимые объекты"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "не удалось обновить %s"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr "внеÑ\88ний HEAD Ñ\81Ñ\81Ñ\8bлаеÑ\82Ñ\81Ñ\8f Ð½Ð° Ð½ÐµÑ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83, Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¿ÐµÑ\80ейÑ\82и на такую версию.\n"
+msgstr "внеÑ\88ний HEAD Ñ\81Ñ\81Ñ\8bлаеÑ\82Ñ\81Ñ\8f Ð½Ð° Ð½ÐµÑ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ñ\81Ñ\81Ñ\8bлкÑ\83, Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на такую версию.\n"
 
-#: builtin/clone.c:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
-msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80ейÑ\82и на версию в рабочем каталоге"
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на версию в рабочем каталоге"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "не удалось записать параметры в файл конфигурации"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "не удалось выполнить перепаковку для очистки"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "не удалось отсоединить временные альтернативные файлы"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "Слишком много аргументов."
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "Вы должны указать репозиторий для клонирования."
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare и --origin %s нельзя использовать одновременно."
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare и --separate-git-dir нельзя использовать одновременно."
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "репозиторий «%s» не существует"
 
-#: builtin/clone.c:887 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:897
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "целевой путь «%s» уже существует и не является пустым каталогом."
 
-#: builtin/clone.c:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "рабочий каталог «%s» уже существует."
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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:925
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "не удалось создать рабочий каталог «%s»"
 
-#: builtin/clone.c:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Клонирование в голый репозиторий «%s»…\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Клонирование в «%s»…\n"
 
-#: builtin/clone.c:984
+#: 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:987
+#: 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:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local игнорируется"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "Не знаю как клонировать %s"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "Похоже, что вы клонировали пустой репозиторий."
 
@@ -4869,7 +5943,7 @@ msgid ""
 "\n"
 "    git commit --allow-empty\n"
 "\n"
-msgstr "Ð\9fÑ\80едÑ\8bдÑ\83Ñ\89ий Ð¾Ñ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его теперь пуст, возможно после разрешения конфликтов.\nЕсли вы все равно хотите сделать пустой коммит, используйте:\n\n    git commit --allow-empty\n\n"
+msgstr "Ð\9aопиÑ\80Ñ\83емÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 теперь пуст, возможно после разрешения конфликтов.\nЕсли вы все равно хотите сделать пустой коммит, используйте:\n\n    git commit --allow-empty\n\n"
 
 #: builtin/commit.c:85
 msgid "Otherwise, please use 'git reset'\n"
@@ -4883,105 +5957,105 @@ msgid ""
 "\n"
 "Then \"git cherry-pick --continue\" will resume cherry-picking\n"
 "the remaining commits.\n"
-msgstr "Ð\95Ñ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82 Ñ\8dÑ\82оÑ\82 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð¸Ñ\81полÑ\8cзÑ\83йÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\83:\n\n    git reset\n\nÐ\9fоÑ\81ле Ñ\8dÑ\82ого Â«git cherry-pick --continue» Ð¿Ñ\80одолжиÑ\82 Ð¾Ñ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его\nв Ð¾Ñ\81Ñ\82авÑ\88иÑ\85Ñ\81Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82аÑ\85.\n"
+msgstr "Ð\95Ñ\81ли Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¿Ñ\80опÑ\83Ñ\81Ñ\82иÑ\82 Ñ\8dÑ\82оÑ\82 ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82, Ð¸Ñ\81полÑ\8cзÑ\83йÑ\82е ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\83:\n\n    git reset\n\nÐ\9fоÑ\81ле Ñ\8dÑ\82ого Â«git cherry-pick --continue» Ð¿Ñ\80одолжиÑ\82 ÐºÐ¾Ð¿Ð¸Ñ\80ование Ð¾Ñ\81Ñ\82авÑ\88иÑ\85Ñ\81Ñ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов.\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "сбой распаковки объекта дерева HEAD"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "не удалось создать временный индекс"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "сбой интерактивного добавления"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "не удалось обновить временный индекс"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "Сбой при обновлении основного кэша дерева"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "нельзя создать частичный коммит во время слияния."
 
-#: builtin/commit.c:447
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
-msgstr "нелÑ\8cзÑ\8f Ñ\81оздаÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82иÑ\87нÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð¾ Ð²Ñ\80емÑ\8f Ð¾Ñ\82боÑ\80а Ð»Ñ\83Ñ\87Ñ\88его коммита."
+msgstr "нелÑ\8cзÑ\8f Ñ\81оздаÑ\82Ñ\8c Ñ\87аÑ\81Ñ\82иÑ\87нÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð¾ Ð²Ñ\80емÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f коммита."
 
-#: builtin/commit.c:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "не удалось прочитать индекс"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "не удалось записать временный файл индекса"
 
-#: builtin/commit.c:580
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "у коммита «%s» отсутствует автор в заголовке"
 
-#: builtin/commit.c:582
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "у коммита «%s» строка автора в неправильном формате"
 
-#: builtin/commit.c:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "параметр --author в неправильном формате"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "неправильный формат даты: %s"
 
-#: builtin/commit.c:653
+#: builtin/commit.c:655
 msgid ""
 "unable to select a comment character that is not used\n"
 "in the current commit message"
 msgstr "нельзя выбрать символ комментария, который\nне используется в текущем сообщении коммита"
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(чтение файла журнала из стандартного ввода)\n"
 
-#: builtin/commit.c:704
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "не удалось прочитать файл журнала из стандартного ввода"
 
-#: builtin/commit.c:708
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "не удалось прочитать файл журнала «%s»"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "не удалось прочитать MERGE_MSG"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "не удалось прочитать SQUASH_MSG"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "не удалось прочитать MERGE_MSG"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "не удалось записать шаблон описания коммита"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -4991,7 +6065,7 @@ msgid ""
 "and try again.\n"
 msgstr "\nПохоже, что вы пытаетесь закоммитить слияние.\nЕсли это ошибка, пожалуйста удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -4999,16 +6073,16 @@ msgid ""
 "If this is not correct, please remove the file\n"
 "\t%s\n"
 "and try again.\n"
-msgstr "\nÐ\9fоÑ\85оже, Ñ\87Ñ\82о Ð²Ñ\8b Ð¿Ñ\8bÑ\82аеÑ\82еÑ\81Ñ\8c Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c Ð¾Ñ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его.\nÐ\95Ñ\81ли Ñ\8dÑ\82о Ð¾Ñ\88ибка, Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а удалите файл\n\t%s\nи попробуйте снова.\n"
+msgstr "\nÐ\9fоÑ\85оже, Ñ\87Ñ\82о Ð²Ñ\8b Ð¿Ñ\8bÑ\82аеÑ\82еÑ\81Ñ\8c Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82иÑ\82Ñ\8c Ð¿Ñ\80и ÐºÐ¾Ð¿Ð¸Ñ\80овании ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а.\nÐ\95Ñ\81ли Ñ\8dÑ\82о Ð½Ðµ Ñ\82ак, Ñ\82о удалите файл\n\t%s\nи попробуйте снова.\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, 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отменяет процесс коммита.\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5016,341 +6090,345 @@ msgid ""
 "An empty message aborts the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита для ваших изменений. Строки,\nначинающиеся с «%c» будут оставлены; вы можете удалить их вручную,\nесли хотите. Пустое сообщение отменяет процесс коммита.\n"
 
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%sАвтор:     %.*s <%.*s>"
 
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%sДата:      %s"
 
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%sКоммитер:  %.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "Не удалось прочитать индекс"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "Ошибка при построении деревьев"
 
-#: builtin/commit.c:953 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:1055
+#: builtin/commit.c:1071
 #, c-format
 msgid "--author '%s' is not 'Name <email>' and matches no existing author"
 msgstr "--author «%s» не в формате «Имя <почта>» и не совпадает с существующим автором"
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Неправильный режим неотслеживаемых файлов «%s»"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long и -z нельзя использовать одновременно"
 
-#: builtin/commit.c:1137
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Указание одновременно опций --reset-author и --author не имеет смысла"
 
-#: builtin/commit.c:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "Нечего исправлять."
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Вы в процессе слияния —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1151
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr "Ð\92Ñ\8b Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е Ð¾Ñ\82боÑ\80а Ð»Ñ\83Ñ\87Ñ\88его —  сейчас нельзя исправлять."
+msgstr "Ð\92Ñ\8b Ð² Ð¿Ñ\80оÑ\86еÑ\81Ñ\81е ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а —  сейчас нельзя исправлять."
 
-#: builtin/commit.c:1154
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Опции --squash и --fixup не могут использоваться одновременно"
 
-#: builtin/commit.c:1164
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Может использоваться только одна из опций -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Опция -m не может использоваться с -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1174
+#: 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:1191
+#: 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:1193
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "Указание путей каталогов с опциями --include/--only не имеет смысла."
 
-#: builtin/commit.c:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "Умно… отмена последнего с измененным индексом."
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "Пути явно указаны пути без опций -i или -o; предполагаю опцию --only…"
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Неправильное значение режима очистки %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "С опцией -a указание пути не имеет смысла."
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "кратко показать статус"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "показать информацию о версии"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: 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:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "показать статус в длинном формате (по умолчанию)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "завершать записи НУЛЕВЫМ байтом"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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:1337 builtin/commit.c:1617
+#: 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "показать игнорируемые файлы"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "когда"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr "игнорировать изменения в подмодулях, опционально когда: all (всегда), dirty (измененные), untracked (неотслеживаемые). (По умолчанию: all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "показать неотслеживаемые файлы по столбцам"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "нельзя запросить новосозданный коммит"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "нельзя разобрать новосозданный коммит"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "отделённый HEAD"
 
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr " (корневой коммит)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "не выводить сводку после успешного коммита"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "добавить список изменений в шаблон сообщения коммита"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "Опции сообщения коммита"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "прочитать сообщение из файла"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "автор"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "подменить автора коммита"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "дата"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "подменить дату коммита"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "сообщение коммита"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "использовать и отредактировать сообщение от указанного коммита"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "использовать сообщение указанного коммита"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для исправления указанного коммита"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "использовать форматированное сообщение автоуплотнения для уплотнения указанного коммита"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "коммит теперь за моим авторством (с использованием -C/-c/--amend)"
 
-#: builtin/commit.c:1588 builtin/log.c:1219 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:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "использовать указанный файл шаблона"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "принудительно редактировать коммит"
 
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "по-умолчанию"
 
-#: builtin/commit.c:1591 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:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "включить статус файлов в шаблон сообщения коммита"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: 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:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "Опции содержимого коммита"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "закоммитить все измененные файлы"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "добавить указанные файлы в индекс для коммита"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "интерактивное добавление файлов"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "интерактивное добавление изменений"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "закоммитить только указанные файлы"
 
-#: builtin/commit.c:1603
-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:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "показать, что будет закоммичено"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "исправить предыдущий коммит"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
-msgstr "пропустить перехватчик после-перезаписи"
+msgstr "пропустить перехватчик post-rewrite"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "разрешить запись пустого коммита"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "разрешить запись изменений с пустым сообщением"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "не удалось разобрать HEAD коммит"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Файл MERGE_HEAD поврежден (%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "не удалось прочитать MERGE_MODE"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "не удалось открыть сообщение коммита: %s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Отмена коммита; вы не изменили сообщение.\n"
 
-#: builtin/commit.c:1740
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Отмена коммита из-за пустого сообщения коммита.\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5361,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:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5503,16 +6581,23 @@ msgid ""
 "#\temail = %s\n"
 msgstr "# Это файл конфигурации пользователя Git.\n[user]\n# Пожалуйста, адаптируйте и раскомментируйте следующие строки:\n#\tuser = %s\n#\temail = %s\n"
 
-#: builtin/config.c:611
+#: 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 "вывод размеров в удобочитаемом для человека виде"
 
@@ -5539,10 +6624,10 @@ msgstr "аннотированная метка %s не содержит вст
 msgid "tag '%s' is really '%s' here"
 msgstr "метка «%s» уже здесь «%s»"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: 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
@@ -5626,9 +6711,9 @@ msgstr "рассматривать последние <n> меток (по ум
 msgid "only consider tags matching <pattern>"
 msgstr "рассматривать только метки по <шаблону>"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
-msgstr "еÑ\81ли Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾, Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ\82Ñ\8c Ñ\81окÑ\80аÑ\89еннÑ\8bй Ð½Ð¾Ð¼ÐµÑ\80 Ñ\80евизии коммита"
+msgstr "еÑ\81ли Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾, Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ\82Ñ\8c Ñ\81окÑ\80аÑ\89еннÑ\8bй Ð½Ð¾Ð¼ÐµÑ\80 Ñ\80едакÑ\86ии коммита"
 
 #: builtin/describe.c:411
 msgid "mark"
@@ -5660,21 +6745,21 @@ msgstr "«%s»: не является обычным файлом или сим
 msgid "invalid option: %s"
 msgstr "неправильный параметр: %s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
-msgstr "Не является репозиторием git"
+msgstr "Не найден git репозитоий"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "передан неправильный объект «%s»."
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "передано больше двух двоичных объектов: «%s»"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "передан необработанный объект «%s»."
@@ -5731,267 +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:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "извлечь со всех внешних репозиториев"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:172
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "путь к программе упаковки пакета на машине с внешним репозиторием"
 
-#: builtin/fetch.c:97 builtin/pull.c:174
+#: 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:176
+#: 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:179
+#: 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:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "по требованию"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "управление рекурсивным извлечением подмодулей"
 
-#: builtin/fetch.c:113 builtin/pull.c:191
+#: 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:194
+#: 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:197
+#: builtin/fetch.c:129 builtin/pull.c:206
 msgid "convert to a complete repository"
 msgstr "преобразовать в полный репозиторий"
 
-#: builtin/fetch.c:122 builtin/log.c:1236
+#: 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:200
+#: 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:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "соответствие-ссылок"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: 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:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "не удалось открыть %s: %s\n"
+#: 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 "Получение группы и указание спецификаций ссылок не имеет смысла"
 
@@ -6000,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 "файл для чтения"
 
@@ -6076,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:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<опции>] [<объект>…]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "показать недоступные объекты"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "показать объекты, на которые нет ссылок"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "вывести отчет по меткам"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "вывести отчет по корневым узлам"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "воспринимать объекты в индексе как корневые узлы"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "создать корневые узлы журналов ссылок (по умолчанию)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "также проверять пакеты и альтернативные объекты"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "только проверить соединение"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "использовать более строгую проверку"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "записать объекты на которые нет ссылок в .git/lost-found"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "показать прогресс выполнения"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "показать подробные имена для недоступных объектов"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "Проверка объектов"
 
@@ -6217,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:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "параметр «%c» ожидает числовое значение"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "не удалось открыть «%s»"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "искать в индексе, а не в рабочем каталоге"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "искать в содержимом не управляемым git"
 
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "искать и в отслеживаемых, и в неотслеживаемых файлах"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "игнорировать файлы указанные в «.gitignore»"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "искать в несовпадающих строках"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "без учета регистра"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "искать совпадения шаблона только на границах слов"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "обработка двоичных файлов как текста"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "не искать совпадения шаблона в двоичных файлах"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "обрабатываться двоичные файлы с помощью фильтров textconv"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "на глубине максиму <глубина> уровней"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "использовать расширенные регулярные выражения POSIX"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "использовать базовые регулярные выражения POSIX (по умолчанию)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "интерпретировать шаблоны как фиксированные строки"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "использовать Perl-совместимые регулярные выражения"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "вывести номера строк"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "не выводить имена файлов"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "выводить имена файлов"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "выводить имена файлов относительно каталога репозитория"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "выводить только имена файлов, а не совпадающие строки"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "синоним для --files-with-matches"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "выводить только несовпадающие имена файлов"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "выводить двоичный НОЛЬ после списка имен файлов"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "выводить количество совпадений, а не совпадающие строки"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "подсвечивать совпадения"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "выводить пустую строку после совпадений из разных файлов"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr "выводить имя файла только раз на несколько совпадений в одном файле"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "показать <n> строк контекста перед и после совпадения"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "показать <n> строк контекста перед совпадением"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "показать <n> строк контекста после совпадения"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "использовать <кол> рабочих потоков"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "тоже, что и -C КОЛИЧЕСТВО"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "показать строку с именем функции перед совпадением"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "показать окружающую функцию"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "прочитать шаблоны из файла"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "поиск соответствий с <шаблоном>"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "объединить шаблоны указанные с помощью -e"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "ничего не выводить, указать на совпадение с помощью кода выхода"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr "показать только совпадения из файлов в которых совпадают все шаблоны"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "показать дерево разбора для выражения поиска"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "пейджер"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "показать совпадающие файлы с помощью программы-пейджера"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "разрешить вызов grep(1) (игнорируется в этой сборке)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "не задан шаблон."
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "указано неправильное количество потоков (%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager работает только в рабочем каталоге"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached или --untracked нельзя использовать одновременно с --no-index."
 
-#: builtin/grep.c:904
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index Ð¸Ð»Ð¸ --untracked Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно Ñ\81 Ñ\83казанием Ñ\80евизии."
+msgstr "--no-index Ð¸Ð»Ð¸ --untracked Ð½ÐµÐ»Ñ\8cзÑ\8f Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно Ñ\81 Ñ\83казанием Ñ\80едакÑ\86ии."
 
-#: builtin/grep.c:907
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard не может использоваться для отслеживаемого содержимого."
 
-#: builtin/grep.c:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "указано одновременно --cached и дерево."
 
@@ -6448,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': %s"
-msgstr "сбой при запуске «%s»: %s"
+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"
@@ -6626,169 +7718,177 @@ 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 objects"
-msgstr "завершено с %d локальными объектами"
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] "завершено с %d локальным объектом"
+msgstr[1] "завершено с %d локальными объектами"
+msgstr[2] "завершено с %d локальными объектами"
+msgstr[3] "завершено с %d локальными объектами"
 
-#: builtin/index-pack.c:1263
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "Неожиданная контрольная сумма в конце %s (диск поврежден?)"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1272
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
@@ -6797,59 +7897,59 @@ msgstr[1] "пакет содержит %d неразрешенные дельт
 msgstr[2] "пакет содержит %d неразрешенных дельт"
 msgstr[3] "пакет содержит %d неразрешенных дельт"
 
-#: builtin/index-pack.c:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "нельзя сжать присоединенный объект (%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "локальный объект %s поврежден"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "ошибка при закрытии файла пакета"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "не удалось записать файл удержания «%s»"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "не удалось закрыть записанный файл удержания «%s»"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "не удалось сохранить файл пакета"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "не удалось сохранить файл индекса"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "плохой pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "нет поддержки потоков, игнорирование %s"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Не удалось открыть существующий файл пакета «%s»"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Не удалось открыть существующий файл индекса для «%s»"
 
-#: builtin/index-pack.c:1587
+#: builtin/index-pack.c:1591
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
@@ -6858,7 +7958,7 @@ msgstr[1] "не дельты: %d объекта"
 msgstr[2] "не дельты: %d объектов"
 msgstr[3] "не дельты: %d объектов"
 
-#: builtin/index-pack.c:1594
+#: builtin/index-pack.c:1598
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
@@ -6867,141 +7967,137 @@ msgstr[1] "длина цепочки = %d: %lu объекта"
 msgstr[2] "длина цепочки = %d: %lu объектов"
 msgstr[3] "длина цепочки = %d: %lu объектов"
 
-#: builtin/index-pack.c:1624
-msgid "Cannot come back to cwd"
-msgstr "Не удалось вернуться в текущий рабочий каталог"
+#: builtin/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "имя пакета «%s» не оканчивается на «.pack»"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin нельзя использовать без --stdin"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "имя пакета «%s» не оканчивается на «.pack»"
-
-#: builtin/index-pack.c:1730
+#: 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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "шаблоны не найдены %s"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "не копирую шаблоны в неправильной версии формата %d из «%s»"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s уже существует"
+msgid "not copying templates from '%s': %s"
+msgstr "не копирую шаблоны из «%s»: %s"
 
-#: builtin/init-db.c:340
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "не удается обработать файл типа %d"
 
-#: builtin/init-db.c:343
+#: 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:399
+#: 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:400
-msgid "Reinitialized existing"
-msgstr "Переинициализация существующего"
+#: 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:400
-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:401
-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:448
+#: 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:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "права-доступа"
 
-#: builtin/init-db.c:472
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "укажите, если репозиторий git будет использоваться несколькими пользователями"
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "не удалось выполнить mkdir %s"
 
-#: builtin/init-db.c:515
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "не удалось выполнить chdir в %s"
 
-#: builtin/init-db.c:536
+#: 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:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Не удалось получить доступ к рабочему каталогу «%s»"
@@ -7032,380 +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:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "не выводить различия"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "показать источник"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "Использовать файл соответствия почтовых адресов"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "опции формата вывода ссылок"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 msgid "Process line range n,m in file, counting from 1"
 msgstr "Обработать диапазон строк n,m из файла, начиная с 1"
 
-#: builtin/log.c:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "Финальный вывод: %d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: плохой файл"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "Не удалось прочитать объект %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "Неизвестный тип объекта: %d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "в format.headers не указано значение"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "слишком длинное имя выходного каталога"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "Ну удалось открыть файл изменений %s"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "Нужен только один диапазон."
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "Не является диапазоном."
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "Сопроводительное письмо должно быть в формате электронной почты"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ошибка в поле in-reply-to: %s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<опции>] [<начиная-с> | <диапазон-редакций>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "Два выходных каталога?"
 
-#: builtin/log.c:1214
+#: 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: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:1263
+msgid "Could not find exact merge base."
+msgstr "Не удалось найти точную базу слияния."
+
+#: 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:1287
+msgid "Failed to find exact merge base"
+msgstr "Не удалось найти точную базу слияния"
+
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
+msgstr "базовый коммит должен быть предком списка редакций"
+
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
+msgstr "базовый коммит не должен быть в списке редакций"
+
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "не удалось получить идентификатор патча"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "выводить [PATCH n/m] даже когда один патч"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "выводить [PATCH] даже когда несколько патчей"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "выводить патчи на стандартный вывод"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "генерировать сопроводительное письмо"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "использовать простую последовательность чисел для имен выходных файлов"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "суффикс"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "использовать суффикс <суффикс> вместо «.patch»"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "начать нумерацию патчей с <n>, а не с 1"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "пометить серию как энную попытку"
 
-#: builtin/log.c:1233
+#: 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:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "сохранить результирующие файлы в <каталог>"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "не обрезать/добавлять [PATCH]"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "не выводить двоичные различия"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "выводить нулевую хэш-сумму в заголовке From"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "не включать патч, если коммит уже есть в вышестоящей ветке"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "выводить в формате патча, а не в стандартном (патч + статистика)"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "Передача сообщений"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "заголовок"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "добавить заголовок сообщения"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "почта"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "добавить заголовок To:"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "добавить заголовок Cc:"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "идентификатор"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "установить адрес отправителя на <идентификатор> (или на идентификатор коммитера, если отсутствует)"
 
-#: builtin/log.c:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "идентификатор-сообщения"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "сделать первое письмо ответом на <идентификатор-сообщения>"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "вложение"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "приложить патч"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "включить патч в текст письма"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "включить в письмах иерархичность, стили: shallow (частичную), deep (глубокую)"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "подпись"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "добавить подпись"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "базовый коммит"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "добавить информацию о требовании дерева к серии патчей"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "добавить подпись из файла"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "не выводить имена файлов патчей"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n и -k нельзя использовать одновременно"
 
-#: builtin/log.c:1367
-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:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only не имеет смысла"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status не имеет смысла"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check не имеет смысла"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "стандартный вывод или каталог?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Не удалось создать каталог «%s»"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "не удалось прочитать файл подписи «%s»"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "Сбой при создании выходных файлов"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<вышестоящая-ветка> [<голова> [<ограничение>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> "
 "manually.\n"
 msgstr "Не удалось найти отслеживаемую внешнюю ветку, укажите <вышестоящую-ветку> вручную.\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Неизвестный коммит %s"
-
-#: 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 "показать отладочную информацию"
 
@@ -7488,182 +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:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "при указании параметра «m» требуется указать значение"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "Не удалось найти стратегию слияния «%s».\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "Доступные стратегии:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "Доступные пользовательские стратегии:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "не выводить статистику изменений после окончания слияния"
 
-#: builtin/merge.c:196 builtin/pull.c:126
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "вывести статистику изменений после окончания слияния"
 
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(синоним для --stat)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: 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:202 builtin/pull.c:135
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "создать один коммит, вместо выполнения слияния"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "сделать коммит, если слияние прошло успешно (по умолчанию)"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "отредактировать сообщение перед выполнением коммита"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "разрешить перемотку вперед (по умолчанию)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "отменить выполнение слияния, если перемотка вперед невозможна"
 
-#: builtin/merge.c:213
-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:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "стратегия"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "используемая стратегия слияния"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "опция=значение"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "опции для выбранной стратегии слияния"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "сообщение коммита для слияния (для слияния без перемотки вперед)"
 
-#: builtin/merge.c:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "отменить выполнение происходящего слияния"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "разрешить слияние несвязанных историй изменений"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "не удалось выполнить stash."
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "сбой при выполнении stash"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "неправильный объект: %s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "сбой при выполнении read-tree"
 
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (нечего уплотнять)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "Уплотнение коммита — не обновляя HEAD\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Не удалось записать в «%s»"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Запись SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Завершение SQUASH_MSG"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Нет сообщения слияния — не обновляем HEAD\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "«%s» не указывает на коммит"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Неправильная строка branch.%s.mergeoptions: %s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
 msgstr "Не обрабатываю ничего, кроме слияния двух указателей на ветки."
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Неизвестный параметр merge-recursive: -X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "не удалось записать %s"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Не удалось прочесть из «%s»"
 
-#: builtin/merge.c:782
+#: 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:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -7673,157 +8807,183 @@ msgid ""
 "the commit.\n"
 msgstr "Пожалуйста, введите сообщение коммита, для объяснения, зачем нужно\nэто слияние, особенно, если это слияние обновленной вышестоящей\nветки в тематическую ветку.\n\nСтроки, начинающиеся с «%c» будут проигнорированы, а пустое\nсообщение отменяет процесс коммита.\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "Пустое сообщение коммита."
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Прекрасно.\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "Не удалось провести автоматическое слияние; исправьте конфликты и сделайте коммит результата.\n"
 
-#: builtin/merge.c:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "«%s» не является коммитом"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "Нет текущей ветки."
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "У текущей ветки нет внешнего репозитория."
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 msgid "No default upstream defined for the current branch."
 msgstr "Для текущей ветки не указана вышестоящая ветка по умолчанию."
 
-#: builtin/merge.c:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Не указана внешняя отслеживаемая ветка для %s на %s"
 
-#: builtin/merge.c:1080
+#: 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:1207
+#: 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:1223
+#: 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:1230
+#: 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 "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88или Ð¾Ñ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его (пÑ\80иÑ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл CHERRY_PICK_HEAD).\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ñ\8bполниÑ\82е ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð²Ð°Ñ\88иÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, перед слиянием."
+msgstr "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88или ÐºÐ¾Ð¿Ð¸Ñ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а (пÑ\80иÑ\81Ñ\83Ñ\82Ñ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл CHERRY_PICK_HEAD).\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82Ñ\8cÑ\82е Ð²Ð°Ñ\88и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, перед слиянием."
 
-#: builtin/merge.c:1233
+#: builtin/merge.c:1188
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
-msgstr "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88или Ð¾Ñ\82боÑ\80 Ð»Ñ\83Ñ\87Ñ\88его (присутствует файл CHERRY_PICK_HEAD)."
+msgstr "Ð\92Ñ\8b Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88или ÐºÐ¾Ð¿Ð¸Ñ\80ование ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а (присутствует файл CHERRY_PICK_HEAD)."
 
-#: builtin/merge.c:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Нельзя использовать одновременно --squash и --no-ff."
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Коммит не указан и параметр merge.defaultToUpstream не установлен."
 
-#: builtin/merge.c:1267
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "Уплотнение коммита в пустую ветку еще не поддерживается"
 
-#: builtin/merge.c:1269
+#: builtin/merge.c:1224
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Коммит, не являющийся перемоткой вперед, нет смысла делать в пустую ветку."
 
-#: builtin/merge.c:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s не является тем, что можно слить"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Можно только один коммит в пустую ветку."
 
-#: builtin/merge.c:1332
+#: builtin/merge.c:1287
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "Коммит %s содержит не доверенную GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1335
+#: builtin/merge.c:1290
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Коммит %s содержит плохую GPG подпись, предположительно от %s."
 
-#: builtin/merge.c:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Коммит %s не содержит GPG подпись."
 
-#: builtin/merge.c:1341
+#: 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:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "отказ слияния несвязанных историй изменений"
+
+#: 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:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Попытка тривиального слияния в индексе…\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "Не вышло.\n"
 
-#: builtin/merge.c:1500
+#: 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:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Перемотка дерева к исходному состоянию…\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Попытка слияния с помощью стратегии %s…\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ни одна стратегия слияния не обработала слияние.\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Сбой при слиянии с помощью стратегии %s.\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Использую %s для подготовки ручного разрешения конфликтов.\n"
 
-#: builtin/merge.c:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "Автоматическое слияние прошло успешно; как и запрашивали, остановлено перед выполнением коммита\n"
@@ -7848,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 "вÑ\8bвеÑ\81Ñ\82и Ñ\81пиÑ\81ок Ñ\80евизий, которые не достижимы из друг друга"
+msgstr "вÑ\8bвеÑ\81Ñ\82и Ñ\81пиÑ\81ок Ñ\80едаÑ\86ий, которые не достижимы из друг друга"
 
-#: 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 "найти журнале ссылок <ссылка> где именно <коммит> разветвился"
 
@@ -7906,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]"
@@ -7931,7 +9124,7 @@ msgstr "git mv [<опции>] <источник>… <назначение>"
 msgid "Directory %s is in index and no submodule?"
 msgstr "Каталог %s в индексе и не является подмодулем?"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr "Чтобы продолжить, проиндексируйте или спрячьте ваши изменения в файле .gitmodules"
 
@@ -7948,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:257 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:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<опции>] <коммит>…"
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<опции>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<опции>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "выводить только имена (без SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "использовать только метки для именования коммитов"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "использовать только ссылки, соответствующие <шаблону> "
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "вывести список всех коммитов, достижимых со всех ссылок"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "прочитать из стандартного ввода"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "разрешить вывод «undefined», если не найдено (по умолчанию)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "разыменовывать введенные метки (для внутреннего использования)"
 
@@ -8159,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'"
@@ -8173,370 +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:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "не удалось прочитать «%s»"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "не удалось открыть или прочитать «%s»"
 
-#: 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:880 builtin/tag.c:456
+#: 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» как ссылку."
+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:256
+#: builtin/notes.c:261
 #, c-format
-msgid "Failed to read object '%s'."
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82 «%s»."
+msgid "cannot read note data from non-blob object '%s'."
+msgstr "не Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð´Ð°Ð½Ð½Ñ\8bе Ð·Ð°Ð¼ÐµÑ\82ки Ð¸Ð· Ð½ÐµÐ´Ð²Ð¾Ð¸Ñ\87ного Ð¾Ð±Ñ\8aекÑ\82а «%s»."
 
-#: builtin/notes.c:260
+#: builtin/notes.c:301
 #, 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 "malformed input line: '%s'."
+msgstr "непÑ\80авилÑ\8cнаÑ\8f Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð°Ñ\8f Ñ\81Ñ\82Ñ\80ока: «%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:945
+#: 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: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:885
+#: 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:767
+#: 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:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "Опции слияния"
 
-#: builtin/notes.c:771
+#: 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:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "Коммит не слитых заметок"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "завершить слияние заметок коммитом не слитых заметок"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "Отмена разрешения слияния заметок"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "отменить слияние заметок"
 
-#: builtin/notes.c:856
+#: 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:883
+#: builtin/notes.c:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "У объекта %s нет заметки\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "попытка удаления несуществующей заметки не является ошибкой"
 
-#: builtin/notes.c:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "прочитать имена объектов из стандартного ввода"
 
-#: builtin/notes.c:979
+#: 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:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "использовать заметку из <ссылка-на-заметку>"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: 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:772
+#: builtin/pack-objects.c:768
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+msgstr "отключение записи битовых карт, так как карты были разбиты на части из-за pack.packSizeLimit"
+
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "Запись объектов"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "отключение записи битовых карт, так как некоторые объекты не были упакованы"
 
-#: builtin/pack-objects.c:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "Сжатие объектов"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "неподдерживаемая версия индекса %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "плохая версия индекса «%s»"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "не выводить прогресс выполнения"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "показать прогресс выполнения"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "показать прогресс выполнения во время записи объектов"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "похоже на --all-progress при включенном прогрессе выполнения"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "версия[,смещение]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr "записать файл индекса пакета в указанной версии формата"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "максимальный размер каждого выходного файла пакета"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "игнорировать чужие объекты, взятые из альтернативного хранилища объектов"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "игнорировать упакованные объекты"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "ограничить окно пакета по количеству объектов"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr "дополнительно к количеству объектов ограничить окно пакета по памяти"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "максимальная разрешенная длина цепочки дельт в результирующем пакете"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "использовать повторно существующие дельты"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "использовать повторно существующие объекты"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "использовать объекты OFS_DELTA"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "использовать многопоточность при поиске лучших совпадений дельт"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "не создавать пустые выходные пакеты"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "прочитать аргументы редакций из стандартного ввода"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "ограничиться объектами, которые еще не упакованы"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "включить объекты, которые достижимы по любой из ссылок"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "включить объекты, на которые ссылаются записи журнала ссылок"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "включить объекты, на которые ссылается индекс"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "вывести пакет на  стандартный вывод"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "включить объекты меток, которые ссылаются на упаковываемые объекты"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "сохранять ссылки на недоступные объекты"
 
-#: builtin/pack-objects.c:2645 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:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "распаковать недоступные объекты, которые новее, чем <время>"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "создавать тонкие пакеты"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "создавать пакеты, подходящие для частичных извлечений"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "игнорировать пакеты, рядом с которыми лежит .keep файл"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "уровень сжатия пакета"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "не скрывать коммиты сращениями"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "по возможности использовать индекс в битовых картах, для ускорения подсчета объектов"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "запись индекса в битовых картах вместе с индексом пакета"
 
-#: builtin/pack-objects.c:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "Подсчет объектов"
 
@@ -8564,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:124
-msgid "do not remove, show only"
-msgstr "не удалять, только показать список"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "вывести список удаленных объектов"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "удалить объекты старее чем <дата-окончания>"
 
@@ -8580,69 +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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "Опции, связанные со слиянием"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "забрать изменения с помощью перебазирования, а не слияния"
 
-#: builtin/pull.c:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "разрешить перемотку вперед"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "пÑ\80овеÑ\80иÑ\82Ñ\8c, Ñ\87Ñ\82о Ñ\83казаннÑ\8bй ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82 Ð¸Ð¼ÐµÐµÑ\82 Ð²ÐµÑ\80нÑ\83Ñ\8e Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81Ñ\8c GPG"
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "авÑ\82омаÑ\82иÑ\87еÑ\81ки Ð²Ñ\8bполнÑ\8fÑ\82Ñ\8c stash/stash pop Ð´Ð¾ Ð¸ Ð¿Ð¾Ñ\81ле Ð¿ÐµÑ\80емеÑ\89ениÑ\8f"
 
-#: builtin/pull.c:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "Опции, связанные с извлечением изменений"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "количество подмодулей, которые будут получены парралельно"
 
-#: builtin/pull.c:275
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "Неправильное значение для pull.ff: %s"
 
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Не удалось получить с перемещением: У вас есть непроиндексированные изменения."
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "К тому же, в вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "Не удалось получить с перемещением: В вашем индексе есть незакоммиченные изменения."
-
-#: builtin/pull.c:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "Нет претендентов для перемещения среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:445
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "Нет претендентов для слияния среди ссылок, которые вы только что получили."
 
-#: builtin/pull.c:446
+#: 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:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -8650,46 +9922,69 @@ msgid ""
 "for your current branch, you must specify a branch on the command line."
 msgstr "Вы попросили получить изменения со внешнего репозитория «%s», но не указали ветку. Так как это не репозиторий по умолчанию для  вашей текущей ветки, вы должны указать ветку в командной строке."
 
-#: builtin/pull.c:454
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "Вы сейчас ни на одной из веток."
 
-#: builtin/pull.c:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "Для дополнительной информации, смотрите git-pull(1)."
 
-#: builtin/pull.c:469
+#: 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:451
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-msgstr "Если вы хотите указать информацию о отслеживаемой ветке, выполните:\n\n    git branch --set-upstream-to=%s/<branch> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr "Если вы хотите указать информацию о отслеживаемой ветке, выполните:"
 
-#: builtin/pull.c:483
+#: 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:841
+#: 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:870
+#: 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"
@@ -8697,7 +9992,7 @@ msgid ""
 "commit %s."
 msgstr "извлечение обновило указатель на вашу текущую ветку.\nперемотка вашего рабочего каталога\nс коммита %s."
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -8708,11 +10003,11 @@ msgid ""
 "to recover."
 msgstr "Не удалось перемотать вперёд изменения в вашем рабочем каталоге.\nПосле того, как вы убедитесь, что вы сохранили всё необходимое из вывода\n$ git diff %s\n, запустите\n$ git reset --hard\nдля восстановления исходного состояния."
 
-#: builtin/pull.c:890
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "Нельзя слить несколько веток в пустой указатель на ветку."
 
-#: builtin/pull.c:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "Невозможно переместить над несколькими ветками."
 
@@ -8832,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"
@@ -8849,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>)"
@@ -9011,12 +10318,53 @@ msgstr "не обновлять индекс или рабочий катало
 
 #: builtin/read-tree.c:137
 msgid "skip applying sparse checkout filter"
-msgstr "пропустить применение фильтра частичного перехода"
+msgstr "пропустить применение фильтра частичного переключения на состояние"
 
 #: builtin/read-tree.c:139
 msgid "debug unpack-trees"
 msgstr "отладка unpack-trees"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <каталог-git>"
+
+#: 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:1897
+msgid "You must specify a directory."
+msgstr "Вы должны указать каталог."
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9158,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» не является допустимым именем внешнего репозитория."
@@ -9186,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"
@@ -9204,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:"
@@ -9226,143 +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:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(нет URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
-msgstr "  URL для отправки: %s"
+msgstr "    URL для отправки: %s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD ветка: %s"
 
-#: builtin/remote.c:1167
+#: 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:1179
+#: 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:1182 builtin/remote.c:1209
+#: 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:1191
+#: builtin/remote.c:1188
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
 msgstr[0] "  Локальная ветка, настроенная для «git pull»:"
@@ -9370,11 +10730,11 @@ msgstr[1] "  Локальные ветки, настроенные для «git
 msgstr[2] "  Локальные ветки, настроенные для «git pull»:"
 msgstr[3] "  Локальные ветки, настроенные для «git pull»:"
 
-#: builtin/remote.c:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr " Локальные ссылки, зеркалируемые с помощью «git push»"
 
-#: builtin/remote.c:1206
+#: builtin/remote.c:1202
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
@@ -9383,207 +10743,220 @@ msgstr[1] "  Локальные ссылки, настроенные для «gi
 msgstr[2] "  Локальные ссылки, настроенные для «git push»%s:"
 msgstr[3] "  Локальные ссылки, настроенные для «git push»%s:"
 
-#: builtin/remote.c:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "установить refs/remotes/<имя>/HEAD в зависимости от внешнего репозитория"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "удалить refs/remotes/<имя>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "Не удалось определить внешний HEAD"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "Несколько внешних HEAD веток. Укажите явно одну из них:"
 
-#: builtin/remote.c:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "Не удалось удалить %s"
 
-#: builtin/remote.c:1264
+#: 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:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "Не удалось настроить %s"
 
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s будет висящей веткой!"
 
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s стала висящей веткой!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
-msgstr "Удаление %s"
+msgstr "Ð\9eÑ\87иÑ\81Ñ\82ка %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL: %s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [будет удалена] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [удалена] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "почистить внешние репозитории после извлечения"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Нет такого внешнего репозитория «%s»"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "добавить ветку"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "не указан внешний репозиторий"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "запросить URL отправки, вместо URL извлечения"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "вернуть все URL"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "URL не настроены для внешнего репозитория «%s»"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "управление URL отправки"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "добавить URL"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "удалить URL"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add нельзя использовать одновременно с --delete"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "Неправильный шаблон старого URL: %s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "Не найдены совпадения URL: %s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "Нельзя удалить все URL не-отправки"
 
-#: builtin/remote.c:1595
+#: 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>"
@@ -9683,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>...]"
@@ -9802,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"
@@ -9854,15 +11227,15 @@ msgstr "%s: %s нельзя использовать одновременно с
 
 #: builtin/revert.c:80
 msgid "end revert or cherry-pick sequence"
-msgstr "конеÑ\86 Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и Ð¾Ñ\82боÑ\80а Ð»Ñ\83Ñ\87Ñ\88его Ð¸Ð»Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\82а ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgstr "конеÑ\86 Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
 #: builtin/revert.c:81
 msgid "resume revert or cherry-pick sequence"
-msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c Ð¾Ñ\82боÑ\80а Ð»Ñ\83Ñ\87Ñ\88его Ð¸Ð»Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\82а ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgstr "пÑ\80одолжиÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
 #: builtin/revert.c:82
 msgid "cancel revert or cherry-pick sequence"
-msgstr "оÑ\82мена Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и Ð¾Ñ\82боÑ\80а Ð»Ñ\83Ñ\87Ñ\88его Ð¸Ð»Ð¸ Ð²Ð¾Ð·Ð²Ñ\80аÑ\82а ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
+msgstr "оÑ\82мена Ð¿Ð¾Ñ\81ледоваÑ\82елÑ\8cноÑ\81Ñ\82и ÐºÐ¾Ð¿Ð¸Ñ\80ованиÑ\8f Ð¸Ð»Ð¸ Ð¾Ð±Ñ\80аÑ\89ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82ов"
 
 #: builtin/revert.c:83
 msgid "don't automatically commit"
@@ -9888,33 +11261,29 @@ 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 "Ñ\81бой Ð²Ð¾Ð·Ð²Ñ\80аÑ\82а коммита"
+msgstr "Ñ\81бой Ð¾Ð±Ñ\80аÑ\89ениÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммита"
 
-#: builtin/revert.c:212
+#: builtin/revert.c:205
 msgid "cherry-pick failed"
-msgstr "Ñ\81бой Ð¿Ñ\80и Ð¾Ñ\82боÑ\80е Ð»Ñ\83Ñ\87Ñ\88его"
+msgstr "Ñ\81бой Ð¿Ñ\80и ÐºÐ¾Ð¿Ð¸Ñ\80овании ÐºÐ¾Ð¼Ð¼Ð¸Ñ\82а"
 
 #: builtin/rm.c:17
 msgid "git rm [<options>] [--] <file>..."
@@ -9998,10 +11367,6 @@ msgstr "разрешить рекурсивное удаление"
 msgid "exit with a zero status even if nothing matched"
 msgstr "выход с нулевым кодом возврата, даже если ничего не найдено"
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr "Пожалуйста, проиндексируйте ваши изменения в .gitmodules или спрячьте их, чтобы продолжить"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10070,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 | "
@@ -10192,80 +11618,218 @@ msgstr "пропустить и удалить все строки, начина
 msgid "prepend comment character and space to each line"
 msgstr "добавить перед каждой строкой символ комметария и пробел"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
+#: 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:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "Ожидалось полное имя ссылки, а получено %s"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "не удалось обрезать один компонент url «%s»"
+
+#: 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:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<путь>] [<путь>…]"
 
-#: builtin/submodule--helper.c:108
+#: 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:369
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "Сбой регистрации адреса для пути подмодуля «%s»"
+
+#: 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:383
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "внимание: предполагаемый режим обновления для подмодуля «%s»\n"
+
+#: builtin/submodule--helper.c:390
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr "Сбой регистрации режима обновления для пути подмодуля «%s»"
+
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Не выводить информацию о инициализации подмодуля"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<путь>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <путь>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "не найдено соответствие подмодулей в .gitmodules для пути «%s»"
 
-#: builtin/submodule--helper.c:164
+#: 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:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "имя нового подмодуля"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "url откуда должен был склонирован новый подмодуль"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "глубина для частичного клона"
 
-#: builtin/submodule--helper.c:182
+#: 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>] [--url <url>][--depth <depth>] [--] "
-"[<path>...]"
-msgstr "git submodule--helper clone [--prefix=<путь>] [--quiet] [--reference <репозиторий>] [--name <имя>] [--url <url>][--depth <глубина>] [--] [<путь>…]"
+"<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:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "не удалось клонировать «%s» в подмодуль по пути «%s»"
 
-#: builtin/submodule--helper.c:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "не удалось открыть файл «%s»"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "не удалось закрыть файл %s"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "не удалось получить каталог для подмодуля «%s»"
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr "критическая ошибка: подкоманда submodule--helper должна вызываться с указанием подкоманды"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "Подмодуль по пути «%s» не инициализирован"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Возможно, вы хотели использовать «update --init»?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "Пропуск не слитого подмодуля %s"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "Пропуск подмодуля «%s»"
+
+#: 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:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "путь в рабочем каталоге, в пределах границ подмодуля"
+
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout или none"
+
+#: builtin/submodule--helper.c:956
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "Создать частичный клон, ограниченный указанным количеством редакций"
+
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr "параллельные задачи"
+
+#: builtin/submodule--helper.c:961
+msgid "whether the initial clone should follow the shallow recommendation"
+msgstr "должен ли изначальный процесс клонирования следовать рекомендации о частичности"
 
-#: builtin/submodule--helper.c:274
+#: builtin/submodule--helper.c:962
+msgid "don't print cloning progress"
+msgstr "вы выводить прогресс клонирования"
+
+#: 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:979
+msgid "bad value for update parameter"
+msgstr "плохое значение для параметра update"
+
+#: 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:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "критическая ошибка: «%s» не является подкомандой submodule--helper"
+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>]"
@@ -10315,27 +11879,22 @@ msgstr "git tag -l [-n[<количество>]] [--contains <коммит>] [--p
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <имя-метки>…"
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "слишком длинное имя метки: %.*s…"
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "метка  «%s» не найдена."
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "Метка «%s» удалена (была %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "не удалось проверить метку «%s»"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -10344,7 +11903,7 @@ msgid ""
 "Lines starting with '%c' will be ignored.\n"
 msgstr "\nВведите сообщение для метки:\n  %s\nСтроки, начинающиеся с «%c» будут проигнорированы.\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -10470,26 +12029,26 @@ msgstr "опции --merged и --no-merged можно использовать 
 msgid "only one -F or -m option is allowed."
 msgstr "-F и -m нельзя использовать одновременно."
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "передано слишком много параметров"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "«%s» не является допустимым именем метки."
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "метка «%s» уже существует"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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 "Распаковка объектов"
 
@@ -10551,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»"
@@ -10732,7 +12295,7 @@ msgstr "git verify-commit [-v | --verbose] <коммит>…"
 msgid "print commit contents"
 msgstr "вывести содержимое коммита"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "выводить сырой вывод статуса от gpg"
 
@@ -10752,7 +12315,7 @@ msgstr "вывести только статистику"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <метка>…"
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "вывести содержимое метки"
 
@@ -10761,78 +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:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Удаление рабочих каталогов/%s: не является каталогом"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Удаление рабочих каталогов/%s: файл gitdir не существует"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "Удаление рабочих каталогов/%s: не удалось прочитать файл gitdir (%s)"
 
-#: builtin/worktree.c:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "Удаление рабочих каталогов/%s: недействительный файл gitdir"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "Удаление рабочих каталогов/%s: gitdir указывает на несуществующее расположение"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "не удалось удалить: %s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "«%s» уже существует"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "не удалось создать каталог «%s»"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "Подготовка %s (идентификатор %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 msgid "checkout <branch> even if already checked out in other worktree"
-msgstr "пеÑ\80ейÑ\82и на <ветка> даже если она уже активна в другом рабочесм каталоге"
+msgstr "пеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на <ветка> даже если она уже активна в другом рабочесм каталоге"
 
-#: builtin/worktree.c:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "создать новую ветку"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "создать или перейти на ветку"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "отсоединить HEAD на указанном коммите"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "наполнить новый рабочий каталог"
+
+#: 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=<префикс>/]"
@@ -10849,7 +12443,36 @@ msgstr "вывести объект дерева для подкаталога 
 msgid "only useful for debugging"
 msgstr "используется только при отладке"
 
-#: credential-cache--daemon.c:262
+#: 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"
 
@@ -10860,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:321
+#: 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"
 
@@ -10976,74 +12603,75 @@ 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"
 
-#: rerere.h:38
+#: rerere.h:40
 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
@@ -11173,65 +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:165
+#: 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:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "Не удалось сохранить $stash_sha1"
 
-#: git-rebase.sh:169
+#: 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:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
-msgstr "Перехватчик пре-перемещения отказал в перемещении."
+msgstr "Перехватчик pre-rebase отказал в перемещении."
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "Похоже, git-am выполняется. Перемещение невозможно."
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "Опция --exec должна использоваться вместе с опцией --interactive"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "Нет перемещения в процессе?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "Действие --edit-todo может использоваться только при интерактивном перемещении."
 
-#: git-rebase.sh:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "Не удалось прочитать HEAD"
 
-#: git-rebase.sh:380
+#: 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:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Не удалось перейти назад на $head_name"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11244,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:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "недействительная вышестоящая ветка $upstream_name"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: имеется больше одной базы слияния"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: нет базы слияния"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "Не указывает на действительный коммит: $onto_name"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "критическая ошибка: нет такой ветки: $branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "Не удалось выполнить автоматическое прятанье"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "Изменения автоматически спрятаны: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "Сделайте коммит или спрячьте их."
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "Текущая ветка $branch_name уже свежая."
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "Текущая ветка $branch_name уже свежая, принудительное перемещение."
 
-#: git-rebase.sh:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "Изменения от $mb до $onto:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "Сначала перематываем указатель текущего коммита, чтобы применить ваши изменения поверх него…"
 
-#: git-rebase.sh:623
+#: 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"
@@ -11348,120 +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:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "не удалось отрезать один компонент адреса «$remoteurl»"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "Относительный путь можно использовать только находясь на вершине рабочего каталога"
 
-#: git-submodule.sh:291
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "URL репозитория: «$repo» должен быть абсолютным или начинаться с ./|../"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "«$sm_path» уже содержится в индексе"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11469,235 +13147,605 @@ msgid ""
 "Use -f if you really want to add it."
 msgstr "Следующие пути игнорируются одним из ваших файлов .gitignore:\n$sm_path\nИспользуйте опцию -f, если вы действительно хотите его добавить."
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Добавляю существующий репозиторий из «$sm_path» в индекс"
 
-#: git-submodule.sh:332
+#: 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:340
+#: 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:342
+#: git-submodule.sh:245
 #, sh-format
 msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr "Если вы хотите переиспользовать локальный каталог git вместо повторного клонирования из"
+"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:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ", то используйте опцию «--force». Если локальный каталог git не является действительным репозиторием"
-
-#: git-submodule.sh:345
-#, sh-format
-msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr "или если вы не поняли, что это значит, то просто используйте другое имя с помощью опции «--name»."
-
-#: git-submodule.sh:347
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Восстановление локального каталога git для подмодуля «$sm_name»."
 
-#: git-submodule.sh:359
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80ейÑ\82и на состояние у подмодуля «$sm_path»"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на состояние у подмодуля «$sm_path»"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Сбой добавления подмодуля «$sm_path»"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Не удалось зарегистрировать подмодуль «$sm_path»"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Заходим в «$prefix$displaypath»"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr "Останавливаемся на «$prefix$displaypath»; сценарий вернул не нулевой код возврата."
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr "Адрес для пути подмодуля «$displaypath» не найден в .gitmodules"
-
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Сбой регистрации адресе для пути подмодуля «$displaypath»"
-
-#: git-submodule.sh:494
+#: git-submodule.sh:324
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "Ð\9fодмодÑ\83лÑ\8c Â«$name» ($url) Ð·Ð°Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ован Ð´Ð»Ñ\8f Ð¿Ñ\83Ñ\82и «$displaypath»"
+msgid "Entering '$displaypath'"
+msgstr "Ð\97аÑ\85одим Ð² «$displaypath»"
 
-#: git-submodule.sh:511
+#: git-submodule.sh:344
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr "Сбой Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ии Ñ\80ежима Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f Ð´Ð»Ñ\8f Ð¿Ñ\83Ñ\82и Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f Â«$displaypath»"
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr "Ð\9eÑ\81Ñ\82анавливаемÑ\81Ñ\8f Ð½Ð° Â«$displaypath»; Ñ\81Ñ\86енаÑ\80ий Ð²ÐµÑ\80нÑ\83л Ð½Ðµ Ð½Ñ\83левой ÐºÐ¾Ð´ Ð²Ð¾Ð·Ð²Ñ\80аÑ\82а."
 
-#: git-submodule.sh:549
+#: git-submodule.sh:415
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Используйте «.», если вы действительно хотите деинициализировать все подмодули"
+msgid "pathspec and --all are incompatible"
+msgstr "спецификацию пути и --all нельзя использовать одновременно"
 
-#: git-submodule.sh:566
+#: git-submodule.sh:420
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "РабоÑ\87ий ÐºÐ°Ñ\82алог Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83лÑ\8f Â«$displaypath» Ñ\81одеÑ\80жиÑ\82 ÐºÐ°Ñ\82алог .git"
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е Â«--all», ÐµÑ\81ли Ð²Ñ\8b Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\82елÑ\8cно Ñ\85оÑ\82иÑ\82е Ð´ÐµÐ¸Ð½Ð¸Ñ\86иализиÑ\80оваÑ\82Ñ\8c Ð²Ñ\81е Ð¿Ð¾Ð´Ð¼Ð¾Ð´Ñ\83ли"
 
-#: git-submodule.sh:567
+#: 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:573
+#: 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:576
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "Очищен каталог «$displaypath»"
 
-#: git-submodule.sh:577
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "Не удалось удалить рабочий каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:580
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "Не удалось создать пустой каталог подмодуля «$displaypath»"
 
-#: git-submodule.sh:589
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "Подмодуль «$name» ($url) был снят с регистрации по пути «$displaypath»"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr "Подмодуль по пути «$displaypath» не инициализирован\nВозможно, вам нужно использовать «update --init»?"
-
-#: git-submodule.sh:736
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Не удалось найти текущую редакцию для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:745
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Не удалось выполнить извлечение для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:768
+#: 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:788
+#: 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 "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c Ð¿ÐµÑ\80еÑ\85од на состояние «$sha1» для подмодуля по пути «$displaypath»"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿ÐµÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8cÑ\81Ñ\8f на состояние «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:789
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: забрано состояние «$sha1»"
 
-#: git-submodule.sh:793
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось переместить «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:794
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: перемещен над «$sha1»"
 
-#: git-submodule.sh:799
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "Не удалось выполнить слияние с «$sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:800
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "Подмодуль по пути «$displaypath»: слито с «$sha1»"
 
-#: git-submodule.sh:805
+#: git-submodule.sh:680
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr "Сбой выполнения «$command $sha1» для подмодуля по пути «$prefix$sm_path»"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+msgstr "Сбой выполнения «$command $sha1» для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:806
+#: git-submodule.sh:681
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Подмодуль по пути «$prefix$sm_path»: «$command $sha1»"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Подмодуль по пути «$displaypath»: «$command $sha1»"
 
-#: git-submodule.sh:836
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$displaypath»"
 
-#: git-submodule.sh:944
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Опцию --cached нельзя использовать одновременно с опцией --files"
 
-#: git-submodule.sh:996
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "неизвестный режим $mod_dst"
 
-#: git-submodule.sh:1016
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_src"
 
-#: git-submodule.sh:1019
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  Предупреждение: $display_name не содержит коммит $sha1_dst"
 
-#: git-submodule.sh:1022
+#: 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:1047
-msgid "blob"
-msgstr "двоичный объект"
-
-#: git-submodule.sh:1165
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Не удалось выполнить рекурсивно для подмодуля по пути «$sm_path»"
 
-#: git-submodule.sh:1229
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Синхронизация url для подмодуля «$displaypath»"
+
+#: 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 ""
+"\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 32bcaba6b5ab267fd12586f2df77a76b8c6552f6..14a555c3aff03f245dcf492c5dd695dc89689f8f 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,12 +5,12 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git 2.8.0\n"
+"Project-Id-Version: git 2.11.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-15 22:35+0100\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22:59+0800\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
-"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language-Team: Svenska <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,7 +23,42 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "tips: %.*s\n"
 
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en cherry-pick eftersom du har filer som inte slagits "
+"samman."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en incheckning eftersom du har filer som inte slagits "
+"samman."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en sammanslagning eftersom du har filer som inte slagits "
+"samman."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en \"pull\" eftersom du har filer som inte slagits samman."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en \"revert\" eftersom du har filer som inte slagits "
+"samman."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr ""
+"Du kan inte utföra en \"%s\" eftersom du har filer som inte slagits samman."
+
+#: 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."
@@ -31,12160 +66,14784 @@ msgstr ""
 "Rätta dem i din arbetskatalog och använd sedan \"git add/rm <fil>\"\n"
 "som lämpligt för att ange lösning och checka in."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+msgid "Exiting because of an unresolved conflict."
+msgstr "Avslutar på grund av olöst konflikgt."
+
+#: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Checka in dina ändringar innan du utför sammanslagningen."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Avslutar på grund av ofullbordad sammanslagning."
 
-#: 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
+#: 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 <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"
+"Observera: checkar ut \"%s\".\n"
+"\n"
+"Du har nu ett \"frånkopplat HEAD\". Du kan se dig omkring, experimentera\n"
+"med ändringar och checka in dem, och du kan kasta incheckningar du gör\n"
+"i det här läget utan att det påverkar grenar genom att checka ut på\n"
+"nytt.\n"
+"\n"
+"Om du vill skapa en ny gren för att behålla ändringarna du skapar, kan\n"
+"du göra det (nu eller senare) genom att använda checkout-kommandot igen\n"
+"med -b. Till exempel:\n"
+"\n"
+"  git checkout -b <namn-på-ny-gren>\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ökvägsangivelsen \"%s\" motsvarade inte några filer"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "fmt"
+msgid "unrecognized whitespace option '%s'"
+msgstr "okänt alternativ för whitespace: \"%s\""
 
-#: archive.c:429
-msgid "archive format"
-msgstr "arkivformat"
+#: apply.c:73
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "okänt alternativ för ignore-whitespace: \"%s\""
 
-#: archive.c:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "prefix"
+#: apply.c:125
+msgid "--reject and --3way cannot be used together."
+msgstr "--reject och --3way kan inte användas samtidigt"
 
-#: 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:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached och --3way kan inte användas samtidigt"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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 "fil"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way utanför arkiv"
 
-#: archive.c:433 builtin/archive.c:89
-msgid "write the archive to this file"
-msgstr "skriv arkivet till filen"
+#: apply.c:141
+msgid "--index outside a repository"
+msgstr "--index utanför arkiv"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "läs .gitattributes i arbetskatalogen"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached utanför arkiv"
 
-#: archive.c:436
-msgid "report archived files on stderr"
-msgstr "rapportera arkiverade filer på standard fel"
+#: 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:437
-msgid "store only"
-msgstr "endast spara"
+#: apply.c:854
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec returnerade %d för indata: %s"
 
-#: archive.c:438
-msgid "compress faster"
-msgstr "komprimera snabbare"
+#: 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:446
-msgid "compress better"
-msgstr "komprimera bättre"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "visa understödda arkivformat"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "arkiv"
+#: 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:452 builtin/archive.c:91
-msgid "retrieve the archive from remote repository <repo>"
-msgstr "hämta arkivet från fjärrarkivet <arkiv>"
+#: 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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "kommando"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: förväntade rad: %.*s"
 
-#: 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:1557
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "patch-fragment utan huvud på rad %d: %.*s"
 
-#: attr.c:263
+#: apply.c:1577
+#, c-format
 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."
+"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)"
 
-#: branch.c:53
+#: apply.c:1589
 #, 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 "git diff header lacks filename information (line %d)"
+msgstr "git-diff-huvudet saknar filnamnsinformation (rad %d)"
 
-#: branch.c:67
+#: apply.c:1759
+msgid "new file depends on old contents"
+msgstr "ny fil beror på gammalt innehåll"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "borttagen fil har fortfarande innehåll"
+
+#: apply.c:1795
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
+msgid "corrupt patch at line %d"
+msgstr "trasig patch på rad %d"
 
-#: branch.c:93
+#: apply.c:1832
 #, 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."
+msgid "new file %s depends on old contents"
+msgstr "nya filen %s beror på gammalt innehåll"
 
-#: branch.c:94
+#: apply.c:1834
 #, 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 "deleted file %s still has contents"
+msgstr "borttagna filen %s har fortfarande innehåll"
 
-#: branch.c:98
+#: apply.c:1837
 #, 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 "** warning: file %s becomes empty but is not deleted"
+msgstr "** varning: filen %s blir tom men har inte tagits bort"
 
-#: branch.c:99
+#: apply.c:1984
 #, 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 "corrupt binary patch at line %d: %.*s"
+msgstr "trasig binärpatch på rad %d: %.*s"
 
-#: branch.c:104
+#: apply.c:2021
 #, 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 "unrecognized binary patch at line %d"
+msgstr "binärpatchen på rad %d känns inte igen"
 
-#: branch.c:105
+#: apply.c:2182
 #, 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 "patch with only garbage at line %d"
+msgstr "patch med bara skräp på rad %d"
 
-#: branch.c:109
+#: apply.c:2274
 #, 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."
+msgid "unable to read symlink %s"
+msgstr "kunde inte läsa symboliska länken %s"
 
-#: branch.c:110
+#: apply.c:2278
 #, 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."
+msgid "unable to open or read %s"
+msgstr "kunde inte öppna eller läsa %s"
 
-#: branch.c:119
-msgid "Unable to write upstream branch configuration"
-msgstr "Kan inte skriva inställningar för uppströmsgren"
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "felaktig inledning på rad: \"%c\""
 
-#: branch.c:156
+#: apply.c:3050
 #, c-format
-msgid "Not tracking: ambiguous information for ref %s"
-msgstr "Spårar inte: tvetydig information för referensen %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)."
 
-#: branch.c:185
+#: apply.c:3062
 #, c-format
-msgid "'%s' is not a valid branch name."
-msgstr "\"%s\" är inte ett giltigt grennamn."
+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"
 
-#: branch.c:190
+#: apply.c:3068
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Det finns redan en gren som heter \"%s\""
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"vid sökning efter:\n"
+"%.*s"
 
-#: branch.c:198
-msgid "Cannot force update the current branch."
-msgstr "Kan inte tvinga uppdatering av aktuell gren."
+#: apply.c:3090
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "saknar binära patchdata för \"%s\""
 
-#: branch.c:218
+#: apply.c:3098
 #, 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 "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr ""
+"kan inte applicera en binärpatch baklänges utan den omvända patchen för \"%s"
+"\""
 
-#: branch.c:220
+#: apply.c:3144
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"kan inte applicera binärpatch på \"%s\" utan den fullständiga indexraden"
 
-#: branch.c:222
+#: apply.c:3154
+#, 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."
+"the patch applies to '%s' (%s), which does not match the current contents."
 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."
+"patchen appliceras på \"%s\" (%s), som inte motsvarar det nuvarande "
+"innehållet."
 
-#: branch.c:266
+#: apply.c:3162
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Objektnamnet är inte giltigt: \"%s\"."
+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"
 
-#: branch.c:286
+#: apply.c:3180
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Objektnamnet är tvetydigt: \"%s\"."
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "nödvändig efterbild %s för \"%s\" kan inte läsas"
 
-#: branch.c:291
+#: apply.c:3193
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Avgreningspunkten är inte giltig: \"%s\""
+msgid "binary patch does not apply to '%s'"
+msgstr "binärpatchen kan inte tillämpas på \"%s\""
 
-#: branch.c:344
+#: apply.c:3199
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "\"%s\" är redan utcheckad på \"%s\""
+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)"
 
-#: bundle.c:34
+#: apply.c:3220
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' ser inte ut som en v2-bundle-fil"
+msgid "patch failed: %s:%ld"
+msgstr "patch misslyckades: %s:%ld"
 
-#: bundle.c:61
+#: apply.c:3342
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "okänt huvud: %s%s (%d)"
+msgid "cannot checkout %s"
+msgstr "kan inte checka ut %s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, 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:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "misslyckades skapa revisionstraversering"
+msgid "failed to read %s"
+msgstr "misslyckades läsa %s"
 
-#: bundle.c:185
+#: apply.c:3398
 #, 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 "reading from '%s' beyond a symbolic link"
+msgstr "läser från \"%s\" som är på andra sidan av en symbolisk länk"
 
-#: bundle.c:194
+#: apply.c:3427 apply.c:3667
 #, 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"
+msgid "path %s has been renamed/deleted"
+msgstr "sökvägen %s har ändrat namn/tagits bort"
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
+msgid "%s: does not exist in index"
+msgstr "%s: finns inte i indexet"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "okänt argument: %s"
+msgid "%s: does not match index"
+msgstr "%s: motsvarar inte indexet"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Vägrar skapa ett tomt paket (bundle)."
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr ""
+"arkivet saknar objekt som behövs för att falla tillbaka på 3-"
+"vägssammanslagning."
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "kan inte skapa \"%s\""
+msgid "Falling back to three-way merge...\n"
+msgstr "Faller tillbaka på trevägssammanslagning...\n"
 
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "index-pack dog"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "kunde inte läsa aktuellt innehåll i \"%s\""
 
-#: color.c:275
+#: apply.c:3589
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "felaktigt färgvärde: %.*s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "Misslyckades falla tillbaka på trevägssammanslagning...\n"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
-msgstr "kunde inte tolka %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Applicerade patchen på \"%s\" med konflikter.\n"
 
-#: commit.c:42
+#: apply.c:3608
 #, c-format
-msgid "%s %s is not a commit!"
-msgstr "%s %s är inte en incheckning!"
+msgid "Applied patch to '%s' cleanly.\n"
+msgstr "Tillämpade patchen på  \"%s\" rent.\n"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "minnet slut"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "patch för borttagning lämnar kvar filinnehåll"
 
-#: config.c:475 config.c:477
+#: apply.c:3706
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "felaktig konfigurationsfil rad %d i %s %s"
+msgid "%s: wrong type"
+msgstr "%s: fel typ"
 
-#: config.c:593
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i %s %s: %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s har typen %o, förväntade %o"
 
-#: config.c:595
+#: apply.c:3859 apply.c:3861
 #, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": %s"
+msgid "invalid path '%s'"
+msgstr "ogiltig sökväg: %s"
 
-#: config.c:680
+#: apply.c:3917
 #, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr "misslyckades expandera användarkatalog i: \"%s\""
+msgid "%s: already exists in index"
+msgstr "%s: finns redan i indexet"
 
-#: config.c:758 config.c:769
+#: apply.c:3920
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "felaktigt zlib-komprimeringsgrad %d"
+msgid "%s: already exists in working directory"
+msgstr "%s: finns redan i arbetskatalogen"
 
-#: config.c:891
+#: apply.c:3940
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "felaktigt läge för skapande av objekt: %s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "kan inte tolka kommandoradskonfiguration"
+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)"
 
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "okänt fel uppstod vid läsning av konfigurationsfilerna"
+#: apply.c:3945
+#, 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"
 
-#: config.c:1629
+#: apply.c:3965
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr "kunde inte tolka värdet \"%s\" från kommandoradskonfiguration"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "den berörda filen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: config.c:1631
+#: apply.c:3969
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "felaktig konfigurationsvariabel \"%s\" i filen \"%s\" på rad %d"
+msgid "%s: patch does not apply"
+msgstr "%s: patchen kan inte tillämpas"
 
-#: config.c:1690
+#: apply.c:3984
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s har flera värden"
+msgid "Checking patch %s..."
+msgstr "Kontrollerar patchen %s..."
 
-#: config.c:2226
+#: apply.c:4075
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Kunde inte ställa in \"%s\" till \"%s\""
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "sha1-informationen saknas eller är oanvändbar för undermodulen %s"
 
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Kunde inte köra \"git rev-list\""
+#: apply.c:4082
+#, c-format
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "nytt läge för %s, som inte finns i nuvarande HEAD"
 
-#: connected.c:89
+#: apply.c:4085
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "kunde inte skriva till rev-list: %s"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1-informationen saknas eller är oanvändbar (%s)."
 
-#: connected.c:97
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "kunde inte stänga rev-list:s standard in: %s"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
 
-#: date.c:95
-msgid "in the future"
-msgstr "i framtiden"
+#: apply.c:4094
+#, c-format
+msgid "could not add %s to temporary index"
+msgstr "kunde inte lägga till %s till temporärt index"
 
-#: date.c:101
+#: apply.c:4104
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu sekund sedan"
-msgstr[1] "%lu sekunder sedan"
+msgid "could not write temporary index to %s"
+msgstr "kunde inte skriva temporärt index till %s"
 
-#: date.c:108
+#: apply.c:4242
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu minut sedan"
-msgstr[1] "%lu minuter sedan"
+msgid "unable to remove %s from index"
+msgstr "kan inte ta bort %s från indexet"
 
-#: date.c:115
+#: apply.c:4277
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu timme sedan"
-msgstr[1] "%lu timmar sedan"
+msgid "corrupt patch for submodule %s"
+msgstr "trasig patch för undermodulen %s"
 
-#: date.c:122
+#: apply.c:4283
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu dag sedan"
-msgstr[1] "%lu dagar sedan"
+msgid "unable to stat newly created file '%s'"
+msgstr "kan inte ta status på nyligen skapade filen \"%s\""
 
-#: date.c:128
+#: apply.c:4291
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu vecka sedan"
-msgstr[1] "%lu veckor sedan"
+msgid "unable to create backing store for newly created file %s"
+msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s"
 
-#: date.c:135
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu månad sedan"
-msgstr[1] "%lu månader sedan"
+msgid "unable to add cache entry for %s"
+msgstr "kan inte lägga till cachepost för %s"
 
-#: date.c:146
+#: apply.c:4338
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu år"
-msgstr[1] "%lu år"
+msgid "failed to write to '%s'"
+msgstr "misslyckades skriva till \"%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 månad sedan"
-msgstr[1] "%s, %lu månader sedan"
+msgid "closing file '%s'"
+msgstr "stänger filen \"%s\""
 
-#: date.c:154 date.c:159
+#: apply.c:4412
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu år sedan"
-msgstr[1] "%lu år sedan"
+msgid "unable to write file '%s' mode %o"
+msgstr "kan inte skriva filen \"%s\" läge %o"
 
-#: diffcore-order.c:24
+#: apply.c:4510
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "kunde inte läsa orderfilen \"%s\""
+msgid "Applied patch %s cleanly."
+msgstr "Tillämpade patchen %s rent."
 
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "Utför onöjaktig namnbytesdetektering"
+#: apply.c:4518
+msgid "internal error"
+msgstr "internt fel"
 
-#: diff.c:115
+#: apply.c:4521
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n"
+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..."
 
-#: diff.c:120
+#: apply.c:4532
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Okänd dirstat-parameter \"%s\"\n"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "trunkerar .rej-filnamnet till %.*s.rej"
 
-#: diff.c:215
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\""
+msgid "cannot open %s"
+msgstr "kan inte öppna %s"
 
-#: diff.c:267
+#: apply.c:4554
 #, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
-"%s"
+msgid "Hunk #%d applied cleanly."
+msgstr "Stycke %d tillämpades rent."
 
-#: diff.c:2997
+#: apply.c:4558
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "extern diff dog, stannar vid %s"
-
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow kräver exakt en sökvägsangivelse"
+msgid "Rejected hunk #%d."
+msgstr "Refuserar stycke %d."
 
-#: diff.c:3556
+#: apply.c:4668
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Misslyckades tolka argument till flaggan --dirstat/-X;\n"
-"%s"
+msgid "Skipped patch '%s'."
+msgstr "Ignorerar patch \"%s\"."
 
-#: diff.c:3570
-#, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "indata känns inte igen"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "misslyckades hämta kärnans namn och information"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "kan inte läsa indexfilen"
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr "Ospårad cache är inaktiverad på systemet eller platsen."
-
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "kunde inte köra gpg."
-
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg godtog inte data"
-
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg misslyckades signera data"
-
-#: gpg-interface.c:222
+#: apply.c:4833
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "kunde inte skapa temporära filen \"%s\": %s"
+msgid "can't open patch '%s': %s"
+msgstr "kan inte öppna patchen \"%s\": %s"
 
-#: gpg-interface.c:225
+#: apply.c:4858
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "misslyckades skriva fristående signatur till \"%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"
 
-#: grep.c:1718
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "\"%s\" kunde inte läsa %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."
 
-#: grep.c:1735
+#: apply.c:4872
 #, c-format
-msgid "'%s': %s"
-msgstr "\"%s\": %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."
 
-#: grep.c:1746
-#, c-format
-msgid "'%s': short read %s"
-msgstr "\"%s\": kort läsning %s"
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "Kunde inte skriva ny indexfil"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "git-kommandon tillgängliga i \"%s\""
+#: 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 "sökväg"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "git-kommandon från andra platser i din $PATH"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "tillämpa inte ändringar som motsvarar given sökväg"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "Dessa vanliga Git-kommandon används i olika situationer:"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "tillämpa ändringar som motsvarar given sökväg"
 
-#: 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\" verkar vara ett git-kommando, men vi kan inte\n"
-"köra det. Kanske git-%s är trasigt?"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "antal"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "Oj då. Ditt system rapporterar inga Git-kommandon alls."
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
 
-#: 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 ""
-"VARNING: Du anropade ett Git-kommando vid namn \"%s\", som inte finns.\n"
-"Fortsätter under förutsättningen att du menade \"%s\""
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "ignorera tillägg gjorda av patchen"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "automatiskt om %0.1f sekunder..."
+#: apply.c:4931
+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"
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "visa antal tillagda och borttagna rader decimalt"
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Menade du detta?"
-msgstr[1] ""
-"\n"
-"Menade du ett av dessa?"
+#: apply.c:4937
+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"
 
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+#: apply.c:4939
+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"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "misslyckades läsa cachen"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "se till att patchen kan tillämpas på aktuellt index"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
-msgstr "kunde inte skriva ny indexfil"
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "tillämpa en patch utan att röra arbetskatalogen"
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
-msgstr "(felaktig incheckning)\n"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "godta en patch som rör filer utanför arbetskatalogen"
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "fel vid byggande av träd"
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr "misslyckades skapa sökvägen \"%s\"%s"
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
 
-#: merge-recursive.c:700
-#, 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"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "sökvägar avdelas med NUL-tecken"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": kanske en K/F-konflikt?"
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "se till att åtminstone <n> rader sammanhang är lika"
 
-#: merge-recursive.c:725
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "vägrar förlora ospårad fil vid \"%s\""
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "åtgärd"
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "kan inte läsa objektet %s: \"%s\""
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "blob förväntades för %s \"%s\""
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "ignorera ändringar i blanktecken för sammanhang"
 
-#: merge-recursive.c:790 builtin/clone.c:374
-#, c-format
-msgid "failed to open '%s'"
-msgstr "misslyckades öppna \"%s\""
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "tillämpa patchen baklänges"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
-msgstr "misslyckades skapa symboliska länken \"%s\""
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "förvänta inte minst en rad sammanhang"
 
-#: merge-recursive.c:801
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Misslyckades exekvera intern sammanslagning"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "tillåt överlappande stycken"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "Kunde inte lägga till %s till databasen"
+#: 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 "var pratsam"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "objekttyp som ej stöds upptäcktes i trädet"
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
 
-#: 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 ""
-"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
-"i trädet."
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+msgstr "lite inte på antalet linjer i styckehuvuden"
 
-#: 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."
-msgstr ""
-"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
-"i trädet vid %s."
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "rot"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "namnbyte"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "lägg till <rot> i alla filnamn"
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "namnbytt"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<flaggor>] <träd-igt> [<sökväg>...]"
 
-#: merge-recursive.c:1150
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s är en katalog i %s lägger till som %s istället"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: merge-recursive.c:1172
-#, c-format
+#: archive.c:14
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
-"namnbyte \"%s\"->\"%s\" i \"%s\"%s"
+"git archive --remote <arkiv> [--exec <kmd>] [<flaggor>] <träd-igt> "
+"[<sökväg>...]"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (lämnad olöst)"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
 
-#: merge-recursive.c:1231
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s"
+msgid "pathspec '%s' did not match any files"
+msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
 
-#: merge-recursive.c:1261
-#, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Byter namn på %s till %s och %s till %s istället"
+#: archive.c:429
+msgid "fmt"
+msgstr "fmt"
 
-#: merge-recursive.c:1460
-#, 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"
+#: archive.c:429
+msgid "archive format"
+msgstr "arkivformat"
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
-msgstr "Lägger till sammanslagen %s"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "prefix"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
-msgstr "Lägger till som %s istället"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "lägg till prefix till varje sökväg i arkivet"
 
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
-msgstr "kan inte läsa objektet %s"
+#: archive.c:432 builtin/archive.c:88 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 "fil"
 
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
-msgstr "objektet %s är inte en blob"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "skriv arkivet till filen"
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "ändra"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "läs .gitattributes i arbetskatalogen"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "ändrad"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "rapportera arkiverade filer på standard fel"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "innehåll"
+#: archive.c:437
+msgid "store only"
+msgstr "endast spara"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "tillägg/tillägg"
+#: archive.c:438
+msgid "compress faster"
+msgstr "komprimera snabbare"
 
-#: merge-recursive.c:1632
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
+#: archive.c:446
+msgid "compress better"
+msgstr "komprimera bättre"
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Slår ihop %s automatiskt"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "visa understödda arkivformat"
 
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "undermodul"
+#: 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 "arkiv"
 
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "hämta arkivet från fjärrarkivet <arkiv>"
 
-#: merge-recursive.c:1737
-#, c-format
-msgid "Removing %s"
-msgstr "Tar bort %s"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "kommando"
 
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "fil/katalog"
+#: 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"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "katalog/fil"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Oväntad flagga --remote"
 
-#: merge-recursive.c:1773
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "Flaggan --exec kan endast användas tillsammans med --remote"
+
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Oväntad flagga --output"
+
+#: archive.c:487
 #, 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"
+msgid "Unknown archive format '%s'"
+msgstr "Okänt arkivformat \"%s\""
 
-#: merge-recursive.c:1783
+#: archive.c:494
 #, c-format
-msgid "Adding %s"
-msgstr "Lägger till %s"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Argumentet stöd inte för formatet \"%s\": -%d"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
+#: 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."
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "Redan à jour!"
+#: bisect.c:441
+#, c-format
+msgid "Could not open file '%s'"
+msgstr "Kunde inte öppna filen \"%s\""
 
-#: merge-recursive.c:1828
+#: bisect.c:446
 #, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "sammanslagning av träden %s och %s misslyckades"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "Felaktigt citerat innehåll i filen \"%s\": %s"
 
-#: merge-recursive.c:1858
+#: bisect.c:655
 #, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Obehandlad sökväg??? %s"
+msgid "We cannot bisect more!\n"
+msgstr "Det finns inte mer att göra \"bisect\" på!\n"
 
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "Slår ihop:"
+#: bisect.c:708
+#, c-format
+msgid "Not a valid commit name %s"
+msgstr "Namnet på incheckningen är inte giltigt: %s"
 
-#: merge-recursive.c:1919
+#: bisect.c:732
 #, 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:"
+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"
 
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
-msgstr "sammanslagningen returnerade ingen incheckning"
+#: bisect.c:737
+#, 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"
 
-#: merge-recursive.c:2013
+#: bisect.c:742
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Kunde inte tolka objektet \"%s\""
+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"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "Kunde inte skriva indexet."
+#: 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 ""
+"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"
 
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd"
+#: 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 ""
+"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å."
 
-#: notes-utils.c:100
+#: bisect.c:798
 #, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Felaktigt värde för notes.rewriteMode: '%s'"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "Bisect: en sammanslagningsbas måste testas\n"
 
-#: notes-utils.c:110
+#: bisect.c:849
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
+msgid "a %s revision is needed"
+msgstr "en %s-revision behövs"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Felaktigt värde på %s: \"%s\""
+msgid "could not create file '%s'"
+msgstr "kunde inte skapa filen \"%s\""
 
-#: object.c:242
+#: bisect.c:917
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "kunde inte tolka objektet: %s"
+msgid "could not read file '%s'"
+msgstr "kunde inte läsa filen \"%s\""
 
-#: parse-options.c:570
-msgid "..."
-msgstr "..."
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "misslyckades läsa bisect-referenser"
 
-#: parse-options.c:588
+#: bisect.c:967
 #, c-format
-msgid "usage: %s"
-msgstr "användning: %s"
+msgid "%s was both %s and %s\n"
+msgstr "%s var både %s och %s\n"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: bisect.c:975
 #, c-format
-msgid "   or: %s"
-msgstr "     eller: %s"
+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"
 
-#: parse-options.c:595
+#: bisect.c:994
 #, c-format
-msgid "    %s"
-msgstr "    %s"
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ungefär %d steg)"
+msgstr[1] "(ungefär %d steg)"
 
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-TAL"
-
-#: parse-options-cb.c:108
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "felformat objektnamn \"%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] "Bisect: %d revision kvar att testa efter denna %s\n"
+msgstr[1] "Bisect: %d revisioner kvar att testa efter denna %s\n"
 
-#: path.c:752
+#: branch.c:53
 #, c-format
-msgid "Could not make %s writable by group"
-msgstr "Kunde inte göra %s skrivbar för gruppen"
-
-#: pathspec.c:133
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-"de globala sökvägsinställningarna \"glob\" och \"noglob\" är inkompatibla"
-
-#: pathspec.c:143
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"\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 ""
-"den globala sökvägsinställningen \"literal\" är inkompatibel med alla andra "
-"globala sökvägsinställningar"
-
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "ogiltig parameter för sökvägsuttrycket för \"prefix\""
+"\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\"."
 
-#: pathspec.c:183
+#: branch.c:67
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "felaktigt sökvägsuttryck \"%.*s\" i \"%s\""
+msgid "Not setting branch %s as its own upstream."
+msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
 
-#: pathspec.c:187
+#: branch.c:93
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "\")\" saknas i slutet av sökvägsuttrycket för \"%s\""
+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."
 
-#: pathspec.c:205
+#: branch.c:94
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "Tecknet \"%c\" i sökvägsuttrycket i \"%s\" har inte implementerats"
+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."
 
-#: pathspec.c:230
+#: branch.c:98
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: \"literal\" och \"glob\" är inkompatibla"
+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."
 
-#: pathspec.c:241
+#: branch.c:99
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: \"%s\" är utanför arkivet"
+msgid "Branch %s set up to track local branch %s."
+msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
 
-#: pathspec.c:291
+#: branch.c:104
 #, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
+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."
 
-#: pathspec.c:353
+#: branch.c:105
 #, 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"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
 
-#: pathspec.c:433
+#: branch.c:109
 #, 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 '.' ?"
+msgid "Branch %s set up to track local ref %s by rebasing."
 msgstr ""
-"Ingenting att exkludera från med :(exkludera)-mönster.\n"
-"Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
+"Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
 
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "kunde inte tolka format för --pretty"
+#: 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."
 
-#: progress.c:235
-msgid "done"
-msgstr "klart"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "Kan inte skriva inställningar för uppströmsgren"
 
-#: read-cache.c:1281
+#: branch.c:156
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"index.version satt, men värdet är ogiltigt.\n"
-"Använder version %i"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "Spårar inte: tvetydig information för referensen %s"
 
-#: read-cache.c:1291
+#: branch.c:185
 #, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
-"Använder version %i"
+msgid "'%s' is not a valid branch name."
+msgstr "\"%s\" är inte ett giltigt grennamn."
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: branch.c:190
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Kunde inte öppna \"%s\" för skrivning"
+msgid "A branch named '%s' already exists."
+msgstr "Det finns redan en gren som heter \"%s\""
 
-#: refs/files-backend.c:2374
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr "kunde inte ta bort referensen %s: %s"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "Kan inte tvinga uppdatering av aktuell gren."
 
-#: refs/files-backend.c:2377
+#: branch.c:218
 #, c-format
-msgid "could not delete references: %s"
-msgstr "kunde inte ta bort referenser: %s"
+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."
 
-#: refs/files-backend.c:2386
+#: branch.c:220
 #, c-format
-msgid "could not remove reference %s"
-msgstr "kunde inte ta bort referensen %s"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
 
-#: ref-filter.c:55
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "förväntat format: %%(color:<color>)"
+#: 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."
 
-#: ref-filter.c:57
+#: branch.c:265
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "okänd färg: %%(color:%s)"
+msgid "Not a valid object name: '%s'."
+msgstr "Objektnamnet är inte giltigt: \"%s\"."
 
-#: ref-filter.c:71
+#: branch.c:285
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "okänt format: %%(%s)"
+msgid "Ambiguous object name: '%s'."
+msgstr "Objektnamnet är tvetydigt: \"%s\"."
 
-#: ref-filter.c:77
+#: branch.c:290
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) tar inte argument"
+msgid "Not a valid branch point: '%s'."
+msgstr "Avgreningspunkten är inte giltig: \"%s\""
 
-#: ref-filter.c:84
+#: branch.c:344
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) tar inte argument"
+msgid "'%s' is already checked out at '%s'"
+msgstr "\"%s\" är redan utcheckad på \"%s\""
 
-#: ref-filter.c:101
+#: branch.c:363
 #, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "positivt värde förväntat contents:lines=%s"
+msgid "HEAD of working tree %s is not updated"
+msgstr "HEAD i arbetskatalogen %s har inte uppdaterats"
 
-#: ref-filter.c:103
+#: bundle.c:34
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "okänt %%(contents)-argument: %s"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' ser inte ut som en v2-bundle-fil"
 
-#: ref-filter.c:113
+#: bundle.c:61
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "okänt %%(objectname)-argument: %s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "okänt huvud: %s%s (%d)"
 
-#: ref-filter.c:135
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "förväntat format: %%(align:<bredd>,<position>)"
+msgid "could not open '%s'"
+msgstr "kunde inte öppna \"%s\""
 
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
-msgstr "okänd position:%s"
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
 
-#: ref-filter.c:151
-#, c-format
-msgid "unrecognized width:%s"
-msgstr "okänd bredd:%s"
+#: 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 "misslyckades skapa revisionstraversering"
 
-#: ref-filter.c:157
+#: bundle.c:185
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "okänt %%(align)-argument: %s"
+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:"
 
-#: ref-filter.c:161
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "positiv bredd förväntad med atomen %%(align)"
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "Paketet (bundlen) beskriver en komplett historik."
 
-#: ref-filter.c:244
+#: bundle.c:194
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "felformat fältnamn: %.*s"
+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:"
 
-#: ref-filter.c:270
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr "okänt fältnamn: %.*s"
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "Kunde inte starta pack-objects"
 
-#: ref-filter.c:372
+#: 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 "format: %%(end) atom used without corresponding atom"
-msgstr "format: atomen %%(end) använd utan motsvarande atom"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
 
-#: ref-filter.c:424
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "malformed format string %s"
-msgstr "felformad formatsträng %s"
+msgid "unrecognized argument: %s"
+msgstr "okänt argument: %s"
 
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= kräver ett positivt heltalsargument"
+#: bundle.c:451
+msgid "Refusing to create empty bundle."
+msgstr "Vägrar skapa ett tomt paket (bundle)."
 
-#: ref-filter.c:883
+#: bundle.c:463
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "referensen \"%s\" har inte %ld komponenter för :strip"
+msgid "cannot create '%s'"
+msgstr "kan inte skapa \"%s\""
 
-#: ref-filter.c:1046
+#: bundle.c:491
+msgid "index-pack died"
+msgstr "index-pack dog"
+
+#: color.c:290
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "okänt \"%.*s\"-format %s"
+msgid "invalid color value: %.*s"
+msgstr "felaktigt färgvärde: %.*s"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "missing object %s for %s"
-msgstr "objektet %s saknas för %s"
+msgid "could not parse %s"
+msgstr "kunde inte tolka %s"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: commit.c:42
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer misslyckades på %s för %s"
+msgid "%s %s is not a commit!"
+msgstr "%s %s är inte en incheckning!"
 
-#: ref-filter.c:1311
+#: commit.c:1514
+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:516
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "felformat objekt vid \"%s\""
+msgid "bad config line %d in blob %s"
+msgstr "felaktig konfigurationsfil rad %d i blob:en %s"
 
-#: ref-filter.c:1373
+#: config.c:520
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "ignorerar referens med trasigt namn %s"
+msgid "bad config line %d in file %s"
+msgstr "felaktig konfigurationsfil rad %d i filen %s"
 
-#: ref-filter.c:1378
+#: config.c:524
 #, c-format
-msgid "ignoring broken ref %s"
-msgstr "ignorerar trasig referens %s"
+msgid "bad config line %d in standard input"
+msgstr "felaktig konfigurationsfil rad %d i standard in"
 
-#: ref-filter.c:1651
+#: config.c:528
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "format: atomen %%(end) saknas"
+msgid "bad config line %d in submodule-blob %s"
+msgstr "felaktig konfigurationsfil rad %d i undermoduls-blob:en %s"
 
-#: ref-filter.c:1705
+#: config.c:532
 #, c-format
-msgid "malformed object name %s"
-msgstr "felformat objektnamn %s"
+msgid "bad config line %d in command line %s"
+msgstr "felaktig konfigurationsfil rad %d i kommandoraden %s"
 
-#: remote.c:745
+#: config.c:536
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "Kan inte hämta både %s och %s till %s"
+msgid "bad config line %d in %s"
+msgstr "felaktig konfigurationsfil rad %d i %s"
+
+#: config.c:655
+msgid "out of range"
+msgstr "utanför intervallet"
 
-#: remote.c:749
+#: config.c:655
+msgid "invalid unit"
+msgstr "ogiltig enhet"
+
+#: config.c:661
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s spårar vanligtvis %s, inte %s"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\": %s"
 
-#: remote.c:753
+#: config.c:666
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s spårar både %s och %s"
+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"
 
-#: remote.c:761
-msgid "Internal error"
-msgstr "Internt fel"
+#: config.c:669
+#, 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"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD pekar inte på en gren"
+#: config.c:672
+#, 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"
 
-#: remote.c:1686
+#: config.c:675
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "okänd gren: \"%s\""
+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"
 
-#: remote.c:1689
+#: config.c:678
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "ingen standarduppström angiven för grenen \"%s\""
+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"
 
-#: remote.c:1695
+#: config.c:681
 #, 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"
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i %s: %s"
 
-#: remote.c:1710
+#: config.c:768
 #, 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"
+msgid "failed to expand user dir in: '%s'"
+msgstr "misslyckades expandera användarkatalog i: \"%s\""
 
-#: remote.c:1725
+#: config.c:852 config.c:863
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "grenen \"%s\" har ingen fjärr för \"push\""
+msgid "bad zlib compression level %d"
+msgstr "felaktigt zlib-komprimeringsgrad %d"
 
-#: remote.c:1736
+#: config.c:978
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "\"push\"-referensspecifikation för \"%s\" innehåller inte \"%s\""
+msgid "invalid mode for object creation: %s"
+msgstr "felaktigt läge för skapande av objekt: %s"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "\"push\" har inget mål (push.default är \"ingenting\")"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "kan inte tolka kommandoradskonfiguration"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "\"enkel push\" motsvarar flera olika mål"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "okänt fel uppstod vid läsning av konfigurationsfilerna"
 
-#: remote.c:2073
+#: config.c:1716
 #, 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"
+msgid "unable to parse '%s' from command-line config"
+msgstr "kunde inte tolka värdet \"%s\" från kommandoradskonfiguration"
 
-#: remote.c:2077
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
+#: config.c:1718
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "felaktig konfigurationsvariabel \"%s\" i filen \"%s\" på rad %d"
 
-#: remote.c:2080
+#: config.c:1777
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "Din gren är à jour med \"%s\".\n"
+msgid "%s has multiple values"
+msgstr "%s har flera värden"
 
-#: remote.c:2084
+#: config.c:2311
 #, 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"
+msgid "could not set '%s' to '%s'"
+msgstr "kunde inte ställa in \"%s\" till \"%s\""
 
-#: remote.c:2090
-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
+#: config.c:2313
 #, 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] ""
-"Din gren ligger efter \"%s\" med %d incheckning, och kan snabbspolas.\n"
-msgstr[1] ""
-"Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
+msgid "could not unset '%s'"
+msgstr "kunde inte ta bort inställning för \"%s\""
 
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (använd \"git pull\" för att uppdatera din lokala gren)\n"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "Fjärren lade på vid inledande kontakt"
 
-#: remote.c:2104
-#, c-format
+#: connect.c:51
 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] ""
-"Din gren och \"%s\" har divergerat,\n"
-"och har %d respektive %d olika incheckning.\n"
-msgstr[1] ""
-"Din gren och \"%s\" har divergerat,\n"
-"och har %d respektive %d olika incheckningar.\n"
-
-#: remote.c:2114
-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"
+"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."
 
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "din nuvarande gren verkar vara trasig"
+# 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
+msgid "Checking connectivity"
+msgstr "Kontrollerar konnektivitet"
 
-#: revision.c:2134
-#, 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"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Kunde inte köra \"git rev-list\""
 
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent är inkompatibelt med --bisect"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "kunde inte skriva till rev-list"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "misslyckades öppna /dev/null"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "kunde inte stänga rev-list:s standard in"
 
-#: run-command.c:94
+#: convert.c:201
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) misslyckades"
-
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "misslyckades underteckna push-certifikatet"
-
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "mottagarsidan stöder inte push med --signed"
-
-#: send-pack.c:406
 msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
+"CRLF will be replaced by LF in %s.\n"
+"The file will have its original line endings in your working directory."
 msgstr ""
-"sänder inte push-certifikat eftersom mottagarsidan inte stlder push med --"
-"signed"
+"CRLF kommer att ersättas av LF i %s.\n"
+"Filen kommer att ha sina ursprungliga radbrytningar i din arbetskatalog."
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "mottagarsidan stöder inte push med --atomic"
+#: convert.c:205
+#, c-format
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF skulle ersättas av LF i %s."
 
-#: sequencer.c:174
+#: convert.c:211
+#, c-format
 msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
+"LF will be replaced by CRLF in %s.\n"
+"The file will have its original line endings in your working directory."
 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>\""
+"LF kommer att ersättas av CRLF i %s.\n"
+"Filen kommer att ha sina ursprungliga radbrytningar i din arbetskatalog."
 
-#: 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\""
+#: 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"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: date.c:103
 #, c-format
-msgid "Could not write to %s"
-msgstr "Kunde inte skriva till %s"
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu sekund sedan"
+msgstr[1] "%lu sekunder sedan"
 
-#: sequencer.c:193
+#: date.c:110
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "Fel vid ombrytning av %s"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu minut sedan"
+msgstr[1] "%lu minuter sedan"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"."
+#: date.c:117
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu timme sedan"
+msgstr[1] "%lu timmar sedan"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "Dina lokala ändringar skulle skrivas över av \"revert\"."
+#: date.c:124
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu dag sedan"
+msgstr[1] "%lu dagar sedan"
 
-#: 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."
+#: date.c:130
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu vecka sedan"
+msgstr[1] "%lu veckor sedan"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: date.c:137
 #, c-format
-msgid "%s: Unable to write new index file"
-msgstr "%s: Kunde inte skriva ny indexfil"
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu månad sedan"
+msgstr[1] "%lu månader sedan"
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Kunde inte bestämma HEAD:s incheckning\n"
+#: date.c:148
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu år"
+msgstr[1] "%lu år"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Kan inte uppdatera cacheträd\n"
+#. 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 månad sedan"
+msgstr[1] "%s, %lu månader sedan"
 
-#: sequencer.c:390
+#: date.c:156 date.c:161
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "Kunde inte tolka incheckningen %s\n"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu år sedan"
+msgstr[1] "%lu år sedan"
 
-#: sequencer.c:395
+#: diffcore-order.c:24
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "Kunde inte tolka föräldraincheckningen %s\n"
+msgid "failed to read orderfile '%s'"
+msgstr "kunde inte läsa orderfilen \"%s\""
 
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "Din indexfil har inte slagits ihop."
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "Utför onöjaktig namnbytesdetektering"
 
-#: sequencer.c:479
+#: diff.c:62
 #, 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."
+msgid "option '%s' requires a value"
+msgstr "flaggan \"%s\" behöver ett värde"
 
-#: sequencer.c:487
+#: diff.c:124
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Incheckning %s har inte förälder %d"
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n"
 
-#: sequencer.c:491
+#: diff.c:129
 #, c-format
-msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Okänd dirstat-parameter \"%s\"\n"
 
-#. TRANSLATORS: The first %s will be "revert" or
-#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:504
+#: diff.c:283
 #, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr "%s: kan inte tolka föräldraincheckningen %s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\""
 
-#: sequencer.c:508
+#: diff.c:346
 #, c-format
-msgid "Cannot get commit message for %s"
-msgstr "Kan inte hämta incheckningsmeddelande för %s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
+"%s"
 
-#: sequencer.c:594
+#: diff.c:3087
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "kunde inte ångra %s... %s"
+msgid "external diff died, stopping at %s"
+msgstr "extern diff dog, stannar vid %s"
 
-#: sequencer.c:595
-#, c-format
-msgid "could not apply %s... %s"
-msgstr "kunde inte tillämpa %s... %s"
+#: diff.c:3412
+msgid "--name-only, --name-status, --check and -s are mutually exclusive"
+msgstr "--name-only, --name-status, -check och -s är ömsesidigt uteslutande"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "den angivna uppsättningen incheckningar är tom"
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow kräver exakt en sökvägsangivelse"
 
-#: sequencer.c:638
+#: diff.c:3665
 #, c-format
-msgid "git %s: failed to read the index"
-msgstr "git %s: misslyckades läsa indexet"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Misslyckades tolka argument till flaggan --dirstat/-X;\n"
+"%s"
 
-#: sequencer.c:642
+#: diff.c:3679
 #, c-format
-msgid "git %s: failed to refresh the index"
-msgstr "git %s: misslyckades uppdatera indexet"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
 
-#: sequencer.c:702
-#, c-format
-msgid "Cannot %s during a %s"
-msgstr "kan inte %s under en %s"
+#: diff.c:4700
+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"
 
-#: sequencer.c:724
+#: diff.c:4703
+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:4706
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Kan inte tolka rad %d."
+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:1866
+msgid "failed to get kernel name and information"
+msgstr "misslyckades hämta kärnans namn och information"
+
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "Ospårad cache är inaktiverad på systemet eller platsen."
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Inga incheckningar lästes."
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: förväntade grund lista"
 
-#: sequencer.c:741
-#, c-format
-msgid "Could not open %s"
-msgstr "Kunde inte öppna %s"
+#: fetch-pack.c:225
+msgid "git fetch-pack: expected ACK/NAK, got EOF"
+msgstr "git fetch-patch: förväntade ACK/NAK, fick EOF"
 
-#: sequencer.c:745
+#: fetch-pack.c:243
 #, c-format
-msgid "Could not read %s."
-msgstr "kunde inte läsa %s."
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack: förväntade ACK/NAK, fick \"%s\""
 
-#: sequencer.c:752
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc kräver \"multi ack detailed\""
+
+#: fetch-pack.c:381
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Oanvändbart manus: %s"
+msgid "invalid shallow line: %s"
+msgstr "ogiltig \"shallow\"-rad: %s"
 
-#: sequencer.c:782
+#: fetch-pack.c:387
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Felaktig nyckel: %s"
+msgid "invalid unshallow line: %s"
+msgstr "ogiltig \"unshallow\"-rad: %s"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: fetch-pack.c:389
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Felaktigt värde för %s: %s"
+msgid "object not found: %s"
+msgstr "objektet hittades inte: %s"
 
-#: sequencer.c:795
+#: fetch-pack.c:392
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Trasigt manus: %s"
+msgid "error in object: %s"
+msgstr "fel i objekt: %s"
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
+#: fetch-pack.c:394
+#, c-format
+msgid "no shallow found: %s"
+msgstr "ingen \"shallow\" hittades: %s"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "förväntade shallow/unshallow, fick %s"
 
-#: sequencer.c:819
+#: fetch-pack.c:436
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
+msgid "got %s %d %s"
+msgstr "fick %s %d %s"
 
-#: sequencer.c:835 sequencer.c:917
+#: fetch-pack.c:450
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Fel vid ombrytning av %s."
+msgid "invalid commit %s"
+msgstr "ogiltig incheckning %s"
 
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "ger upp"
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "kan inte bestämma HEAD"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "klart"
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "kan inte avbryta från en gren som ännu inte är född"
+#: fetch-pack.c:505
+#, c-format
+msgid "got %s (%d) %s"
+msgstr "fick %s (%d) %s"
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: fetch-pack.c:551
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "kan inte öppna %s: %s"
+msgid "Marking %s as complete"
+msgstr "Markerar %s som komplett"
 
-#: sequencer.c:881
+#: fetch-pack.c:697
 #, c-format
-msgid "cannot read %s: %s"
-msgstr "kan inte läsa %s: %s"
+msgid "already have %s (%s)"
+msgstr "har redan %s (%s)"
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "oväntat filslut"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-patch: kunde inte grena av sidbandsmultiplexare"
 
-#: sequencer.c:888
-#, 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"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "protokollfel: felaktigt packhuvud"
 
-#: sequencer.c:910
+#: fetch-pack.c:799
 #, c-format
-msgid "Could not format %s."
-msgstr "Kunde inte formatera %s."
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-patch: kunde inte grena av %s"
 
-#: sequencer.c:1055
+#: fetch-pack.c:815
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
+msgid "%s failed"
+msgstr "%s misslyckades"
 
-#: sequencer.c:1058
-#, c-format
-msgid "%s: bad revision"
-msgstr "%s: felaktig revision"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "fel i sidbands-avmultiplexare"
 
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "Kan inte ångra som första incheckning"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Servern stöder inte klienter med grunda arkiv"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Servern stöder \"multi_ack_detailed\""
 
-#: setup.c:246
-#, c-format
-msgid "failed to read %s"
-msgstr "misslyckades läsa %s"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Servern stöder \"no-done\""
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "offset före slutet av packfilen (trasig .idx?)"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Servern stöder \"multi_ack\""
 
-#: sha1_file.c:2459
-#, 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?)"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Servern stöder \"side-band-64k\""
 
-#: sha1_file.c:2463
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "offset borton slutet av packindex för %s (trunkerat index?)"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Servern stöder \"side-band\""
 
-#: 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\""
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Servern stöder \"allow-tip-sha1-in-want\""
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-"Kan inte ändra .gitmodules-fil som inte slagits ihop, lös "
-"sammanslagningskonflikter först"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Servern stöder \"allow-reachable-sha1-in-want\""
 
-#: submodule.c:66 submodule.c:100
-#, 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"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Servern stöder \"ofs-delta\""
 
-#: submodule.c:74
+#: fetch-pack.c:890
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Kunde inte uppdatera .gitmodules-posten %s"
+msgid "Server version is %.*s"
+msgstr "Serverversionen är %.*s"
 
-#: submodule.c:107
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Kunde inte ta bort .gitmodules-posten för %s"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Servern stöder inte --shallow-since"
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "misslyckades köa uppdaterad .gitmodules"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Servern stöder inte --shallow-exclude"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "misslyckades utföra \"trailer\"-kommandot \"%s\""
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Servern stöder inte --deepen"
 
-#: 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\""
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "inga gemensamma incheckningar"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
-#, c-format
-msgid "more than one %s"
-msgstr "mer än en %s"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-patch: hämtning misslyckades."
 
-#: trailer.c:582
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "inget motsvarande fjärrhuvud"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg misslyckades signera data"
+
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "kunde inte skapa temporära fil"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "tom släpradssymbol i släpraden \"%.*s\""
+msgid "failed writing detached signature to '%s'"
+msgstr "misslyckades skriva fristående signatur till \"%s\""
 
-#: trailer.c:702
+#: grep.c:1782
 #, c-format
-msgid "could not read input file '%s'"
-msgstr "kunde inte läsa indatafilen \"%s\""
+msgid "'%s': unable to read %s"
+msgstr "\"%s\" kunde inte läsa %s"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "Kunde inte läsa från standard in"
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "misslyckades ta status på \"%s\""
 
-#: trailer.c:857 builtin/am.c:42
+#: grep.c:1810
 #, c-format
-msgid "could not stat %s"
-msgstr "kunde inte ta status på %s"
+msgid "'%s': short read"
+msgstr "\"%s\": kort läsning"
 
-#: trailer.c:859
+#: help.c:203
 #, c-format
-msgid "file %s is not a regular file"
-msgstr "filen %s är inte en normal fil"
+msgid "available git commands in '%s'"
+msgstr "git-kommandon tillgängliga i \"%s\""
+
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "git-kommandon från andra platser i din $PATH"
+
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "Dessa vanliga Git-kommandon används i olika situationer:"
 
-#: trailer.c:861
+#: help.c:306
 #, c-format
-msgid "file %s is not writable by user"
-msgstr "filen %s är inte skrivbar av användaren"
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"\"%s\" verkar vara ett git-kommando, men vi kan inte\n"
+"köra det. Kanske git-%s är trasigt?"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "kunde inte öppna temporär file"
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Oj då. Ditt system rapporterar inga Git-kommandon alls."
 
-#: trailer.c:912
+#: help.c:383
 #, c-format
-msgid "could not rename temporary file to %s"
-msgstr "kunde inte byta nman på temporära file till %s"
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"VARNING: Du anropade ett Git-kommando vid namn \"%s\", som inte finns.\n"
+"Fortsätter under förutsättningen att du menade \"%s\""
 
-#: transport-helper.c:1041
+#: help.c:388
 #, c-format
-msgid "Could not read ref %s"
-msgstr "Kunde inte läsa referensen %s"
+msgid "in %0.1f seconds automatically..."
+msgstr "automatiskt om %0.1f sekunder..."
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "Checkar ut filer"
+#: help.c:395
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Menade du detta?"
+msgstr[1] ""
+"\n"
+"Menade du ett av dessa?"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: help.c:461
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "ogiltig %XX-teckensekvens"
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "värd saknas och schemat är inte \"file:\""
+#: 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"
+"*** 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"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "en \"file:\"-URL kan inte innehålla portnummer"
+#: 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 ""
+"Kunde inte skapa \"%s.lock\": %s.\n"
+"\n"
+"Det verkar som en annan git-process kör i det här arkivet, t.ex.\n"
+"ett textredigeringsprogram startat av \"git commit\". Se till att\n"
+"alla processer avslutats och försök sedan igen. Om det fortfarande\n"
+"misslyckas kanske en git-process har kraschat i det här arkivet\n"
+"tidigare:\n"
+"ta bort filen manuellt för att fortsätta."
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "ogiltiga tecken i värdnamnet"
+#: lockfile.c:160
+#, c-format
+msgid "Unable to create '%s.lock': %s"
+msgstr "kunde inte skapa \"%s.lock\": %s"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "felaktigt portnummer"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "misslyckades läsa cachen"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "felaktigt \"..\"-sökvägssegment"
+#: 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 "kunde inte skriva ny indexfil"
 
-#: wrapper.c:222 wrapper.c:381
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "kunde inte öppna \"%s\" för läsning och skrivning"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(felaktig incheckning)\n"
 
-#: wrapper.c:224 wrapper.c:383
+#: merge-recursive.c:231
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "kunde inte öppna \"%s\" för skrivning"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "kunde inte öppna \"%s\" för läsning"
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "fel vid byggande av träd"
 
-#: wrapper.c:611
+#: merge-recursive.c:720
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "kan inte komma åt \"%s\": %s"
+msgid "failed to create path '%s'%s"
+msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: wrapper.c:632
+#: merge-recursive.c:731
 #, c-format
-msgid "unable to access '%s'"
-msgstr "kan inte komma åt \"%s\""
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "Tar bort %s för att göra plats för underkatalog\n"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "kan inte hämta aktuell arbetskatalog"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": kanske en K/F-konflikt?"
 
-#: wrapper.c:667
+#: merge-recursive.c:754
 #, c-format
-msgid "could not open %s for writing"
-msgstr "kunde inte öppna %s för skrivning"
+msgid "refusing to lose untracked file at '%s'"
+msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: wrapper.c:678 builtin/am.c:410
+#: merge-recursive.c:796 builtin/cat-file.c:34
 #, c-format
-msgid "could not write to %s"
-msgstr "kunde inte skriva till %s"
+msgid "cannot read object %s '%s'"
+msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: wrapper.c:684
+#: merge-recursive.c:798
 #, c-format
-msgid "could not close %s"
-msgstr "kunde inte stänga %s"
+msgid "blob expected for %s '%s'"
+msgstr "blob förväntades för %s \"%s\""
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Ej sammanslagna sökvägar:"
+#: merge-recursive.c:822
+#, c-format
+msgid "failed to open '%s': %s"
+msgstr "misslyckades öppna \"%s\": %s"
 
-#: wt-status.c:176 wt-status.c:203
+#: merge-recursive.c:833
 #, 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 "failed to symlink '%s': %s"
+msgstr "misslyckades skapa symboliska länken \"%s\": %s"
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (använd \"git rm --cached <fil>...\" för att ta bort från kö)"
+#: merge-recursive.c:838
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
 
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (använd \"git add <fil>...\" för att ange lösning)"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: wt-status.c:184 wt-status.c:188
-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)"
+#: merge-recursive.c:982
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "Kunde inte lägga till %s till databasen"
 
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (använd \"git rm <fil>...\" för att ange lösning)"
+#: merge-recursive.c:1081 merge-recursive.c:1095
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
+"i trädet."
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Ändringar att checka in:"
+#: merge-recursive.c:1087 merge-recursive.c:1100
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
+"i trädet vid %s."
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Ändringar ej i incheckningskön:"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "namnbyte"
 
-#: wt-status.c:219
-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)"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "namnbytt"
 
-#: wt-status.c:221
-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)"
+#: merge-recursive.c:1200
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s är en katalog i %s lägger till som %s istället"
 
-#: wt-status.c:222
+#: merge-recursive.c:1225
+#, c-format
 msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
 msgstr ""
-"  (använd \"git checkout -- <fil>...\" för att förkasta ändringar i "
-"arbetskatalogen)"
+"KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
+"namnbyte \"%s\"->\"%s\" i \"%s\"%s"
 
-#: wt-status.c:224
-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)"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (lämnad olöst)"
 
-#: wt-status.c:236
+#: merge-recursive.c:1292
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"  (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)"
+"KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s"
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "borttaget av bägge:"
+#: merge-recursive.c:1325
+#, c-format
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "Byter namn på %s till %s och %s till %s istället"
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "tillagt av oss:"
+#: merge-recursive.c:1531
+#, 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"
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "borttaget av dem:"
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
+msgstr "Lägger till sammanslagen %s"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "tillagt av dem:"
+#: merge-recursive.c:1553 merge-recursive.c:1766
+#, c-format
+msgid "Adding as %s instead"
+msgstr "Lägger till som %s istället"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "borttaget av oss:"
-
-#: wt-status.c:261
-msgid "both added:"
-msgstr "tillagt av bägge:"
-
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "ändrat av bägge:"
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
+msgstr "kan inte läsa objektet %s"
 
-#: wt-status.c:265
+#: merge-recursive.c:1613
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "programfel: ej hanterad \"unmerged\"-status %x"
+msgid "object %s is not a blob"
+msgstr "objektet %s är inte en blob"
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "ny fil:"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "ändra"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "kopierad:"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "ändrad"
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "borttagen:"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "innehåll"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "ändrad:"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "tillägg/tillägg"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "namnbytt:"
+#: merge-recursive.c:1718
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "typbyte:"
+#: merge-recursive.c:1732
+#, c-format
+msgid "Auto-merging %s"
+msgstr "Slår ihop %s automatiskt"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "okänd:"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "undermodul"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "osammanslagen:"
+#: merge-recursive.c:1737
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "nya incheckningar, "
+#: merge-recursive.c:1831
+#, c-format
+msgid "Removing %s"
+msgstr "Tar bort %s"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "ändrat innehåll, "
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "fil/katalog"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "ospårat innehåll, "
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "katalog/fil"
 
-#: wt-status.c:390
+#: merge-recursive.c:1868
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "programfel: diff-status %c ej hanterad"
+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"
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Undermoduler ändrade men inte uppdaterade:"
+#: merge-recursive.c:1877
+#, c-format
+msgid "Adding %s"
+msgstr "Lägger till %s"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Undermodulers ändringar att checka in:"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Redan à jour!"
 
-#: wt-status.c:837
-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."
+#: merge-recursive.c:1923
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "Du har ej sammanslagna sökvägar."
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Slår ihop:"
 
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (rätta konflikter och kör \"git commit\")"
+#: merge-recursive.c:2019
+#, 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:"
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "Kunde inte tolka objektet \"%s\""
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Du är i mitten av en körning av \"git am\"."
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Kunde inte skriva indexet."
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "Aktuell patch är tom."
+#: 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."
 
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
+#: 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)."
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd"
 
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (använd \"git am --abort\" för att återställa ursprungsgrenen)"
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Felaktigt värde för notes.rewriteMode: '%s'"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Inga kommandon utförda."
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
 
-#: wt-status.c:1108
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, 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 "Bad %s value: '%s'"
+msgstr "Felaktigt värde på %s: \"%s\""
 
-#: wt-status.c:1119
+#: object.c:242
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (se fler i filen %s)"
+msgid "unable to parse object: %s"
+msgstr "kunde inte tolka objektet: %s"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Inga kommandon återstår."
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#: wt-status.c:1127
+#: parse-options.c:590
 #, 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):"
-
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (använd \"git rebase --edit-todo\" för att visa och redigera)"
+msgid "usage: %s"
+msgstr "användning: %s"
 
-#: wt-status.c:1148
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
+msgid "   or: %s"
+msgstr "     eller: %s"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Du håller på med en ombasering."
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-TAL"
 
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "felformat objektnamn \"%s\""
 
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
+#: path.c:826
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "Kunde inte göra %s skrivbar för gruppen"
 
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr ""
+"de globala sökvägsinställningarna \"glob\" och \"noglob\" är inkompatibla"
 
-#: wt-status.c:1181
-#, c-format
+#: pathspec.c:143
 msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
 msgstr ""
-"Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
-"ovanpå \"%s\"."
+"den globala sökvägsinställningen \"literal\" är inkompatibel med alla andra "
+"globala sökvägsinställningar"
 
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "Du håller på att dela upp en incheckning i en ombasering."
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "ogiltig parameter för sökvägsuttrycket för \"prefix\""
 
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "felaktigt sökvägsuttryck \"%.*s\" i \"%s\""
 
-#: wt-status.c:1193
+#: pathspec.c:187
 #, 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 "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "\")\" saknas i slutet av sökvägsuttrycket för \"%s\""
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "Du håller på att redigera en incheckning under en ombasering."
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "Tecknet \"%c\" i sökvägsuttrycket i \"%s\" har inte implementerats"
 
-#: wt-status.c:1201
-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)"
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: \"literal\" och \"glob\" är inkompatibla"
 
-#: wt-status.c:1203
-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)"
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: \"%s\" är utanför arkivet"
 
-#: wt-status.c:1213
+#: pathspec.c:291
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
 
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
-
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
+#: pathspec.c:353
+#, 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"
 
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 msgstr ""
-"  (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-"
-"operationen)"
+"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"
 
-#: wt-status.c:1232
+#: pathspec.c:440
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "Du håller på med att ångra incheckningen %s."
-
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "sökvägsangivelsen \"%s\" är på andra sidan av en symbolisk länk"
 
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
+#: pathspec.c:449
+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 \".\"?"
 
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "kunde inte tolka format för --pretty"
 
-#: wt-status.c:1253
+#: read-cache.c:1315
 #, 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:1257
-msgid "You are currently bisecting."
-msgstr "Du håller på med en \"bisect\"."
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version satt, men värdet är ogiltigt.\n"
+"Använder version %i"
 
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
+#: read-cache.c:1325
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
 msgstr ""
-"  (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
+"GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
+"Använder version %i"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "På grenen "
+#: refs.c:576 builtin/merge.c:840
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "interaktiv ombasering pågår; ovanpå"
+#: refs/files-backend.c:2481
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "kunde inte ta bort referensen %s: %s"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "ombasering pågår; ovanpå"
+#: refs/files-backend.c:2484
+#, c-format
+msgid "could not delete references: %s"
+msgstr "kunde inte ta bort referenser: %s"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD frånkopplad vid "
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "kunde inte ta bort referensen %s"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD frånkopplad från "
+#: ref-filter.c:55
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "förväntat format: %%(color:<color>)"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Inte på någon gren för närvarande."
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "okänd färg: %%(color:%s)"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "Första incheckning"
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "okänt format: %%(%s)"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Ospårade filer"
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) tar inte argument"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "Ignorerade filer"
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) tar inte argument"
 
-#: wt-status.c:1494
+#: ref-filter.c:101
 #, 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 ""
-"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\")."
+msgid "positive value expected contents:lines=%s"
+msgstr "positivt värde förväntat contents:lines=%s"
 
-# %s är nästa sträng eller tom.
-#: wt-status.c:1500
+#: ref-filter.c:103
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "Ospårade filer visas ej%s"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "okänt %%(contents)-argument: %s"
 
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr " (använd flaggan -u för att visa ospårade filer)"
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "okänt %%(objectname)-argument: %s"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Inga ändringar"
+#: ref-filter.c:135
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "förväntat format: %%(align:<bredd>,<position>)"
 
-#: wt-status.c:1513
+#: ref-filter.c:147
 #, 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"
+msgid "unrecognized position:%s"
+msgstr "okänd position:%s"
 
-#: wt-status.c:1516
+#: ref-filter.c:151
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "inga ändringar att checka in\n"
+msgid "unrecognized width:%s"
+msgstr "okänd bredd:%s"
 
-#: wt-status.c:1519
+#: ref-filter.c:157
 #, c-format
-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"
+msgid "unrecognized %%(align) argument: %s"
+msgstr "okänt %%(align)-argument: %s"
 
-#: wt-status.c:1522
+#: ref-filter.c:161
 #, 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 "positive width expected with the %%(align) atom"
+msgstr "positiv bredd förväntad med atomen %%(align)"
 
-#: wt-status.c:1525
+#: ref-filter.c:244
 #, 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 "malformed field name: %.*s"
+msgstr "felformat fältnamn: %.*s"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: ref-filter.c:270
 #, c-format
-msgid "nothing to commit\n"
-msgstr "inget att checka in\n"
+msgid "unknown field name: %.*s"
+msgstr "okänt fältnamn: %.*s"
 
-#: wt-status.c:1531
+#: ref-filter.c:372
 #, 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 "format: %%(end) atom used without corresponding atom"
+msgstr "format: atomen %%(end) använd utan motsvarande atom"
 
-#: wt-status.c:1535
+#: ref-filter.c:424
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "inget att checka in, arbetskatalogen ren\n"
+msgid "malformed format string %s"
+msgstr "felformad formatsträng %s"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Första incheckning på "
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= kräver ett positivt heltalsargument"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (ingen gren)"
+#: ref-filter.c:883
+#, c-format
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "referensen \"%s\" har inte %ld komponenter för :strip"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "försvunnen"
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "okänt \"%.*s\"-format %s"
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "efter "
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "objektet %s saknas för %s"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "före "
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer misslyckades på %s för %s"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: ref-filter.c:1311
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "misslyckades ta bort länken \"%s\""
+msgid "malformed object at '%s'"
+msgstr "felformat objekt vid \"%s\""
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<flaggor>] [--] <sökväg>..."
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "ignorerar referens med trasigt namn %s"
 
-#: builtin/add.c:65
+#: ref-filter.c:1378
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "diff-status %c förväntades inte"
+msgid "ignoring broken ref %s"
+msgstr "ignorerar trasig referens %s"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "misslyckades uppdatera filer"
+#: ref-filter.c:1633
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "format: atomen %%(end) saknas"
 
-#: builtin/add.c:80
+#: ref-filter.c:1687
 #, c-format
-msgid "remove '%s'\n"
-msgstr "ta bort \"%s\"\n"
+msgid "malformed object name %s"
+msgstr "felformat objektnamn %s"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "Oköade ändringar efter att ha uppdaterat indexet:"
+#: remote.c:746
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Kan inte hämta både %s och %s till %s"
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Kunde inte läsa indexet"
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s spårar vanligtvis %s, inte %s"
 
-#: builtin/add.c:205
+#: remote.c:754
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Kunde inte öppna \"%s\" för skrivning"
+msgid "%s tracks both %s and %s"
+msgstr "%s spårar både %s och %s"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Kunde inte skriva patch"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Internt fel"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "redigering av patch misslyckades"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD pekar inte på en gren"
 
-#: builtin/add.c:215
+#: remote.c:1686
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "Kunde inte ta status på \"%s\""
+msgid "no such branch: '%s'"
+msgstr "okänd gren: \"%s\""
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Tom patch. Avbryter."
+#: remote.c:1689
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "ingen standarduppström angiven för grenen \"%s\""
 
-#: builtin/add.c:222
+#: remote.c:1695
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Kunde inte tillämpa \"%s\""
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "uppströmsgrenen \"%s\" är inte lagrad som en fjärrspårande gren"
 
-#: builtin/add.c:232
-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"
+#: remote.c:1710
+#, 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"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "testkörning"
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "grenen \"%s\" har ingen fjärr för \"push\""
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "var pratsam"
+#: remote.c:1736
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "\"push\"-referensspecifikation för \"%s\" innehåller inte \"%s\""
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "plocka interaktivt"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "\"push\" har inget mål (push.default är \"ingenting\")"
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "välj stycken interaktivt"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "\"enkel push\" motsvarar flera olika mål"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "redigera aktuell diff och applicera"
+#: remote.c:2073
+#, 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"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "tillåt lägga till annars ignorerade filer"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (använd \"git branch --unset-upstream\" för att rätta)\n"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "uppdatera spårade filer"
+#: remote.c:2080
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Din gren är à jour med \"%s\".\n"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "registrera endast att sökvägen kommer läggas till senare"
+#: 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] "Din gren ligger före \"%s\" med %d incheckning.\n"
+msgstr[1] "Din gren ligger före \"%s\" med %d incheckningar.\n"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "lägg till ändringar från alla spårade och ospårade filer"
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (använd \"git push\" för att publicera dina lokala incheckningar)\n"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)"
+#: 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] ""
+"Din gren ligger efter \"%s\" med %d incheckning, och kan snabbspolas.\n"
+msgstr[1] ""
+"Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "lägg inte till, uppdatera endast indexet"
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (använd \"git pull\" för att uppdatera din lokala gren)\n"
 
-#: builtin/add.c:264
-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"
+#: remote.c:2104
+#, 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] ""
+"Din gren och \"%s\" har divergerat,\n"
+"och har %d respektive %d olika incheckning.\n"
+msgstr[1] ""
+"Din gren och \"%s\" har divergerat,\n"
+"och har %d respektive %d olika incheckningar.\n"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "se om - även saknade - filer ignoreras i testkörning"
+#: remote.c:2114
+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:2158
+msgid "your current branch appears to be broken"
+msgstr "din nuvarande gren verkar vara trasig"
 
-#: builtin/add.c:287
+#: revision.c:2161
 #, 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 "your current branch '%s' does not have any commits yet"
+msgstr "din nuvarande gren \"%s\" innehåller ännu inte några incheckningar"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "misslyckades lägga till filer"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent är inkompatibelt med --bisect"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A och -u är ömsesidigt inkompatibla"
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "misslyckades öppna /dev/null"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
+#: run-command.c:108
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) misslyckades"
+
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "misslyckades underteckna push-certifikatet"
+
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "mottagarsidan stöder inte push med --signed"
+
+#: send-pack.c:412
+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:424
+msgid "the receiving end does not support --atomic push"
+msgstr "mottagarsidan stöder inte push med --atomic"
+
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "mottagarsidan stöder inte push-flaggor"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "revert"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "cherry-pick"
+
+#: sequencer.c:228
+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:231
+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\""
 
-#: builtin/add.c:352
+#: sequencer.c:244 sequencer.c:1209
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "Inget angivet, inget tillagt.\n"
+msgid "could not lock '%s'"
+msgstr "kunde inte låsa \"%s\""
 
-#: builtin/add.c:353
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Kanske menade du att skriva \"git add .\"?\n"
+msgid "could not write to '%s'"
+msgstr "kunde inte skriva till \"%s\""
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "indexfilen trasig"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "kunde inte skriva radslut till \"%s\""
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "Kunde inte skriva ny indexfil"
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "misslyckades färdigställa \"%s\"."
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
 msgid "could not read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "kunde inte tolka författarskript"
-
-#: builtin/am.c:507
+#: sequencer.c:305
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "\"%s\" togs bort av kroken applypatch-msg"
+msgid "your local changes would be overwritten by %s."
+msgstr "dina lokala ändringar skulle skrivas över av %s."
+
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "checka in dina ändringar eller använd \"stash\" för att fortsätta."
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: sequencer.c:324
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Felaktig indatarad: \"%s\"."
+msgid "%s: fast-forward"
+msgstr "%s: snabbspola"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
+msgid "%s: Unable to write new index file"
+msgstr "%s: Kunde inte skriva ny indexfil"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "\"fseek\" misslyckades"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "kunde inte bestämma HEAD:s incheckning\n"
+
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "kan inte uppdatera cacheträd\n"
 
-#: builtin/am.c:772 builtin/am.c:860
+#: sequencer.c:483
 #, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "kunde inte öppna \"%s\" för läsning: %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 ""
+"du har köade ändringar i din arbetskatalog.\n"
+"Om ändringarna skall läggas in i föregående incheckning, kör:\n"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"Om de skall checkas in i en egen incheckning, kör:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"Oavsett vilket, när du är färdig fortsätter du med:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: builtin/am.c:779
+#: sequencer.c:567
 #, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "Kunde inte öppna \"%s\" för skrivning: %s"
+msgid "could not parse commit %s\n"
+msgstr "kunde inte tolka incheckningen %s\n"
 
-#: builtin/am.c:788
+#: sequencer.c:572
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "kunde inte tolka patchen \"%s\""
+msgid "could not parse parent commit %s\n"
+msgstr "kunde inte tolka föräldraincheckningen %s\n"
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "din indexfil har inte slagits ihop."
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "ogiltig tidsstämpel"
+#: sequencer.c:675
+#, 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."
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "ogiltig \"Date\"-rad"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "incheckning %s har inte förälder %d"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "ogiltig tidszons-offset"
+#: sequencer.c:687
+#, c-format
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Misslyckades detektera patchformat."
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: kan inte tolka föräldraincheckningen %s"
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: sequencer.c:705
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "misslyckades skapa katalogen \"%s\""
+msgid "cannot get commit message for %s"
+msgstr "kan inte hämta incheckningsmeddelande för %s"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Misslyckades dela patchar."
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "kunde inte ångra %s... %s"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "kan inte skriva indexfil"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "kunde inte tillämpa %s... %s"
+
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "den angivna uppsättningen incheckningar är tom"
 
-#: builtin/am.c:1188
+#: sequencer.c:843
 #, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "När du har löst problemet, kör \"%s --continue\"."
+msgid "git %s: failed to read the index"
+msgstr "git %s: misslyckades läsa indexet"
 
-#: builtin/am.c:1189
+#: sequencer.c:850
 #, 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."
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: misslyckades uppdatera indexet"
 
-#: builtin/am.c:1190
+#: sequencer.c:944
 #, 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\"."
+msgid "invalid line %d: %.*s"
+msgstr "ogiltig rad %d: %.*s"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "Patchen är tom. Delades den upp felaktigt?"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "inga incheckningar lästes."
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: sequencer.c:966
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "ogiltig ident-rad: %s"
+msgid "could not read '%s'."
+msgstr "kunde inte läsa \"%s\"."
 
-#: builtin/am.c:1429
+#: sequencer.c:972
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "kunde inte tolka incheckningen %s"
+msgid "unusable instruction sheet: '%s'"
+msgstr "oanvändbart manus: %s"
 
-#: builtin/am.c:1631
-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/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr "Använder indexinfo för att återskapa ett basträd..."
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "kan inte utföra \"cherry-pick\" under en \"revert\"."
 
-#: builtin/am.c:1652
-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."
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "kan inte utföra \"revert\" under en \"cherry-pick\"."
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
-"Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "felaktig nyckel: %s"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Misslyckades slå ihop ändringarna."
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "felaktigt värde för %s: %s"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree misslyckades skriva ett träd"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "trasigt manus: %s"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "tillämpar på en tom historik"
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "kunde inte skriva incheckningsobjekt"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: builtin/am.c:1749 builtin/am.c:1753
+#: sequencer.c:1106
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "kan inte återuppta: %s finns inte."
+msgid "could not create sequencer directory '%s'"
+msgstr "kunde inte skapa \"sequencer\"-katalogen \"%s\""
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
-"kan inte vara interaktiv om standard in inte är ansluten till en terminal."
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "kunde inte låsa HEAD"
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "Incheckningskroppen är:"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "ingen \"cherry-pick\" eller \"revert\" pågå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:1784
-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: "
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "kan inte bestämma HEAD"
 
-#: builtin/am.c:1834
+#: sequencer.c:1155 sequencer.c:1189
+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:1175 builtin/grep.c:578
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: %s)"
+msgid "cannot open '%s'"
+msgstr "kan inte öppna \"%s\""
 
-#: builtin/am.c:1869 builtin/am.c:1941
+#: sequencer.c:1177
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Tillämpar: %.*s"
+msgid "cannot read '%s': %s"
+msgstr "kan inte läsa \"%s\": %s"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Inga ändringar -- Patchen har redan tillämpats."
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "oväntat filslut"
 
-#: builtin/am.c:1893
+#: sequencer.c:1184
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Patch misslyckades på %s %.*s"
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
 
-#: builtin/am.c:1899
+#: sequencer.c:1354
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "En kopia av patchen som misslyckades finns i: %s"
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
+
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: felaktig revision"
 
-#: builtin/am.c:1944
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "kan inte ångra som första incheckning"
+
+#: setup.c:160
+#, c-format
 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."
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 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."
+"%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."
 
-#: builtin/am.c:1951
+#: setup.c:173
+#, c-format
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"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 ""
-"Du har fortfarande sökvägar som inte slagits samman i ditt index.\n"
-"Glömde du använda \"git add\"?"
+"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>...]\""
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: setup.c:223
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "Kan inte tolka objektet \"%s\""
-
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "misslyckades städa upp indexet"
-
-#: builtin/am.c:2145
 msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
-"Återställer inte till ORIG_HEAD"
+"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>...]\""
 
-#: builtin/am.c:2206
+#: setup.c:468
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Felaktigt värde för --patch-format: %s"
+msgid "Expected git repo version <= %d, found %d"
+msgstr "Förväntade git-arkivversion <= %d, hittade %d"
 
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<flaggor>] [(<mbox>|<Maildir>)...]"
-
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<flaggor>] (--continue | --skip | --abort)"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "okända arkivutökningar hittades:"
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "kör interaktivt"
+#: 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"
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "historisk flagga -- no-op"
+#: 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)"
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "tillåt falla tillbaka på trevägssammanslagning om nödvändigt"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "Kan inte läsa aktuell arbetskatalog"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "var tyst"
+#: 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)."
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
-msgstr "lägg till \"Signed-off-by\"-rad i incheckningsmeddelandet"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "kan inte byta till \"%s/..\""
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "koda om till utf8 (standard)"
+#: 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."
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "sänd flaggan -k till git-mailinfo"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "sökvägen \"%s\" finns inte"
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "sänd flaggan -b till git-mailinfo"
+#: sha1_file.c:499
+#, 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/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "sänd flaggan -m till git-mailinfo"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
 
-#: builtin/am.c:2264
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "sänd flaggan --keep-cr till git-mailsplit för mbox-formatet"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "referensarkivet \"%s\" är grunt"
 
-#: builtin/am.c:2267
-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"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "referensarkivet \"%s\" är ympat"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "ta bort allting före en saxlinje"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "offset före slutet av packfilen (trasig .idx?)"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "åtgärd"
+#: sha1_file.c:2592
+#, 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?)"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "sänd det genom git-apply"
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "offset borton slutet av packindex för %s (trunkerat index?)"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "rot"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "kort SHA1 %s är tvetydig"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "sökväg"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Kandidaterna är:"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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"
+#: 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 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\""
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "antal"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"Kan inte ändra .gitmodules-fil som inte slagits ihop, lös "
+"sammanslagningskonflikter först"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "format"
+#: 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"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "format för patch(ar)"
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "Kunde inte uppdatera .gitmodules-posten %s"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "överstyr felmeddelanden när patchfel uppstår"
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Kunde inte ta bort .gitmodules-posten för %s"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "fortsätt applicera patchar efter att ha löst en konflikt"
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "misslyckades köa uppdaterad .gitmodules"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "synonymer till --continue"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "negativa värden är inte tillåtna för submodule.fetchJobs"
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "hoppa över den aktuella grenen"
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "ogiltigt värde för %s"
 
-#: builtin/am.c:2313
-msgid "restore the original branch and abort the patching operation."
-msgstr "återställ originalgrenen och avbryt patchningen."
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "misslyckades utföra \"trailer\"-kommandot \"%s\""
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "ljug om incheckningsdatum"
+#: 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 "okänt värde \"%s\" för nyckeln \"%s\""
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "använd nuvarande tidsstämpel för författardatum"
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "mer än en %s"
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "nyckel-id"
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "tom släpradssymbol i släpraden \"%.*s\""
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "GPG-signera incheckningar"
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "kunde inte läsa indatafilen \"%s\""
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(används internt av git-rebase)"
-
-#: builtin/am.c:2340
-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/am.c:2347
-msgid "failed to read the index"
-msgstr "misslyckades läsa indexet"
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "Kunde inte läsa från standard in"
 
-#: builtin/am.c:2362
+#: trailer.c:929 builtin/am.c:44
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "tidigare rebase-katalog %s finns fortfarande, men mbox angavs."
+msgid "could not stat %s"
+msgstr "kunde inte ta status på %s"
 
-#: builtin/am.c:2386
+#: trailer.c:931
 #, 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."
+msgid "file %s is not a regular file"
+msgstr "filen %s är inte en normal fil"
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Lösningsoperation pågår inte, vi återupptar inte."
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "filen %s är inte skrivbar av användaren"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<flaggor>] [<patch>...]"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "kunde inte öppna temporär file"
 
-#: builtin/apply.c:111
+#: trailer.c:983
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "okänt alternativ för whitespace: \"%s\""
+msgid "could not rename temporary file to %s"
+msgstr "kunde inte byta namn på temporär fil till %s"
 
-#: builtin/apply.c:126
+#: transport.c:62
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "okänt alternativ för ignore-whitespace: \"%s\""
+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"
 
-#: builtin/apply.c:818
+#: transport.c:151
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
+msgid "transport: invalid depth option '%s'"
+msgstr "transport: ogiltig flagga för depth: %s"
 
-#: builtin/apply.c:827
+#: transport.c:817
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec returnerade %d för indata: %s"
+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"
 
-#: builtin/apply.c:908
+#: transport.c:821
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "kan inte hitta filnamn i patchen på rad %d"
+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"
 
-#: builtin/apply.c:940
-#, 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"
+#: transport.c:829
+msgid "Aborting."
+msgstr "Avbryter."
 
-#: builtin/apply.c:944
+#: transport-helper.c:1075
 #, 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 "Could not read ref %s"
+msgstr "Kunde inte läsa referensen %s"
 
-#: builtin/apply.c:945
-#, 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"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "trädobjekt för kort"
 
-#: builtin/apply.c:952
-#, 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"
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "felformat läge i trädpost"
 
-#: builtin/apply.c:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount: förväntade rad: %.*s"
+#: tree-walk.c:41
+msgid "empty filename in tree entry"
+msgstr "tomt filnamn i trädpost"
 
-#: builtin/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "patch-fragment utan huvud på rad %d: %.*s"
+#: tree-walk.c:113
+msgid "too-short tree file"
+msgstr "trädfil för kort"
 
-#: builtin/apply.c:1489
+#: unpack-trees.c:64
 #, 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)"
-
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "ny fil beror på gammalt innehåll"
-
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "borttagen fil har fortfarande innehåll"
+"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."
 
-#: builtin/apply.c:1683
+#: unpack-trees.c:66
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "trasig patch på rad %d"
+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"
 
-#: builtin/apply.c:1719
+#: unpack-trees.c:69
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "nya filen %s beror på gammalt innehåll"
+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 ""
+"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."
 
-#: builtin/apply.c:1721
+#: unpack-trees.c:71
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "borttagna filen %s har fortfarande innehåll"
+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"
 
-#: builtin/apply.c:1724
+#: unpack-trees.c:74
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** varning: filen %s blir tom men har inte tagits bort"
+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\"."
 
-#: builtin/apply.c:1870
+#: unpack-trees.c:76
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "trasig binärpatch på rad %d: %.*s"
+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"
 
-#: builtin/apply.c:1899
+#: unpack-trees.c:81
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "binärpatchen på rad %d känns inte igen"
+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"
 
-#: builtin/apply.c:2050
+#: unpack-trees.c:85
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "patch med bara skräp på rad %d"
+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."
 
-#: builtin/apply.c:2140
+#: unpack-trees.c:87
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "kunde inte läsa symboliska länken %s"
+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"
 
-#: builtin/apply.c:2144
+#: unpack-trees.c:90
 #, c-format
-msgid "unable to open or read %s"
-msgstr "kunde inte öppna eller läsa %s"
+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."
 
-#: builtin/apply.c:2777
+#: unpack-trees.c:92
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "felaktig inledning på rad: \"%c\""
+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"
 
-#: builtin/apply.c:2896
+#: unpack-trees.c:95
 #, 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)."
+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\"."
 
-#: builtin/apply.c:2908
+#: unpack-trees.c:97
 #, 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"
+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"
 
-#: builtin/apply.c:2914
+#: unpack-trees.c:102
 #, c-format
 msgid ""
-"while searching for:\n"
-"%.*s"
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%sPlease move or remove them before you switch branches."
 msgstr ""
-"vid sökning efter:\n"
-"%.*s"
+"Följande ospårade filer i arbetskatalogen skulle skrivas över av "
+"utcheckningen:\n"
+"%%sFlytta eller ta bort dem innan du byter gren."
 
-#: builtin/apply.c:2934
+#: unpack-trees.c:104
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "saknar binära patchdata för \"%s\""
+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/apply.c:3035
+#: unpack-trees.c:107
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "binärpatchen kan inte tillämpas på \"%s\""
+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/apply.c:3041
+#: unpack-trees.c:109
 #, 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 ""
+"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/apply.c:3062
+#: unpack-trees.c:112
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "patch misslyckades: %s:%ld"
+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/apply.c:3186
+#: unpack-trees.c:114
 #, c-format
-msgid "cannot checkout %s"
-msgstr "kan inte checka ut %s"
+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/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: unpack-trees.c:121
 #, c-format
-msgid "read of %s failed"
-msgstr "misslyckades läsa %s"
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Posten \"%s\" överlappar \"%s\". Kan inte binda."
 
-#: builtin/apply.c:3239
+#: unpack-trees.c:124
 #, 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"
+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/apply.c:3267 builtin/apply.c:3489
+#: unpack-trees.c:126
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "sökvägen %s har ändrat namn/tagits bort"
+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/apply.c:3348 builtin/apply.c:3503
+#: unpack-trees.c:128
 #, c-format
-msgid "%s: does not exist in index"
-msgstr "%s: finns inte i indexet"
+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/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: unpack-trees.c:205
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
+msgid "Aborting\n"
+msgstr "Avbryter\n"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
-#, c-format
-msgid "%s: does not match index"
-msgstr "%s: motsvarar inte indexet"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "Checkar ut filer"
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "patch för borttagning lämnar kvar filinnehåll"
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
 
-#: builtin/apply.c:3528
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: fel typ"
+msgid "invalid %XX escape sequence"
+msgstr "ogiltig %XX-teckensekvens"
 
-#: builtin/apply.c:3530
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s har typen %o, förväntade %o"
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "värd saknas och schemat är inte \"file:\""
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
-#, c-format
-msgid "invalid path '%s'"
-msgstr "ogiltig sökväg: %s"
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "en \"file:\"-URL kan inte innehålla portnummer"
 
-#: builtin/apply.c:3746
-#, c-format
-msgid "%s: already exists in index"
-msgstr "%s: finns redan i indexet"
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "ogiltiga tecken i värdnamnet"
 
-#: builtin/apply.c:3749
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: finns redan i arbetskatalogen"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "felaktigt portnummer"
 
-#: builtin/apply.c:3769
-#, 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)"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "felaktigt \"..\"-sökvägssegment"
 
-#: builtin/apply.c:3774
+#: worktree.c:282
 #, 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"
+msgid "failed to read '%s'"
+msgstr "misslyckades läsa \"%s\""
 
-#: builtin/apply.c:3794
+#: wrapper.c:222 wrapper.c:392
 #, 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 "could not open '%s' for reading and writing"
+msgstr "kunde inte öppna \"%s\" för läsning och skrivning"
 
-#: builtin/apply.c:3798
+#: wrapper.c:224 wrapper.c:394 builtin/am.c:766
 #, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: patchen kan inte tillämpas"
+msgid "could not open '%s' for writing"
+msgstr "kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/apply.c:3812
+#: 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 "Checking patch %s..."
-msgstr "Kontrollerar patchen %s..."
+msgid "could not open '%s' for reading"
+msgstr "kunde inte öppna \"%s\" för läsning"
 
-#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#: wrapper.c:605 wrapper.c:626
 #, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
+msgid "unable to access '%s'"
+msgstr "kan inte komma åt \"%s\""
 
-#: builtin/apply.c:4048
-#, c-format
-msgid "unable to remove %s from index"
-msgstr "kan inte ta bort %s från indexet"
+#: wrapper.c:634
+msgid "unable to get current working directory"
+msgstr "kan inte hämta aktuell arbetskatalog"
 
-#: builtin/apply.c:4077
+#: wrapper.c:658
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "trasig patch för undermodulen %s"
+msgid "could not write to %s"
+msgstr "kunde inte skriva till %s"
 
-#: builtin/apply.c:4081
+#: wrapper.c:660
 #, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr "kan inte ta status på nyligen skapade filen \"%s\""
+msgid "could not close %s"
+msgstr "kunde inte stänga %s"
 
-#: builtin/apply.c:4086
-#, 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"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Ej sammanslagna sökvägar:"
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
+#: wt-status.c:178 wt-status.c:205
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "kan inte lägga till cachepost för %s"
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (använd \"git reset %s <fil>...\" för att ta bort från kö)"
 
-#: builtin/apply.c:4122
-#, c-format
-msgid "closing file '%s'"
-msgstr "stänger filen \"%s\""
+#: 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/apply.c:4171
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "kan inte skriva filen \"%s\" läge %o"
+#: 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/apply.c:4258
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Tillämpade patchen %s rent."
+#: 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/apply.c:4266
-msgid "internal error"
-msgstr "internt fel"
+#: 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/apply.c:4269
-#, 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..."
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Ändringar att checka in:"
 
-#: builtin/apply.c:4279
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr "trunkerar .rej-filnamnet till %.*s.rej"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Ändringar ej i incheckningskön:"
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Stycke %d tillämpades rent."
+#: 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/apply.c:4303
+#: 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)"
+
+#: 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)"
+
+#: 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)"
+
+#: wt-status.c:238
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "Refuserar stycke %d."
+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/apply.c:4393
-msgid "unrecognized input"
-msgstr "indata känns inte igen"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "borttaget av bägge:"
 
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "kan inte läsa indexfilen"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "tillagt av oss:"
 
-#: builtin/apply.c:4507
-msgid "don't apply changes matching the given path"
-msgstr "tillämpa inte ändringar som motsvarar given sökväg"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "borttaget av dem:"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "tillämpa ändringar som motsvarar given sökväg"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "tillagt av dem:"
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "borttaget av oss:"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "ignorera tillägg gjorda av patchen"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "tillagt av bägge:"
 
-#: builtin/apply.c:4518
-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"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "ändrat av bägge:"
 
-#: builtin/apply.c:4522
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "visa antal tillagda och borttagna rader decimalt"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "ny fil:"
 
-#: builtin/apply.c:4524
-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"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "kopierad:"
 
-#: builtin/apply.c:4526
-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"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "borttagen:"
 
-#: builtin/apply.c:4528
-msgid "make sure the patch is applicable to the current index"
-msgstr "se till att patchen kan tillämpas på aktuellt index"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "ändrad:"
 
-#: builtin/apply.c:4530
-msgid "apply a patch without touching the working tree"
-msgstr "tillämpa en patch utan att röra arbetskatalogen"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "namnbytt:"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-msgstr "godta en patch som rör filer utanför arbetskatalogen"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "typbyte:"
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "okänd:"
 
-#: builtin/apply.c:4536
-msgid "attempt three-way merge if a patch does not apply"
-msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "osammanslagen:"
 
-#: builtin/apply.c:4538
-msgid "build a temporary index based on embedded index information"
-msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "nya incheckningar, "
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "sökvägar avdelas med NUL-tecken"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "ändrat innehåll, "
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "se till att åtminstone <n> rader sammanhang är lika"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "ospårat innehåll, "
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
+#: wt-status.c:818
+msgid "Submodules changed but not updated:"
+msgstr "Undermoduler ändrade men inte uppdaterade:"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "ignorera ändringar i blanktecken för sammanhang"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Undermodulers ändringar att checka in:"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "tillämpa patchen baklänges"
+#: wt-status.c:901
+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."
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "förvänta inte minst en rad sammanhang"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Du har ej sammanslagna sökvägar."
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (rätta konflikter och kör \"git commit\")"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "tillåt överlappande stycken"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (använd \"git merge --abort\" för att avbryta sammanslagningen)"
 
-#: builtin/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
+#: wt-status.c:1023
+msgid "All conflicts fixed but you are still merging."
+msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
 
-#: builtin/apply.c:4566
-msgid "do not trust the line counts in the hunk headers"
-msgstr "lite inte på antalet linjer i styckehuvuden"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (använd \"git commit\" för att slutföra sammanslagningen)"
 
-#: builtin/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "lägg till <rot> i alla filnamn"
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Du är i mitten av en körning av \"git am\"."
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way utanför arkiv"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Aktuell patch är tom."
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index utanför arkiv"
+#: wt-status.c:1043
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git am --continue\")"
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached utanför arkiv"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (använd \"git am --skip\" för att hoppa över patchen)"
 
-#: builtin/apply.c:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "kan inte öppna patchen \"%s\""
+#: wt-status.c:1047
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (använd \"git am --abort\" för att återställa ursprungsgrenen)"
 
-#: builtin/apply.c:4635
-#, 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"
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Inga kommandon utförda."
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
+#: wt-status.c:1175
 #, 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."
+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/archive.c:17
+#: wt-status.c:1186
 #, c-format
-msgid "could not create archive file '%s'"
-msgstr "Kunde inte skapa arkivfilen \"%s\""
-
-#: builtin/archive.c:20
-msgid "could not redirect output"
-msgstr "kunde inte omdirigera utdata"
+msgid "  (see more in file %s)"
+msgstr "  (se fler i filen %s)"
 
-#: builtin/archive.c:37
-msgid "git archive: Remote with no URL"
-msgstr "git archive: Fjärr utan URL"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Inga kommandon återstår."
 
-#: builtin/archive.c:58
-msgid "git archive: expected ACK/NAK, got EOF"
-msgstr "git archive: förväntade ACK/NAK, fick EOF"
-
-#: builtin/archive.c:61
-#, c-format
-msgid "git archive: NACK %s"
-msgstr "git archive: NACK %s"
-
-#: builtin/archive.c:63
+#: wt-status.c:1194
 #, c-format
-msgid "remote error: %s"
-msgstr "fjärrfel: %s"
-
-#: builtin/archive.c:64
-msgid "git archive: protocol error"
-msgstr "git archive: protokollfel"
-
-#: builtin/archive.c:68
-msgid "git archive: expected a flush"
-msgstr "git archive: förväntade en tömning (flush)"
-
-#: builtin/bisect--helper.c:7
-msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr "git bisect--helper --next-all [--no-checkout]"
-
-#: builtin/bisect--helper.c:17
-msgid "perform 'git bisect next'"
-msgstr "utför 'git bisect next'"
+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/bisect--helper.c:19
-msgid "update BISECT_HEAD instead of checking out the current commit"
-msgstr "uppdatera BISECT_HEAD istället för att checka ut aktuell incheckning"
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (använd \"git rebase --edit-todo\" för att visa och redigera)"
 
-#: builtin/blame.c:33
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr "git blame [<flaggor>] [<rev-flaggor>] [<rev>] [--] <fil>"
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
 
-#: builtin/blame.c:38
-msgid "<rev-opts> are documented in git-rev-list(1)"
-msgstr "<rev-flaggor> dokumenteras i git-rev-list(1)"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Du håller på med en ombasering."
 
-#: builtin/blame.c:1782
-msgid "Blaming lines"
-msgstr "Klandra rader"
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git rebase --continue\")"
 
-#: builtin/blame.c:2530
-msgid "Show blame entries as we find them, incrementally"
-msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (använd \"git rebase --skip\" för att hoppa över patchen)"
 
-#: builtin/blame.c:2531
-msgid "Show blank SHA-1 for boundary commits (Default: off)"
-msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
 
-#: builtin/blame.c:2532
-msgid "Do not treat root commits as boundaries (Default: off)"
-msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git rebase --continue\")"
 
-#: builtin/blame.c:2533
-msgid "Show work cost statistics"
-msgstr "Visa statistik över arbetskostnad"
+#: wt-status.c:1248
+#, 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/blame.c:2534
-msgid "Force progress reporting"
-msgstr "Tvinga förloppsrapportering"
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "Du håller på att dela upp en incheckning i en ombasering."
 
-#: builtin/blame.c:2535
-msgid "Show output score for blame entries"
-msgstr "Visa utdatapoäng för klandringsposter"
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
 
-#: builtin/blame.c:2536
-msgid "Show original filename (Default: auto)"
-msgstr "Visa originalfilnamn (Standard: auto)"
+#: wt-status.c:1260
+#, 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/blame.c:2537
-msgid "Show original linenumber (Default: off)"
-msgstr "Visa ursprungligt radnummer (Standard: av)"
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "Du håller på att redigera en incheckning under en ombasering."
 
-#: builtin/blame.c:2538
-msgid "Show in a format designed for machine consumption"
-msgstr "Visa i ett format avsett för maskinkonsumtion"
+#: wt-status.c:1268
+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/blame.c:2539
-msgid "Show porcelain format with per-line commit information"
-msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
+#: wt-status.c:1270
+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/blame.c:2540
-msgid "Use the same output mode as git-annotate (Default: off)"
-msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
 
-#: builtin/blame.c:2541
-msgid "Show raw timestamp (Default: off)"
-msgstr "Visa rå tidsstämpel (Standard: av)"
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
 
-#: builtin/blame.c:2542
-msgid "Show long commit SHA1 (Default: off)"
-msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git cherry-pick --continue\")"
 
-#: builtin/blame.c:2543
-msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
+#: wt-status.c:1290
+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/blame.c:2544
-msgid "Show author email instead of name (Default: off)"
-msgstr "Visa författarens e-post istället för namn (Standard: av)"
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "Du håller på med att ångra incheckningen %s."
 
-#: builtin/blame.c:2545
-msgid "Ignore whitespace differences"
-msgstr "Ignorera ändringar i blanksteg"
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (rätta konflikter och kör sedan \"git revert --continue\")"
 
-#: builtin/blame.c:2546
-msgid "Spend extra cycles to find better match"
-msgstr "Slösa extra cykler med att hitta bättre träff"
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (alla konflikter rättade: kör \"git revert --continue\")"
 
-#: builtin/blame.c:2547
-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"
+#: wt-status.c:1309
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (använd \"git revert --abort\" för att avbryta ångrandet)"
 
-#: builtin/blame.c:2548
-msgid "Use <file>'s contents as the final image"
-msgstr "Använd <fil>s innehåll som slutgiltig bild"
+#: wt-status.c:1320
+#, 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/blame.c:2549 builtin/blame.c:2550
-msgid "score"
-msgstr "poäng"
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "Du håller på med en \"bisect\"."
 
-#: builtin/blame.c:2549
-msgid "Find line copies within and across files"
-msgstr "Hitta kopierade rader inuti och mellan filer"
+#: wt-status.c:1327
+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/blame.c:2550
-msgid "Find line movements within and across files"
-msgstr "Hitta flyttade rader inuti och mellan filer"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "På grenen "
 
-#: builtin/blame.c:2551
-msgid "n,m"
-msgstr "n,m"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "interaktiv ombasering pågår; ovanpå"
 
-#: builtin/blame.c:2551
-msgid "Process only line range n,m, counting from 1"
-msgstr "Behandla endast radintervallet n,m, med början på 1"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "ombasering pågår; ovanpå"
 
-#. 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:2640
-msgid "4 years, 11 months ago"
-msgstr "4 år, 11 månader sedan"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD frånkopplad vid "
 
-#: builtin/branch.c:25
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
-msgstr "git branch [<flaggor>] [-r | -a] [--merged | --no-merged]"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD frånkopplad från "
 
-#: builtin/branch.c:26
-msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
-msgstr "git branch [<flaggor>] [-l] [-f] <grennamn> [<startpunkt>]"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Inte på någon gren för närvarande."
 
-#: builtin/branch.c:27
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr "git branch [<flaggor>] [-r] (-d | -D) <grennamn>..."
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Första incheckning"
 
-#: builtin/branch.c:28
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr "git branch [<flaggor>] (-m | -M) [<gammal_gren>] <ny_gren>"
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Ospårade filer"
 
-#: builtin/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr "git branch [<flaggor>] [-r | -a] [--points-at]"
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Ignorerade filer"
 
-#: builtin/branch.c:142
+#: wt-status.c:1580
 #, c-format
 msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
+"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 ""
-"tar bort grenen \"%s\" som har slagits ihop med\n"
-"         \"%s\", men ännu inte slagits ihop med HEAD."
+"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/branch.c:146
+# %s är nästa sträng eller tom.
+#: wt-status.c:1586
 #, c-format
-msgid ""
-"not deleting branch '%s' that is not yet merged to\n"
-"         '%s', even though it is merged to HEAD."
+msgid "Untracked files not listed%s"
+msgstr "Ospårade filer visas ej%s"
+
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr " (använd flaggan -u för att visa ospårade filer)"
+
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Inga ändringar"
+
+#: wt-status.c:1599
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
-"tar inte bort grenen \"%s\" som inte har slagits ihop med\n"
-"         \"%s\", trots att den har slagits ihop med HEAD."
+"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
+"\")\n"
 
-#: builtin/branch.c:160
+#: wt-status.c:1602
 #, c-format
-msgid "Couldn't look up commit object for '%s'"
-msgstr "Kunde inte slå upp incheckningsobjekt för \"%s\""
+msgid "no changes added to commit\n"
+msgstr "inga ändringar att checka in\n"
 
-#: builtin/branch.c:164
+#: wt-status.c:1605
 #, 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'."
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 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:177
-msgid "Update of config-file failed"
-msgstr "Misslyckades uppdatera konfigurationsfil"
-
-#: builtin/branch.c:205
-msgid "cannot use -a with -d"
-msgstr "kan inte ange -a med -d"
+"inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
+"\")\n"
 
-#: builtin/branch.c:211
-msgid "Couldn't look up commit object for HEAD"
-msgstr "Kunde inte slå upp incheckningsobjekt för HEAD"
+#: wt-status.c:1608
+#, 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"
 
-#: builtin/branch.c:219
+#: wt-status.c:1611
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Kan inte ta bort grenen \"%s\" som du befinner dig på för närvarande."
+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/branch.c:235
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "remote-tracking branch '%s' not found."
-msgstr "fjärrspårande grenen \"%s\" hittades inte."
+msgid "nothing to commit\n"
+msgstr "inget att checka in\n"
 
-#: builtin/branch.c:236
+#: wt-status.c:1617
 #, c-format
-msgid "branch '%s' not found."
-msgstr "grenen \"%s\" hittades inte."
+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/branch.c:251
+#: wt-status.c:1621
 #, c-format
-msgid "Error deleting remote-tracking branch '%s'"
-msgstr "Fel vid borttagning av fjärrspårande grenen \"%s\""
+msgid "nothing to commit, working tree clean\n"
+msgstr "inget att checka in, arbetskatalogen ren\n"
 
-#: builtin/branch.c:252
-#, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Fel vid borttagning av grenen \"%s\""
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Första incheckning på "
 
-#: builtin/branch.c:259
-#, c-format
-msgid "Deleted remote-tracking branch %s (was %s).\n"
-msgstr "Tog bort fjärrspårande grenen %s (var %s).\n"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (ingen gren)"
 
-#: builtin/branch.c:260
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr "Tog bort grenen %s (var %s).\n"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "försvunnen"
 
-#: builtin/branch.c:303
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: försvunnen]"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "efter "
 
-#: builtin/branch.c:308
-#, c-format
-msgid "[%s]"
-msgstr "[%s]"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "före "
 
-#: builtin/branch.c:313
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: bakom %d] "
+msgid "cannot %s: You have unstaged changes."
+msgstr "kan inte %s: Du har oköade ändringar."
 
-#: builtin/branch.c:315
-#, c-format
-msgid "[behind %d]"
-msgstr "[bakom %d] "
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "dessutom innehåller dit index ändringar som inte har checkats in."
 
-#: builtin/branch.c:319
+#: wt-status.c:2278
 #, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: före %d] "
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "kan inte %s: Ditt index innehåller ändringar som inte checkats in."
 
-#: builtin/branch.c:321
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "[ahead %d]"
-msgstr "[före %d] "
+msgid "failed to unlink '%s'"
+msgstr "misslyckades ta bort länken \"%s\""
 
-#: builtin/branch.c:324
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: före %d, bakom %d] "
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<flaggor>] [--] <sökväg>..."
 
-#: builtin/branch.c:327
+#: builtin/add.c:80
 #, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[före %d, bakom %d] "
+msgid "unexpected diff status %c"
+msgstr "diff-status %c förväntades inte"
 
-#: builtin/branch.c:340
-msgid " **** invalid ref ****"
-msgstr " **** ogiltig ref ****"
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "misslyckades uppdatera filer"
 
-#: builtin/branch.c:366
+#: builtin/add.c:95
 #, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(ingen gren, ombaserar %s)"
+msgid "remove '%s'\n"
+msgstr "ta bort \"%s\"\n"
 
-#: builtin/branch.c:369
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr "(ingen gren, \"bisect\" startad på %s)"
+#: builtin/add.c:149
+msgid "Unstaged changes after refreshing the index:"
+msgstr "Oköade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/branch.c:375
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD frånkopplat vid %s)"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Kunde inte läsa indexet"
 
-#: builtin/branch.c:378
+#: builtin/add.c:220
 #, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD frånkopplat från %s)"
+msgid "Could not open '%s' for writing."
+msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: builtin/branch.c:382
-msgid "(no branch)"
-msgstr "(ingen gren)"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Kunde inte skriva patch"
 
-#: builtin/branch.c:524
-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/add.c:227
+msgid "editing patch failed"
+msgstr "redigering av patch misslyckades"
 
-#: builtin/branch.c:534
+#: builtin/add.c:230
 #, c-format
-msgid "Invalid branch name: '%s'"
-msgstr "Felaktigt namn på gren: \"%s\""
+msgid "Could not stat '%s'"
+msgstr "Kunde inte ta status på \"%s\""
 
-#: builtin/branch.c:549
-msgid "Branch rename failed"
-msgstr "Misslyckades byta namn på gren"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Tom patch. Avbryter."
 
-#: builtin/branch.c:553
+#: builtin/add.c:237
 #, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
+msgid "Could not apply '%s'"
+msgstr "Kunde inte tillämpa \"%s\""
 
-#: builtin/branch.c:557
-#, c-format
-msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr "Grenen namnbytt till %s, men HEAD har inte uppdaterats!"
+#: 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/branch.c:564
-msgid "Branch is renamed, but update of config-file failed"
-msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
+#: 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 "testkörning"
 
-#: builtin/branch.c:586
-#, c-format
-msgid "could not write branch description template: %s"
-msgstr "kunde inte skriva grenbeskrivningsmall: %s"
+#: builtin/add.c:269
+msgid "interactive picking"
+msgstr "plocka interaktivt"
 
-#: builtin/branch.c:615
-msgid "Generic options"
-msgstr "Allmänna flaggor"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "välj stycken interaktivt"
 
-#: builtin/branch.c:617
-msgid "show hash and subject, give twice for upstream branch"
-msgstr "visa hash och ärenderad, ange två gånger för uppströmsgren"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "redigera aktuell diff och applicera"
 
-#: builtin/branch.c:618
-msgid "suppress informational messages"
-msgstr "undertryck informationsmeddelanden"
+#: builtin/add.c:272
+msgid "allow adding otherwise ignored files"
+msgstr "tillåt lägga till annars ignorerade filer"
 
-#: builtin/branch.c:619
-msgid "set up tracking mode (see git-pull(1))"
-msgstr "ställ in spårningsläge (se git-pull(1))"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "uppdatera spårade filer"
 
-#: builtin/branch.c:621
-msgid "change upstream info"
-msgstr "ändra uppströmsinformation"
+#: 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/branch.c:625
-msgid "use colored output"
-msgstr "använd färgad utdata"
+#: 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/branch.c:626
-msgid "act on remote-tracking branches"
-msgstr "arbeta på fjärrspårande grenar"
+#: 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/branch.c:628 builtin/branch.c:629
-msgid "print only branches that contain the commit"
-msgstr "visa endast grenar som innehåller incheckningen"
+#: builtin/add.c:280
+msgid "don't add, only refresh the index"
+msgstr "lägg inte till, uppdatera endast indexet"
 
-#: builtin/branch.c:632
-msgid "Specific git-branch actions:"
-msgstr "Specifika git-branch-åtgärder:"
+#: 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/branch.c:633
-msgid "list both remote-tracking and local branches"
-msgstr "visa både fjärrspårande och lokala grenar"
+#: 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/branch.c:635
-msgid "delete fully merged branch"
-msgstr "ta bort helt sammanslagen gren"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/branch.c:636
-msgid "delete branch (even if not merged)"
-msgstr "ta bort gren (även om inte helt sammanslagen)"
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "överstyr exekveringsbiten för angivna filer"
 
-#: builtin/branch.c:637
-msgid "move/rename a branch and its reflog"
-msgstr "flytta/ta bort en gren och dess reflogg"
+#: builtin/add.c:305
+#, 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"
 
-#: builtin/branch.c:638
-msgid "move/rename a branch, even if target exists"
-msgstr "flytta/ta bort en gren, även om målet finns"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "misslyckades lägga till filer"
 
-#: builtin/branch.c:639
-msgid "list branch names"
-msgstr "lista namn på grenar"
+#: builtin/add.c:348
+msgid "-A and -u are mutually incompatible"
+msgstr "-A och -u är ömsesidigt inkompatibla"
 
-#: builtin/branch.c:640
-msgid "create the branch's reflog"
-msgstr "skapa grenens reflogg"
+#: 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/branch.c:642
-msgid "edit the description for the branch"
-msgstr "redigera beskrivning för grenen"
+#: builtin/add.c:359
+#, c-format
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod-parametern \"%s\" måste antingen vara -x eller +x"
 
-#: builtin/branch.c:643
-msgid "force creation, move/rename, deletion"
-msgstr "tvinga skapande, flytt/namnändring, borttagande"
+#: builtin/add.c:374
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/branch.c:644
-msgid "print only branches that are merged"
-msgstr "visa endast sammanslagna grenar"
+#: builtin/add.c:375
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "Kanske menade du att skriva \"git add .\"?\n"
 
-#: builtin/branch.c:645
-msgid "print only branches that are not merged"
-msgstr "visa endast ej sammanslagna grenar"
+#: 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 "indexfilen trasig"
 
-#: builtin/branch.c:646
-msgid "list branches in columns"
-msgstr "visa grenar i spalter"
+#: builtin/am.c:414
+msgid "could not parse author script"
+msgstr "kunde inte tolka författarskript"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
-msgid "key"
-msgstr "nyckel"
+#: builtin/am.c:491
+#, c-format
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "\"%s\" togs bort av kroken applypatch-msg"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
-msgid "field name to sort on"
-msgstr "fältnamn att sortera på"
+#: builtin/am.c:532
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr "Felaktig indatarad: \"%s\"."
 
-#: builtin/branch.c:650 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 "objekt"
+#: builtin/am.c:569
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
 
-#: builtin/branch.c:651
-msgid "print only branches of the object"
-msgstr "visa endast grenar för objektet"
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "\"fseek\" misslyckades"
 
-#: builtin/branch.c:669
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr "Misslyckades slå upp HEAD som giltig referens"
+#: builtin/am.c:775
+#, c-format
+msgid "could not parse patch '%s'"
+msgstr "kunde inte tolka patchen \"%s\""
 
-#: builtin/branch.c:673 builtin/clone.c:705
-msgid "HEAD not found below refs/heads!"
-msgstr "HEAD hittades inte under refs/heads!"
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
 
-#: builtin/branch.c:693
-msgid "--column and --verbose are incompatible"
-msgstr "--column och --verbose är inkompatibla"
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "ogiltig tidsstämpel"
 
-#: builtin/branch.c:704 builtin/branch.c:746
-msgid "branch name required"
-msgstr "grennamn krävs"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "ogiltig \"Date\"-rad"
 
-#: builtin/branch.c:722
-msgid "Cannot give description to detached HEAD"
-msgstr "Kan inte beskriva frånkopplad HEAD"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "ogiltig tidszons-offset"
 
-#: builtin/branch.c:727
-msgid "cannot edit description of more than one branch"
-msgstr "kan inte redigera beskrivning för mer än en gren"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Misslyckades detektera patchformat."
 
-#: builtin/branch.c:734
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "No commit on branch '%s' yet."
-msgstr "Inga incheckningar på grenen \"%s\" ännu"
+msgid "failed to create directory '%s'"
+msgstr "misslyckades skapa katalogen \"%s\""
 
-#: builtin/branch.c:737
-#, c-format
-msgid "No branch named '%s'."
-msgstr "Ingen gren vid namnet \"%s\"."
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "Misslyckades dela patchar."
 
-#: builtin/branch.c:752
-msgid "too many branches for a rename operation"
-msgstr "för många grenar för namnbyte"
-
-#: builtin/branch.c:757
-msgid "too many branches to set new upstream"
-msgstr "för många grenar för att byta uppström"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "kan inte skriva indexfil"
 
-#: builtin/branch.c:761
+#: builtin/am.c:1176
 #, 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."
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "När du har löst problemet, kör \"%s --continue\"."
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/am.c:1177
 #, c-format
-msgid "no such branch '%s'"
-msgstr "okänd gren \"%s\""
+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/branch.c:768
+#: builtin/am.c:1178
 #, c-format
-msgid "branch '%s' does not exist"
-msgstr "grenen \"%s\" finns inte"
-
-#: builtin/branch.c:780
-msgid "too many branches to unset upstream"
-msgstr "för många grenar för att ta bort uppström"
-
-#: builtin/branch.c:784
-msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
-"kunde inte ta bort uppström för HEAD när det inte pekar mot någon gren."
+"För att återgå till ursprunglig gren och sluta patcha, kör \"%s --abort\"."
+
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "Patchen är tom. Delades den upp felaktigt?"
 
-#: builtin/branch.c:790
+#: builtin/am.c:1390 builtin/log.c:1550
 #, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr "Grenen \"%s\" har ingen uppströmsinformation"
+msgid "invalid ident line: %s"
+msgstr "ogiltig ident-rad: %s"
 
-#: builtin/branch.c:804
-msgid "it does not make sense to create 'HEAD' manually"
-msgstr "kan inte skapa \"HEAD\" manuellt"
+#: builtin/am.c:1417
+#, c-format
+msgid "unable to parse commit %s"
+msgstr "kunde inte tolka incheckningen %s"
 
-#: builtin/branch.c:810
-msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+#: builtin/am.c:1610
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
 msgstr ""
-"flaggorna -a och -r på \"git branch\" kan inte anges tillsammans med ett "
-"grennamn"
+"Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
+"vägssammanslagning."
 
-#: builtin/branch.c:813
-#, c-format
+#: builtin/am.c:1612
+msgid "Using index info to reconstruct a base tree..."
+msgstr "Använder indexinfo för att återskapa ett basträd..."
+
+#: builtin/am.c:1631
 msgid ""
-"The --set-upstream flag is deprecated and will be removed. Consider using --"
-"track or --set-upstream-to\n"
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
 msgstr ""
-"Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
-"eller --set-upstream-to\n"
+"Har du handredigerat din patch?\n"
+"Den kan inte tillämpas på blobbar som antecknats i dess index."
 
-#: builtin/branch.c:830
-#, c-format
-msgid ""
-"\n"
-"If you wanted to make '%s' track '%s', do this:\n"
-"\n"
+#: builtin/am.c:1637
+msgid "Falling back to patching base and 3-way merge..."
 msgstr ""
-"\n"
-"Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
-"\n"
+"Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Misslyckades slå ihop ändringarna."
 
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree misslyckades skriva ett träd"
 
-#: builtin/bundle.c:51
-#, c-format
-msgid "%s is okay\n"
-msgstr "%s är okej\n"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "tillämpar på en tom historik"
 
-#: builtin/bundle.c:64
-msgid "Need a repository to create a bundle."
-msgstr "Behöver ett arkiv för att skapa ett paket (bundle)."
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "kunde inte skriva incheckningsobjekt"
 
-#: builtin/bundle.c:68
-msgid "Need a repository to unbundle."
-msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
+#: builtin/am.c:1739 builtin/am.c:1743
+#, c-format
+msgid "cannot resume: %s does not exist."
+msgstr "kan inte återuppta: %s finns inte."
 
-#: builtin/cat-file.c:428
-msgid ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<type>|--textconv) <object>"
+#: builtin/am.c:1759
+msgid "cannot be interactive without stdin connected to a terminal."
 msgstr ""
-"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
-"<typ>|--textconv) <objekt>"
+"kan inte vara interaktiv om standard in inte är ansluten till en terminal."
 
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Incheckningskroppen är:"
 
-#: builtin/cat-file.c:466
-msgid "<type> can be one of: blob, tree, commit, tag"
-msgstr "<typ> kan vara en av: blob, tree, commit, tag"
+#. 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 "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla: "
 
-#: builtin/cat-file.c:467
-msgid "show object type"
-msgstr "visa objekttyp"
+#: builtin/am.c:1824
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: %s)"
 
-#: builtin/cat-file.c:468
-msgid "show object size"
-msgstr "visa objektstorlek"
+#: builtin/am.c:1861 builtin/am.c:1933
+#, c-format
+msgid "Applying: %.*s"
+msgstr "Tillämpar: %.*s"
 
-#: builtin/cat-file.c:470
-msgid "exit with zero when there's no error"
-msgstr "avsluta med noll när det inte uppstått något fel"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Inga ändringar -- Patchen har redan tillämpats."
 
-#: builtin/cat-file.c:471
-msgid "pretty-print object's content"
-msgstr "visa objektets innehåll snyggt"
+#: builtin/am.c:1885
+#, c-format
+msgid "Patch failed at %s %.*s"
+msgstr "Patch misslyckades på %s %.*s"
 
-#: builtin/cat-file.c:473
-msgid "for blob objects, run textconv on object's content"
-msgstr "för blob-objekt, kör textconv på objektets innehåll"
+#: builtin/am.c:1891
+#, 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/cat-file.c:475
-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/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 ""
+"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/cat-file.c:476
-msgid "buffer --batch output"
-msgstr "buffra utdata från --batch"
+#: builtin/am.c:1943
+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/cat-file.c:478
-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/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "Kan inte tolka objektet \"%s\""
 
-#: builtin/cat-file.c:481
-msgid "show info about objects fed from the standard input"
-msgstr "visa information för objekt som listas på standard in"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "misslyckades städa upp indexet"
 
-#: builtin/cat-file.c:484
-msgid "follow in-tree symlinks (used with --batch or --batch-check)"
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
 msgstr ""
-"följ symboliska länkar i trädet (använd med --batch eller --batch-check)"
+"Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
+"Återställer inte till ORIG_HEAD"
 
-#: builtin/cat-file.c:486
-msgid "show all objects with --batch or --batch-check"
-msgstr "visa alla objekt med --batch eller --batch-check"
+#: builtin/am.c:2200
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Felaktigt värde för --patch-format: %s"
 
-#: builtin/check-attr.c:11
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr "git check-attr [-a | --all | <attr>...] [--] <sökväg>..."
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<flaggor>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<flaggor>] (--continue | --skip | --abort)"
 
-#: builtin/check-attr.c:19
-msgid "report all attributes set on file"
-msgstr "visa alla attribut som satts på filen"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "kör interaktivt"
 
-#: builtin/check-attr.c:20
-msgid "use .gitattributes only from the index"
-msgstr "använd .gitattributes endast från indexet"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "historisk flagga -- no-op"
 
-#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
-msgid "read file names from stdin"
-msgstr "läs filnamn från standard in"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "tillåt falla tillbaka på trevägssammanslagning om nödvändigt"
 
-#: builtin/check-attr.c:23 builtin/check-ignore.c:24
-msgid "terminate input and output records by a NUL character"
-msgstr "avsluta in- och utdataposter med NUL-tecken"
+#: builtin/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "var tyst"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
-msgid "suppress progress reporting"
-msgstr "undertryck förloppsrapportering"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "lägg till \"Signed-off-by\"-rad i incheckningsmeddelandet"
 
-#: builtin/check-ignore.c:26
-msgid "show non-matching input paths"
-msgstr "visa indatasökvägar som inte träffas"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "koda om till utf8 (standard)"
 
-#: builtin/check-ignore.c:28
-msgid "ignore index when checking"
-msgstr "ignorera index vid kontroll"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "sänd flaggan -k till git-mailinfo"
 
-#: builtin/check-ignore.c:154
-msgid "cannot specify pathnames with --stdin"
-msgstr "kan inte ange sökvägsnamn med --stdin"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "sänd flaggan -b till git-mailinfo"
 
-#: builtin/check-ignore.c:157
-msgid "-z only makes sense with --stdin"
-msgstr "-z kan endast användas tillsammans med --stdin"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "sänd flaggan -m till git-mailinfo"
 
-#: builtin/check-ignore.c:159
-msgid "no path specified"
-msgstr "ingen sökväg angavs"
+#: builtin/am.c:2258
+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/check-ignore.c:163
-msgid "--quiet is only valid with a single pathname"
-msgstr "--quiet kan endast användas med ett enkelt sökvägsnamn"
+#: builtin/am.c:2261
+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/check-ignore.c:165
-msgid "cannot have both --quiet and --verbose"
-msgstr "kan inte använda både --quiet och --verbose"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "ta bort allting före en saxlinje"
 
-#: builtin/check-ignore.c:168
-msgid "--non-matching is only valid with --verbose"
-msgstr "--non-matching är endast giltig med --verbose"
+#: 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 "sänd det genom git-apply"
 
-#: builtin/check-mailmap.c:8
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr "git check-mailmap [<flaggor>] <kontakt>..."
+#: 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/check-mailmap.c:13
-msgid "also read contacts from stdin"
-msgstr "läs även kontakter från standard in"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "format"
 
-#: builtin/check-mailmap.c:24
-#, c-format
-msgid "unable to parse contact: %s"
-msgstr "kunde inte tolka kontakt: %s"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "format för patch(ar)"
 
-#: builtin/check-mailmap.c:47
-msgid "no contacts specified"
-msgstr "inga kontakter angavs"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "överstyr felmeddelanden när patchfel uppstår"
 
-#: builtin/checkout-index.c:127
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr "git checkout-index [<flaggor>] [--] [<fil>...]"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "fortsätt applicera patchar efter att ha löst en konflikt"
 
-#: builtin/checkout-index.c:144
-msgid "stage should be between 1 and 3 or all"
-msgstr "etapp måste vara mellan 1 och 3 eller \"all\""
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "synonymer till --continue"
 
-#: builtin/checkout-index.c:160
-msgid "check out all files in the index"
-msgstr "checka ut alla filer i indexet"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "hoppa över den aktuella grenen"
 
-#: builtin/checkout-index.c:161
-msgid "force overwrite of existing files"
-msgstr "tvinga överskrivning av befintliga filer"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "återställ originalgrenen och avbryt patchningen."
 
-#: builtin/checkout-index.c:163
-msgid "no warning for existing files and files not in index"
-msgstr "ingen varning för existerande filer och filer ej i indexet"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "ljug om incheckningsdatum"
 
-#: builtin/checkout-index.c:165
-msgid "don't checkout new files"
-msgstr "checka inte ut nya filer"
+#: builtin/am.c:2313
+msgid "use current timestamp for author date"
+msgstr "använd nuvarande tidsstämpel för författardatum"
 
-#: builtin/checkout-index.c:167
-msgid "update stat information in the index file"
-msgstr "uppdatera stat-information i indexfilen"
+#: 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 "nyckel-id"
 
-#: builtin/checkout-index.c:171
-msgid "read list of paths from the standard input"
-msgstr "läs listan över sökvägar från standard in"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "GPG-signera incheckningar"
 
-#: builtin/checkout-index.c:173
-msgid "write the content to temporary files"
-msgstr "skriv innehåll till temporära filer"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(används internt av git-rebase)"
 
-#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
-msgid "string"
-msgstr "sträng"
+#: 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 ""
+"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/checkout-index.c:175
-msgid "when creating files, prepend <string>"
-msgstr "när filer skapas, lägg till <sträng> först"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "misslyckades läsa indexet"
 
-#: builtin/checkout-index.c:177
-msgid "copy out the files from named stage"
-msgstr "kopiera ut filer från namngiven etapp"
+#: builtin/am.c:2356
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "tidigare rebase-katalog %s finns fortfarande, men mbox angavs."
 
-#: builtin/checkout.c:25
-msgid "git checkout [<options>] <branch>"
-msgstr "git checkout [<flaggor>] <gren>"
+#: builtin/am.c:2380
+#, 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/checkout.c:26
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr "git checkout [<flaggor>] [<gren>] -- <fil>..."
+#: builtin/am.c:2386
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "Lösningsoperation pågår inte, vi återupptar inte."
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
-#, c-format
-msgid "path '%s' does not have our version"
-msgstr "sökvägen \"%s\" har inte vår version"
+#: builtin/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<flaggor>] [<patch>...]"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
+#: builtin/archive.c:17
 #, c-format
-msgid "path '%s' does not have their version"
-msgstr "sökvägen \"%s\" har inte deras version"
+msgid "could not create archive file '%s'"
+msgstr "Kunde inte skapa arkivfilen \"%s\""
 
-#: builtin/checkout.c:152
-#, 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/archive.c:20
+msgid "could not redirect output"
+msgstr "kunde inte omdirigera utdata"
 
-#: builtin/checkout.c:196
-#, c-format
-msgid "path '%s' does not have necessary versions"
-msgstr "sökvägen \"%s\" innehåller inte nödvändiga versioner"
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: Fjärr utan URL"
 
-#: builtin/checkout.c:213
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr "sökväg \"%s\": kan inte slå ihop"
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: förväntade ACK/NAK, fick EOF"
 
-#: builtin/checkout.c:230
+#: builtin/archive.c:61
 #, c-format
-msgid "Unable to add merge result for '%s'"
-msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
+msgid "git archive: NACK %s"
+msgstr "git archive: NACK %s"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: builtin/archive.c:63
 #, c-format
-msgid "'%s' cannot be used with updating paths"
-msgstr "\"%s\" kan inte användas vid uppdatering av sökvägar"
+msgid "remote error: %s"
+msgstr "fjärrfel: %s"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
-#, c-format
-msgid "'%s' cannot be used with %s"
-msgstr "\"%s\" kan inte användas med %s"
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: protokollfel"
 
-#: builtin/checkout.c:269
-#, 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/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: förväntade en tömning (flush)"
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "indexfilen är trasig"
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
 
-#: builtin/checkout.c:340 builtin/checkout.c:347
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr "sökvägen \"%s\" har inte slagits ihop"
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "utför 'git bisect next'"
 
-#: builtin/checkout.c:496
-msgid "you need to resolve your current index first"
-msgstr "du måste lösa ditt befintliga index först"
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr "uppdatera BISECT_HEAD istället för att checka ut aktuell incheckning"
 
-#: builtin/checkout.c:623
-#, c-format
-msgid "Can not do reflog for '%s': %s\n"
-msgstr "Kan inte skapa referenslogg för \"%s\": %s\n"
+#: builtin/blame.c:33
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+msgstr "git blame [<flaggor>] [<rev-flaggor>] [<rev>] [--] <fil>"
 
-#: builtin/checkout.c:661
-msgid "HEAD is now at"
-msgstr "HEAD är nu på"
+#: builtin/blame.c:38
+msgid "<rev-opts> are documented in git-rev-list(1)"
+msgstr "<rev-flaggor> dokumenteras i git-rev-list(1)"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
-msgid "unable to update HEAD"
-msgstr "kan inte uppdatera HEAD"
+#: builtin/blame.c:1781
+msgid "Blaming lines"
+msgstr "Klandra rader"
 
-#: builtin/checkout.c:669
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr "Återställ gren \"%s\"\n"
+#: builtin/blame.c:2577
+msgid "Show blame entries as we find them, incrementally"
+msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
 
-#: builtin/checkout.c:672
-#, c-format
-msgid "Already on '%s'\n"
-msgstr "Redan på \"%s\"\n"
+#: builtin/blame.c:2578
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
 
-#: builtin/checkout.c:676
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr "Växlade till och nollställde grenen \"%s\"\n"
+#: builtin/blame.c:2579
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr "Växlade till en ny gren \"%s\"\n"
+#: builtin/blame.c:2580
+msgid "Show work cost statistics"
+msgstr "Visa statistik över arbetskostnad"
 
-#: builtin/checkout.c:680
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr "Växlade till grenen \"%s\"\n"
+#: builtin/blame.c:2581
+msgid "Force progress reporting"
+msgstr "Tvinga förloppsrapportering"
 
-#: builtin/checkout.c:732
-#, c-format
-msgid " ... and %d more.\n"
-msgstr " ... och %d till.\n"
+#: builtin/blame.c:2582
+msgid "Show output score for blame entries"
+msgstr "Visa utdatapoäng för klandringsposter"
 
-#: builtin/checkout.c:738
-#, 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] ""
-"Varning: du lämnar %d incheckning bakom dig som inte är ansluten till\n"
-"någon av dina grenar:\n"
-"\n"
-"%s\n"
-msgstr[1] ""
-"Varning: du lämnar %d incheckningar bakom dig som inte är ansluta till\n"
-"någon av dina grenar:\n"
-"\n"
-"%s\n"
+#: builtin/blame.c:2583
+msgid "Show original filename (Default: auto)"
+msgstr "Visa originalfilnamn (Standard: auto)"
 
-#: builtin/checkout.c:757
-#, 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] ""
-"Om du vill behålla den genom att skapa en ny gren är nu en bra tidpunkt\n"
-"att göra så, med:\n"
-"\n"
-" git branch <nytt_grennamn> %s\n"
-"\n"
-msgstr[1] ""
-"Om du vill behålla dem genom att skapa en ny gren är nu en bra tidpunkt\n"
-"att göra så, med:\n"
-"\n"
-" git branch <nytt_grennamn> %s\n"
-"\n"
-
-#: builtin/checkout.c:793
-msgid "internal error in revision walk"
-msgstr "internt fel vid genomgång av revisioner (revision walk)"
+#: builtin/blame.c:2584
+msgid "Show original linenumber (Default: off)"
+msgstr "Visa ursprungligt radnummer (Standard: av)"
 
-#: builtin/checkout.c:797
-msgid "Previous HEAD position was"
-msgstr "Tidigare position för HEAD var"
+#: builtin/blame.c:2585
+msgid "Show in a format designed for machine consumption"
+msgstr "Visa i ett format avsett för maskinkonsumtion"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
-msgid "You are on a branch yet to be born"
-msgstr "Du är på en gren som ännu inte är född"
+#: builtin/blame.c:2586
+msgid "Show porcelain format with per-line commit information"
+msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
 
-#: builtin/checkout.c:969
-#, c-format
-msgid "only one reference expected, %d given."
-msgstr "endast en referens förväntades, %d gavs."
+#: builtin/blame.c:2587
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
-#, c-format
-msgid "invalid reference: %s"
-msgstr "felaktig referens: %s"
+#: builtin/blame.c:2588
+msgid "Show raw timestamp (Default: off)"
+msgstr "Visa rå tidsstämpel (Standard: av)"
 
-#: builtin/checkout.c:1038
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr "referensen är inte ett träd: %s"
+#: builtin/blame.c:2589
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
 
-#: builtin/checkout.c:1077
-msgid "paths cannot be used with switching branches"
-msgstr "sökvägar kan inte användas vid byte av gren"
+#: builtin/blame.c:2590
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
-#, c-format
-msgid "'%s' cannot be used with switching branches"
-msgstr "\"%s\" kan inte användas vid byte av gren"
+#: builtin/blame.c:2591
+msgid "Show author email instead of name (Default: off)"
+msgstr "Visa författarens e-post istället för namn (Standard: av)"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
-#, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr "\"%s\" kan inte användas med \"%s\""
+#: builtin/blame.c:2592
+msgid "Ignore whitespace differences"
+msgstr "Ignorera ändringar i blanksteg"
 
-#: builtin/checkout.c:1104
-#, c-format
-msgid "Cannot switch branch to a non-commit '%s'"
-msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
+#: builtin/blame.c:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr ""
+"Använd en experimentell indenteringsbaserad algoritm för att förbättra diffar"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
-msgid "branch"
-msgstr "gren"
+#: builtin/blame.c:2600
+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"
 
-#: builtin/checkout.c:1138
-msgid "create and checkout a new branch"
-msgstr "skapa och checka ut en ny gren"
+#: builtin/blame.c:2602
+msgid "Spend extra cycles to find better match"
+msgstr "Slösa extra cykler med att hitta bättre träff"
 
-#: builtin/checkout.c:1140
-msgid "create/reset and checkout a branch"
-msgstr "skapa/nollställ och checka ut en gren"
+#: builtin/blame.c:2603
+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/checkout.c:1141
-msgid "create reflog for new branch"
-msgstr "skapa reflogg för ny gren"
+#: builtin/blame.c:2604
+msgid "Use <file>'s contents as the final image"
+msgstr "Använd <fil>s innehåll som slutgiltig bild"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "koppla från HEAD vid namngiven incheckning"
+#: builtin/blame.c:2605 builtin/blame.c:2606
+msgid "score"
+msgstr "poäng"
 
-#: builtin/checkout.c:1143
-msgid "set upstream info for new branch"
-msgstr "sätt uppströmsinformation för ny gren"
+#: builtin/blame.c:2605
+msgid "Find line copies within and across files"
+msgstr "Hitta kopierade rader inuti och mellan filer"
 
-#: builtin/checkout.c:1145
-msgid "new-branch"
-msgstr "ny-gren"
+#: builtin/blame.c:2606
+msgid "Find line movements within and across files"
+msgstr "Hitta flyttade rader inuti och mellan filer"
 
-#: builtin/checkout.c:1145
-msgid "new unparented branch"
-msgstr "ny gren utan förälder"
+#: builtin/blame.c:2607
+msgid "n,m"
+msgstr "n,m"
 
-#: builtin/checkout.c:1146
-msgid "checkout our version for unmerged files"
-msgstr "checka ut vår version för ej sammanslagna filer"
+#: builtin/blame.c:2607
+msgid "Process only line range n,m, counting from 1"
+msgstr "Behandla endast radintervallet n,m, med början på 1"
 
-#: builtin/checkout.c:1148
-msgid "checkout their version for unmerged files"
-msgstr "checka ut deras version för ej sammanslagna filer"
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
+msgstr "--progress kan inte användas med --incremental eller porslinsformat"
 
-#: builtin/checkout.c:1150
-msgid "force checkout (throw away local modifications)"
-msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
+#. 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:2700
+msgid "4 years, 11 months ago"
+msgstr "4 år, 11 månader sedan"
 
-#: builtin/checkout.c:1151
-msgid "perform a 3-way merge with the new branch"
-msgstr "utför en 3-vägssammanslagning för den nya grenen"
+#: builtin/blame.c:2780
+msgid "--contents and --reverse do not blend well."
+msgstr "--contents och --reverse fungerar inte så bra tillsammans."
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
-msgid "update ignored files (default)"
-msgstr "uppdatera ignorerade filer (standard)"
+#: builtin/blame.c:2800
+msgid "cannot use --contents with final commit object name"
+msgstr "kan inte använda --contents med namn på slutgiltigt incheckningsobjekt"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
-msgid "style"
-msgstr "stil"
+#: builtin/blame.c:2805
+msgid "--reverse and --first-parent together require specified latest commit"
+msgstr ""
+"--reverse och --first-parent tillsammans kräver att du anger senaste "
+"incheckningen"
 
-#: builtin/checkout.c:1154
-msgid "conflict style (merge or diff3)"
-msgstr "konfliktstil (merge eller diff3)"
+#: builtin/blame.c:2832
+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/checkout.c:1157
-msgid "do not limit pathspecs to sparse entries only"
-msgstr "begränsa inte sökvägar till endast glesa poster"
+#: builtin/blame.c:2843
+#, c-format
+msgid "no such path %s in %s"
+msgstr "sökvägen %s i %s finns inte"
 
-#: builtin/checkout.c:1159
-msgid "second guess 'git checkout <no-such-branch>'"
-msgstr "förutspå \"git checkout <gren-saknas>\""
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "kan inte läsa objektet %s för sökvägen %s"
 
-#: builtin/checkout.c:1161
-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/blame.c:2873
+#, 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/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 builtin/push.c:526
-#: builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "tvinga förloppsrapportering"
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [<flaggor>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/checkout.c:1193
-msgid "-b, -B and --orphan are mutually exclusive"
-msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+msgstr "git branch [<flaggor>] [-l] [-f] <grennamn> [<startpunkt>]"
 
-#: builtin/checkout.c:1210
-msgid "--track needs a branch name"
-msgstr "--track behöver ett namn på en gren"
+#: builtin/branch.c:28
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+msgstr "git branch [<flaggor>] [-r] (-d | -D) <grennamn>..."
 
-#: builtin/checkout.c:1215
-msgid "Missing branch name; try -b"
-msgstr "Grennamn saknas; försök med -b"
+#: builtin/branch.c:29
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+msgstr "git branch [<flaggor>] (-m | -M) [<gammal_gren>] <ny_gren>"
 
-#: builtin/checkout.c:1251
-msgid "invalid path specification"
-msgstr "felaktig sökvägsangivelse"
+#: builtin/branch.c:30
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<flaggor>] [-r | -a] [--points-at]"
 
-#: builtin/checkout.c:1258
+#: builtin/branch.c:143
 #, 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?"
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
 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?"
+"tar bort grenen \"%s\" som har slagits ihop med\n"
+"         \"%s\", men ännu inte slagits ihop med HEAD."
 
-#: builtin/checkout.c:1263
+#: builtin/branch.c:147
 #, 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:1267
 msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
 msgstr ""
-"git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n"
-"du checkar ut från indexet."
+"tar inte bort grenen \"%s\" som inte har slagits ihop med\n"
+"         \"%s\", trots att den har slagits ihop med HEAD."
 
-#: builtin/clean.c:25
+#: builtin/branch.c:161
+#, c-format
+msgid "Couldn't look up commit object for '%s'"
+msgstr "Kunde inte slå upp incheckningsobjekt för \"%s\""
+
+#: builtin/branch.c:165
+#, c-format
 msgid ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
-"git clean [-d] [-f] [-i] [-n] [-q] [-e <mönster>] [-x | -X] [--] "
-"<sökvägar>..."
+"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/clean.c:29
-#, c-format
-msgid "Removing %s\n"
-msgstr "Tar bort %s\n"
+#: builtin/branch.c:178
+msgid "Update of config-file failed"
+msgstr "Misslyckades uppdatera konfigurationsfil"
 
-#: builtin/clean.c:30
+#: builtin/branch.c:206
+msgid "cannot use -a with -d"
+msgstr "kan inte ange -a med -d"
+
+#: builtin/branch.c:212
+msgid "Couldn't look up commit object for HEAD"
+msgstr "Kunde inte slå upp incheckningsobjekt för HEAD"
+
+#: builtin/branch.c:226
 #, c-format
-msgid "Would remove %s\n"
-msgstr "Skulle ta bort %s\n"
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "Kan inte ta bort grenen \"%s\" som är utcheckad på \"%s\""
 
-#: builtin/clean.c:31
+#: builtin/branch.c:241
 #, c-format
-msgid "Skipping repository %s\n"
-msgstr "Hoppar över arkivet %s\n"
+msgid "remote-tracking branch '%s' not found."
+msgstr "fjärrspårande grenen \"%s\" hittades inte."
 
-#: builtin/clean.c:32
+#: builtin/branch.c:242
 #, c-format
-msgid "Would skip repository %s\n"
-msgstr "Skulle hoppa över arkivet %s\n"
+msgid "branch '%s' not found."
+msgstr "grenen \"%s\" hittades inte."
 
-#: builtin/clean.c:33
+#: builtin/branch.c:257
 #, c-format
-msgid "failed to remove %s"
-msgstr "misslyckades ta bort %s"
+msgid "Error deleting remote-tracking branch '%s'"
+msgstr "Fel vid borttagning av fjärrspårande grenen \"%s\""
 
-#: 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 ""
-"Kommandohjälp:\n"
-"1          - markera en numrerad post\n"
-"foo        - markera post baserad på unikt prefix\n"
-"           - (tomt) markera ingenting"
+#: builtin/branch.c:258
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr "Fel vid borttagning av grenen \"%s\""
 
-#: 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"
-msgstr ""
-"Kommandohjälp:\n"
-"1          - markera en ensam post\n"
-"3-5        - markera ett intervall med poster\n"
-"2-3,6-9    - markera flera intervall\n"
-"foo        - markera post baserad på unikt prefix\n"
-"-...       - avmarkera specifika poster\n"
-"*          - välj alla poster\n"
-"           - (tomt) avsluta markering"
+#: builtin/branch.c:265
+#, c-format
+msgid "Deleted remote-tracking branch %s (was %s).\n"
+msgstr "Tog bort fjärrspårande grenen %s (var %s).\n"
 
-#: builtin/clean.c:511
+#: builtin/branch.c:266
 #, c-format
-msgid "Huh (%s)?"
-msgstr "Vadå (%s)?"
+msgid "Deleted branch %s (was %s).\n"
+msgstr "Tog bort grenen %s (var %s).\n"
 
-#: builtin/clean.c:653
+#: builtin/branch.c:312
 #, c-format
-msgid "Input ignore patterns>> "
-msgstr "Ange ignoreringsmönster>>"
+msgid "[%s: gone]"
+msgstr "[%s: försvunnen]"
 
-#: builtin/clean.c:690
+#: builtin/branch.c:317
 #, c-format
-msgid "WARNING: Cannot find items matched by: %s"
-msgstr "VARNING: Hittar inte poster som motsvarar: %s"
+msgid "[%s]"
+msgstr "[%s]"
 
-#: builtin/clean.c:711
-msgid "Select items to delete"
-msgstr "Välj poster att ta bort"
+#: builtin/branch.c:322
+#, c-format
+msgid "[%s: behind %d]"
+msgstr "[%s: bakom %d] "
 
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
+#: builtin/branch.c:324
 #, c-format
-msgid "Remove %s [y/N]? "
-msgstr "Ta bort %s [Y=ja / N=nej]?"
+msgid "[behind %d]"
+msgstr "[bakom %d] "
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Hej då."
+#: builtin/branch.c:328
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr "[%s: före %d] "
 
-#: 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               - börja städa\n"
-"filter by pattern   - uteslut poster från borttagning\n"
-"select by numbers   - markera poster som ska tas bort med siffror\n"
-"ask each            - bekräfta varje borttagning (som \"rm -i\")\n"
-"quit                - sluta städa\n"
-"help                - denna skärm\n"
-"?                   - hjälp för kommandoval"
+#: builtin/branch.c:330
+#, c-format
+msgid "[ahead %d]"
+msgstr "[före %d] "
 
-#: builtin/clean.c:812
-msgid "*** Commands ***"
-msgstr "*** Kommandon ***"
+#: builtin/branch.c:333
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr "[%s: före %d, bakom %d] "
 
-#: builtin/clean.c:813
-msgid "What now"
-msgstr "Vad nu"
+#: builtin/branch.c:336
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr "[före %d, bakom %d] "
 
-#: builtin/clean.c:821
-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/branch.c:349
+msgid " **** invalid ref ****"
+msgstr " **** ogiltig ref ****"
 
-#: builtin/clean.c:838
-msgid "No more files to clean, exiting."
-msgstr "Inga fler filer att städa, avslutar."
+#: builtin/branch.c:375
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(ingen gren, ombaserar %s)"
 
-#: builtin/clean.c:869
-msgid "do not print names of files removed"
-msgstr "skriv inte ut namn på borttagna filer"
+#: builtin/branch.c:378
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(ingen gren, \"bisect\" startad på %s)"
 
-#: builtin/clean.c:871
-msgid "force"
-msgstr "tvinga"
+#. 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)"
 
-#: builtin/clean.c:872
-msgid "interactive cleaning"
-msgstr "städa interaktivt"
+#. 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/clean.c:874
-msgid "remove whole directories"
-msgstr "ta bort hela kataloger"
+#: builtin/branch.c:393
+msgid "(no branch)"
+msgstr "(ingen gren)"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 builtin/show-ref.c:182
-msgid "pattern"
-msgstr "mönster"
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "Grenen %s ombaseras på %s"
 
-#: builtin/clean.c:876
-msgid "add <pattern> to ignore rules"
-msgstr "lägg till <mönster> till ignoreringsregler"
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "Grenen %s är i en \"bisect\" på %s"
 
-#: builtin/clean.c:877
-msgid "remove ignored files, too"
-msgstr "ta även bort ignorerade filer"
+#: builtin/branch.c:563
+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/clean.c:879
-msgid "remove only ignored files"
-msgstr "ta endast bort ignorerade filer"
+#: builtin/branch.c:573
+#, c-format
+msgid "Invalid branch name: '%s'"
+msgstr "Felaktigt namn på gren: \"%s\""
 
-#: builtin/clean.c:897
-msgid "-x and -X cannot be used together"
-msgstr "-x och -X kan inte användas samtidigt"
+#: builtin/branch.c:590
+msgid "Branch rename failed"
+msgstr "Misslyckades byta namn på gren"
 
-#: builtin/clean.c:901
-msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
-msgstr ""
-"clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
-"städa"
+#: builtin/branch.c:594
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
 
-#: builtin/clean.c:904
+#: builtin/branch.c:597
+#, 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
+msgid "Branch is renamed, but update of config-file failed"
+msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
+
+#: builtin/branch.c:620
+#, c-format
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
 msgstr ""
-"clean.requireForce har standardvärdet true och varken -i, -n eller -f "
-"angavs; vägrar städa"
+"Redigera beskrivningen för grenen\n"
+"  %s\n"
+"Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/clone.c:37
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr "git clone [<flaggor>] [--] <arkiv> [<kat>]"
+#: builtin/branch.c:651
+msgid "Generic options"
+msgstr "Allmänna flaggor"
 
-#: builtin/clone.c:60
-msgid "don't create a checkout"
-msgstr "skapa inte någon utcheckning"
+#: builtin/branch.c:653
+msgid "show hash and subject, give twice for upstream branch"
+msgstr "visa hash och ärenderad, ange två gånger för uppströmsgren"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
-msgid "create a bare repository"
-msgstr "skapa ett naket (\"bare\") arkiv"
+#: builtin/branch.c:654
+msgid "suppress informational messages"
+msgstr "undertryck informationsmeddelanden"
 
-#: builtin/clone.c:65
-msgid "create a mirror repository (implies bare)"
-msgstr "skapa ett spegelarkiv (implicerar \"bare\")"
+#: builtin/branch.c:655
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "ställ in spårningsläge (se git-pull(1))"
 
-#: builtin/clone.c:67
-msgid "to clone from a local repository"
-msgstr "för att klona från ett lokalt arkiv"
+#: builtin/branch.c:657
+msgid "change upstream info"
+msgstr "ändra uppströmsinformation"
 
-#: builtin/clone.c:69
-msgid "don't use local hardlinks, always copy"
-msgstr "skapa inte lokala hårda länkar, kopiera alltid"
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "uppströms"
 
-#: builtin/clone.c:71
-msgid "setup as shared repository"
-msgstr "skapa som ett delat arkiv"
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "ändra uppströmsinformationen"
 
-#: builtin/clone.c:73 builtin/clone.c:75
-msgid "initialize submodules in the clone"
-msgstr "initiera undermoduler i klonen"
+#: builtin/branch.c:660
+msgid "Unset the upstream info"
+msgstr "ta bort uppströmsinformationen"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
-msgid "template-directory"
-msgstr "mallkatalog"
+#: builtin/branch.c:661
+msgid "use colored output"
+msgstr "använd färgad utdata"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
-msgid "directory from which templates will be used"
-msgstr "katalog att använda mallar från"
+#: builtin/branch.c:662
+msgid "act on remote-tracking branches"
+msgstr "arbeta på fjärrspårande grenar"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
-msgid "reference repository"
-msgstr "referensarkiv"
+#: builtin/branch.c:664 builtin/branch.c:665
+msgid "print only branches that contain the commit"
+msgstr "visa endast grenar som innehåller incheckningen"
 
-#: builtin/clone.c:81
-msgid "use --reference only while cloning"
-msgstr "använd --reference endast under kloningen"
+#: builtin/branch.c:668
+msgid "Specific git-branch actions:"
+msgstr "Specifika git-branch-åtgärder:"
 
-#: builtin/clone.c:82 builtin/column.c:26 builtin/merge-file.c:44
-msgid "name"
-msgstr "namn"
+#: builtin/branch.c:669
+msgid "list both remote-tracking and local branches"
+msgstr "visa både fjärrspårande och lokala grenar"
 
-#: builtin/clone.c:83
-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/branch.c:671
+msgid "delete fully merged branch"
+msgstr "ta bort helt sammanslagen gren"
 
-#: builtin/clone.c:85
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr "checka ut <gren> istället för fjärrens HEAD"
+#: builtin/branch.c:672
+msgid "delete branch (even if not merged)"
+msgstr "ta bort gren (även om inte helt sammanslagen)"
 
-#: builtin/clone.c:87
-msgid "path to git-upload-pack on the remote"
-msgstr "sökväg till git-upload-pack på fjärren"
+#: builtin/branch.c:673
+msgid "move/rename a branch and its reflog"
+msgstr "flytta/ta bort en gren och dess reflogg"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
-msgid "depth"
-msgstr "djup"
+#: builtin/branch.c:674
+msgid "move/rename a branch, even if target exists"
+msgstr "flytta/ta bort en gren, även om målet finns"
 
-#: builtin/clone.c:89
-msgid "create a shallow clone of that depth"
-msgstr "skapa en grund klon på detta djup"
+#: builtin/branch.c:675
+msgid "list branch names"
+msgstr "lista namn på grenar"
 
-#: builtin/clone.c:91
-msgid "clone only one branch, HEAD or --branch"
-msgstr "klona endast en gren, HEAD eller --branch"
+#: builtin/branch.c:676
+msgid "create the branch's reflog"
+msgstr "skapa grenens reflogg"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
-msgid "gitdir"
-msgstr "gitkat"
+#: builtin/branch.c:678
+msgid "edit the description for the branch"
+msgstr "redigera beskrivning för grenen"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
-msgid "separate git dir from working tree"
-msgstr "separera gitkatalogen från arbetskatalogen"
+#: builtin/branch.c:679
+msgid "force creation, move/rename, deletion"
+msgstr "tvinga skapande, flytt/namnändring, borttagande"
 
-#: builtin/clone.c:94
-msgid "key=value"
-msgstr "nyckel=värde"
+#: builtin/branch.c:680
+msgid "print only branches that are merged"
+msgstr "visa endast sammanslagna grenar"
 
-#: builtin/clone.c:95
-msgid "set config inside the new repository"
-msgstr "ställ in konfiguration i det nya arkivet"
+#: builtin/branch.c:681
+msgid "print only branches that are not merged"
+msgstr "visa endast ej sammanslagna grenar"
 
-#: builtin/clone.c:96 builtin/fetch.c:131 builtin/push.c:536
-msgid "use IPv4 addresses only"
-msgstr "använd endast IPv4-adresser"
+#: builtin/branch.c:682
+msgid "list branches in columns"
+msgstr "visa grenar i spalter"
 
-#: builtin/clone.c:98 builtin/fetch.c:133 builtin/push.c:538
-msgid "use IPv6 addresses only"
-msgstr "använd endast IPv6-adresser"
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "nyckel"
 
-#: builtin/clone.c:239
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-"Kunde inte gissa katalognamn.\n"
-"Ange en katalog på kommandoraden"
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "fältnamn att sortera på"
 
-#: builtin/clone.c:305
-#, 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/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 "objekt"
 
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv."
+#: builtin/branch.c:687
+msgid "print only branches of the object"
+msgstr "visa endast grenar för objektet"
 
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "referensarkivet \"%s\" är grunt"
+#: builtin/branch.c:705
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "Misslyckades slå upp HEAD som giltig referens"
 
-#: builtin/clone.c:315
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "referensarkivet \"%s\" är ympat"
+#: builtin/branch.c:709 builtin/clone.c:706
+msgid "HEAD not found below refs/heads!"
+msgstr "HEAD hittades inte under refs/heads!"
 
-#: builtin/clone.c:380 builtin/diff.c:84
-#, c-format
-msgid "failed to stat '%s'"
-msgstr "misslyckades ta status på \"%s\""
+#: builtin/branch.c:729
+msgid "--column and --verbose are incompatible"
+msgstr "--column och --verbose är inkompatibla"
 
-#: builtin/clone.c:382
-#, c-format
-msgid "%s exists and is not a directory"
-msgstr "%s finns och är ingen katalog"
+#: builtin/branch.c:740 builtin/branch.c:782
+msgid "branch name required"
+msgstr "grennamn krävs"
 
-#: builtin/clone.c:396
-#, c-format
-msgid "failed to stat %s\n"
-msgstr "misslyckades ta status på %s\n"
+#: builtin/branch.c:758
+msgid "Cannot give description to detached HEAD"
+msgstr "Kan inte beskriva frånkopplad HEAD"
 
-#: builtin/clone.c:418
-#, c-format
-msgid "failed to create link '%s'"
-msgstr "misslyckades skapa länken \"%s\""
+#: builtin/branch.c:763
+msgid "cannot edit description of more than one branch"
+msgstr "kan inte redigera beskrivning för mer än en gren"
 
-#: builtin/clone.c:422
+#: builtin/branch.c:770
 #, c-format
-msgid "failed to copy file to '%s'"
-msgstr "misslyckades kopiera filen till \"%s\""
+msgid "No commit on branch '%s' yet."
+msgstr "Inga incheckningar på grenen \"%s\" ännu"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/branch.c:773
 #, c-format
-msgid "done.\n"
-msgstr "klart.\n"
+msgid "No branch named '%s'."
+msgstr "Ingen gren vid namnet \"%s\"."
+
+#: builtin/branch.c:788
+msgid "too many branches for a rename operation"
+msgstr "för många grenar för namnbyte"
+
+#: builtin/branch.c:793
+msgid "too many branches to set new upstream"
+msgstr "för många grenar för att byta uppström"
 
-#: builtin/clone.c:459
+#: builtin/branch.c:797
+#, 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"
+"could not set upstream of HEAD to %s when it does not point to any branch."
 msgstr ""
-"Klonen lyckades, men utcheckningen misslyckades.\n"
-"Du kan inspektera det som checkades ut med \"git status\"\n"
-"och försöka checka ut igen med \"git checkout -f HEAD\"\n"
+"kunde inte sätta uppström för HEAD till %s när det inte pekar mot någon gren."
 
-#: builtin/clone.c:536
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
-msgid "Could not find remote branch %s to clone."
-msgstr "Kunde inte hitta fjärrgrenen %s för att klona."
+msgid "no such branch '%s'"
+msgstr "okänd gren \"%s\""
 
-# Vague original, not networking-related, but rather related to the actual
-# objects downloaded.
-#: builtin/clone.c:626
+#: builtin/branch.c:804
 #, c-format
-msgid "Checking connectivity... "
-msgstr "Kontrollerar om vi fick alla objekt..."
+msgid "branch '%s' does not exist"
+msgstr "grenen \"%s\" finns inte"
 
-#: builtin/clone.c:629
-msgid "remote did not send all necessary objects"
-msgstr "fjärren sände inte alla nödvändiga objekt"
+#: builtin/branch.c:816
+msgid "too many branches to unset upstream"
+msgstr "för många grenar för att ta bort uppström"
+
+#: builtin/branch.c:820
+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/clone.c:647
+#: builtin/branch.c:826
 #, c-format
-msgid "unable to update %s"
-msgstr "kan inte uppdatera %s"
+msgid "Branch '%s' has no upstream information"
+msgstr "Grenen \"%s\" har ingen uppströmsinformation"
 
-#: builtin/clone.c:696
-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/branch.c:840
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "kan inte skapa \"HEAD\" manuellt"
 
-#: builtin/clone.c:727
-msgid "unable to checkout working tree"
-msgstr "kunde inte checka ut arbetskatalogen"
+#: builtin/branch.c:846
+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/clone.c:753
-msgid "unable to write parameters to config file"
-msgstr "kunde inte skriva parametrar till konfigurationsfilen"
+#: builtin/branch.c:849
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+"Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
+"eller --set-upstream-to\n"
 
-#: builtin/clone.c:816
-msgid "cannot repack to clean up"
-msgstr "kan inte packa om för att städa upp"
+#: builtin/branch.c:866
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+"\n"
+"Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
+"\n"
 
-#: builtin/clone.c:818
-msgid "cannot unlink temporary alternates file"
-msgstr "kunde inte ta bort temporär \"alternates\"-fil"
+#: builtin/bundle.c:51
+#, c-format
+msgid "%s is okay\n"
+msgstr "%s är okej\n"
 
-#: builtin/clone.c:850
-msgid "Too many arguments."
-msgstr "För många argument."
+#: builtin/bundle.c:64
+msgid "Need a repository to create a bundle."
+msgstr "Behöver ett arkiv för att skapa ett paket (bundle)."
 
-#: builtin/clone.c:854
-msgid "You must specify a repository to clone."
-msgstr "Du måste ange ett arkiv att klona."
+#: builtin/bundle.c:68
+msgid "Need a repository to unbundle."
+msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
 
-#: builtin/clone.c:865
-#, c-format
-msgid "--bare and --origin %s options are incompatible."
-msgstr "flaggorna --bare och --origin %s är inkompatibla."
+#: 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 | <typ> | --textconv | --filters) [--path=<sökväg>] <objekt>"
 
-#: builtin/clone.c:868
-msgid "--bare and --separate-git-dir are incompatible."
-msgstr "flaggorna --bare och --separate-git-dir är inkompatibla."
+#: 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/clone.c:881
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr "arkivet \"%s\" finns inte"
+#: 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/clone.c:887 builtin/fetch.c:1174
-#, c-format
-msgid "depth %s is not a positive number"
-msgstr "djupet %s är inte ett positivt tal"
+#: builtin/cat-file.c:552
+msgid "show object type"
+msgstr "visa objekttyp"
 
-#: builtin/clone.c:897
-#, 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/cat-file.c:553
+msgid "show object size"
+msgstr "visa objektstorlek"
 
-#: builtin/clone.c:907
-#, c-format
-msgid "working tree '%s' already exists."
-msgstr "arbetsträdet \"%s\" finns redan."
+#: 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/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
-#, c-format
-msgid "could not create leading directories of '%s'"
-msgstr "kunde inte skapa inledande kataloger för \"%s\""
+#: builtin/cat-file.c:556
+msgid "pretty-print object's content"
+msgstr "visa objektets innehåll snyggt"
 
-#: builtin/clone.c:925
-#, c-format
-msgid "could not create work tree dir '%s'"
-msgstr "kunde inte skapa arbetskatalogen \"%s\""
+#: builtin/cat-file.c:558
+msgid "for blob objects, run textconv on object's content"
+msgstr "för blob-objekt, kör filter på objektets innehåll"
 
-#: builtin/clone.c:943
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr "Klonar till ett naket arkiv \"%s\"...\n"
+#: 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/clone.c:945
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr "Klonar till \"%s\"...\n"
+#: builtin/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "blob"
 
-#: builtin/clone.c:984
-msgid "--depth is ignored in local clones; use file:// instead."
-msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
+#: 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/clone.c:987
-msgid "source repository is shallow, ignoring --local"
-msgstr "källarkivet är grunt, ignorerar --local"
+#: 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/clone.c:992
-msgid "--local is ignored"
-msgstr "--local ignoreras"
+#: builtin/cat-file.c:565
+msgid "buffer --batch output"
+msgstr "buffra utdata från --batch"
 
-#: builtin/clone.c:996
-#, c-format
-msgid "Don't know how to clone %s"
-msgstr "Vet inte hur man klonar %s"
+#: 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/clone.c:1045 builtin/clone.c:1053
-#, c-format
-msgid "Remote branch %s not found in upstream %s"
-msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s"
+#: 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/clone.c:1056
-msgid "You appear to have cloned an empty repository."
-msgstr "Du verkar ha klonat ett tomt arkiv."
+#: 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/column.c:9
-msgid "git column [<options>]"
-msgstr "git column [<flaggor>]"
+#: builtin/cat-file.c:575
+msgid "show all objects with --batch or --batch-check"
+msgstr "visa alla objekt med --batch eller --batch-check"
 
-#: builtin/column.c:26
-msgid "lookup config vars"
-msgstr "slå upp konfigurationsvariabler"
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+msgstr "git check-attr [-a | --all | <attr>...] [--] <sökväg>..."
 
-#: builtin/column.c:27 builtin/column.c:28
-msgid "layout to use"
-msgstr "utseende att använda"
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <attr>...]"
 
-#: builtin/column.c:29
-msgid "Maximum width"
-msgstr "Maximal bredd"
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "visa alla attribut som satts på filen"
 
-#: builtin/column.c:30
-msgid "Padding space on left border"
-msgstr "Spaltfyllnad i vänsterkanten"
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "använd .gitattributes endast från indexet"
 
-#: builtin/column.c:31
-msgid "Padding space on right border"
-msgstr "Spaltfyllnad i högerkanten"
+#: 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"
 
-#: builtin/column.c:32
-msgid "Padding space between columns"
-msgstr "Spaltfyllnad mellan spalter"
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr "avsluta in- och utdataposter med NUL-tecken"
 
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr "--command måste vara första argument"
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
+msgid "suppress progress reporting"
+msgstr "undertryck förloppsrapportering"
 
-#: builtin/commit.c:38
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr "git commit [<flaggor>] [--] <sökväg>..."
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "visa indatasökvägar som inte träffas"
 
-#: builtin/commit.c:43
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr "git status [<flaggor>] [--] <sökväg>..."
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "ignorera index vid kontroll"
 
-#: 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 ""
-"Ditt namn och e-postadress konfigurerades automatiskt baserat på\n"
-"ditt användar-id och värdnamn. Kontrollera att de är riktiga. Du\n"
-"kan förhindra det här meddelandet genom att ställa dem explicit.\n"
-"Kör följande kommandon och följ instruktionerna i textredigeraren\n"
-"för att redigera din konfigurationsfil:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"När du gjort det kan du rätta identiteten som användes för den här\n"
-"incheckningen med:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "kan inte ange sökvägsnamn med --stdin"
 
-#: 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 ""
-"Ditt namn och e-postadress konfigurerades automatiskt baserat på\n"
-"ditt användar-id och värdnamn. Kontrollera att de är riktiga. Du\n"
-"kan förhindra det här meddelandet genom att ställa dem explicit:\n"
-"\n"
-"    git config --global user.name \"Ditt namn\"\n"
-"    git config --global user.email du@example.com\n"
-"\n"
-"När du gjort det kan du rätta identiteten som användes för den här\n"
-"incheckningen med:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "-z kan endast användas tillsammans med --stdin"
 
-#: 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 ""
-"Du bad om att utöka den senaste incheckningen, men om du gör det\n"
-"blir den tom. Du kan köra kommandot på nytt med --allow-empty, eller\n"
-"så kan du ta bort incheckningen helt med \"git reset HEAD^\".\n"
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "ingen sökväg angavs"
 
-#: 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 ""
-"Den tidigare \"cherry-pick\":en är nu tom, kanske på grund av en löst\n"
-"konflikt. Om du vill checka in den ändå använder du:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "--quiet kan endast användas med ett enkelt sökvägsnamn"
 
-#: builtin/commit.c:85
-msgid "Otherwise, please use 'git reset'\n"
-msgstr "Använd annars \"git reset\"\n"
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "kan inte använda både --quiet och --verbose"
 
-#: 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 ""
-"Om du vill hoppa över incheckningen, använd:\n"
-"\n"
-"    git reset\n"
-"\n"
-"\"git cherry-pick --continue\" kommer därefter att återuppta\n"
-"cherry-pick för återstående incheckningar.\n"
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "--non-matching är endast giltig med --verbose"
 
-#: builtin/commit.c:305
-msgid "failed to unpack HEAD tree object"
-msgstr "misslyckades packa upp HEAD:s trädobjekt"
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
+msgstr "git check-mailmap [<flaggor>] <kontakt>..."
 
-#: builtin/commit.c:346
-msgid "unable to create temporary index"
-msgstr "kunde inte skapa temporär indexfil"
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "läs även kontakter från standard in"
 
-#: builtin/commit.c:352
-msgid "interactive add failed"
-msgstr "interaktiv tilläggning misslyckades"
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr "kunde inte tolka kontakt: %s"
 
-#: builtin/commit.c:365
-msgid "unable to update temporary index"
-msgstr "kan inte uppdatera temporärt index"
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "inga kontakter angavs"
 
-#: builtin/commit.c:367
-msgid "Failed to update main cache tree"
-msgstr "Misslyckades uppdatera huvud-cacheträdet"
+#: builtin/checkout-index.c:127
+msgid "git checkout-index [<options>] [--] [<file>...]"
+msgstr "git checkout-index [<flaggor>] [--] [<fil>...]"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
-msgid "unable to write new_index file"
-msgstr "kunde inte skriva filen new_index"
+#: builtin/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
+msgstr "etapp måste vara mellan 1 och 3 eller \"all\""
 
-#: builtin/commit.c:445
-msgid "cannot do a partial commit during a merge."
-msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
+#: builtin/checkout-index.c:160
+msgid "check out all files in the index"
+msgstr "checka ut alla filer i indexet"
 
-#: builtin/commit.c:447
-msgid "cannot do a partial commit during a cherry-pick."
-msgstr "kan inte utföra en delvis incheckning under en cherry-pick."
+#: builtin/checkout-index.c:161
+msgid "force overwrite of existing files"
+msgstr "tvinga överskrivning av befintliga filer"
 
-#: builtin/commit.c:456
-msgid "cannot read the index"
-msgstr "kan inte läsa indexet"
+#: builtin/checkout-index.c:163
+msgid "no warning for existing files and files not in index"
+msgstr "ingen varning för existerande filer och filer ej i indexet"
 
-#: builtin/commit.c:475
-msgid "unable to write temporary index file"
-msgstr "kunde inte skriva temporär indexfil"
+#: builtin/checkout-index.c:165
+msgid "don't checkout new files"
+msgstr "checka inte ut nya filer"
 
-#: builtin/commit.c:580
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr "incheckningen \"%s\" saknar författarhuvud"
+#: builtin/checkout-index.c:167
+msgid "update stat information in the index file"
+msgstr "uppdatera stat-information i indexfilen"
 
-#: builtin/commit.c:582
-#, c-format
-msgid "commit '%s' has malformed author line"
-msgstr "incheckningen \"%s\" har felformaterat författarhuvud"
+#: builtin/checkout-index.c:171
+msgid "read list of paths from the standard input"
+msgstr "läs listan över sökvägar från standard in"
 
-#: builtin/commit.c:601
-msgid "malformed --author parameter"
-msgstr "felformad \"--author\"-flagga"
+#: builtin/checkout-index.c:173
+msgid "write the content to temporary files"
+msgstr "skriv innehåll till temporära filer"
 
-#: builtin/commit.c:609
-#, c-format
-msgid "invalid date format: %s"
-msgstr "felaktigt datumformat: %s"
+#: builtin/checkout-index.c:174 builtin/column.c:30
+#: 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 "sträng"
 
-#: builtin/commit.c:653
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-msgstr ""
-"kunde inte välja ett kommentarstecken som inte använts\n"
-"i det befintliga incheckningsmeddelandet"
+#: builtin/checkout-index.c:175
+msgid "when creating files, prepend <string>"
+msgstr "när filer skapas, lägg till <sträng> först"
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#: builtin/checkout-index.c:177
+msgid "copy out the files from named stage"
+msgstr "kopiera ut filer från namngiven etapp"
+
+#: builtin/checkout.c:25
+msgid "git checkout [<options>] <branch>"
+msgstr "git checkout [<flaggor>] <gren>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [<options>] [<branch>] -- <file>..."
+msgstr "git checkout [<flaggor>] [<gren>] -- <fil>..."
+
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
-msgid "could not lookup commit %s"
-msgstr "kunde inte slå upp incheckningen %s"
+msgid "path '%s' does not have our version"
+msgstr "sökvägen \"%s\" har inte vår version"
 
-#: builtin/commit.c:702 builtin/shortlog.c:285
+#: builtin/checkout.c:136 builtin/checkout.c:169
 #, c-format
-msgid "(reading log message from standard input)\n"
-msgstr "(läser loggmeddelande från standard in)\n"
+msgid "path '%s' does not have their version"
+msgstr "sökvägen \"%s\" har inte deras version"
 
-#: builtin/commit.c:704
-msgid "could not read log from standard input"
-msgstr "kunde inte läsa logg från standard in"
+#: builtin/checkout.c:152
+#, 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/commit.c:708
+#: builtin/checkout.c:196
 #, c-format
-msgid "could not read log file '%s'"
-msgstr "kunde inte läsa loggfilen \"%s\""
+msgid "path '%s' does not have necessary versions"
+msgstr "sökvägen \"%s\" innehåller inte nödvändiga versioner"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "kunde inte läsa MERGE_MSG"
+#: builtin/checkout.c:213
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "sökväg \"%s\": kan inte slå ihop"
 
-#: builtin/commit.c:734
-msgid "could not read SQUASH_MSG"
-msgstr "kunde inte läsa SQUASH_MSG"
+#: builtin/checkout.c:230
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
 
-#: builtin/commit.c:785
-msgid "could not write commit template"
-msgstr "kunde inte skriva incheckningsmall"
+#: 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\" kan inte användas vid uppdatering av sökvägar"
 
-#: builtin/commit.c:803
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, 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"
-"Det verkar som du checkar in en sammanslagning.\n"
-"Om det inte stämmer tar du bort filen\n"
-"\t%s\n"
-"och försöker igen.\n"
+msgid "'%s' cannot be used with %s"
+msgstr "\"%s\" kan inte användas med %s"
 
-#: builtin/commit.c:808
+#: builtin/checkout.c:268
 #, 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"
-"Det verkar som du checkar in en cherry-pick.\n"
-"Om det inte stämmer tar du bort filen\n"
-"\t%s\n"
-"och försöker igen.\n"
+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/commit.c:821
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, 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 ""
-"Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n"
-"med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
-"incheckningen.\n"
+msgid "path '%s' is unmerged"
+msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/commit.c:828
-#, 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"
-msgstr ""
-"Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n"
-"med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
-"Ett tomt meddelande avbryter incheckningen.\n"
+#: builtin/checkout.c:494
+msgid "you need to resolve your current index first"
+msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/commit.c:848
+#: builtin/checkout.c:624
 #, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr "%sFörfattare: %.*s <%.*s>"
+msgid "Can not do reflog for '%s': %s\n"
+msgstr "Kan inte skapa referenslogg för \"%s\": %s\n"
+
+#: builtin/checkout.c:663
+msgid "HEAD is now at"
+msgstr "HEAD är nu på"
+
+#: builtin/checkout.c:667 builtin/clone.c:660
+msgid "unable to update HEAD"
+msgstr "kan inte uppdatera HEAD"
 
-#: builtin/commit.c:856
+#: builtin/checkout.c:671
 #, c-format
-msgid "%sDate:      %s"
-msgstr "%sDatum:      %s"
+msgid "Reset branch '%s'\n"
+msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/commit.c:863
+#: builtin/checkout.c:674
 #, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr "%sIncheckare: %.*s <%.*s>"
+msgid "Already on '%s'\n"
+msgstr "Redan på \"%s\"\n"
 
-#: builtin/commit.c:881
-msgid "Cannot read index"
-msgstr "Kan inte läsa indexet"
+#: builtin/checkout.c:678
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/commit.c:938
-msgid "Error building trees"
-msgstr "Fel vid byggande av träd"
+#: builtin/checkout.c:680 builtin/checkout.c:1069
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "Växlade till en ny gren \"%s\"\n"
 
-#: builtin/commit.c:953 builtin/tag.c:266
+#: builtin/checkout.c:682
 #, c-format
-msgid "Please supply the message using either -m or -F option.\n"
-msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
+msgid "Switched to branch '%s'\n"
+msgstr "Växlade till grenen \"%s\"\n"
 
-#: builtin/commit.c:1055
+#: builtin/checkout.c:733
 #, 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"
+msgid " ... and %d more.\n"
+msgstr " ... och %d till.\n"
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
+#: builtin/checkout.c:739
 #, c-format
-msgid "Invalid untracked files mode '%s'"
-msgstr "Ogiltigt läge för ospårade filer: \"%s\""
+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] ""
+"Varning: du lämnar %d incheckning bakom dig som inte är ansluten till\n"
+"någon av dina grenar:\n"
+"\n"
+"%s\n"
+msgstr[1] ""
+"Varning: du lämnar %d incheckningar bakom dig som inte är ansluta till\n"
+"någon av dina grenar:\n"
+"\n"
+"%s\n"
 
-#: builtin/commit.c:1107
-msgid "--long and -z are incompatible"
-msgstr "--long och -z är inkompatibla"
+#: 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"
+"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] ""
+"Om du vill behålla den genom att skapa en ny gren är nu en bra tidpunkt\n"
+"att göra så, med:\n"
+"\n"
+" git branch <nytt_grennamn> %s\n"
+"\n"
+msgstr[1] ""
+"Om du vill behålla dem genom att skapa en ny gren är nu en bra tidpunkt\n"
+"att göra så, med:\n"
+"\n"
+" git branch <nytt_grennamn> %s\n"
+"\n"
 
-#: builtin/commit.c:1137
-msgid "Using both --reset-author and --author does not make sense"
-msgstr "Kan inte använda både --reset-author och --author"
+#: builtin/checkout.c:794
+msgid "internal error in revision walk"
+msgstr "internt fel vid genomgång av revisioner (revision walk)"
 
-#: builtin/commit.c:1146
-msgid "You have nothing to amend."
-msgstr "Du har inget att utöka."
+#: builtin/checkout.c:798
+msgid "Previous HEAD position was"
+msgstr "Tidigare position för HEAD var"
 
-#: builtin/commit.c:1149
-msgid "You are in the middle of a merge -- cannot amend."
-msgstr "Du är i mitten av en sammanslagning -- kan inte utöka."
+#: builtin/checkout.c:825 builtin/checkout.c:1064
+msgid "You are on a branch yet to be born"
+msgstr "Du är på en gren som ännu inte är född"
 
-#: builtin/commit.c:1151
-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/checkout.c:970
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr "endast en referens förväntades, %d gavs."
 
-#: builtin/commit.c:1154
-msgid "Options --squash and --fixup cannot be used together"
-msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
+#: builtin/checkout.c:1010 builtin/worktree.c:214
+#, c-format
+msgid "invalid reference: %s"
+msgstr "felaktig referens: %s"
 
-#: builtin/commit.c:1164
-msgid "Only one of -c/-C/-F/--fixup can be used."
-msgstr "Endast en av -c/-C/-F/--fixup kan användas."
+#: builtin/checkout.c:1039
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "referensen är inte ett träd: %s"
 
-#: builtin/commit.c:1166
-msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
-msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup."
+#: builtin/checkout.c:1078
+msgid "paths cannot be used with switching branches"
+msgstr "sökvägar kan inte användas vid byte av gren"
 
-#: builtin/commit.c:1174
-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/checkout.c:1081 builtin/checkout.c:1085
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "\"%s\" kan inte användas vid byte av gren"
 
-#: builtin/commit.c:1191
-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/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\" kan inte användas med \"%s\""
 
-#: builtin/commit.c:1193
-msgid "No paths with --include/--only does not make sense."
-msgstr "Du måste ange sökvägar tillsammans med --include/--only."
+#: builtin/checkout.c:1105
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/commit.c:1195
-msgid "Clever... amending the last one with dirty index."
-msgstr "Smart... utöka den senaste med smutsigt index."
+#: 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 "gren"
 
-#: builtin/commit.c:1197
-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/checkout.c:1139
+msgid "create and checkout a new branch"
+msgstr "skapa och checka ut en ny gren"
 
-#: builtin/commit.c:1209 builtin/tag.c:475
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr "Felaktigt städningsläge %s"
+#: builtin/checkout.c:1141
+msgid "create/reset and checkout a branch"
+msgstr "skapa/nollställ och checka ut en gren"
 
-#: builtin/commit.c:1214
-msgid "Paths with -a does not make sense."
-msgstr "Kan inte ange sökvägar med -a."
+#: builtin/checkout.c:1142
+msgid "create reflog for new branch"
+msgstr "skapa reflogg för ny gren"
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
-msgid "show status concisely"
-msgstr "visa koncis status"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
-msgid "show branch information"
-msgstr "visa information om gren"
+#: builtin/checkout.c:1144
+msgid "set upstream info for new branch"
+msgstr "sätt uppströmsinformation för ny gren"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
-msgid "machine-readable output"
-msgstr "maskinläsbar utdata"
+#: builtin/checkout.c:1146
+msgid "new-branch"
+msgstr "ny-gren"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
-msgid "show status in long format (default)"
-msgstr "visa status i långt format (standard)"
+#: builtin/checkout.c:1146
+msgid "new unparented branch"
+msgstr "ny gren utan förälder"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
-msgid "terminate entries with NUL"
-msgstr "terminera poster med NUL"
+#: builtin/checkout.c:1147
+msgid "checkout our version for unmerged files"
+msgstr "checka ut vår version för ej sammanslagna filer"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
-msgid "mode"
-msgstr "läge"
+#: builtin/checkout.c:1149
+msgid "checkout their version for unmerged files"
+msgstr "checka ut deras version för ej sammanslagna filer"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
-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/checkout.c:1151
+msgid "force checkout (throw away local modifications)"
+msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
 
-#: builtin/commit.c:1340
-msgid "show ignored files"
-msgstr "visa ignorerade filer"
+#: builtin/checkout.c:1152
+msgid "perform a 3-way merge with the new branch"
+msgstr "utför en 3-vägssammanslagning för den nya grenen"
 
-#: builtin/commit.c:1341 parse-options.h:155
-msgid "when"
-msgstr "när"
+#: builtin/checkout.c:1153 builtin/merge.c:231
+msgid "update ignored files (default)"
+msgstr "uppdatera ignorerade filer (standard)"
 
-#: builtin/commit.c:1342
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-"ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
-"(Default: all)"
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
+msgid "style"
+msgstr "stil"
 
-#: builtin/commit.c:1344
-msgid "list untracked files in columns"
-msgstr "visa ospårade filer i spalter"
+#: builtin/checkout.c:1155
+msgid "conflict style (merge or diff3)"
+msgstr "konfliktstil (merge eller diff3)"
 
-#: builtin/commit.c:1430
-msgid "couldn't look up newly created commit"
-msgstr "kunde inte slå upp en precis skapad incheckning"
+#: builtin/checkout.c:1158
+msgid "do not limit pathspecs to sparse entries only"
+msgstr "begränsa inte sökvägar till endast glesa poster"
 
-#: builtin/commit.c:1432
-msgid "could not parse newly created commit"
-msgstr "kunde inte tolka en precis skapad incheckning"
+#: builtin/checkout.c:1160
+msgid "second guess 'git checkout <no-such-branch>'"
+msgstr "förutspå \"git checkout <gren-saknas>\""
 
-#: builtin/commit.c:1477
-msgid "detached HEAD"
-msgstr "frånkopplad HEAD"
+#: builtin/checkout.c:1162
+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/commit.c:1480
-msgid " (root-commit)"
-msgstr " (rotincheckning)"
+#: 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 "tvinga förloppsrapportering"
 
-#: builtin/commit.c:1575
-msgid "suppress summary after successful commit"
-msgstr "undertryck sammanfattning efter framgångsrik incheckning"
+#: builtin/checkout.c:1194
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
 
-#: builtin/commit.c:1576
-msgid "show diff in commit message template"
-msgstr "visa diff i mallen för incheckningsmeddelandet"
+#: builtin/checkout.c:1211
+msgid "--track needs a branch name"
+msgstr "--track behöver ett namn på en gren"
 
-#: builtin/commit.c:1578
-msgid "Commit message options"
-msgstr "Alternativ för incheckningsmeddelande"
+#: builtin/checkout.c:1216
+msgid "Missing branch name; try -b"
+msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
-msgid "read message from file"
-msgstr "läs meddelande från fil"
+#: builtin/checkout.c:1252
+msgid "invalid path specification"
+msgstr "felaktig sökvägsangivelse"
 
-#: builtin/commit.c:1580
-msgid "author"
-msgstr "författare"
+#: 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 ""
+"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/commit.c:1580
-msgid "override author for commit"
-msgstr "överstyr författare för incheckningen"
+#: builtin/checkout.c:1264
+#, 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/commit.c:1581 builtin/gc.c:326
-msgid "date"
-msgstr "datum"
+#: builtin/checkout.c:1268
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+"git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n"
+"du checkar ut från indexet."
 
-#: builtin/commit.c:1581
-msgid "override date for commit"
-msgstr "överstyr datum för incheckningen"
+#: 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 <mönster>] [-x | -X] [--] "
+"<sökvägar>..."
 
-#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
-msgid "message"
-msgstr "meddelande"
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
+msgstr "Tar bort %s\n"
 
-#: builtin/commit.c:1582
-msgid "commit message"
-msgstr "incheckningsmeddelande"
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
+msgstr "Skulle ta bort %s\n"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
-msgid "commit"
-msgstr "incheckning"
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr "Hoppar över arkivet %s\n"
 
-#: builtin/commit.c:1583
-msgid "reuse and edit message from specified commit"
-msgstr "återanvänd och redigera meddelande från angiven incheckning"
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr "Skulle hoppa över arkivet %s\n"
 
-#: builtin/commit.c:1584
-msgid "reuse message from specified commit"
-msgstr "återanvänd meddelande från angiven incheckning"
+#: builtin/clean.c:33
+#, c-format
+msgid "failed to remove %s"
+msgstr "misslyckades ta bort %s"
 
-#: builtin/commit.c:1585
-msgid "use autosquash formatted message to fixup specified commit"
+#: 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 ""
-"använd autosquash-formaterat meddelande för att fixa angiven incheckning"
+"Kommandohjälp:\n"
+"1          - markera en numrerad post\n"
+"foo        - markera post baserad på unikt prefix\n"
+"           - (tomt) markera ingenting"
 
-#: builtin/commit.c:1586
-msgid "use autosquash formatted message to squash specified commit"
+#: 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"
 msgstr ""
-"använd autosquash-formaterat meddelande för att slå ihop med angiven "
-"incheckning"
+"Kommandohjälp:\n"
+"1          - markera en ensam post\n"
+"3-5        - markera ett intervall med poster\n"
+"2-3,6-9    - markera flera intervall\n"
+"foo        - markera post baserad på unikt prefix\n"
+"-...       - avmarkera specifika poster\n"
+"*          - välj alla poster\n"
+"           - (tomt) avsluta markering"
 
-#: builtin/commit.c:1587
-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/clean.c:511
+#, c-format
+msgid "Huh (%s)?"
+msgstr "Vadå (%s)?"
 
-#: builtin/commit.c:1588 builtin/log.c:1219 builtin/revert.c:86
-msgid "add Signed-off-by:"
-msgstr "lägg till Signed-off-by:"
+#: builtin/clean.c:653
+#, c-format
+msgid "Input ignore patterns>> "
+msgstr "Ange ignoreringsmönster>>"
 
-#: builtin/commit.c:1589
-msgid "use specified template file"
-msgstr "använd angiven mallfil"
+#: builtin/clean.c:690
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr "VARNING: Hittar inte poster som motsvarar: %s"
 
-#: builtin/commit.c:1590
-msgid "force edit of commit"
-msgstr "tvinga redigering av incheckning"
+#: builtin/clean.c:711
+msgid "Select items to delete"
+msgstr "Välj poster att ta bort"
 
-#: builtin/commit.c:1591
-msgid "default"
-msgstr "standard"
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:752
+#, c-format
+msgid "Remove %s [y/N]? "
+msgstr "Ta bort %s [Y=ja / N=nej]?"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
-msgid "how to strip spaces and #comments from message"
-msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
+#: builtin/clean.c:777
+msgid "Bye."
+msgstr "Hej då."
 
-#: builtin/commit.c:1592
-msgid "include status in commit message template"
-msgstr "inkludera status i mallen för incheckningsmeddelandet"
+#: 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               - börja städa\n"
+"filter by pattern   - uteslut poster från borttagning\n"
+"select by numbers   - markera poster som ska tas bort med siffror\n"
+"ask each            - bekräfta varje borttagning (som \"rm -i\")\n"
+"quit                - sluta städa\n"
+"help                - denna skärm\n"
+"?                   - hjälp för kommandoval"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
-#: builtin/revert.c:93
-msgid "GPG sign commit"
-msgstr "GPG-signera incheckning"
+#: builtin/clean.c:812
+msgid "*** Commands ***"
+msgstr "*** Kommandon ***"
 
-#: builtin/commit.c:1597
-msgid "Commit contents options"
-msgstr "Alternativ för incheckningens innehåll"
+#: builtin/clean.c:813
+msgid "What now"
+msgstr "Vad nu"
 
-#: builtin/commit.c:1598
-msgid "commit all changed files"
-msgstr "checka in alla ändrade filer"
+#: builtin/clean.c:821
+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/commit.c:1599
-msgid "add specified files to index for commit"
-msgstr "lägg till angivna filer till indexet för incheckning"
+#: builtin/clean.c:838
+msgid "No more files to clean, exiting."
+msgstr "Inga fler filer att städa, avslutar."
 
-#: builtin/commit.c:1600
-msgid "interactively add files"
-msgstr "lägg till filer interaktivt"
+#: builtin/clean.c:869
+msgid "do not print names of files removed"
+msgstr "skriv inte ut namn på borttagna filer"
 
-#: builtin/commit.c:1601
-msgid "interactively add changes"
-msgstr "lägg till ändringar interaktivt"
+#: builtin/clean.c:871
+msgid "force"
+msgstr "tvinga"
 
-#: builtin/commit.c:1602
-msgid "commit only specified files"
-msgstr "checka endast in angivna filer"
+#: builtin/clean.c:872
+msgid "interactive cleaning"
+msgstr "städa interaktivt"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "förbigå pre-commit-krok"
+#: builtin/clean.c:874
+msgid "remove whole directories"
+msgstr "ta bort hela kataloger"
 
-#: builtin/commit.c:1604
-msgid "show what would be committed"
-msgstr "visa vad som skulle checkas in"
+#: 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 "mönster"
 
-#: builtin/commit.c:1615
-msgid "amend previous commit"
-msgstr "lägg till föregående incheckning"
+#: builtin/clean.c:876
+msgid "add <pattern> to ignore rules"
+msgstr "lägg till <mönster> till ignoreringsregler"
 
-#: builtin/commit.c:1616
-msgid "bypass post-rewrite hook"
-msgstr "förbigå post-rewrite-krok"
+#: builtin/clean.c:877
+msgid "remove ignored files, too"
+msgstr "ta även bort ignorerade filer"
 
-#: builtin/commit.c:1621
-msgid "ok to record an empty change"
-msgstr "ok att registrera en tom ändring"
+#: builtin/clean.c:879
+msgid "remove only ignored files"
+msgstr "ta endast bort ignorerade filer"
 
-#: builtin/commit.c:1623
-msgid "ok to record a change with an empty message"
-msgstr "ok att registrera en ändring med tomt meddelande"
+#: builtin/clean.c:897
+msgid "-x and -X cannot be used together"
+msgstr "-x och -X kan inte användas samtidigt"
 
-#: builtin/commit.c:1652
-msgid "could not parse HEAD commit"
-msgstr "kunde inte tolka HEAD:s incheckning"
+#: builtin/clean.c:901
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+msgstr ""
+"clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
+"städa"
 
-#: builtin/commit.c:1698
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr "Trasig MERGE_HEAD-fil (%s)"
-
-#: builtin/commit.c:1705
-msgid "could not read MERGE_MODE"
-msgstr "kunde inte läsa MERGE_MODE"
-
-#: builtin/commit.c:1724
-#, c-format
-msgid "could not read commit message: %s"
-msgstr "kunde inte läsa incheckningsmeddelande: %s"
-
-#: builtin/commit.c:1735
-#, c-format
-msgid "Aborting commit; you did not edit the message.\n"
-msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
-
-#: builtin/commit.c:1740
-#, c-format
-msgid "Aborting commit due to empty commit message.\n"
-msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
-
-#: builtin/commit.c:1788
+#: builtin/clean.c:904
 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."
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
 msgstr ""
-"Arkivet har uppdaterats, men kunde inte skriva filen\n"
-"new_index. Kontrollera att disken inte är full och\n"
-"att kvoten inte har överskridits, och kör sedan\n"
-"\"git reset HEAD\" för att återställa."
-
-#: builtin/config.c:9
-msgid "git config [<options>]"
-msgstr "git config [<flaggor>]"
-
-#: builtin/config.c:56
-msgid "Config file location"
-msgstr "Konfigurationsfilens plats"
-
-#: builtin/config.c:57
-msgid "use global config file"
-msgstr "använd global konfigurationsfil"
+"clean.requireForce har standardvärdet true och varken -i, -n eller -f "
+"angavs; vägrar städa"
 
-#: builtin/config.c:58
-msgid "use system config file"
-msgstr "använd systemets konfigurationsfil"
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
+msgstr "git clone [<flaggor>] [--] <arkiv> [<kat>]"
 
-#: builtin/config.c:59
-msgid "use repository config file"
-msgstr "använd arkivets konfigurationsfil"
+#: builtin/clone.c:65
+msgid "don't create a checkout"
+msgstr "skapa inte någon utcheckning"
 
-#: builtin/config.c:60
-msgid "use given config file"
-msgstr "använd angiven konfigurationsfil"
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
+msgid "create a bare repository"
+msgstr "skapa ett naket (\"bare\") arkiv"
 
-#: builtin/config.c:61
-msgid "blob-id"
-msgstr "blob-id"
+#: builtin/clone.c:70
+msgid "create a mirror repository (implies bare)"
+msgstr "skapa ett spegelarkiv (implicerar \"bare\")"
 
-#: builtin/config.c:61
-msgid "read config from given blob object"
-msgstr "läs konfiguration från givet blob-objekt"
+#: builtin/clone.c:72
+msgid "to clone from a local repository"
+msgstr "för att klona från ett lokalt arkiv"
 
-#: builtin/config.c:62
-msgid "Action"
-msgstr "Åtgärd"
+#: builtin/clone.c:74
+msgid "don't use local hardlinks, always copy"
+msgstr "skapa inte lokala hårda länkar, kopiera alltid"
 
-#: builtin/config.c:63
-msgid "get value: name [value-regex]"
-msgstr "hämta värde: namn [värde-reguttr]"
+#: builtin/clone.c:76
+msgid "setup as shared repository"
+msgstr "skapa som ett delat arkiv"
 
-#: builtin/config.c:64
-msgid "get all values: key [value-regex]"
-msgstr "hämta alla värden: nyckel [värde-reguttr]"
+#: builtin/clone.c:78 builtin/clone.c:80
+msgid "initialize submodules in the clone"
+msgstr "initiera undermoduler i klonen"
 
-#: 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/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "antal undermoduler som klonas parallellt"
 
-#: 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/clone.c:83 builtin/init-db.c:475
+msgid "template-directory"
+msgstr "mallkatalog"
 
-#: 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/clone.c:84 builtin/init-db.c:476
+msgid "directory from which templates will be used"
+msgstr "katalog att använda mallar från"
 
-#: builtin/config.c:68
-msgid "add a new variable: name value"
-msgstr "lägg till en ny variabel: namn värde"
+#: builtin/clone.c:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
+msgid "reference repository"
+msgstr "referensarkiv"
 
-#: builtin/config.c:69
-msgid "remove a variable: name [value-regex]"
-msgstr "ta bort en variabel: namn [värde-reguttr]"
+#: builtin/clone.c:90
+msgid "use --reference only while cloning"
+msgstr "använd --reference endast under kloningen"
 
-#: builtin/config.c:70
-msgid "remove all matches: name [value-regex]"
-msgstr "ta bort alla träffar: namn [värde-reguttr]"
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "namn"
 
-#: builtin/config.c:71
-msgid "rename section: old-name new-name"
-msgstr "byt namn på sektion: gammalt-namn nytt-namn"
+#: builtin/clone.c:92
+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/config.c:72
-msgid "remove a section: name"
-msgstr "ta bort en sektion: namn"
+#: builtin/clone.c:94
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "checka ut <gren> istället för fjärrens HEAD"
 
-#: builtin/config.c:73
-msgid "list all"
-msgstr "visa alla"
+#: builtin/clone.c:96
+msgid "path to git-upload-pack on the remote"
+msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/config.c:74
-msgid "open an editor"
-msgstr "öppna textredigeringsprogram"
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
+msgid "depth"
+msgstr "djup"
 
-#: builtin/config.c:75
-msgid "find the color configured: slot [default]"
-msgstr "hitta den inställda färgen: slot [default]"
+#: builtin/clone.c:98
+msgid "create a shallow clone of that depth"
+msgstr "skapa en grund klon på detta djup"
 
-#: builtin/config.c:76
-msgid "find the color setting: slot [stdout-is-tty]"
-msgstr "hitta färginställningen: slot [stdout-is-tty]"
+#: builtin/clone.c:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "tid"
 
-#: builtin/config.c:77
-msgid "Type"
-msgstr "Typ"
+#: builtin/clone.c:100
+msgid "create a shallow clone since a specific time"
+msgstr "skapa en grund klon från en angiven tidpunkt"
 
-#: builtin/config.c:78
-msgid "value is \"true\" or \"false\""
-msgstr "värdet är \"true\" eller \"false\""
+#: builtin/clone.c:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "revision"
 
-#: builtin/config.c:79
-msgid "value is decimal number"
-msgstr "värdet är ett decimalt tal"
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by excluding rev"
+msgstr "fördjupa historik för grund klon genom att exkludera revision"
 
-#: builtin/config.c:80
-msgid "value is --bool or --int"
-msgstr "värdet är --bool eller --int"
+#: builtin/clone.c:104
+msgid "clone only one branch, HEAD or --branch"
+msgstr "klona endast en gren, HEAD eller --branch"
 
-#: 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/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "klonade undermoduler kommer vara grunda"
 
-#: builtin/config.c:82
-msgid "Other"
-msgstr "Andra"
+#: builtin/clone.c:107 builtin/init-db.c:484
+msgid "gitdir"
+msgstr "gitkat"
 
-#: builtin/config.c:83
-msgid "terminate values with NUL byte"
-msgstr "terminera värden med NUL-byte"
+#: builtin/clone.c:108 builtin/init-db.c:485
+msgid "separate git dir from working tree"
+msgstr "separera gitkatalogen från arbetskatalogen"
 
-#: builtin/config.c:84
-msgid "show variable names only"
-msgstr "visa endast variabelnamn"
+#: builtin/clone.c:109
+msgid "key=value"
+msgstr "nyckel=värde"
 
-#: builtin/config.c:85
-msgid "respect include directives on lookup"
-msgstr "respektera inkluderingsdirektiv vid uppslag"
+#: builtin/clone.c:110
+msgid "set config inside the new repository"
+msgstr "ställ in konfiguration i det nya arkivet"
 
-#: 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/clone.c:111 builtin/fetch.c:140 builtin/push.c:547
+msgid "use IPv4 addresses only"
+msgstr "använd endast IPv4-adresser"
 
-#: builtin/config.c:328
-msgid "unable to parse default color value"
-msgstr "kan inte tolka standardfärgvärde"
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
+msgid "use IPv6 addresses only"
+msgstr "använd endast IPv6-adresser"
 
-#: builtin/config.c:469
-#, c-format
+#: builtin/clone.c:250
 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"
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
 msgstr ""
-"# Detta är Gits användarspecifika konfigurationsfil\n"
-"[user]\n"
-"# Justera och ta bort kommenteringsmärket från följande rader:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
+"Kunde inte gissa katalognamn.\n"
+"Ange en katalog på kommandoraden"
 
-#: builtin/config.c:611
+#: builtin/clone.c:303
 #, c-format
-msgid "cannot create configuration file %s"
-msgstr "kan inte skapa konfigurationsfilen \"%s\""
-
-#: builtin/count-objects.c:77
-msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr "git count-objects [-v] [-H | --human-readable]"
-
-#: builtin/count-objects.c:87
-msgid "print sizes in human readable format"
-msgstr "skriv storlekar i människoläsbart format"
-
-#: builtin/describe.c:17
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [<flaggor>] [<incheckning-igt>...]"
-
-#: builtin/describe.c:18
-msgid "git describe [<options>] --dirty"
-msgstr "git describe [<flaggor>] --dirty"
+msgid "info: Could not add alternate for '%s': %s\n"
+msgstr "info: Kan inte skapa alternativ för \"%s\": %s\n"
 
-#: builtin/describe.c:217
+#: builtin/clone.c:375
 #, c-format
-msgid "annotated tag %s not available"
-msgstr "den annoterade taggen %s inte tillgänglig"
+msgid "failed to open '%s'"
+msgstr "misslyckades öppna \"%s\""
 
-#: builtin/describe.c:221
+#: builtin/clone.c:383
 #, c-format
-msgid "annotated tag %s has no embedded name"
-msgstr "den annoterade taggen %s har inget inbäddat namn"
+msgid "%s exists and is not a directory"
+msgstr "%s finns och är ingen katalog"
 
-#: builtin/describe.c:223
+#: builtin/clone.c:397
 #, c-format
-msgid "tag '%s' is really '%s' here"
-msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
+msgid "failed to stat %s\n"
+msgstr "misslyckades ta status på %s\n"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/clone.c:419
 #, c-format
-msgid "Not a valid object name %s"
-msgstr "Objektnamnet är inte giltigt: %s"
+msgid "failed to create link '%s'"
+msgstr "misslyckades skapa länken \"%s\""
 
-#: builtin/describe.c:253
+#: builtin/clone.c:423
 #, c-format
-msgid "%s is not a valid '%s' object"
-msgstr "%s är inte ett giltigt \"%s\"-objekt"
+msgid "failed to copy file to '%s'"
+msgstr "misslyckades kopiera filen till \"%s\""
 
-#: builtin/describe.c:270
+#: builtin/clone.c:448
 #, c-format
-msgid "no tag exactly matches '%s'"
-msgstr "ingen tagg motsvarar \"%s\" exakt"
+msgid "done.\n"
+msgstr "klart.\n"
 
-#: builtin/describe.c:272
+#: 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 ""
+"Klonen lyckades, men utcheckningen misslyckades.\n"
+"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:537
 #, c-format
-msgid "searching to describe %s\n"
-msgstr "söker för att beskriva %s\n"
-
-#: builtin/describe.c:319
-#, c-format
-msgid "finished search at %s\n"
-msgstr "avslutade sökning på %s\n"
-
-#: builtin/describe.c:346
-#, c-format
-msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
-msgstr ""
-"Inga annoterade taggar kan beskriva \"%s\".\n"
-"Det finns dock oannoterade taggar: testa --tags."
+msgid "Could not find remote branch %s to clone."
+msgstr "Kunde inte hitta fjärrgrenen %s för att klona."
 
-#: builtin/describe.c:350
-#, c-format
-msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
-msgstr ""
-"Inga taggar kan beskriva \"%s\".\n"
-"Testa --always, eller skapa några taggar."
+#: builtin/clone.c:632
+msgid "remote did not send all necessary objects"
+msgstr "fjärren sände inte alla nödvändiga objekt"
 
-#: builtin/describe.c:371
+#: builtin/clone.c:648
 #, c-format
-msgid "traversed %lu commits\n"
-msgstr "traverserade %lu incheckningar\n"
+msgid "unable to update %s"
+msgstr "kan inte uppdatera %s"
 
-#: builtin/describe.c:374
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
+#: builtin/clone.c:697
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr ""
-"mer än %i taggar hittades; listar de %i senaste\n"
-"gav upp sökningen vid %s\n"
-
-#: builtin/describe.c:396
-msgid "find the tag that comes after the commit"
-msgstr "hitta taggen som kommer efter incheckningen"
-
-#: builtin/describe.c:397
-msgid "debug search strategy on stderr"
-msgstr "felsök sökstrategin på standard fel"
-
-#: builtin/describe.c:398
-msgid "use any ref"
-msgstr "använd alla referenser"
-
-#: builtin/describe.c:399
-msgid "use any tag, even unannotated"
-msgstr "använd alla taggar, även oannoterade"
-
-#: builtin/describe.c:400
-msgid "always use long format"
-msgstr "använd alltid långt format"
-
-#: builtin/describe.c:401
-msgid "only follow first parent"
-msgstr "följ endast första föräldern"
-
-#: builtin/describe.c:404
-msgid "only output exact matches"
-msgstr "skriv endast ut exakta träffar"
+"HEAD hos fjärren pekar på en obefintlig referens, kan inte checka ut.\n"
 
-#: builtin/describe.c:406
-msgid "consider <n> most recent tags (default: 10)"
-msgstr "överväg de <n> nyaste taggarna (standard: 10)"
+#: builtin/clone.c:728
+msgid "unable to checkout working tree"
+msgstr "kunde inte checka ut arbetskatalogen"
 
-#: builtin/describe.c:408
-msgid "only consider tags matching <pattern>"
-msgstr "överväg endast taggar som motsvarar <mönster>"
+#: builtin/clone.c:768
+msgid "unable to write parameters to config file"
+msgstr "kunde inte skriva parametrar till konfigurationsfilen"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
-msgid "show abbreviated commit object as fallback"
-msgstr "visa förkortade incheckningsobjekt som standard"
+#: builtin/clone.c:831
+msgid "cannot repack to clean up"
+msgstr "kan inte packa om för att städa upp"
 
-#: builtin/describe.c:411
-msgid "mark"
-msgstr "märke"
+#: builtin/clone.c:833
+msgid "cannot unlink temporary alternates file"
+msgstr "kunde inte ta bort temporär \"alternates\"-fil"
 
-#: builtin/describe.c:412
-msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
+msgid "Too many arguments."
+msgstr "För många argument."
 
-#: builtin/describe.c:430
-msgid "--long is incompatible with --abbrev=0"
-msgstr "--long är inkompatibel med --abbrev=0"
+#: builtin/clone.c:870
+msgid "You must specify a repository to clone."
+msgstr "Du måste ange ett arkiv att klona."
 
-#: builtin/describe.c:456
-msgid "No names found, cannot describe anything."
-msgstr "Inga namn hittades, kan inte beskriva något."
+#: builtin/clone.c:883
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
+msgstr "flaggorna --bare och --origin %s är inkompatibla."
 
-#: builtin/describe.c:476
-msgid "--dirty is incompatible with commit-ishes"
-msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
+#: builtin/clone.c:886
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr "flaggorna --bare och --separate-git-dir är inkompatibla."
 
-#: builtin/diff.c:86
+#: builtin/clone.c:899
 #, c-format
-msgid "'%s': not a regular file or symlink"
-msgstr "\"%s\": inte en normal fil eller symbolisk länk"
+msgid "repository '%s' does not exist"
+msgstr "arkivet \"%s\" finns inte"
 
-#: builtin/diff.c:237
+#: builtin/clone.c:905 builtin/fetch.c:1338
 #, c-format
-msgid "invalid option: %s"
-msgstr "ogiltig flagga: %s"
-
-#: builtin/diff.c:358
-msgid "Not a git repository"
-msgstr "Inte ett git-arkiv"
+msgid "depth %s is not a positive number"
+msgstr "djupet %s är inte ett positivt tal"
 
-#: builtin/diff.c:401
+#: builtin/clone.c:915
 #, c-format
-msgid "invalid object '%s' given."
-msgstr "objektet \"%s\" som angavs är felaktigt."
+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/diff.c:410
+#: builtin/clone.c:925
 #, c-format
-msgid "more than two blobs given: '%s'"
-msgstr "mer än två blobbar angavs: \"%s\""
+msgid "working tree '%s' already exists."
+msgstr "arbetsträdet \"%s\" finns redan."
 
-#: builtin/diff.c:417
+#: builtin/clone.c:940 builtin/clone.c:951 builtin/submodule--helper.c:657
+#: builtin/worktree.c:222 builtin/worktree.c:249
 #, c-format
-msgid "unhandled object '%s' given."
-msgstr "ej hanterat objekt \"%s\" angavs."
-
-#: builtin/fast-export.c:25
-msgid "git fast-export [rev-list-opts]"
-msgstr "git fast-export [rev-list-flaggor]"
+msgid "could not create leading directories of '%s'"
+msgstr "kunde inte skapa inledande kataloger för \"%s\""
 
-#: builtin/fast-export.c:980
-msgid "show progress after <n> objects"
-msgstr "visa förlopp efter <n> objekt"
+#: builtin/clone.c:943
+#, c-format
+msgid "could not create work tree dir '%s'"
+msgstr "kunde inte skapa arbetskatalogen \"%s\""
 
-#: builtin/fast-export.c:982
-msgid "select handling of signed tags"
-msgstr "välj hantering av signerade taggar"
+#: builtin/clone.c:955
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "Klonar till ett naket arkiv \"%s\"...\n"
 
-#: builtin/fast-export.c:985
-msgid "select handling of tags that tag filtered objects"
-msgstr "välj hantering av taggar som har taggfiltrerade objekt"
+#: builtin/clone.c:957
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "Klonar till \"%s\"...\n"
 
-#: builtin/fast-export.c:988
-msgid "Dump marks to this file"
-msgstr "Dump märken till filen"
+#: builtin/clone.c:963
+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/fast-export.c:990
-msgid "Import marks from this file"
-msgstr "Importera märken från filen"
+#: builtin/clone.c:1019
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth ignoreras i lokala kloningar; använd file:// istället"
 
-#: builtin/fast-export.c:992
-msgid "Fake a tagger when tags lack one"
-msgstr "Fejka taggare när taggen saknar en"
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since ignoreras i lokala kloningar; använd file:// istället"
 
-#: builtin/fast-export.c:994
-msgid "Output full tree for each commit"
-msgstr "Skriv ut hela trädet för varje incheckning"
+#: builtin/clone.c:1023
+msgid "--shallow-exclude is ignored in local clones; use file:// instead."
+msgstr ""
+"--shallow-exclude ignoreras i lokala kloningar; använd file:// istället"
 
-#: builtin/fast-export.c:996
-msgid "Use the done feature to terminate the stream"
-msgstr "Använd done-funktionen för att avsluta strömmen"
+#: builtin/clone.c:1026
+msgid "source repository is shallow, ignoring --local"
+msgstr "källarkivet är grunt, ignorerar --local"
 
-#: builtin/fast-export.c:997
-msgid "Skip output of blob data"
-msgstr "Hoppa över skrivning av blob-data"
+#: builtin/clone.c:1031
+msgid "--local is ignored"
+msgstr "--local ignoreras"
 
-#: builtin/fast-export.c:998
-msgid "refspec"
-msgstr "referensspecifikation"
+#: builtin/clone.c:1035
+#, c-format
+msgid "Don't know how to clone %s"
+msgstr "Vet inte hur man klonar %s"
 
-#: builtin/fast-export.c:999
-msgid "Apply refspec to exported refs"
-msgstr "Applicera referensspecifikation på exporterade referenser"
+#: builtin/clone.c:1090 builtin/clone.c:1098
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s"
 
-#: builtin/fast-export.c:1000
-msgid "anonymize output"
-msgstr "anonymisera utdata"
+#: builtin/clone.c:1101
+msgid "You appear to have cloned an empty repository."
+msgstr "Du verkar ha klonat ett tomt arkiv."
 
-#: builtin/fetch.c:20
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr "git fetch [<flaggor>] [<arkiv> [<refspec>...]]"
+#: builtin/column.c:9
+msgid "git column [<options>]"
+msgstr "git column [<flaggor>]"
 
-#: builtin/fetch.c:21
-msgid "git fetch [<options>] <group>"
-msgstr "git fetch [<flaggor>] <grupp>"
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "slå upp konfigurationsvariabler"
 
-#: builtin/fetch.c:22
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]"
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "utseende att använda"
 
-#: builtin/fetch.c:23
-msgid "git fetch --all [<options>]"
-msgstr "git fetch --all [<flaggor>]"
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "Maximal bredd"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
-msgid "fetch from all remotes"
-msgstr "hämta från alla fjärrar"
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "Spaltfyllnad i vänsterkanten"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
-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/column.c:31
+msgid "Padding space on right border"
+msgstr "Spaltfyllnad i högerkanten"
 
-#: builtin/fetch.c:96 builtin/pull.c:172
-msgid "path to upload pack on remote end"
-msgstr "sökväg till upload pack på fjärren"
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "Spaltfyllnad mellan spalter"
 
-#: builtin/fetch.c:97 builtin/pull.c:174
-msgid "force overwrite of local branch"
-msgstr "tvinga överskrivning av lokal gren"
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "--command måste vara första argument"
 
-#: builtin/fetch.c:99
-msgid "fetch from multiple remotes"
-msgstr "hämta från flera fjärrar"
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
+msgstr "git commit [<flaggor>] [--] <sökväg>..."
 
-#: builtin/fetch.c:101 builtin/pull.c:176
-msgid "fetch all tags and associated objects"
-msgstr "hämta alla taggar och associerade objekt"
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
+msgstr "git status [<flaggor>] [--] <sökväg>..."
 
-#: builtin/fetch.c:103
-msgid "do not fetch all tags (--no-tags)"
-msgstr "hämta inte alla taggar (--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 ""
+"Ditt namn och e-postadress konfigurerades automatiskt baserat på\n"
+"ditt användar-id och värdnamn. Kontrollera att de är riktiga. Du\n"
+"kan förhindra det här meddelandet genom att ställa dem explicit.\n"
+"Kör följande kommandon och följ instruktionerna i textredigeraren\n"
+"för att redigera din konfigurationsfil:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"När du gjort det kan du rätta identiteten som användes för den här\n"
+"incheckningen med:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 
-#: builtin/fetch.c:105
-msgid "number of submodules fetched in parallel"
-msgstr "antal undermoduler som hämtas parallellt"
+#: 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 ""
+"Ditt namn och e-postadress konfigurerades automatiskt baserat på\n"
+"ditt användar-id och värdnamn. Kontrollera att de är riktiga. Du\n"
+"kan förhindra det här meddelandet genom att ställa dem explicit:\n"
+"\n"
+"    git config --global user.name \"Ditt namn\"\n"
+"    git config --global user.email du@example.com\n"
+"\n"
+"När du gjort det kan du rätta identiteten som användes för den här\n"
+"incheckningen med:\n"
+"\n"
+"    git commit --amend --reset-author\n"
 
-#: builtin/fetch.c:107 builtin/pull.c:179
-msgid "prune remote-tracking branches no longer on remote"
-msgstr "rensa fjärrspårande grenar ej längre på fjärren"
+#: 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 ""
+"Du bad om att utöka den senaste incheckningen, men om du gör det\n"
+"blir den tom. Du kan köra kommandot på nytt med --allow-empty, eller\n"
+"så kan du ta bort incheckningen helt med \"git reset HEAD^\".\n"
 
-#: builtin/fetch.c:108 builtin/pull.c:182
-msgid "on-demand"
-msgstr "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 ""
+"Den tidigare \"cherry-pick\":en är nu tom, kanske på grund av en löst\n"
+"konflikt. Om du vill checka in den ändå använder du:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
-msgid "control recursive fetching of submodules"
-msgstr "styr rekursiv hämtning av undermoduler"
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "Använd annars \"git reset\"\n"
 
-#: builtin/fetch.c:113 builtin/pull.c:191
-msgid "keep downloaded pack"
-msgstr "behåll hämtade paket"
+#: 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 ""
+"Om du vill hoppa över incheckningen, använd:\n"
+"\n"
+"    git reset\n"
+"\n"
+"\"git cherry-pick --continue\" kommer därefter att återuppta\n"
+"cherry-pick för återstående incheckningar.\n"
 
-#: builtin/fetch.c:115
-msgid "allow updating of HEAD ref"
-msgstr "tillåt uppdatering av HEAD-referens"
+#: builtin/commit.c:318
+msgid "failed to unpack HEAD tree object"
+msgstr "misslyckades packa upp HEAD:s trädobjekt"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
-msgid "deepen history of shallow clone"
-msgstr "fördjupa historik för grund klon"
+#: builtin/commit.c:359
+msgid "unable to create temporary index"
+msgstr "kunde inte skapa temporär indexfil"
 
-#: builtin/fetch.c:120 builtin/pull.c:197
-msgid "convert to a complete repository"
-msgstr "konvertera till komplett arkiv"
+#: builtin/commit.c:365
+msgid "interactive add failed"
+msgstr "interaktiv tilläggning misslyckades"
 
-#: builtin/fetch.c:122 builtin/log.c:1236
-msgid "dir"
-msgstr "kat"
+#: builtin/commit.c:378
+msgid "unable to update temporary index"
+msgstr "kan inte uppdatera temporärt index"
 
-#: builtin/fetch.c:123
-msgid "prepend this to submodule path output"
-msgstr "lägg till i början av undermodulens sökvägsutdata"
+#: builtin/commit.c:380
+msgid "Failed to update main cache tree"
+msgstr "Misslyckades uppdatera huvud-cacheträdet"
 
-#: builtin/fetch.c:126
-msgid "default mode for recursion"
-msgstr "standardläge för rekursion"
+#: 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/fetch.c:128 builtin/pull.c:200
-msgid "accept refs that update .git/shallow"
-msgstr "tar emot referenser som uppdaterar .git/shallow"
+#: 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/fetch.c:129 builtin/pull.c:202
-msgid "refmap"
-msgstr "referenskarta"
+#: 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/fetch.c:130 builtin/pull.c:203
-msgid "specify fetch refmap"
-msgstr "ange referenskarta för \"fetch\""
+#: builtin/commit.c:469
+msgid "cannot read the index"
+msgstr "kan inte läsa indexet"
 
-#: builtin/fetch.c:386
-msgid "Couldn't find remote ref HEAD"
-msgstr "Kunde inte hitta fjärr-referensen HEAD"
+#: builtin/commit.c:488
+msgid "unable to write temporary index file"
+msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/fetch.c:466
+#: builtin/commit.c:582
 #, c-format
-msgid "object %s not found"
-msgstr "objektet %s hittades inte"
-
-#: builtin/fetch.c:471
-msgid "[up to date]"
-msgstr "[àjour]"
+msgid "commit '%s' lacks author header"
+msgstr "incheckningen \"%s\" saknar författarhuvud"
 
-#: builtin/fetch.c:485
+#: builtin/commit.c:584
 #, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (kan inte hämta i aktuell gren)"
+msgid "commit '%s' has malformed author line"
+msgstr "incheckningen \"%s\" har felformaterat författarhuvud"
 
-#: builtin/fetch.c:486 builtin/fetch.c:574
-msgid "[rejected]"
-msgstr "[refuserad]"
+#: builtin/commit.c:603
+msgid "malformed --author parameter"
+msgstr "felformad \"--author\"-flagga"
 
-#: builtin/fetch.c:497
-msgid "[tag update]"
-msgstr "[uppdaterad tagg]"
+#: builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "felaktigt datumformat: %s"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (kunde inte uppdatera lokal ref)"
+#: builtin/commit.c:655
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"kunde inte välja ett kommentarstecken som inte använts\n"
+"i det befintliga incheckningsmeddelandet"
 
-#: builtin/fetch.c:517
-msgid "[new tag]"
-msgstr "[ny tagg]"
+#: 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/fetch.c:520
-msgid "[new branch]"
-msgstr "[ny gren]"
+#: builtin/commit.c:704 builtin/shortlog.c:286
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr "(läser loggmeddelande från standard in)\n"
 
-#: builtin/fetch.c:523
-msgid "[new ref]"
-msgstr "[ny ref]"
+#: builtin/commit.c:706
+msgid "could not read log from standard input"
+msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "kunde inte uppdatera lokal ref"
+#: builtin/commit.c:710
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "kunde inte läsa loggfilen \"%s\""
 
-#: builtin/fetch.c:569
-msgid "forced update"
-msgstr "tvingad uppdatering"
+#: builtin/commit.c:737 builtin/commit.c:745
+msgid "could not read SQUASH_MSG"
+msgstr "kunde inte läsa SQUASH_MSG"
 
-#: builtin/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(ej snabbspolad)"
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "kunde inte läsa MERGE_MSG"
 
-#: builtin/fetch.c:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "kan inte öppna %s: %s\n"
+#: builtin/commit.c:796
+msgid "could not write commit template"
+msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/fetch.c:619
+#: builtin/commit.c:814
 #, c-format
-msgid "%s did not send all necessary objects\n"
-msgstr "%s sände inte alla nödvändiga objekt\n"
+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"
+"Det verkar som du checkar in en sammanslagning.\n"
+"Om det inte stämmer tar du bort filen\n"
+"\t%s\n"
+"och försöker igen.\n"
 
-#: builtin/fetch.c:637
+#: builtin/commit.c:819
 #, c-format
-msgid "reject %s because shallow roots are not allowed to be updated"
-msgstr "avvisa %s då grunda rötter inte kan uppdateras"
+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"
+"Det verkar som du checkar in en cherry-pick.\n"
+"Om det inte stämmer tar du bort filen\n"
+"\t%s\n"
+"och försöker igen.\n"
 
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/commit.c:832
 #, c-format
-msgid "From %.*s\n"
-msgstr "Från %.*s\n"
+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 ""
+"Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n"
+"med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
+"incheckningen.\n"
 
-#: builtin/fetch.c:735
+#: builtin/commit.c:839
 #, c-format
 msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
+"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 ""
-"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"
+"Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n"
+"med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
+"Ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/fetch.c:787
+#: builtin/commit.c:859
 #, c-format
-msgid "   (%s will become dangling)"
-msgstr "   (%s kommer bli dinglande)"
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sFörfattare: %.*s <%.*s>"
 
-#: builtin/fetch.c:788
+#: builtin/commit.c:867
 #, c-format
-msgid "   (%s has become dangling)"
-msgstr "   (%s har blivit dinglande)"
-
-#: builtin/fetch.c:820
-msgid "[deleted]"
-msgstr "[borttagen]"
+msgid "%sDate:      %s"
+msgstr "%sDatum:      %s"
 
-#: builtin/fetch.c:821 builtin/remote.c:1025
-msgid "(none)"
-msgstr "(ingen)"
-
-#: builtin/fetch.c:841
+#: builtin/commit.c:874
 #, 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"
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sIncheckare: %.*s <%.*s>"
 
-#: builtin/fetch.c:860
-#, 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/commit.c:892
+msgid "Cannot read index"
+msgstr "Kan inte läsa indexet"
 
-#: builtin/fetch.c:863
-#, c-format
-msgid "Option \"%s\" is ignored for %s\n"
-msgstr "Flaggan \"%s\" ignoreras för %s\n"
+#: builtin/commit.c:954
+msgid "Error building trees"
+msgstr "Fel vid byggande av träd"
 
-#: builtin/fetch.c:920
+#: builtin/commit.c:969 builtin/tag.c:266
 #, c-format
-msgid "Don't know how to fetch from %s"
-msgstr "Vet inte hur man hämtar från %s"
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
 
-#: builtin/fetch.c:1080
+#: builtin/commit.c:1071
 #, c-format
-msgid "Fetching %s\n"
-msgstr "Hämtar %s\n"
+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/fetch.c:1082 builtin/remote.c:96
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
-msgid "Could not fetch %s"
-msgstr "Kunde inte hämta %s"
+msgid "Invalid untracked files mode '%s'"
+msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/fetch.c:1100
-msgid ""
-"No remote repository specified.  Please, specify either a URL or a\n"
-"remote name from which new revisions should be fetched."
-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/commit.c:1124
+msgid "--long and -z are incompatible"
+msgstr "--long och -z är inkompatibla"
 
-#: builtin/fetch.c:1123
-msgid "You need to specify a tag name."
-msgstr "Du måste ange namnet på en tagg."
+#: 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/fetch.c:1165
-msgid "--depth and --unshallow cannot be used together"
-msgstr "--depth och --unshallow kan inte användas samtidigt"
+#: builtin/commit.c:1163
+msgid "You have nothing to amend."
+msgstr "Du har inget att utöka."
 
-#: builtin/fetch.c:1167
-msgid "--unshallow on a complete repository does not make sense"
-msgstr "--unshallow kan inte användas på ett komplett arkiv"
+#: 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/fetch.c:1187
-msgid "fetch --all does not take a repository argument"
-msgstr "fetch --all tar inte namnet på ett arkiv som argument"
+#: 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/fetch.c:1189
-msgid "fetch --all does not make sense with refspecs"
-msgstr "fetch --all kan inte anges med referensspecifikationer"
+#: builtin/commit.c:1171
+msgid "Options --squash and --fixup cannot be used together"
+msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/fetch.c:1200
-#, c-format
-msgid "No such remote or remote group: %s"
-msgstr "Fjärren eller fjärrgruppen finns inte: %s"
+#: 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/fetch.c:1208
-msgid "Fetching a group and specifying refspecs does not make sense"
-msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
+#: 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/fmt-merge-msg.c:14
-msgid ""
-"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
-msgstr ""
-"git fmt-merge-msg [-m <meddelande>] [--log[=<n>] | --no-log] [--file <fil>]"
+#: 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/fmt-merge-msg.c:667
-msgid "populate log with at most <n> entries from shortlog"
-msgstr "fyll i loggen med som mest <n> poster från shortlog"
+#: 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/fmt-merge-msg.c:670
-msgid "alias for --log (deprecated)"
-msgstr "alias för --log (avråds)"
+#: 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/fmt-merge-msg.c:673
-msgid "text"
-msgstr "text"
+#: builtin/commit.c:1212
+msgid "Clever... amending the last one with dirty index."
+msgstr "Smart... utöka den senaste med smutsigt index."
 
-#: builtin/fmt-merge-msg.c:674
-msgid "use <text> as start of message"
-msgstr "inled meddelande med <text>"
+#: builtin/commit.c:1214
+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/fmt-merge-msg.c:675
-msgid "file to read from"
-msgstr "fil att läsa från"
+#: builtin/commit.c:1226 builtin/tag.c:474
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "Felaktigt städningsläge %s"
 
-#: builtin/for-each-ref.c:9
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr "git for-each-ref [<flaggor>] [<mönster>]"
+#: builtin/commit.c:1231
+msgid "Paths with -a does not make sense."
+msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [--points-at <object>]"
-msgstr "git for-each-ref [--points-at <objekt>]"
+#: builtin/commit.c:1341 builtin/commit.c:1617
+msgid "show status concisely"
+msgstr "visa koncis status"
 
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git for-each-ref [(--merged | --no-merged) [<objekt>]]"
+#: builtin/commit.c:1343 builtin/commit.c:1619
+msgid "show branch information"
+msgstr "visa information om gren"
 
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<objekt>]]"
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "version"
 
-#: builtin/for-each-ref.c:27
-msgid "quote placeholders suitably for shells"
-msgstr "citera platshållare passande för skal"
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
+msgid "machine-readable output"
+msgstr "maskinläsbar utdata"
 
-#: builtin/for-each-ref.c:29
-msgid "quote placeholders suitably for perl"
-msgstr "citera platshållare passande för perl"
+#: builtin/commit.c:1348 builtin/commit.c:1623
+msgid "show status in long format (default)"
+msgstr "visa status i långt format (standard)"
 
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for python"
-msgstr "citera platshållare passande för python"
+#: builtin/commit.c:1351 builtin/commit.c:1626
+msgid "terminate entries with NUL"
+msgstr "terminera poster med NUL"
 
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for Tcl"
-msgstr "citera platshållare passande för Tcl"
+#: 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 "läge"
 
-#: builtin/for-each-ref.c:36
-msgid "show only <n> matched refs"
-msgstr "visa endast <n> träffade refs"
+#: builtin/commit.c:1354 builtin/commit.c:1629
+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/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/commit.c:1357
+msgid "show ignored files"
+msgstr "visa ignorerade filer"
 
-#: builtin/for-each-ref.c:41
-msgid "print only refs which points at the given object"
-msgstr "visa endast referenser som pekar på objektet"
+#: builtin/commit.c:1358 parse-options.h:155
+msgid "when"
+msgstr "när"
 
-#: builtin/for-each-ref.c:43
-msgid "print only refs that are merged"
-msgstr "visa endast referenser som slagits samman"
+#: builtin/commit.c:1359
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+"ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
+"(Default: all)"
 
-#: builtin/for-each-ref.c:44
-msgid "print only refs that are not merged"
-msgstr "visa endast referenser som ej slagits samman"
+#: builtin/commit.c:1361
+msgid "list untracked files in columns"
+msgstr "visa ospårade filer i spalter"
 
-#: builtin/for-each-ref.c:45
-msgid "print only refs which contain the commit"
-msgstr "visa endast referenser som innehåller incheckningen"
+#: builtin/commit.c:1437
+msgid "couldn't look up newly created commit"
+msgstr "kunde inte slå upp en precis skapad incheckning"
 
-# Vague original, not networking-related, but rather related to the actual
-# objects in the database.
-#: builtin/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Kontrollerar konnektivitet"
+#: builtin/commit.c:1439
+msgid "could not parse newly created commit"
+msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/fsck.c:486
-msgid "Checking object directories"
-msgstr "Kontrollerar objektkataloger"
+#: builtin/commit.c:1484
+msgid "detached HEAD"
+msgstr "frånkopplad HEAD"
 
-#: builtin/fsck.c:553
-msgid "git fsck [<options>] [<object>...]"
-msgstr "git fsck [<flaggor>] [<objekt>...]"
+#: builtin/commit.c:1487
+msgid " (root-commit)"
+msgstr " (rotincheckning)"
 
-#: builtin/fsck.c:559
-msgid "show unreachable objects"
-msgstr "visa onåbara objekt"
+#: builtin/commit.c:1587
+msgid "suppress summary after successful commit"
+msgstr "undertryck sammanfattning efter framgångsrik incheckning"
 
-#: builtin/fsck.c:560
-msgid "show dangling objects"
-msgstr "visa dinglande objekt"
+#: builtin/commit.c:1588
+msgid "show diff in commit message template"
+msgstr "visa diff i mallen för incheckningsmeddelandet"
 
-#: builtin/fsck.c:561
-msgid "report tags"
-msgstr "rapportera taggar"
+#: builtin/commit.c:1590
+msgid "Commit message options"
+msgstr "Alternativ för incheckningsmeddelande"
 
-#: builtin/fsck.c:562
-msgid "report root nodes"
-msgstr "rapportera rotnoder"
+#: builtin/commit.c:1591 builtin/tag.c:351
+msgid "read message from file"
+msgstr "läs meddelande från fil"
 
-#: builtin/fsck.c:563
-msgid "make index objects head nodes"
-msgstr "gör indexojekt till huvudnoder"
+#: builtin/commit.c:1592
+msgid "author"
+msgstr "författare"
 
-#: builtin/fsck.c:564
-msgid "make reflogs head nodes (default)"
-msgstr "gör refloggar till huvudnoder (standard)"
+#: builtin/commit.c:1592
+msgid "override author for commit"
+msgstr "överstyr författare för incheckningen"
 
-#: builtin/fsck.c:565
-msgid "also consider packs and alternate objects"
-msgstr "ta även hänsyn till paket och alternativa objekt"
+#: builtin/commit.c:1593 builtin/gc.c:326
+msgid "date"
+msgstr "datum"
 
-# Vague original, not networking-related, but rather related to the actual
-# objects in the database.
-#: builtin/fsck.c:566
-msgid "check only connectivity"
-msgstr "kontrollera endast konnektivitet"
+#: builtin/commit.c:1593
+msgid "override date for commit"
+msgstr "överstyr datum för incheckningen"
 
-#: builtin/fsck.c:567
-msgid "enable more strict checking"
-msgstr "aktivera striktare kontroll"
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
+msgid "message"
+msgstr "meddelande"
 
-#: builtin/fsck.c:569
-msgid "write dangling objects in .git/lost-found"
-msgstr "skriv dinglande objekt i .git/lost-found"
+#: builtin/commit.c:1594
+msgid "commit message"
+msgstr "incheckningsmeddelande"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
-msgid "show progress"
-msgstr "visa förlopp"
+#: 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 "incheckning"
 
-#: builtin/fsck.c:631
-msgid "Checking objects"
-msgstr "Kontrollerar objekt"
+#: builtin/commit.c:1595
+msgid "reuse and edit message from specified commit"
+msgstr "återanvänd och redigera meddelande från angiven incheckning"
 
-#: builtin/gc.c:25
-msgid "git gc [<options>]"
-msgstr "git gc [<flaggor>]"
+#: builtin/commit.c:1596
+msgid "reuse message from specified commit"
+msgstr "återanvänd meddelande från angiven incheckning"
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr "Felaktigt %s: \"%s\""
+#: builtin/commit.c:1597
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+"använd autosquash-formaterat meddelande för att fixa angiven incheckning"
 
-#: builtin/gc.c:139
-#, c-format
-msgid "insanely long object directory %.*s"
-msgstr "tokigt lång objektkatalog %.*s"
-
-#: 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 "use autosquash formatted message to squash specified commit"
 msgstr ""
-"Senaste körningen av git gc rapporterade följande. Fixa grundproblemet\n"
-"och ta bort %s.\n"
-"Automatisk städning kommer inte utföras förrän filen tas bort.\n"
-"\n"
-"%s"
-
-#: builtin/gc.c:327
-msgid "prune unreferenced objects"
-msgstr "rensa ej refererade objekt"
+"använd autosquash-formaterat meddelande för att slå ihop med angiven "
+"incheckning"
 
-#: builtin/gc.c:329
-msgid "be more thorough (increased runtime)"
-msgstr "var mer grundlig (ökar körtiden)"
+#: builtin/commit.c:1599
+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/gc.c:330
-msgid "enable auto-gc mode"
-msgstr "aktivera auto-gc-läge"
+#: builtin/commit.c:1600 builtin/log.c:1413 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr "lägg till Signed-off-by:"
 
-#: builtin/gc.c:331
-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/commit.c:1601
+msgid "use specified template file"
+msgstr "använd angiven mallfil"
 
-#: builtin/gc.c:373
-#, 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/commit.c:1602
+msgid "force edit of commit"
+msgstr "tvinga redigering av incheckning"
 
-#: builtin/gc.c:375
-#, c-format
-msgid "Auto packing the repository for optimum performance.\n"
-msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
+#: builtin/commit.c:1603
+msgid "default"
+msgstr "standard"
 
-#: builtin/gc.c:376
-#, c-format
-msgid "See \"git help gc\" for manual housekeeping.\n"
-msgstr "Se \"git help gc\" för manuell hushållning.\n"
+#: builtin/commit.c:1603 builtin/tag.c:354
+msgid "how to strip spaces and #comments from message"
+msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
 
-#: builtin/gc.c:397
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
-msgstr ""
-"gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
-"är fallet)"
+#: builtin/commit.c:1604
+msgid "include status in commit message template"
+msgstr "inkludera status i mallen för incheckningsmeddelandet"
 
-#: builtin/gc.c:441
-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/commit.c:1606 builtin/merge.c:230 builtin/pull.c:166
+#: builtin/revert.c:93
+msgid "GPG sign commit"
+msgstr "GPG-signera incheckning"
 
-#: builtin/grep.c:23
-msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr "git grep [<flaggor>] [-e] <mönster> [<rev>...] [[--] <sökväg>...]"
+#: builtin/commit.c:1609
+msgid "Commit contents options"
+msgstr "Alternativ för incheckningens innehåll"
 
-#: builtin/grep.c:219
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr "grep: misslyckades skapa tråd. %s"
+#: builtin/commit.c:1610
+msgid "commit all changed files"
+msgstr "checka in alla ändrade filer"
 
-#: builtin/grep.c:277
-#, c-format
-msgid "invalid number of threads specified (%d) for %s"
-msgstr "felaktigt antal trådar angivet (%d) för %s"
+#: builtin/commit.c:1611
+msgid "add specified files to index for commit"
+msgstr "lägg till angivna filer till indexet för incheckning"
 
-#: builtin/grep.c:452 builtin/grep.c:487
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr "kunde inte läsa träd (%s)"
+#: builtin/commit.c:1612
+msgid "interactively add files"
+msgstr "lägg till filer interaktivt"
 
-#: builtin/grep.c:502
-#, c-format
-msgid "unable to grep from object of type %s"
-msgstr "Kunde inte \"grep\" från objekt av typen %s"
+#: builtin/commit.c:1613
+msgid "interactively add changes"
+msgstr "lägg till ändringar interaktivt"
 
-#: builtin/grep.c:558
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr "flaggan \"%c\" antar ett numeriskt värde"
+#: builtin/commit.c:1614
+msgid "commit only specified files"
+msgstr "checka endast in angivna filer"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "kan inte öppna \"%s\""
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "förbigå pre-commit- och commit-msg-krokar"
 
-#: builtin/grep.c:644
-msgid "search in index instead of in the work tree"
-msgstr "sök i indexet istället för i arbetskatalogen"
+#: builtin/commit.c:1616
+msgid "show what would be committed"
+msgstr "visa vad som skulle checkas in"
 
-#: builtin/grep.c:646
-msgid "find in contents not managed by git"
-msgstr "sök i innehåll som inte hanteras av git"
+#: builtin/commit.c:1627
+msgid "amend previous commit"
+msgstr "lägg till föregående incheckning"
 
-#: builtin/grep.c:648
-msgid "search in both tracked and untracked files"
-msgstr "sök i både spårade och ospårade filer"
+#: builtin/commit.c:1628
+msgid "bypass post-rewrite hook"
+msgstr "förbigå post-rewrite-krok"
 
-#: builtin/grep.c:650
-msgid "ignore files specified via '.gitignore'"
-msgstr "ignorera filer angivna i \".gitignore\""
+#: builtin/commit.c:1633
+msgid "ok to record an empty change"
+msgstr "ok att registrera en tom ändring"
 
-#: builtin/grep.c:653
-msgid "show non-matching lines"
-msgstr "visa rader som inte träffas"
+#: builtin/commit.c:1635
+msgid "ok to record a change with an empty message"
+msgstr "ok att registrera en ändring med tomt meddelande"
 
-#: builtin/grep.c:655
-msgid "case insensitive matching"
-msgstr "skiftlägesokänslig sökning"
+#: builtin/commit.c:1664
+msgid "could not parse HEAD commit"
+msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/grep.c:657
-msgid "match patterns only at word boundaries"
-msgstr "matcha endast mönster vid ordgränser"
+#: builtin/commit.c:1712
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/grep.c:659
-msgid "process binary files as text"
-msgstr "hantera binärfiler som text"
+#: builtin/commit.c:1719
+msgid "could not read MERGE_MODE"
+msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/grep.c:661
-msgid "don't match patterns in binary files"
-msgstr "träffa inte mönster i binärfiler"
+#: builtin/commit.c:1738
+#, c-format
+msgid "could not read commit message: %s"
+msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/grep.c:664
-msgid "process binary files with textconv filters"
-msgstr "hantera binärfiler med textconv-filter"
+#: builtin/commit.c:1749
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
+msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/grep.c:666
-msgid "descend at most <depth> levels"
-msgstr "gå som mest ned <djup> nivåer"
+#: builtin/commit.c:1754
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
+msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/grep.c:670
-msgid "use extended POSIX regular expressions"
-msgstr "använd utökade POSIX-reguljära uttryck"
+#: 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"
+"not exceeded, and then \"git reset HEAD\" to recover."
+msgstr ""
+"Arkivet har uppdaterats, men kunde inte skriva filen\n"
+"new_index. Kontrollera att disken inte är full och\n"
+"att kvoten inte har överskridits, och kör sedan\n"
+"\"git reset HEAD\" för att återställa."
 
-#: builtin/grep.c:673
-msgid "use basic POSIX regular expressions (default)"
-msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
+#: builtin/config.c:9
+msgid "git config [<options>]"
+msgstr "git config [<flaggor>]"
 
-#: builtin/grep.c:676
-msgid "interpret patterns as fixed strings"
-msgstr "tolka mönster som fixerade strängar"
+#: builtin/config.c:55
+msgid "Config file location"
+msgstr "Konfigurationsfilens plats"
 
-#: builtin/grep.c:679
-msgid "use Perl-compatible regular expressions"
-msgstr "använd Perlkompatibla reguljära uttryck"
+#: builtin/config.c:56
+msgid "use global config file"
+msgstr "använd global konfigurationsfil"
 
-#: builtin/grep.c:682
-msgid "show line numbers"
-msgstr "visa radnummer"
+#: builtin/config.c:57
+msgid "use system config file"
+msgstr "använd systemets konfigurationsfil"
 
-#: builtin/grep.c:683
-msgid "don't show filenames"
-msgstr "visa inte filnamn"
+#: builtin/config.c:58
+msgid "use repository config file"
+msgstr "använd arkivets konfigurationsfil"
 
-#: builtin/grep.c:684
-msgid "show filenames"
-msgstr "visa filnamn"
+#: builtin/config.c:59
+msgid "use given config file"
+msgstr "använd angiven konfigurationsfil"
 
-#: builtin/grep.c:686
-msgid "show filenames relative to top directory"
-msgstr "visa filnamn relativa till toppkatalogen"
+#: builtin/config.c:60
+msgid "blob-id"
+msgstr "blob-id"
 
-#: builtin/grep.c:688
-msgid "show only filenames instead of matching lines"
-msgstr "visa endast filnamn istället för träffade rader"
+#: builtin/config.c:60
+msgid "read config from given blob object"
+msgstr "läs konfiguration från givet blob-objekt"
 
-#: builtin/grep.c:690
-msgid "synonym for --files-with-matches"
-msgstr "synonym för --files-with-matches"
+#: builtin/config.c:61
+msgid "Action"
+msgstr "Åtgärd"
 
-#: builtin/grep.c:693
-msgid "show only the names of files without match"
-msgstr "visa endast namn på filer utan träffar"
+#: builtin/config.c:62
+msgid "get value: name [value-regex]"
+msgstr "hämta värde: namn [värde-reguttr]"
 
-#: builtin/grep.c:695
-msgid "print NUL after filenames"
-msgstr "skriv NUL efter filnamn"
+#: builtin/config.c:63
+msgid "get all values: key [value-regex]"
+msgstr "hämta alla värden: nyckel [värde-reguttr]"
 
-#: builtin/grep.c:697
-msgid "show the number of matches instead of matching lines"
-msgstr "visa antal träffar istället för träffade rader"
+#: builtin/config.c:64
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]"
 
-#: builtin/grep.c:698
-msgid "highlight matches"
-msgstr "ljusmarkera träffar"
+#: builtin/config.c:65
+msgid "get value specific for the URL: section[.var] URL"
+msgstr "hämta värde specifikt URL:en: sektion[.var] URL"
 
-#: builtin/grep.c:700
-msgid "print empty line between matches from different files"
-msgstr "skriv tomma rader mellan träffar från olika filer"
+#: builtin/config.c:66
+msgid "replace all matching variables: name value [value_regex]"
+msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]"
 
-#: builtin/grep.c:702
-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:705
-msgid "show <n> context lines before and after matches"
-msgstr "visa <n> rader sammanhang före och efter träffar"
-
-#: builtin/grep.c:708
-msgid "show <n> context lines before matches"
-msgstr "visa <n> rader sammanhang före träffar"
-
-#: builtin/grep.c:710
-msgid "show <n> context lines after matches"
-msgstr "visa <n> rader sammanhang efter träffar"
-
-#: builtin/grep.c:712
-msgid "use <n> worker threads"
-msgstr "använd <n> jobbtrådar"
+#: builtin/config.c:67
+msgid "add a new variable: name value"
+msgstr "lägg till en ny variabel: namn värde"
 
-#: builtin/grep.c:713
-msgid "shortcut for -C NUM"
-msgstr "genväg för -C NUM"
+#: builtin/config.c:68
+msgid "remove a variable: name [value-regex]"
+msgstr "ta bort en variabel: namn [värde-reguttr]"
 
-#: builtin/grep.c:716
-msgid "show a line with the function name before matches"
-msgstr "visa en rad med funktionsnamnet före träffen"
+#: builtin/config.c:69
+msgid "remove all matches: name [value-regex]"
+msgstr "ta bort alla träffar: namn [värde-reguttr]"
 
-#: builtin/grep.c:718
-msgid "show the surrounding function"
-msgstr "visa den omkringliggande funktionen"
+#: builtin/config.c:70
+msgid "rename section: old-name new-name"
+msgstr "byt namn på sektion: gammalt-namn nytt-namn"
 
-#: builtin/grep.c:721
-msgid "read patterns from file"
-msgstr "läs mönster från fil"
+#: builtin/config.c:71
+msgid "remove a section: name"
+msgstr "ta bort en sektion: namn"
 
-#: builtin/grep.c:723
-msgid "match <pattern>"
-msgstr "träffa <mönster>"
+#: builtin/config.c:72
+msgid "list all"
+msgstr "visa alla"
 
-#: builtin/grep.c:725
-msgid "combine patterns specified with -e"
-msgstr "kombinera mönster som anges med -e"
+#: builtin/config.c:73
+msgid "open an editor"
+msgstr "öppna textredigeringsprogram"
 
-#: builtin/grep.c:737
-msgid "indicate hit with exit status without output"
-msgstr "ange träff med slutstatuskod utan utdata"
+#: builtin/config.c:74
+msgid "find the color configured: slot [default]"
+msgstr "hitta den inställda färgen: slot [default]"
 
-#: builtin/grep.c:739
-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/config.c:75
+msgid "find the color setting: slot [stdout-is-tty]"
+msgstr "hitta färginställningen: slot [stdout-is-tty]"
 
-#: builtin/grep.c:741
-msgid "show parse tree for grep expression"
-msgstr "visa analysträd för grep-uttryck"
+#: builtin/config.c:76
+msgid "Type"
+msgstr "Typ"
 
-#: builtin/grep.c:745
-msgid "pager"
-msgstr "bläddrare"
+#: builtin/config.c:77
+msgid "value is \"true\" or \"false\""
+msgstr "värdet är \"true\" eller \"false\""
 
-#: builtin/grep.c:745
-msgid "show matching files in the pager"
-msgstr "visa träffade filer i filbläddraren"
+#: builtin/config.c:78
+msgid "value is decimal number"
+msgstr "värdet är ett decimalt tal"
 
-#: builtin/grep.c:748
-msgid "allow calling of grep(1) (ignored by this build)"
-msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
+#: builtin/config.c:79
+msgid "value is --bool or --int"
+msgstr "värdet är --bool eller --int"
 
-#: builtin/grep.c:811
-msgid "no pattern given."
-msgstr "inget mönster angavs."
+#: builtin/config.c:80
+msgid "value is a path (file or directory name)"
+msgstr "värdet är en sökväg (fil- eller katalognamn)"
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr "felaktigt antal trådar angivet (%d)"
+#: builtin/config.c:81
+msgid "Other"
+msgstr "Andra"
 
-#: builtin/grep.c:873
-msgid "--open-files-in-pager only works on the worktree"
-msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
+#: builtin/config.c:82
+msgid "terminate values with NUL byte"
+msgstr "terminera värden med NUL-byte"
 
-#: builtin/grep.c:899
-msgid "--cached or --untracked cannot be used with --no-index."
-msgstr "--cached och --untracked kan inte användas med --no-index."
+#: builtin/config.c:83
+msgid "show variable names only"
+msgstr "visa endast variabelnamn"
 
-#: builtin/grep.c:904
-msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index och --untracked kan inte användas med revisioner."
+#: builtin/config.c:84
+msgid "respect include directives on lookup"
+msgstr "respektera inkluderingsdirektiv vid uppslag"
 
-#: builtin/grep.c:907
-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/config.c:85
+msgid "show origin of config (file, standard input, blob, command line)"
+msgstr "visa konfigurationskälla (fil, standard in, blob, kommandorad)"
 
-#: builtin/grep.c:915
-msgid "both --cached and trees are given."
-msgstr "både --cached och träd angavs."
+#: builtin/config.c:327
+msgid "unable to parse default color value"
+msgstr "kan inte tolka standardfärgvärde"
 
-#: builtin/hash-object.c:81
+#: builtin/config.c:471
+#, c-format
 msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
+"# 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 hash-object [-t <typ>] [-w] [--path=<fil> | --no-filters] [--stdin] [--] "
-"<fil>..."
-
-#: builtin/hash-object.c:82
-msgid "git hash-object  --stdin-paths"
-msgstr "git hash-object  --stdin-paths"
-
-#: builtin/hash-object.c:93
-msgid "type"
-msgstr "typ"
-
-#: builtin/hash-object.c:93
-msgid "object type"
-msgstr "objekttyp"
-
-#: builtin/hash-object.c:94
-msgid "write the object into the object database"
-msgstr "skriv objektet till objektdatabasen"
-
-#: builtin/hash-object.c:96
-msgid "read the object from stdin"
-msgstr "läs objektet från standard in"
+"# Detta är Gits användarspecifika konfigurationsfil\n"
+"[user]\n"
+"# Justera och ta bort kommenteringsmärket från följande rader:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
 
-#: builtin/hash-object.c:98
-msgid "store file as is without filters"
-msgstr "spara filen som den är utan filer"
+#: builtin/config.c:613
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "kan inte skapa konfigurationsfilen \"%s\""
 
-#: builtin/hash-object.c:99
+#: builtin/config.c:625
+#, c-format
 msgid ""
-"just hash any random garbage to create corrupt objects for debugging Git"
+"cannot overwrite multiple values with a single value\n"
+"       Use a regexp, --add or --replace-all to change %s."
 msgstr ""
-"hasha slumpmässigt skräp för att skapa korrupta objekt för felsökning av Git"
+"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/hash-object.c:100
-msgid "process file as it were from this path"
-msgstr "hantera filen som om den kom från sökvägen"
+#: builtin/count-objects.c:86
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr "git count-objects [-v] [-H | --human-readable]"
 
-#: builtin/help.c:41
-msgid "print all available commands"
-msgstr "visa alla tillgängliga kommandon"
+#: builtin/count-objects.c:96
+msgid "print sizes in human readable format"
+msgstr "skriv storlekar i människoläsbart format"
 
-#: builtin/help.c:42
-msgid "print list of useful guides"
-msgstr "lista användbara vägledningar"
+#: builtin/describe.c:17
+msgid "git describe [<options>] [<commit-ish>...]"
+msgstr "git describe [<flaggor>] [<incheckning-igt>...]"
 
-#: builtin/help.c:43
-msgid "show man page"
-msgstr "visa manualsida"
+#: builtin/describe.c:18
+msgid "git describe [<options>] --dirty"
+msgstr "git describe [<flaggor>] --dirty"
 
-#: builtin/help.c:44
-msgid "show manual in web browser"
-msgstr "visa manual i webbläsare"
+#: builtin/describe.c:217
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "den annoterade taggen %s inte tillgänglig"
 
-#: builtin/help.c:46
-msgid "show info page"
-msgstr "visa info-sida"
+#: builtin/describe.c:221
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr "den annoterade taggen %s har inget inbäddat namn"
 
-#: builtin/help.c:52
-msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
-msgstr "git help [--all] [--guides] [--man | --web | --info] [<kommando>]"
+#: builtin/describe.c:223
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
 
-#: builtin/help.c:64
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
-msgid "unrecognized help format '%s'"
-msgstr "okänt hjälpformat: %s"
+msgid "Not a valid object name %s"
+msgstr "Objektnamnet är inte giltigt: %s"
 
-#: builtin/help.c:91
-msgid "Failed to start emacsclient."
-msgstr "Misslyckades starta emacsclient."
+#: builtin/describe.c:253
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s är inte ett giltigt \"%s\"-objekt"
 
-#: builtin/help.c:104
-msgid "Failed to parse emacsclient version."
-msgstr "Kunde inte tolka emacsclient-version."
+#: builtin/describe.c:270
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr "ingen tagg motsvarar \"%s\" exakt"
 
-#: builtin/help.c:112
+#: builtin/describe.c:272
 #, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr "emacsclient version \"%d\" för gammal (< 22)."
+msgid "searching to describe %s\n"
+msgstr "söker för att beskriva %s\n"
 
-#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#: builtin/describe.c:319
 #, c-format
-msgid "failed to exec '%s': %s"
-msgstr "exec misslyckades för \"%s\": %s"
+msgid "finished search at %s\n"
+msgstr "avslutade sökning på %s\n"
 
-#: builtin/help.c:205
+#: builtin/describe.c:346
 #, c-format
 msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
 msgstr ""
-"\"%s\": sökväg för man-visare som ej stöds.\n"
-"Använd \"man.<verktyg>.cmd\" istället."
+"Inga annoterade taggar kan beskriva \"%s\".\n"
+"Det finns dock oannoterade taggar: testa --tags."
 
-#: builtin/help.c:217
+#: builtin/describe.c:350
 #, c-format
 msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
 msgstr ""
-"\"%s\": kommando för man-visare som stöds.\n"
-"Använd \"man.<verktyg>.path\" istället."
+"Inga taggar kan beskriva \"%s\".\n"
+"Testa --always, eller skapa några taggar."
 
-#: builtin/help.c:334
+#: builtin/describe.c:371
 #, c-format
-msgid "'%s': unknown man viewer."
-msgstr "\"%s\": okänd man-visare."
-
-#: builtin/help.c:351
-msgid "no man viewer handled the request"
-msgstr "ingen man-visare hanterade förfrågan"
-
-#: builtin/help.c:359
-msgid "no info viewer handled the request"
-msgstr "ingen info-visare hanterade förfrågan"
+msgid "traversed %lu commits\n"
+msgstr "traverserade %lu incheckningar\n"
 
-#: builtin/help.c:408
-msgid "Defining attributes per path"
-msgstr "Definierar attribut per sökväg"
-
-#: builtin/help.c:409
-msgid "Everyday Git With 20 Commands Or So"
-msgstr "Git för dagligt bruk i ungefär 20 kommandon"
-
-#: builtin/help.c:410
-msgid "A Git glossary"
-msgstr "En Git-ordlista"
-
-#: builtin/help.c:411
-msgid "Specifies intentionally untracked files to ignore"
-msgstr "Ange avsiktligen ospårade filer att ignorera"
-
-#: builtin/help.c:412
-msgid "Defining submodule properties"
-msgstr "Ange egenskaper för undermoduler"
+#: builtin/describe.c:374
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+msgstr ""
+"mer än %i taggar hittades; listar de %i senaste\n"
+"gav upp sökningen vid %s\n"
 
-#: builtin/help.c:413
-msgid "Specifying revisions and ranges for Git"
-msgstr "Ange versioner och intervall i Git"
+#: builtin/describe.c:396
+msgid "find the tag that comes after the commit"
+msgstr "hitta taggen som kommer efter incheckningen"
 
-#: builtin/help.c:414
-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/describe.c:397
+msgid "debug search strategy on stderr"
+msgstr "felsök sökstrategin på standard fel"
 
-#: builtin/help.c:415
-msgid "An overview of recommended workflows with Git"
-msgstr "Översikt över rekommenderade arbetsflöden med Git"
+#: builtin/describe.c:398
+msgid "use any ref"
+msgstr "använd alla referenser"
 
-#: builtin/help.c:427
-msgid "The common Git guides are:\n"
-msgstr "De vanliga Git-vägledningarna är:\n"
+#: builtin/describe.c:399
+msgid "use any tag, even unannotated"
+msgstr "använd alla taggar, även oannoterade"
 
-#: builtin/help.c:448 builtin/help.c:465
-#, c-format
-msgid "usage: %s%s"
-msgstr "användning: %s%s"
+#: builtin/describe.c:400
+msgid "always use long format"
+msgstr "använd alltid långt format"
 
-#: builtin/help.c:481
-#, c-format
-msgid "`git %s' is aliased to `%s'"
-msgstr "\"git %s\" är ett alias för \"%s\""
+#: builtin/describe.c:401
+msgid "only follow first parent"
+msgstr "följ endast första föräldern"
 
-#: builtin/index-pack.c:152
-#, c-format
-msgid "unable to open %s"
-msgstr "kunde inte öppna %s"
+#: builtin/describe.c:404
+msgid "only output exact matches"
+msgstr "skriv endast ut exakta träffar"
 
-#: builtin/index-pack.c:202
-#, c-format
-msgid "object type mismatch at %s"
-msgstr "objekttyp stämmer inte överens vid %s"
+#: builtin/describe.c:406
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "överväg de <n> nyaste taggarna (standard: 10)"
 
-#: builtin/index-pack.c:222
-#, c-format
-msgid "did not receive expected object %s"
-msgstr "emottog inte det förväntade objektet %s"
+#: builtin/describe.c:408
+msgid "only consider tags matching <pattern>"
+msgstr "överväg endast taggar som motsvarar <mönster>"
 
-#: builtin/index-pack.c:225
-#, c-format
-msgid "object %s: expected type %s, found %s"
-msgstr "objektet %s: förväntad typ %s, såg %s"
+#: builtin/describe.c:410 builtin/name-rev.c:320
+msgid "show abbreviated commit object as fallback"
+msgstr "visa förkortade incheckningsobjekt som standard"
 
-#: builtin/index-pack.c:267
-#, 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/describe.c:411
+msgid "mark"
+msgstr "märke"
 
-#: builtin/index-pack.c:277
-msgid "early EOF"
-msgstr "tidigt filslut"
+#: builtin/describe.c:412
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
 
-#: builtin/index-pack.c:278
-msgid "read error on input"
-msgstr "indataläsfel"
+#: builtin/describe.c:430
+msgid "--long is incompatible with --abbrev=0"
+msgstr "--long är inkompatibel med --abbrev=0"
 
-#: builtin/index-pack.c:290
-msgid "used more bytes than were available"
-msgstr "använde fler byte än tillgängligt"
+#: builtin/describe.c:456
+msgid "No names found, cannot describe anything."
+msgstr "Inga namn hittades, kan inte beskriva något."
 
-#: builtin/index-pack.c:297
-msgid "pack too large for current definition of off_t"
-msgstr "paket för stort för nuvarande definition av off_t"
+#: builtin/describe.c:476
+msgid "--dirty is incompatible with commit-ishes"
+msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
 
-#: builtin/index-pack.c:313
+#: builtin/diff.c:86
 #, c-format
-msgid "unable to create '%s'"
-msgstr "kunde inte skapa \"%s\""
+msgid "'%s': not a regular file or symlink"
+msgstr "\"%s\": inte en normal fil eller symbolisk länk"
 
-#: builtin/index-pack.c:318
+#: builtin/diff.c:237
 #, c-format
-msgid "cannot open packfile '%s'"
-msgstr "kan inte öppna paketfilen \"%s\""
+msgid "invalid option: %s"
+msgstr "ogiltig flagga: %s"
 
-#: builtin/index-pack.c:332
-msgid "pack signature mismatch"
-msgstr "paketsignatur stämmer inte överens"
+#: builtin/diff.c:361
+msgid "Not a git repository"
+msgstr "Inte ett git-arkiv"
 
-#: builtin/index-pack.c:334
+#: builtin/diff.c:404
 #, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr "paketversion %<PRIu32> stöds ej"
+msgid "invalid object '%s' given."
+msgstr "objektet \"%s\" som angavs är felaktigt."
 
-#: builtin/index-pack.c:352
+#: builtin/diff.c:413
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "paketet har felaktigt objekt vid index %lu: %s"
+msgid "more than two blobs given: '%s'"
+msgstr "mer än två blobbar angavs: \"%s\""
 
-#: builtin/index-pack.c:473
+#: builtin/diff.c:420
 #, c-format
-msgid "inflate returned %d"
-msgstr "inflate returnerade %d"
+msgid "unhandled object '%s' given."
+msgstr "ej hanterat objekt \"%s\" angavs."
 
-#: builtin/index-pack.c:522
-msgid "offset value overflow for delta base object"
-msgstr "indexvärdespill för deltabasobjekt"
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [rev-list-flaggor]"
 
-#: builtin/index-pack.c:530
-msgid "delta base offset is out of bound"
-msgstr "deltabasindex utanför gränsen"
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
+msgstr "visa förlopp efter <n> objekt"
 
-#: builtin/index-pack.c:538
-#, c-format
-msgid "unknown object type %d"
-msgstr "okänd objekttyp %d"
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
+msgstr "välj hantering av signerade taggar"
 
-#: builtin/index-pack.c:569
-msgid "cannot pread pack file"
-msgstr "kan inte utföra \"pread\" på paketfil"
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
+msgstr "välj hantering av taggar som har taggfiltrerade objekt"
 
-#: 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] "för tidigt slut på paketfilen, %lu byte saknas"
-msgstr[1] "för tidigt slut på paketfilen, %lu byte saknas"
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
+msgstr "Dump märken till filen"
 
-#: builtin/index-pack.c:597
-msgid "serious inflate inconsistency"
-msgstr "allvarlig inflate-inkonsekvens"
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
+msgstr "Importera märken från filen"
 
-#: 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
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
+msgstr "Fejka taggare när taggen saknar en"
 
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
-#, c-format
-msgid "unable to read %s"
-msgstr "kunde inte läsa %s"
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
+msgstr "Skriv ut hela trädet för varje incheckning"
 
-#: builtin/index-pack.c:812
-#, c-format
-msgid "cannot read existing object %s"
-msgstr "kan inte läsa befintligt objekt %s"
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
+msgstr "Använd done-funktionen för att avsluta strömmen"
 
-#: builtin/index-pack.c:826
-#, c-format
-msgid "invalid blob object %s"
-msgstr "ogiltigt blob-objekt %s"
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
+msgstr "Hoppa över skrivning av blob-data"
 
-#: builtin/index-pack.c:840
-#, c-format
-msgid "invalid %s"
-msgstr "ogiltigt %s"
+#: builtin/fast-export.c:998
+msgid "refspec"
+msgstr "referensspecifikation"
 
-#: builtin/index-pack.c:843
-msgid "Error in object"
-msgstr "Fel i objekt"
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
+msgstr "Applicera referensspecifikation på exporterade referenser"
 
-#: builtin/index-pack.c:845
-#, c-format
-msgid "Not all child objects of %s are reachable"
-msgstr "Inte alla barnobjekt för %s kan nås"
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
+msgstr "anonymisera utdata"
 
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
-msgid "failed to apply delta"
-msgstr "misslyckades tillämpa delta"
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [<flaggor>] [<arkiv> [<refspec>...]]"
 
-#: builtin/index-pack.c:1118
-msgid "Receiving objects"
-msgstr "Tar emot objekt"
+#: builtin/fetch.c:22
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<flaggor>] <grupp>"
 
-#: builtin/index-pack.c:1118
-msgid "Indexing objects"
-msgstr "Skapar index för objekt"
+#: builtin/fetch.c:23
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]"
 
-#: builtin/index-pack.c:1150
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr "paketet är trasigt (SHA1 stämmer inte)"
+#: builtin/fetch.c:24
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<flaggor>]"
 
-#: builtin/index-pack.c:1155
-msgid "cannot fstat packfile"
-msgstr "kan inte utföra \"fstat\" på paketfil"
+#: builtin/fetch.c:95 builtin/pull.c:175
+msgid "fetch from all remotes"
+msgstr "hämta från alla fjärrar"
 
-#: builtin/index-pack.c:1158
-msgid "pack has junk at the end"
-msgstr "paket har skräp i slutet"
+#: 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/index-pack.c:1169
-msgid "confusion beyond insanity in parse_pack_objects()"
-msgstr "förvirrad bortom vanvett i parse_pack_objects()"
+#: 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/index-pack.c:1194
-msgid "Resolving deltas"
-msgstr "Analyserar delta"
+#: builtin/fetch.c:100 builtin/pull.c:183
+msgid "force overwrite of local branch"
+msgstr "tvinga överskrivning av lokal gren"
 
-#: builtin/index-pack.c:1205
-#, c-format
-msgid "unable to create thread: %s"
-msgstr "kunde inte skapa tråd: %s"
+#: builtin/fetch.c:102
+msgid "fetch from multiple remotes"
+msgstr "hämta från flera fjärrar"
 
-#: builtin/index-pack.c:1247
-msgid "confusion beyond insanity"
-msgstr "förvirrad bortom vanvett"
+#: builtin/fetch.c:104 builtin/pull.c:185
+msgid "fetch all tags and associated objects"
+msgstr "hämta alla taggar och associerade objekt"
 
-#: builtin/index-pack.c:1253
-#, c-format
-msgid "completed with %d local objects"
-msgstr "slutfördes med %d lokala objekt"
+#: builtin/fetch.c:106
+msgid "do not fetch all tags (--no-tags)"
+msgstr "hämta inte alla taggar (--no-tags)"
 
-#: builtin/index-pack.c:1263
-#, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr "Oväntad svanschecksumma för %s (trasig disk?)"
+#: builtin/fetch.c:108
+msgid "number of submodules fetched in parallel"
+msgstr "antal undermoduler som hämtas parallellt"
 
-#: builtin/index-pack.c:1267
-#, 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/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/index-pack.c:1291
-#, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr "kunde inte utföra \"deflate\" på tillagt objekt (%d)"
+#: builtin/fetch.c:111 builtin/pull.c:191
+msgid "on-demand"
+msgstr "on-demand"
 
-#: builtin/index-pack.c:1367
-#, c-format
-msgid "local object %s is corrupt"
-msgstr "lokalt objekt %s är trasigt"
+#: builtin/fetch.c:112 builtin/pull.c:192
+msgid "control recursive fetching of submodules"
+msgstr "styr rekursiv hämtning av undermoduler"
 
-#: builtin/index-pack.c:1391
-msgid "error while closing pack file"
-msgstr "fel vid stängning av paketfil"
+#: builtin/fetch.c:116 builtin/pull.c:200
+msgid "keep downloaded pack"
+msgstr "behåll hämtade paket"
 
-#: builtin/index-pack.c:1404
-#, c-format
-msgid "cannot write keep file '%s'"
-msgstr "kan inte ta skriva \"keep\"-fil \"%s\""
+#: builtin/fetch.c:118
+msgid "allow updating of HEAD ref"
+msgstr "tillåt uppdatering av HEAD-referens"
 
-#: builtin/index-pack.c:1412
-#, c-format
-msgid "cannot close written keep file '%s'"
-msgstr "akn inte stänga skriven \"keep\"-fil \"%s\""
+#: 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/index-pack.c:1425
-msgid "cannot store pack file"
-msgstr "kan inte spara paketfil"
+#: 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/index-pack.c:1436
-msgid "cannot store index file"
-msgstr "kan inte spara indexfil"
+#: builtin/fetch.c:129 builtin/pull.c:206
+msgid "convert to a complete repository"
+msgstr "konvertera till komplett arkiv"
 
-#: builtin/index-pack.c:1469
-#, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr "felaktig pack.indexversion=%<PRIu32>"
+#: builtin/fetch.c:131 builtin/log.c:1433
+msgid "dir"
+msgstr "kat"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
-#, c-format
-msgid "no threads support, ignoring %s"
-msgstr "trådstöd saknas, ignorerar %s"
+#: builtin/fetch.c:132
+msgid "prepend this to submodule path output"
+msgstr "lägg till i början av undermodulens sökvägsutdata"
 
-#: builtin/index-pack.c:1538
-#, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr "Kan inte öppna befintlig paketfil \"%s\""
+#: builtin/fetch.c:135
+msgid "default mode for recursion"
+msgstr "standardläge för rekursion"
 
-#: builtin/index-pack.c:1540
-#, c-format
-msgid "Cannot open existing pack idx file for '%s'"
-msgstr "Kan inte öppna befintlig paket-idx-fil för \"%s\""
+#: builtin/fetch.c:137 builtin/pull.c:209
+msgid "accept refs that update .git/shallow"
+msgstr "tar emot referenser som uppdaterar .git/shallow"
 
-#: builtin/index-pack.c:1587
-#, 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/fetch.c:138 builtin/pull.c:211
+msgid "refmap"
+msgstr "referenskarta"
 
-#: builtin/index-pack.c:1594
-#, 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/fetch.c:139 builtin/pull.c:212
+msgid "specify fetch refmap"
+msgstr "ange referenskarta för \"fetch\""
 
-#: builtin/index-pack.c:1624
-msgid "Cannot come back to cwd"
-msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
+#: builtin/fetch.c:398
+msgid "Couldn't find remote ref HEAD"
+msgstr "Kunde inte hitta fjärr-referensen HEAD"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: builtin/fetch.c:514
 #, c-format
-msgid "bad %s"
-msgstr "felaktig %s"
-
-#: builtin/index-pack.c:1709
-msgid "--fix-thin cannot be used without --stdin"
-msgstr "--fix-thin kan inte användas med --stdin"
+msgid "configuration fetch.output contains invalid value %s"
+msgstr "konfigurationen för fetch.output innehåller ogiltigt värde %s"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
+#: builtin/fetch.c:607
 #, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\""
+msgid "object %s not found"
+msgstr "objektet %s hittades inte"
 
-#: builtin/index-pack.c:1730
-msgid "--verify with no packfile name given"
-msgstr "--verify angavs utan paketfilnamn"
+#: builtin/fetch.c:611
+msgid "[up to date]"
+msgstr "[àjour]"
 
-#: builtin/init-db.c:55
-#, c-format
-msgid "cannot stat '%s'"
-msgstr "kan inte ta status på \"%s\""
+#: builtin/fetch.c:624 builtin/fetch.c:704
+msgid "[rejected]"
+msgstr "[refuserad]"
 
-#: builtin/init-db.c:61
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr "kan inte ta status på mallen \"%s\""
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "kan inte hämta i aktuell gren"
 
-#: builtin/init-db.c:66
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr "kan inte öppna katalogen (opendir) \"%s\""
+#: builtin/fetch.c:634
+msgid "[tag update]"
+msgstr "[uppdaterad tagg]"
 
-#: builtin/init-db.c:77
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr "kan inte läsa länk (readlink) \"%s\""
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "kunde inte uppdatera lokal ref"
 
-#: builtin/init-db.c:79
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr "kan inte skapa symbolisk länk \"%s\" \"%s\""
+#: builtin/fetch.c:654
+msgid "[new tag]"
+msgstr "[ny tagg]"
 
-#: builtin/init-db.c:85
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr "kan inte kopiera \"%s\" till \"%s\""
+#: builtin/fetch.c:657
+msgid "[new branch]"
+msgstr "[ny gren]"
 
-#: builtin/init-db.c:89
-#, c-format
-msgid "ignoring template %s"
-msgstr "ignorerar mallen %s"
+#: builtin/fetch.c:660
+msgid "[new ref]"
+msgstr "[ny ref]"
 
-#: builtin/init-db.c:118
-#, c-format
-msgid "templates not found %s"
-msgstr "mallarna hittades inte %s"
+#: builtin/fetch.c:699
+msgid "forced update"
+msgstr "tvingad uppdatering"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "kopierade inte mallar från felaktig formatversion %d från \"%s\""
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "ej snabbspolad"
 
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/fetch.c:749
 #, c-format
-msgid "%s already exists"
-msgstr "%s finns redan"
+msgid "%s did not send all necessary objects\n"
+msgstr "%s sände inte alla nödvändiga objekt\n"
 
-#: builtin/init-db.c:340
+#: builtin/fetch.c:769
 #, c-format
-msgid "unable to handle file type %d"
-msgstr "kan inte hantera filtyp %d"
+msgid "reject %s because shallow roots are not allowed to be updated"
+msgstr "avvisa %s då grunda rötter inte kan uppdateras"
 
-#: builtin/init-db.c:343
+#: builtin/fetch.c:856 builtin/fetch.c:952
 #, c-format
-msgid "unable to move %s to %s"
-msgstr "kan inte flytta %s till %s"
+msgid "From %.*s\n"
+msgstr "Från %.*s\n"
 
-#. 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:399
+#: builtin/fetch.c:867
 #, c-format
-msgid "%s%s Git repository in %s%s\n"
-msgstr "%s%s Git-arkiv i %s%s\n"
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
+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/init-db.c:400
-msgid "Reinitialized existing"
-msgstr "Ominitierade befintligt"
+#: builtin/fetch.c:922
+#, c-format
+msgid "   (%s will become dangling)"
+msgstr "   (%s kommer bli dinglande)"
 
-#: builtin/init-db.c:400
-msgid "Initialized empty"
-msgstr "Initierade tomt"
+#: builtin/fetch.c:923
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (%s har blivit dinglande)"
 
-#: builtin/init-db.c:401
-msgid " shared"
-msgstr " delat"
+#: builtin/fetch.c:955
+msgid "[deleted]"
+msgstr "[borttagen]"
 
-#: builtin/init-db.c:448
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-"git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--"
-"shared[=<behörigheter>]] [<katalog>]"
+#: builtin/fetch.c:956 builtin/remote.c:1020
+msgid "(none)"
+msgstr "(ingen)"
 
-#: builtin/init-db.c:471
-msgid "permissions"
-msgstr "behörigheter"
+#: builtin/fetch.c:979
+#, 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/init-db.c:472
-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/fetch.c:998
+#, 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/init-db.c:506 builtin/init-db.c:511
+#: builtin/fetch.c:1001
 #, c-format
-msgid "cannot mkdir %s"
-msgstr "kan inte skapa katalogen (mkdir) %s"
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr "Flaggan \"%s\" ignoreras för %s\n"
 
-#: builtin/init-db.c:515
+#: builtin/fetch.c:1077
 #, c-format
-msgid "cannot chdir to %s"
-msgstr "kan inte byta katalog (chdir) till %s"
+msgid "Don't know how to fetch from %s"
+msgstr "Vet inte hur man hämtar från %s"
 
-#: builtin/init-db.c:536
+#: builtin/fetch.c:1237
 #, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-msgstr ""
-"%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
-"dir=<katalog>)"
+msgid "Fetching %s\n"
+msgstr "Hämtar %s\n"
 
-#: builtin/init-db.c:564
+#: builtin/fetch.c:1239 builtin/remote.c:96
 #, c-format
-msgid "Cannot access work tree '%s'"
-msgstr "Kan inte komma åt arbetskatalogen \"%s\""
+msgid "Could not fetch %s"
+msgstr "Kunde inte hämta %s"
 
-#: builtin/interpret-trailers.c:15
+#: builtin/fetch.c:1257
 msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
 msgstr ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<symbol>[(=|:)<värde>])...] [<fil>...]"
+"Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n"
+"fjärrarkiv som nya incheckningar skall hämtas från."
 
-#: builtin/interpret-trailers.c:26
-msgid "edit files in place"
-msgstr "redigera filer på plats"
+#: builtin/fetch.c:1280
+msgid "You need to specify a tag name."
+msgstr "Du måste ange namnet på en tagg."
 
-#: builtin/interpret-trailers.c:27
-msgid "trim empty trailers"
-msgstr "ta bort tomma släprader"
+#: builtin/fetch.c:1322
+msgid "Negative depth in --deepen is not supported"
+msgstr "Negativa djup stöds inte i --deepen"
 
-#: builtin/interpret-trailers.c:28
-msgid "trailer"
-msgstr "släprad"
+#: builtin/fetch.c:1324
+msgid "--deepen and --depth are mutually exclusive"
+msgstr "--deepen och --depth är ömsesidigt uteslutande"
 
-#: builtin/interpret-trailers.c:29
-msgid "trailer(s) to add"
-msgstr "släprad(er) att lägga till"
+#: builtin/fetch.c:1329
+msgid "--depth and --unshallow cannot be used together"
+msgstr "--depth och --unshallow kan inte användas samtidigt"
 
-#: builtin/interpret-trailers.c:42
-msgid "no input file given for in-place editing"
-msgstr "ingen indatafil angiven för redigering på plats"
+#: builtin/fetch.c:1331
+msgid "--unshallow on a complete repository does not make sense"
+msgstr "--unshallow kan inte användas på ett komplett arkiv"
 
-#: builtin/log.c:43
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr "git log [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
+#: builtin/fetch.c:1353
+msgid "fetch --all does not take a repository argument"
+msgstr "fetch --all tar inte namnet på ett arkiv som argument"
 
-#: builtin/log.c:44
-msgid "git show [<options>] <object>..."
-msgstr "git show [<flaggor>] <objekt>..."
+#: builtin/fetch.c:1355
+msgid "fetch --all does not make sense with refspecs"
+msgstr "fetch --all kan inte anges med referensspecifikationer"
 
-#: builtin/log.c:83
+#: builtin/fetch.c:1366
 #, c-format
-msgid "invalid --decorate option: %s"
-msgstr "ogiltig flagga för --decorate: %s"
-
-#: builtin/log.c:131
-msgid "suppress diff output"
-msgstr "undertryck diff-utdata"
+msgid "No such remote or remote group: %s"
+msgstr "Fjärren eller fjärrgruppen finns inte: %s"
 
-#: builtin/log.c:132
-msgid "show source"
-msgstr "visa källkod"
+#: builtin/fetch.c:1374
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
 
-#: builtin/log.c:133
-msgid "Use mail map file"
-msgstr "Använd e-postmappningsfil"
+#: 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 <meddelande>] [--log[=<n>] | --no-log] [--file <fil>]"
 
-#: builtin/log.c:134
-msgid "decorate options"
-msgstr "dekoreringsflaggor"
+#: 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/log.c:137
-msgid "Process line range n,m in file, counting from 1"
-msgstr "Behandla radintervallet n,m i filen, med början på 1"
+#: builtin/fmt-merge-msg.c:666
+msgid "alias for --log (deprecated)"
+msgstr "alias för --log (avråds)"
 
-#: builtin/log.c:233
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr "Slututdata: %d %s\n"
-
-#: builtin/log.c:465
-#, c-format
-msgid "git show %s: bad file"
-msgstr "git show %s: felaktig fil"
+#: builtin/fmt-merge-msg.c:669
+msgid "text"
+msgstr "text"
 
-#: builtin/log.c:479 builtin/log.c:572
-#, c-format
-msgid "Could not read object %s"
-msgstr "Kunde inte läsa objektet %s"
+#: builtin/fmt-merge-msg.c:670
+msgid "use <text> as start of message"
+msgstr "inled meddelande med <text>"
 
-#: builtin/log.c:596
-#, c-format
-msgid "Unknown type: %d"
-msgstr "Okänd typ: %d"
+#: builtin/fmt-merge-msg.c:671
+msgid "file to read from"
+msgstr "fil att läsa från"
 
-#: builtin/log.c:715
-msgid "format.headers without value"
-msgstr "format.headers utan värde"
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
+msgstr "git for-each-ref [<flaggor>] [<mönster>]"
 
-#: builtin/log.c:801
-msgid "name of output directory is too long"
-msgstr "namnet på utdatakatalogen är för långt"
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <objekt>]"
 
-#: builtin/log.c:816
-#, c-format
-msgid "Cannot open patch file %s"
-msgstr "Kan inte öppna patchfilen %s"
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<objekt>]]"
 
-#: builtin/log.c:830
-msgid "Need exactly one range."
-msgstr "Behöver precis ett intervall."
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<objekt>]]"
 
-#: builtin/log.c:840
-msgid "Not a range."
-msgstr "Inte ett intervall."
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
+msgstr "citera platshållare passande för skal"
 
-#: builtin/log.c:946
-msgid "Cover letter needs email format"
-msgstr "Omslagsbrevet behöver e-postformat"
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
+msgstr "citera platshållare passande för perl"
 
-#: builtin/log.c:1025
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr "tokigt in-reply-to: %s"
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
+msgstr "citera platshållare passande för python"
 
-#: builtin/log.c:1053
-msgid "git format-patch [<options>] [<since> | <revision-range>]"
-msgstr "git format-patch [<flaggor>] [<sedan> | <revisionsintervall>]"
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
+msgstr "citera platshållare passande för Tcl"
 
-#: builtin/log.c:1098
-msgid "Two output directories?"
-msgstr "Två utdatakataloger?"
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
+msgstr "visa endast <n> träffade refs"
 
-#: builtin/log.c:1214
-msgid "use [PATCH n/m] even with a single patch"
-msgstr "använd [PATCH n/m] även för en ensam patch"
+#: 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/log.c:1217
-msgid "use [PATCH] even with multiple patches"
-msgstr "använd [PATCH] även för flera patchar"
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "visa endast referenser som pekar på objektet"
 
-#: builtin/log.c:1221
-msgid "print patches to standard out"
-msgstr "skriv patcharna på standard ut"
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "visa endast referenser som slagits samman"
 
-#: builtin/log.c:1223
-msgid "generate a cover letter"
-msgstr "generera ett följebrev"
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "visa endast referenser som ej slagits samman"
 
-#: builtin/log.c:1225
-msgid "use simple number sequence for output file names"
-msgstr "använd enkel nummersekvens för utdatafilnamn"
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "visa endast referenser som innehåller incheckningen"
 
-#: builtin/log.c:1226
-msgid "sfx"
-msgstr "sfx"
+#: builtin/fsck.c:519
+msgid "Checking object directories"
+msgstr "Kontrollerar objektkataloger"
 
-#: builtin/log.c:1227
-msgid "use <sfx> instead of '.patch'"
-msgstr "använd <sfx> istället för \".patch\""
+#: builtin/fsck.c:588
+msgid "git fsck [<options>] [<object>...]"
+msgstr "git fsck [<flaggor>] [<objekt>...]"
 
-#: builtin/log.c:1229
-msgid "start numbering patches at <n> instead of 1"
-msgstr "börja numrera patchar på <n> istället för 1"
+#: builtin/fsck.c:594
+msgid "show unreachable objects"
+msgstr "visa onåbara objekt"
 
-#: builtin/log.c:1231
-msgid "mark the series as Nth re-roll"
-msgstr "markera serien som N:te försök"
+#: builtin/fsck.c:595
+msgid "show dangling objects"
+msgstr "visa dinglande objekt"
 
-#: builtin/log.c:1233
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Använd [<prefix>] istället för [PATCH]"
+#: builtin/fsck.c:596
+msgid "report tags"
+msgstr "rapportera taggar"
 
-#: builtin/log.c:1236
-msgid "store resulting files in <dir>"
-msgstr "spara filerna i <katalog>"
+#: builtin/fsck.c:597
+msgid "report root nodes"
+msgstr "rapportera rotnoder"
 
-#: builtin/log.c:1239
-msgid "don't strip/add [PATCH]"
-msgstr "ta inte bort eller lägg till [PATCH]"
+#: builtin/fsck.c:598
+msgid "make index objects head nodes"
+msgstr "gör indexojekt till huvudnoder"
 
-#: builtin/log.c:1242
-msgid "don't output binary diffs"
-msgstr "skriv inte binära diffar"
+#: builtin/fsck.c:599
+msgid "make reflogs head nodes (default)"
+msgstr "gör refloggar till huvudnoder (standard)"
 
-#: builtin/log.c:1244
-msgid "output all-zero hash in From header"
-msgstr "använd hashvärde med nollor i From-huvud"
+#: builtin/fsck.c:600
+msgid "also consider packs and alternate objects"
+msgstr "ta även hänsyn till paket och alternativa objekt"
 
-#: builtin/log.c:1246
-msgid "don't include a patch matching a commit upstream"
-msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
+# Vague original, not networking-related, but rather related to the actual
+# objects in the database.
+#: builtin/fsck.c:601
+msgid "check only connectivity"
+msgstr "kontrollera endast konnektivitet"
 
-#: builtin/log.c:1248
-msgid "show patch format instead of default (patch + stat)"
-msgstr "visa patchformat istället för standard (patch + stat)"
+#: builtin/fsck.c:602
+msgid "enable more strict checking"
+msgstr "aktivera striktare kontroll"
 
-#: builtin/log.c:1250
-msgid "Messaging"
-msgstr "E-post"
+#: builtin/fsck.c:604
+msgid "write dangling objects in .git/lost-found"
+msgstr "skriv dinglande objekt i .git/lost-found"
 
-#: builtin/log.c:1251
-msgid "header"
-msgstr "huvud"
+#: builtin/fsck.c:605 builtin/prune.c:107
+msgid "show progress"
+msgstr "visa förlopp"
 
-#: builtin/log.c:1252
-msgid "add email header"
-msgstr "lägg till e-posthuvud"
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "visa ordrika namn för nåbara objekt"
 
-#: builtin/log.c:1253 builtin/log.c:1255
-msgid "email"
-msgstr "epost"
+#: builtin/fsck.c:665
+msgid "Checking objects"
+msgstr "Kontrollerar objekt"
 
-#: builtin/log.c:1253
-msgid "add To: header"
-msgstr "Lägg till mottagarhuvud (\"To:\")"
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
+msgstr "git gc [<flaggor>]"
 
-#: builtin/log.c:1255
-msgid "add Cc: header"
-msgstr "Lägg till kopiehuvud (\"Cc:\")"
+#: builtin/gc.c:72
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Felaktigt %s: \"%s\""
 
-#: builtin/log.c:1257
-msgid "ident"
-msgstr "ident"
+#: builtin/gc.c:139
+#, c-format
+msgid "insanely long object directory %.*s"
+msgstr "tokigt lång objektkatalog %.*s"
 
-#: builtin/log.c:1258
-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/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"
+msgstr ""
+"Senaste körningen av git gc rapporterade följande. Fixa grundproblemet\n"
+"och ta bort %s.\n"
+"Automatisk städning kommer inte utföras förrän filen tas bort.\n"
+"\n"
+"%s"
 
-#: builtin/log.c:1260
-msgid "message-id"
-msgstr "meddelande-id"
+#: builtin/gc.c:327
+msgid "prune unreferenced objects"
+msgstr "rensa ej refererade objekt"
 
-#: builtin/log.c:1261
-msgid "make first mail a reply to <message-id>"
-msgstr "Gör det första brevet ett svar till <meddelande-id>"
+#: builtin/gc.c:329
+msgid "be more thorough (increased runtime)"
+msgstr "var mer grundlig (ökar körtiden)"
 
-#: builtin/log.c:1262 builtin/log.c:1265
-msgid "boundary"
-msgstr "gräns"
+#: builtin/gc.c:330
+msgid "enable auto-gc mode"
+msgstr "aktivera auto-gc-läge"
 
-#: builtin/log.c:1263
-msgid "attach the patch"
-msgstr "bifoga patchen"
+#: builtin/gc.c:331
+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/log.c:1266
-msgid "inline the patch"
-msgstr "gör patchen ett inline-objekt"
+#: builtin/gc.c:373
+#, 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/log.c:1270
-msgid "enable message threading, styles: shallow, deep"
-msgstr "aktivera brevtrådning, typer: shallow, deep"
+#: builtin/gc.c:375
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
 
-#: builtin/log.c:1272
-msgid "signature"
-msgstr "signatur"
+#: builtin/gc.c:376
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Se \"git help gc\" för manuell hushållning.\n"
 
-#: builtin/log.c:1273
-msgid "add a signature"
-msgstr "lägg till signatur"
+#: builtin/gc.c:397
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+msgstr ""
+"gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
+"är fallet)"
 
-#: builtin/log.c:1275
-msgid "add a signature from a file"
-msgstr "lägg till signatur från fil"
+#: builtin/gc.c:441
+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/log.c:1276
-msgid "don't print the patch filenames"
-msgstr "visa inte filnamn för patchar"
+#: builtin/grep.c:23
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [<flaggor>] [-e] <mönster> [<rev>...] [[--] <sökväg>...]"
 
-#: builtin/log.c:1365
-msgid "-n and -k are mutually exclusive."
-msgstr "-n och -k kan inte användas samtidigt."
+#: builtin/grep.c:219
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr "grep: misslyckades skapa tråd. %s"
 
-#: builtin/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix och -k kan inte användas samtidigt."
+#: builtin/grep.c:277
+#, c-format
+msgid "invalid number of threads specified (%d) for %s"
+msgstr "felaktigt antal trådar angivet (%d) för %s"
 
-#: builtin/log.c:1375
-msgid "--name-only does not make sense"
-msgstr "kan inte använda --name-only"
-
-#: builtin/log.c:1377
-msgid "--name-status does not make sense"
-msgstr "kan inte använda --name-status"
-
-#: builtin/log.c:1379
-msgid "--check does not make sense"
-msgstr "kan inte använda --check"
-
-#: builtin/log.c:1407
-msgid "standard output, or directory, which one?"
-msgstr "standard ut, eller katalog, vilken skall det vara?"
+#: builtin/grep.c:453 builtin/grep.c:488
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr "kunde inte läsa träd (%s)"
 
-#: builtin/log.c:1409
+#: builtin/grep.c:503
 #, c-format
-msgid "Could not create directory '%s'"
-msgstr "Kunde inte skapa katalogen \"%s\""
+msgid "unable to grep from object of type %s"
+msgstr "Kunde inte \"grep\" från objekt av typen %s"
 
-#: builtin/log.c:1506
+#: builtin/grep.c:561
 #, c-format
-msgid "unable to read signature file '%s'"
-msgstr "kunde inte läsa signaturfil \"%s\""
+msgid "switch `%c' expects a numerical value"
+msgstr "flaggan \"%c\" antar ett numeriskt värde"
 
-#: builtin/log.c:1569
-msgid "Failed to create output files"
-msgstr "Misslyckades skapa utdatafiler"
+#: builtin/grep.c:647
+msgid "search in index instead of in the work tree"
+msgstr "sök i indexet istället för i arbetskatalogen"
 
-#: builtin/log.c:1617
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
+#: builtin/grep.c:649
+msgid "find in contents not managed by git"
+msgstr "sök i innehåll som inte hanteras av git"
 
-#: builtin/log.c:1671
-#, 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/grep.c:651
+msgid "search in both tracked and untracked files"
+msgstr "sök i både spårade och ospårade filer"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "Okänd incheckning %s"
+#: builtin/grep.c:653
+msgid "ignore files specified via '.gitignore'"
+msgstr "ignorera filer angivna i \".gitignore\""
 
-#: builtin/ls-files.c:378
-msgid "git ls-files [<options>] [<file>...]"
-msgstr "git ls-files [<flaggor>] [<fil>...]"
+#: builtin/grep.c:656
+msgid "show non-matching lines"
+msgstr "visa rader som inte träffas"
 
-#: builtin/ls-files.c:427
-msgid "identify the file status with tags"
-msgstr "identifiera filstatus med taggar"
+#: builtin/grep.c:658
+msgid "case insensitive matching"
+msgstr "skiftlägesokänslig sökning"
 
-#: builtin/ls-files.c:429
-msgid "use lowercase letters for 'assume unchanged' files"
-msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
+#: builtin/grep.c:660
+msgid "match patterns only at word boundaries"
+msgstr "matcha endast mönster vid ordgränser"
 
-#: builtin/ls-files.c:431
-msgid "show cached files in the output (default)"
-msgstr "visa cachade filer i utdata (standard)"
+#: builtin/grep.c:662
+msgid "process binary files as text"
+msgstr "hantera binärfiler som text"
 
-#: builtin/ls-files.c:433
-msgid "show deleted files in the output"
-msgstr "visa borttagna filer i utdata"
+#: builtin/grep.c:664
+msgid "don't match patterns in binary files"
+msgstr "träffa inte mönster i binärfiler"
 
-#: builtin/ls-files.c:435
-msgid "show modified files in the output"
-msgstr "visa modifierade filer i utdata"
+#: builtin/grep.c:667
+msgid "process binary files with textconv filters"
+msgstr "hantera binärfiler med textconv-filter"
 
-#: builtin/ls-files.c:437
-msgid "show other files in the output"
-msgstr "visa andra filer i utdata"
+#: builtin/grep.c:669
+msgid "descend at most <depth> levels"
+msgstr "gå som mest ned <djup> nivåer"
 
-#: builtin/ls-files.c:439
-msgid "show ignored files in the output"
-msgstr "visa ignorerade filer i utdata"
+#: builtin/grep.c:673
+msgid "use extended POSIX regular expressions"
+msgstr "använd utökade POSIX-reguljära uttryck"
 
-#: builtin/ls-files.c:442
-msgid "show staged contents' object name in the output"
-msgstr "visa köat innehålls objektnamn i utdata"
+#: builtin/grep.c:676
+msgid "use basic POSIX regular expressions (default)"
+msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
 
-#: builtin/ls-files.c:444
-msgid "show files on the filesystem that need to be removed"
-msgstr "visa filer i filsystemet som behöver tas bort"
+#: builtin/grep.c:679
+msgid "interpret patterns as fixed strings"
+msgstr "tolka mönster som fixerade strängar"
 
-#: builtin/ls-files.c:446
-msgid "show 'other' directories' names only"
-msgstr "visa endast namn för \"andra\" kataloger"
+#: builtin/grep.c:682
+msgid "use Perl-compatible regular expressions"
+msgstr "använd Perlkompatibla reguljära uttryck"
 
-#: builtin/ls-files.c:448
-msgid "show line endings of files"
-msgstr "visa radslut i filer"
+#: builtin/grep.c:685
+msgid "show line numbers"
+msgstr "visa radnummer"
 
-#: builtin/ls-files.c:450
-msgid "don't show empty directories"
-msgstr "visa inte tomma kataloger"
+#: builtin/grep.c:686
+msgid "don't show filenames"
+msgstr "visa inte filnamn"
 
-#: builtin/ls-files.c:453
-msgid "show unmerged files in the output"
-msgstr "visa ej sammanslagna filer i utdata"
+#: builtin/grep.c:687
+msgid "show filenames"
+msgstr "visa filnamn"
 
-#: builtin/ls-files.c:455
-msgid "show resolve-undo information"
-msgstr "visa \"resolve-undo\"-information"
+#: builtin/grep.c:689
+msgid "show filenames relative to top directory"
+msgstr "visa filnamn relativa till toppkatalogen"
 
-#: builtin/ls-files.c:457
-msgid "skip files matching pattern"
-msgstr "hoppa över filer som motsvarar mönster"
+#: builtin/grep.c:691
+msgid "show only filenames instead of matching lines"
+msgstr "visa endast filnamn istället för träffade rader"
 
-#: builtin/ls-files.c:460
-msgid "exclude patterns are read from <file>"
-msgstr "exkludera mönster som läses från <fil>"
+#: builtin/grep.c:693
+msgid "synonym for --files-with-matches"
+msgstr "synonym för --files-with-matches"
 
-#: builtin/ls-files.c:463
-msgid "read additional per-directory exclude patterns in <file>"
-msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
+#: builtin/grep.c:696
+msgid "show only the names of files without match"
+msgstr "visa endast namn på filer utan träffar"
 
-#: builtin/ls-files.c:465
-msgid "add the standard git exclusions"
-msgstr "lägg till git:s standardexkluderingar"
+#: builtin/grep.c:698
+msgid "print NUL after filenames"
+msgstr "skriv NUL efter filnamn"
 
-#: builtin/ls-files.c:468
-msgid "make the output relative to the project top directory"
-msgstr "gör utdata relativ till projektets toppkatalog"
+#: builtin/grep.c:700
+msgid "show the number of matches instead of matching lines"
+msgstr "visa antal träffar istället för träffade rader"
 
-#: builtin/ls-files.c:471
-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/grep.c:701
+msgid "highlight matches"
+msgstr "ljusmarkera träffar"
 
-#: builtin/ls-files.c:472
-msgid "tree-ish"
-msgstr "träd-igt"
+#: builtin/grep.c:703
+msgid "print empty line between matches from different files"
+msgstr "skriv tomma rader mellan träffar från olika filer"
 
-#: builtin/ls-files.c:473
-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/grep.c:705
+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/ls-files.c:475
-msgid "show debugging data"
-msgstr "visa felsökningsutdata"
+#: builtin/grep.c:708
+msgid "show <n> context lines before and after matches"
+msgstr "visa <n> rader sammanhang före och efter träffar"
 
-#: 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=<exec>]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [<arkiv> [<referenser>...]]"
+#: builtin/grep.c:711
+msgid "show <n> context lines before matches"
+msgstr "visa <n> rader sammanhang före träffar"
 
-#: builtin/ls-remote.c:50
-msgid "do not print remote URL"
-msgstr "visa inte fjärr-URL"
+#: builtin/grep.c:713
+msgid "show <n> context lines after matches"
+msgstr "visa <n> rader sammanhang efter träffar"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
-msgid "exec"
-msgstr "exec"
+#: builtin/grep.c:715
+msgid "use <n> worker threads"
+msgstr "använd <n> jobbtrådar"
 
-#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
-msgid "path of git-upload-pack on the remote host"
-msgstr "sökväg till git-upload-pack på fjärren"
+#: builtin/grep.c:716
+msgid "shortcut for -C NUM"
+msgstr "genväg för -C NUM"
 
-#: builtin/ls-remote.c:56
-msgid "limit to tags"
-msgstr "begränsa till taggar"
+#: builtin/grep.c:719
+msgid "show a line with the function name before matches"
+msgstr "visa en rad med funktionsnamnet före träffen"
 
-#: builtin/ls-remote.c:57
-msgid "limit to heads"
-msgstr "begränsa till huvuden"
+#: builtin/grep.c:721
+msgid "show the surrounding function"
+msgstr "visa den omkringliggande funktionen"
 
-#: builtin/ls-remote.c:58
-msgid "do not show peeled tags"
-msgstr "visa inte avskalade taggar"
+#: builtin/grep.c:724
+msgid "read patterns from file"
+msgstr "läs mönster från fil"
 
-#: builtin/ls-remote.c:60
-msgid "take url.<base>.insteadOf into account"
-msgstr "ta hänsyn till url.<bas>.insteadOf"
+#: builtin/grep.c:726
+msgid "match <pattern>"
+msgstr "träffa <mönster>"
 
-#: builtin/ls-remote.c:62
-msgid "exit with exit code 2 if no matching refs are found"
-msgstr "avsluta med felkod 2 om motsvarande referenser inte hittas"
+#: builtin/grep.c:728
+msgid "combine patterns specified with -e"
+msgstr "kombinera mönster som anges med -e"
 
-#: builtin/ls-remote.c:64
-msgid "show underlying ref in addition to the object pointed by it"
-msgstr "visa underliggande referens och objektet det pekar på"
+#: builtin/grep.c:740
+msgid "indicate hit with exit status without output"
+msgstr "ange träff med slutstatuskod utan utdata"
 
-#: builtin/ls-tree.c:28
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]"
+#: builtin/grep.c:742
+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/ls-tree.c:128
-msgid "only show trees"
-msgstr "visa endast träd"
+#: builtin/grep.c:744
+msgid "show parse tree for grep expression"
+msgstr "visa analysträd för grep-uttryck"
 
-#: builtin/ls-tree.c:130
-msgid "recurse into subtrees"
-msgstr "rekursera ner i underträd"
+#: builtin/grep.c:748
+msgid "pager"
+msgstr "bläddrare"
 
-#: builtin/ls-tree.c:132
-msgid "show trees when recursing"
-msgstr "visa träd medan rekursering"
+#: builtin/grep.c:748
+msgid "show matching files in the pager"
+msgstr "visa träffade filer i filbläddraren"
 
-#: builtin/ls-tree.c:135
-msgid "terminate entries with NUL byte"
-msgstr "terminera poster med NUL-byte"
+#: builtin/grep.c:751
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
 
-#: builtin/ls-tree.c:136
-msgid "include object size"
-msgstr "inkludera objektstorlek"
+#: builtin/grep.c:814
+msgid "no pattern given."
+msgstr "inget mönster angavs."
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
-msgid "list only filenames"
-msgstr "visa endast filnamn"
+#: builtin/grep.c:846 builtin/index-pack.c:1480
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "felaktigt antal trådar angivet (%d)"
 
-#: builtin/ls-tree.c:143
-msgid "use full path names"
-msgstr "använd fullständiga sökvägsnamn"
+#: builtin/grep.c:876
+msgid "--open-files-in-pager only works on the worktree"
+msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/ls-tree.c:145
-msgid "list entire tree; not just current directory (implies --full-name)"
-msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
+#: builtin/grep.c:902
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/merge.c:45
-msgid "git merge [<options>] [<commit>...]"
-msgstr "git merge [<flaggor>] [<incheckning>...]"
+#: builtin/grep.c:907
+msgid "--no-index or --untracked cannot be used with revs."
+msgstr "--no-index och --untracked kan inte användas med revisioner."
 
-#: builtin/merge.c:46
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<flaggor>] <meddelande> HEAD <incheckning>"
+#: builtin/grep.c:910
+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/merge.c:47
-msgid "git merge --abort"
-msgstr "git merge --abort"
+#: builtin/grep.c:918
+msgid "both --cached and trees are given."
+msgstr "både --cached och träd angavs."
 
-#: builtin/merge.c:100
-msgid "switch `m' requires a value"
-msgstr "flaggan \"m\" behöver ett värde"
+#: builtin/hash-object.c:81
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
+msgstr ""
+"git hash-object [-t <typ>] [-w] [--path=<fil> | --no-filters] [--stdin] [--] "
+"<fil>..."
 
-#: builtin/merge.c:137
-#, c-format
-msgid "Could not find merge strategy '%s'.\n"
-msgstr "Kunde inte hitta sammanslagningsstrategin \"%s\".\n"
+#: builtin/hash-object.c:82
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/merge.c:138
-#, c-format
-msgid "Available strategies are:"
-msgstr "Tillgängliga strategier är:"
+#: builtin/hash-object.c:94
+msgid "type"
+msgstr "typ"
 
-#: builtin/merge.c:143
-#, c-format
-msgid "Available custom strategies are:"
-msgstr "Tillgängliga skräddarsydda strategier är:"
+#: builtin/hash-object.c:94
+msgid "object type"
+msgstr "objekttyp"
 
-#: builtin/merge.c:193 builtin/pull.c:123
-msgid "do not show a diffstat at the end of the merge"
-msgstr "visa inte en diffstat när sammanslagningen är färdig"
+#: builtin/hash-object.c:95
+msgid "write the object into the object database"
+msgstr "skriv objektet till objektdatabasen"
 
-#: builtin/merge.c:196 builtin/pull.c:126
-msgid "show a diffstat at the end of the merge"
-msgstr "visa en diffstat när sammanslagningen är färdig"
+#: builtin/hash-object.c:97
+msgid "read the object from stdin"
+msgstr "läs objektet från standard in"
 
-#: builtin/merge.c:197 builtin/pull.c:129
-msgid "(synonym to --stat)"
-msgstr "(synonym till --stat)"
+#: builtin/hash-object.c:99
+msgid "store file as is without filters"
+msgstr "spara filen som den är utan filer"
 
-#: builtin/merge.c:199 builtin/pull.c:132
-msgid "add (at most <n>) entries from shortlog to merge commit message"
+#: builtin/hash-object.c:100
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
 msgstr ""
-"lägg till (som mest <n>) poster från shortlog till incheckningsmeddelandet"
+"hasha slumpmässigt skräp för att skapa korrupta objekt för felsökning av Git"
 
-#: builtin/merge.c:202 builtin/pull.c:135
-msgid "create a single commit instead of doing a merge"
-msgstr "skapa en ensam incheckning istället för en sammanslagning"
+#: 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/merge.c:204 builtin/pull.c:138
-msgid "perform a commit if the merge succeeds (default)"
-msgstr "utför en incheckning om sammanslagningen lyckades (standard)"
+#: builtin/help.c:42
+msgid "print all available commands"
+msgstr "visa alla tillgängliga kommandon"
 
-#: builtin/merge.c:206 builtin/pull.c:141
-msgid "edit message before committing"
-msgstr "redigera meddelande innan incheckning"
+#: builtin/help.c:43
+msgid "exclude guides"
+msgstr "uteslut vägledningar"
 
-#: builtin/merge.c:207
-msgid "allow fast-forward (default)"
-msgstr "tillåt snabbspolning (standard)"
+#: builtin/help.c:44
+msgid "print list of useful guides"
+msgstr "lista användbara vägledningar"
 
-#: builtin/merge.c:209 builtin/pull.c:147
-msgid "abort if fast-forward is not possible"
-msgstr "avbryt om snabbspolning inte är möjlig"
+#: builtin/help.c:45
+msgid "show man page"
+msgstr "visa manualsida"
 
-#: builtin/merge.c:213
-msgid "Verify that the named commit has a valid GPG signature"
-msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
+#: builtin/help.c:46
+msgid "show manual in web browser"
+msgstr "visa manual i webbläsare"
 
-#: builtin/merge.c:214 builtin/notes.c:770 builtin/pull.c:152
-#: builtin/revert.c:89
-msgid "strategy"
-msgstr "strategi"
+#: builtin/help.c:48
+msgid "show info page"
+msgstr "visa info-sida"
 
-#: builtin/merge.c:215 builtin/pull.c:153
-msgid "merge strategy to use"
-msgstr "sammanslagningsstrategi att använda"
+#: builtin/help.c:54
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+msgstr "git help [--all] [--guides] [--man | --web | --info] [<kommando>]"
 
-#: builtin/merge.c:216 builtin/pull.c:156
-msgid "option=value"
-msgstr "alternativ=värde"
+#: builtin/help.c:66
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "okänt hjälpformat: %s"
 
-#: builtin/merge.c:217 builtin/pull.c:157
-msgid "option for selected merge strategy"
-msgstr "alternativ för vald sammanslagningsstrategi"
+#: builtin/help.c:93
+msgid "Failed to start emacsclient."
+msgstr "Misslyckades starta emacsclient."
 
-#: builtin/merge.c:219
-msgid "merge commit message (for a non-fast-forward merge)"
-msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning"
+#: builtin/help.c:106
+msgid "Failed to parse emacsclient version."
+msgstr "Kunde inte tolka emacsclient-version."
 
-#: builtin/merge.c:223
-msgid "abort the current in-progress merge"
-msgstr "avbryt den pågående sammanslagningen"
+#: builtin/help.c:114
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "emacsclient version \"%d\" för gammal (< 22)."
 
-#: builtin/merge.c:251
-msgid "could not run stash."
-msgstr "kunde köra stash."
+#: 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/merge.c:256
-msgid "stash failed"
-msgstr "stash misslyckades"
+#: builtin/help.c:207
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
+msgstr ""
+"\"%s\": sökväg för man-visare som ej stöds.\n"
+"Använd \"man.<verktyg>.cmd\" istället."
 
-#: builtin/merge.c:261
+#: builtin/help.c:219
 #, c-format
-msgid "not a valid object: %s"
-msgstr "inte ett giltigt objekt: %s"
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"\"%s\": kommando för man-visare som stöds.\n"
+"Använd \"man.<verktyg>.path\" istället."
 
-#: builtin/merge.c:280 builtin/merge.c:297
-msgid "read-tree failed"
-msgstr "read-tree misslyckades"
+#: builtin/help.c:336
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "\"%s\": okänd man-visare."
 
-#: builtin/merge.c:327
-msgid " (nothing to squash)"
-msgstr " (inget att platta till)"
+#: builtin/help.c:353
+msgid "no man viewer handled the request"
+msgstr "ingen man-visare hanterade förfrågan"
 
-#: builtin/merge.c:340
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr "Tillplattningsincheckning -- uppdaterar inte HEAD\n"
+#: builtin/help.c:361
+msgid "no info viewer handled the request"
+msgstr "ingen info-visare hanterade förfrågan"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Kunde inte skriva till \"%s\""
+#: builtin/help.c:403
+msgid "Defining attributes per path"
+msgstr "Definierar attribut per sökväg"
 
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Skriver SQUASH_MSG"
+#: builtin/help.c:404
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "Git för dagligt bruk i ungefär 20 kommandon"
 
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Avslutar SQUASH_MSG"
+#: builtin/help.c:405
+msgid "A Git glossary"
+msgstr "En Git-ordlista"
 
-#: builtin/merge.c:397
-#, c-format
-msgid "No merge message -- not updating HEAD\n"
-msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n"
+#: builtin/help.c:406
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "Ange avsiktligen ospårade filer att ignorera"
 
-#: builtin/merge.c:448
-#, c-format
-msgid "'%s' does not point to a commit"
-msgstr "\"%s\" verkar inte peka på en incheckning"
+#: builtin/help.c:407
+msgid "Defining submodule properties"
+msgstr "Ange egenskaper för undermoduler"
 
-#: builtin/merge.c:538
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
+#: builtin/help.c:408
+msgid "Specifying revisions and ranges for Git"
+msgstr "Ange versioner och intervall i Git"
 
-#: builtin/merge.c:657
-msgid "Not handling anything other than two heads merge."
-msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
+#: 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/merge.c:671
-#, c-format
-msgid "Unknown option for merge-recursive: -X%s"
-msgstr "Felaktig flagga för merge-recursive: -X%s"
+#: builtin/help.c:410
+msgid "An overview of recommended workflows with Git"
+msgstr "Översikt över rekommenderade arbetsflöden med Git"
 
-#: builtin/merge.c:684
-#, c-format
-msgid "unable to write %s"
-msgstr "kunde inte skriva %s"
+#: builtin/help.c:422
+msgid "The common Git guides are:\n"
+msgstr "De vanliga Git-vägledningarna är:\n"
 
-#: builtin/merge.c:773
+#: builtin/help.c:440
 #, c-format
-msgid "Could not read from '%s'"
-msgstr "Kunde inte läsa från \"%s\""
+msgid "`git %s' is aliased to `%s'"
+msgstr "\"git %s\" är ett alias för \"%s\""
 
-#: builtin/merge.c:782
+#: builtin/help.c:462 builtin/help.c:479
 #, 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"
+msgid "usage: %s%s"
+msgstr "användning: %s%s"
 
-#: builtin/merge.c:788
+#: builtin/index-pack.c:154
 #, 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 ""
-"Ange ett incheckningsmeddelande för att förklara varför sammanslagningen\n"
-"är nödvändig, speciellt om den slår in en uppdaterad uppström i en\n"
-"temagren.\n"
-"\n"
-"Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
-"avbryter incheckningen.\n"
+msgid "unable to open %s"
+msgstr "kunde inte öppna %s"
 
-#: builtin/merge.c:812
-msgid "Empty commit message."
-msgstr "Tomt incheckningsmeddelande."
+#: builtin/index-pack.c:204
+#, c-format
+msgid "object type mismatch at %s"
+msgstr "objekttyp stämmer inte överens vid %s"
 
-#: builtin/merge.c:824
+#: builtin/index-pack.c:224
 #, c-format
-msgid "Wonderful.\n"
-msgstr "Underbart.\n"
+msgid "did not receive expected object %s"
+msgstr "emottog inte det förväntade objektet %s"
 
-#: builtin/merge.c:879
+#: builtin/index-pack.c:227
 #, 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"
+msgid "object %s: expected type %s, found %s"
+msgstr "objektet %s: förväntad typ %s, såg %s"
 
-#: builtin/merge.c:895
+#: builtin/index-pack.c:269
 #, c-format
-msgid "'%s' is not a commit"
-msgstr "\"%s\" är inte en incheckning"
+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/merge.c:936
-msgid "No current branch."
-msgstr "Inte på någon gren."
+#: builtin/index-pack.c:279
+msgid "early EOF"
+msgstr "tidigt filslut"
 
-#: builtin/merge.c:938
-msgid "No remote for the current branch."
-msgstr "Ingen fjärr för aktuell gren."
+#: builtin/index-pack.c:280
+msgid "read error on input"
+msgstr "indataläsfel"
 
-#: builtin/merge.c:940
-msgid "No default upstream defined for the current branch."
-msgstr "Ingen standarduppström angiven för aktuell gren."
+#: builtin/index-pack.c:292
+msgid "used more bytes than were available"
+msgstr "använde fler byte än tillgängligt"
+
+#: 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:302 builtin/unpack-objects.c:92
+msgid "pack exceeds maximum allowed size"
+msgstr "paket är större än tillåten maximal storlek"
 
-#: builtin/merge.c:945
+#: builtin/index-pack.c:317
 #, c-format
-msgid "No remote-tracking branch for %s from %s"
-msgstr "Ingen fjärrspårande gren för %s från %s"
+msgid "unable to create '%s'"
+msgstr "kunde inte skapa \"%s\""
 
-#: builtin/merge.c:1080
+#: builtin/index-pack.c:322
 #, c-format
-msgid "could not close '%s'"
-msgstr "kunde inte stänga \"%s\""
+msgid "cannot open packfile '%s'"
+msgstr "kan inte öppna paketfilen \"%s\""
 
-#: builtin/merge.c:1207
-msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
+#: builtin/index-pack.c:336
+msgid "pack signature mismatch"
+msgstr "paketsignatur stämmer inte överens"
 
-#: builtin/merge.c:1223
-msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-"Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
-"Checka in dina ändringar innan du slår ihop."
+#: builtin/index-pack.c:338
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "paketversion %<PRIu32> stöds ej"
 
-#: builtin/merge.c:1230
-msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
-msgstr ""
-"Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
-"Checka in dina ändringar innan du slår ihop."
+#: builtin/index-pack.c:356
+#, c-format
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "paketet har felaktigt objekt vid index %<PRIuMAX>: %s"
 
-#: builtin/merge.c:1233
-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/index-pack.c:478
+#, c-format
+msgid "inflate returned %d"
+msgstr "inflate returnerade %d"
 
-#: builtin/merge.c:1242
-msgid "You cannot combine --squash with --no-ff."
-msgstr "Du kan inte kombinera --squash med --no-ff."
+#: builtin/index-pack.c:527
+msgid "offset value overflow for delta base object"
+msgstr "indexvärdespill för deltabasobjekt"
 
-#: builtin/merge.c:1250
-msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
+#: builtin/index-pack.c:535
+msgid "delta base offset is out of bound"
+msgstr "deltabasindex utanför gränsen"
 
-#: builtin/merge.c:1267
-msgid "Squash commit into empty head not supported yet"
-msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
+#: builtin/index-pack.c:543
+#, c-format
+msgid "unknown object type %d"
+msgstr "okänd objekttyp %d"
 
-#: builtin/merge.c:1269
-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/index-pack.c:574
+msgid "cannot pread pack file"
+msgstr "kan inte utföra \"pread\" på paketfil"
 
-#: builtin/merge.c:1275
+#: builtin/index-pack.c:576
 #, c-format
-msgid "%s - not something we can merge"
-msgstr "%s - inte något vi kan slå ihop"
+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/merge.c:1277
-msgid "Can merge only exactly one commit into empty head"
-msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud."
+#: builtin/index-pack.c:602
+msgid "serious inflate inconsistency"
+msgstr "allvarlig inflate-inkonsekvens"
 
-#: builtin/merge.c:1332
+#: 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 "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."
+msgid "SHA1 COLLISION FOUND WITH %s !"
+msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
 
-#: builtin/merge.c:1335
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
 #, 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."
+msgid "unable to read %s"
+msgstr "kunde inte läsa %s"
 
-#: builtin/merge.c:1338
+#: builtin/index-pack.c:817
 #, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr "Incheckning %s har inte någon GPG-signatur."
+msgid "cannot read existing object %s"
+msgstr "kan inte läsa befintligt objekt %s"
 
-#: builtin/merge.c:1341
+#: builtin/index-pack.c:831
 #, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
+msgid "invalid blob object %s"
+msgstr "ogiltigt blob-objekt %s"
 
-#: builtin/merge.c:1424
+#: builtin/index-pack.c:845
 #, c-format
-msgid "Updating %s..%s\n"
-msgstr "Uppdaterar %s..%s\n"
+msgid "invalid %s"
+msgstr "ogiltigt %s"
 
-#: builtin/merge.c:1461
-#, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
+#: builtin/index-pack.c:848
+msgid "Error in object"
+msgstr "Fel i objekt"
 
-#: builtin/merge.c:1468
+#: builtin/index-pack.c:850
 #, c-format
-msgid "Nope.\n"
-msgstr "Nej.\n"
+msgid "Not all child objects of %s are reachable"
+msgstr "Inte alla barnobjekt för %s kan nås"
 
-#: builtin/merge.c:1500
-msgid "Not possible to fast-forward, aborting."
-msgstr "Kan inte snabbspola, avbryter."
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
+msgid "failed to apply delta"
+msgstr "misslyckades tillämpa delta"
+
+#: builtin/index-pack.c:1123
+msgid "Receiving objects"
+msgstr "Tar emot objekt"
+
+#: builtin/index-pack.c:1123
+msgid "Indexing objects"
+msgstr "Skapar index för objekt"
+
+#: builtin/index-pack.c:1155
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "paketet är trasigt (SHA1 stämmer inte)"
+
+#: builtin/index-pack.c:1160
+msgid "cannot fstat packfile"
+msgstr "kan inte utföra \"fstat\" på paketfil"
+
+#: builtin/index-pack.c:1163
+msgid "pack has junk at the end"
+msgstr "paket har skräp i slutet"
+
+#: builtin/index-pack.c:1174
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr "förvirrad bortom vanvett i parse_pack_objects()"
+
+#: builtin/index-pack.c:1197
+msgid "Resolving deltas"
+msgstr "Analyserar delta"
 
-#: builtin/merge.c:1523 builtin/merge.c:1602
+#: builtin/index-pack.c:1208
 #, c-format
-msgid "Rewinding the tree to pristine...\n"
-msgstr "Återspolar trädet till orört...\n"
+msgid "unable to create thread: %s"
+msgstr "kunde inte skapa tråd: %s"
 
-#: builtin/merge.c:1527
+#: builtin/index-pack.c:1250
+msgid "confusion beyond insanity"
+msgstr "förvirrad bortom vanvett"
+
+#: builtin/index-pack.c:1256
 #, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr "Försöker sammanslagningsstrategin %s...\n"
+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/merge.c:1593
+#: builtin/index-pack.c:1268
 #, c-format
-msgid "No merge strategy handled the merge.\n"
-msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr "Oväntad svanschecksumma för %s (trasig disk?)"
 
-#: builtin/merge.c:1595
+#: builtin/index-pack.c:1272
 #, c-format
-msgid "Merge with strategy %s failed.\n"
-msgstr "Sammanslagning med strategin %s misslyckades.\n"
+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/merge.c:1604
+#: builtin/index-pack.c:1296
 #, 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"
+msgid "unable to deflate appended object (%d)"
+msgstr "kunde inte utföra \"deflate\" på tillagt objekt (%d)"
 
-#: builtin/merge.c:1616
+#: builtin/index-pack.c:1372
 #, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr ""
-"Automatisk sammanslagning lyckades; stoppar före incheckning som önskat\n"
+msgid "local object %s is corrupt"
+msgstr "lokalt objekt %s är trasigt"
 
-#: builtin/merge-base.c:29
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr "git merge-base [-a | --all] <incheckning> <incheckning>..."
+#: builtin/index-pack.c:1396
+msgid "error while closing pack file"
+msgstr "fel vid stängning av paketfil"
 
-#: builtin/merge-base.c:30
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr "git merge-base [-a | --all] --octopus <incheckning>..."
+#: builtin/index-pack.c:1409
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr "kan inte ta skriva \"keep\"-fil \"%s\""
 
-#: builtin/merge-base.c:31
-msgid "git merge-base --independent <commit>..."
-msgstr "git merge-base --independent <incheckning>..."
+#: builtin/index-pack.c:1417
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr "akn inte stänga skriven \"keep\"-fil \"%s\""
 
-#: builtin/merge-base.c:32
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr "git merge-base --is-ancestor <incheckning> <incheckning>"
+#: builtin/index-pack.c:1430
+msgid "cannot store pack file"
+msgstr "kan inte spara paketfil"
 
-#: builtin/merge-base.c:33
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr "git merge-base --fork-point <ref> <incheckning>"
+#: builtin/index-pack.c:1441
+msgid "cannot store index file"
+msgstr "kan inte spara indexfil"
 
-#: builtin/merge-base.c:214
-msgid "output all common ancestors"
-msgstr "skriv ut alla gemensamma anfäder"
+#: builtin/index-pack.c:1474
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "felaktig pack.indexversion=%<PRIu32>"
 
-#: builtin/merge-base.c:216
-msgid "find ancestors for a single n-way merge"
-msgstr "hitta anfader för enkel n-vägssammanslagning"
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "trådstöd saknas, ignorerar %s"
 
-#: builtin/merge-base.c:218
-msgid "list revs not reachable from others"
-msgstr "visa revisioner som inte kan nås från andra"
+#: builtin/index-pack.c:1542
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "Kan inte öppna befintlig paketfil \"%s\""
 
-#: builtin/merge-base.c:220
-msgid "is the first one ancestor of the other?"
-msgstr "är den första anfader till den andra?"
+#: builtin/index-pack.c:1544
+#, c-format
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr "Kan inte öppna befintlig paket-idx-fil för \"%s\""
 
-#: builtin/merge-base.c:222
-msgid "find where <commit> forked from reflog of <ref>"
-msgstr "se var <incheckning> grenades av från referensloggen från <ref>"
+#: builtin/index-pack.c:1591
+#, 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/merge-file.c:8
-msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
-msgstr ""
-"git merge-file [<alternativ>] [-L <namn1> [-L <orig> [-L <namn2>]]] <fil1> "
-"<origfil> <fil2>"
+#: builtin/index-pack.c:1598
+#, 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/merge-file.c:33
-msgid "send results to standard output"
-msgstr "sänd resultat till standard ut"
+#: builtin/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\""
 
-#: builtin/merge-file.c:34
-msgid "use a diff3 based merge"
-msgstr "använd diff3-baserad sammanslagning"
+#: 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 "felaktig %s"
 
-#: builtin/merge-file.c:35
-msgid "for conflicts, use our version"
-msgstr "för konflikter, använd vår version"
+#: builtin/index-pack.c:1732
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "--fix-thin kan inte användas med --stdin"
 
-#: builtin/merge-file.c:37
-msgid "for conflicts, use their version"
-msgstr "för konflikter, använd deras version"
+#: builtin/index-pack.c:1740
+msgid "--verify with no packfile name given"
+msgstr "--verify angavs utan paketfilnamn"
 
-#: builtin/merge-file.c:39
-msgid "for conflicts, use a union version"
-msgstr "för konflikter, använd en förenad version"
+#: builtin/init-db.c:54
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "kan inte ta status på \"%s\""
 
-#: builtin/merge-file.c:42
-msgid "for conflicts, use this marker size"
-msgstr "för konflikter, använd denna markörstorlek"
+#: builtin/init-db.c:60
+#, c-format
+msgid "cannot stat template '%s'"
+msgstr "kan inte ta status på mallen \"%s\""
 
-#: builtin/merge-file.c:43
-msgid "do not warn about conflicts"
-msgstr "varna inte om konflikter"
+#: builtin/init-db.c:65
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr "kan inte öppna katalogen (opendir) \"%s\""
 
-#: builtin/merge-file.c:45
-msgid "set labels for file1/orig-file/file2"
-msgstr "sätt etiketter för fil1/origfil/fil2"
+#: builtin/init-db.c:76
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr "kan inte läsa länk (readlink) \"%s\""
 
-#: builtin/mktree.c:65
-msgid "git mktree [-z] [--missing] [--batch]"
-msgstr "git mktree [-z] [--missing] [--batch]"
+#: builtin/init-db.c:78
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr "kan inte skapa symbolisk länk \"%s\" \"%s\""
 
-#: builtin/mktree.c:152
-msgid "input is NUL terminated"
-msgstr "indata är NUL-terminerad"
+#: builtin/init-db.c:84
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr "kan inte kopiera \"%s\" till \"%s\""
 
-#: builtin/mktree.c:153 builtin/write-tree.c:24
-msgid "allow missing objects"
-msgstr "tillåt saknade objekt"
+#: builtin/init-db.c:88
+#, c-format
+msgid "ignoring template %s"
+msgstr "ignorerar mallen %s"
 
-#: builtin/mktree.c:154
-msgid "allow creation of more than one tree"
-msgstr "tillåt skapa mer än ett träd"
+#: builtin/init-db.c:119
+#, c-format
+msgid "templates not found %s"
+msgstr "mallarna hittades inte %s"
 
-#: builtin/mv.c:15
-msgid "git mv [<options>] <source>... <destination>"
-msgstr "git mv [<flaggor>] <källa>... <mål>"
+#: builtin/init-db.c:134
+#, c-format
+msgid "not copying templates from '%s': %s"
+msgstr "kopierade inte mallar från \"%s\": %s"
 
-#: builtin/mv.c:70
+#: builtin/init-db.c:327
 #, c-format
-msgid "Directory %s is in index and no submodule?"
-msgstr "Katalogen %s är i indexet och inte en undermodul?"
+msgid "unable to handle file type %d"
+msgstr "kan inte hantera filtyp %d"
 
-#: builtin/mv.c:72
-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/init-db.c:330
+#, c-format
+msgid "unable to move %s to %s"
+msgstr "kan inte flytta %s till %s"
 
-#: builtin/mv.c:90
+#: builtin/init-db.c:347 builtin/init-db.c:350
 #, c-format
-msgid "%.*s is in index"
-msgstr "%.*s är i indexet"
+msgid "%s already exists"
+msgstr "%s finns redan"
 
-#: builtin/mv.c:112
-msgid "force move/rename even if target exists"
-msgstr "tvinga flytta/ändra namn även om målet finns"
+#: 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/mv.c:113
-msgid "skip move/rename errors"
-msgstr "hoppa över fel vid flytt/namnändring"
+#: 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/mv.c:152
+#: builtin/init-db.c:408
 #, c-format
-msgid "destination '%s' is not a directory"
-msgstr "destinationen \"%s\" är ingen katalog"
+msgid "Initialized empty shared Git repository in %s%s\n"
+msgstr "Initierade tomt delat Git-arkiv i %s%s\n"
 
-#: builtin/mv.c:163
+#: builtin/init-db.c:409
 #, c-format
-msgid "Checking rename of '%s' to '%s'\n"
-msgstr "Kontrollerar namnbyte av \"%s\" till \"%s\"\n"
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "Initierade tomt Git-arkiv i %s%s\n"
 
-#: builtin/mv.c:167
-msgid "bad source"
-msgstr "felaktig källa"
+#: builtin/init-db.c:457
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
+msgstr ""
+"git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--"
+"shared[=<behörigheter>]] [<katalog>]"
 
-#: builtin/mv.c:170
-msgid "can not move directory into itself"
-msgstr "kan inte flytta katalog till sig själv"
+#: builtin/init-db.c:480
+msgid "permissions"
+msgstr "behörigheter"
 
-#: builtin/mv.c:173
-msgid "cannot move directory over file"
-msgstr "kan inte flytta katalog över fil"
+#: 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/mv.c:182
-msgid "source directory is empty"
-msgstr "källkatalogen är tom"
+#: builtin/init-db.c:515 builtin/init-db.c:520
+#, c-format
+msgid "cannot mkdir %s"
+msgstr "kan inte skapa katalogen (mkdir) %s"
 
-#: builtin/mv.c:207
-msgid "not under version control"
-msgstr "inte versionshanterad"
+#: builtin/init-db.c:524
+#, c-format
+msgid "cannot chdir to %s"
+msgstr "kan inte byta katalog (chdir) till %s"
 
-#: builtin/mv.c:210
-msgid "destination exists"
-msgstr "destinationen finns"
+#: builtin/init-db.c:545
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+"%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
+"dir=<katalog>)"
 
-#: builtin/mv.c:218
+#: builtin/init-db.c:573
 #, c-format
-msgid "overwriting '%s'"
-msgstr "skriver över \"%s\""
+msgid "Cannot access work tree '%s'"
+msgstr "Kan inte komma åt arbetskatalogen \"%s\""
 
-#: builtin/mv.c:221
-msgid "Cannot overwrite"
-msgstr "Kan inte skriva över"
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
+msgstr ""
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<symbol>[(=|:)<värde>])...] [<fil>...]"
 
-#: builtin/mv.c:224
-msgid "multiple sources for the same target"
-msgstr "flera källor för samma mål"
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
+msgstr "redigera filer på plats"
 
-#: builtin/mv.c:226
-msgid "destination directory does not exist"
-msgstr "destinationskatalogen finns inte"
+#: builtin/interpret-trailers.c:27
+msgid "trim empty trailers"
+msgstr "ta bort tomma släprader"
+
+#: builtin/interpret-trailers.c:28
+msgid "trailer"
+msgstr "släprad"
+
+#: builtin/interpret-trailers.c:29
+msgid "trailer(s) to add"
+msgstr "släprad(er) att lägga till"
+
+#: builtin/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
+msgstr "ingen indatafil angiven för redigering på plats"
+
+#: builtin/log.c:44
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+msgstr "git log [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
+
+#: builtin/log.c:45
+msgid "git show [<options>] <object>..."
+msgstr "git show [<flaggor>] <objekt>..."
 
-#: builtin/mv.c:233
+#: builtin/log.c:84
 #, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr "%s, källa=%s, mål=%s"
+msgid "invalid --decorate option: %s"
+msgstr "ogiltig flagga för --decorate: %s"
+
+#: builtin/log.c:139
+msgid "suppress diff output"
+msgstr "undertryck diff-utdata"
+
+#: builtin/log.c:140
+msgid "show source"
+msgstr "visa källkod"
+
+#: builtin/log.c:141
+msgid "Use mail map file"
+msgstr "Använd e-postmappningsfil"
+
+#: builtin/log.c:142
+msgid "decorate options"
+msgstr "dekoreringsflaggor"
+
+#: builtin/log.c:145
+msgid "Process line range n,m in file, counting from 1"
+msgstr "Behandla radintervallet n,m i filen, med början på 1"
 
-#: builtin/mv.c:254
+#: builtin/log.c:241
 #, c-format
-msgid "Renaming %s to %s\n"
-msgstr "Byter namn på %s till %s\n"
+msgid "Final output: %d %s\n"
+msgstr "Slututdata: %d %s\n"
 
-#: builtin/mv.c:257 builtin/remote.c:714 builtin/repack.c:365
+#: builtin/log.c:486
 #, c-format
-msgid "renaming '%s' failed"
-msgstr "misslyckades byta namn på \"%s\""
+msgid "git show %s: bad file"
+msgstr "git show %s: felaktig fil"
 
-#: builtin/name-rev.c:251
-msgid "git name-rev [<options>] <commit>..."
-msgstr "git name-rev [<flaggor>] <incheckning>..."
+#: builtin/log.c:500 builtin/log.c:594
+#, c-format
+msgid "Could not read object %s"
+msgstr "Kunde inte läsa objektet %s"
 
-#: builtin/name-rev.c:252
-msgid "git name-rev [<options>] --all"
-msgstr "git name-rev [<flaggor>] --all"
+#: builtin/log.c:618
+#, c-format
+msgid "Unknown type: %d"
+msgstr "Okänd typ: %d"
 
-#: builtin/name-rev.c:253
-msgid "git name-rev [<options>] --stdin"
-msgstr "git name-rev [<flaggor>] --stdin"
+#: builtin/log.c:739
+msgid "format.headers without value"
+msgstr "format.headers utan värde"
 
-#: builtin/name-rev.c:305
-msgid "print only names (no SHA-1)"
-msgstr "skriv endast namn (ingen SHA-1)"
+#: builtin/log.c:839
+msgid "name of output directory is too long"
+msgstr "namnet på utdatakatalogen är för långt"
 
-#: builtin/name-rev.c:306
-msgid "only use tags to name the commits"
-msgstr "använd endast taggar för att namnge incheckningar"
+#: builtin/log.c:854
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr "Kan inte öppna patchfilen %s"
 
-#: builtin/name-rev.c:308
-msgid "only use refs matching <pattern>"
-msgstr "använd endast referenser som motsvarar <mönster>"
+#: builtin/log.c:868
+msgid "Need exactly one range."
+msgstr "Behöver precis ett intervall."
 
-#: builtin/name-rev.c:310
-msgid "list all commits reachable from all refs"
-msgstr "lista alla incheckningar som kan nås alla referenser"
+#: builtin/log.c:878
+msgid "Not a range."
+msgstr "Inte ett intervall."
 
-#: builtin/name-rev.c:311
-msgid "read from stdin"
-msgstr "läs från standard in"
+#: builtin/log.c:984
+msgid "Cover letter needs email format"
+msgstr "Omslagsbrevet behöver e-postformat"
 
-#: builtin/name-rev.c:312
-msgid "allow to print `undefined` names (default)"
-msgstr "tillåt att skriva \"odefinierade\" namn (standard)"
+#: builtin/log.c:1063
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "tokigt in-reply-to: %s"
 
-#: builtin/name-rev.c:318
-msgid "dereference tags in the input (internal use)"
-msgstr "avreferera taggar i indata (används internt)"
+#: builtin/log.c:1091
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
+msgstr "git format-patch [<flaggor>] [<sedan> | <revisionsintervall>]"
 
-#: builtin/notes.c:25
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]"
+#: builtin/log.c:1141
+msgid "Two output directories?"
+msgstr "Två utdatakataloger?"
 
-#: 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 <anteckningsref>] add [-f] [--allow-empty] [-m <medd> | -F "
-"<fil> | (-c | -C) <objekt>] [<objekt>]"
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Okänd incheckning %s"
 
-#: builtin/notes.c:27
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr ""
-"git notes [--ref <anteckningsref>] copy [-f] <från-objekt> <till-objekt>"
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
 
-#: builtin/notes.c:28
+#: builtin/log.c:1263
+msgid "Could not find exact merge base."
+msgstr "Kunde inte hitta exakt sammanslagningsbas."
+
+#: builtin/log.c:1267
 msgid ""
-"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
-"(-c | -C) <object>] [<object>]"
+"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 notes [--ref <anteckningsref>] append [--allow-empty] [-m <medd> | -F "
-"<fil> | (-c | -C) <objekt>] [<objekt>]"
+"Kunde inte hämta uppström, om du vill lagra basincheckningen automatiskt,\n"
+"använd git branch --set-upstream-to för att spåra en fjärrgren.\n"
+"Eller så kan du ange basincheckning med --base=<bas-inchecknings-id> "
+"manuellt."
 
-#: builtin/notes.c:29
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr "git notes [--ref <anteckningsref>] edit [--allow-empty] [<objekt>]"
+#: builtin/log.c:1287
+msgid "Failed to find exact merge base"
+msgstr "Kunde inte hitta exakt sammanslagningsbas"
 
-#: builtin/notes.c:30
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr "git notes [--ref <anteckningsref>] show [<objekt>]"
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
+msgstr "basincheckningen bör vara förfader till revisionslistan"
 
-#: builtin/notes.c:31
-msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
-msgstr ""
-"git notes [--ref <anteckningsref>] merge [-v | -q] [-s <strategi>] "
-"<anteckningsref>"
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
+msgstr "basincheckningen bör inte vara i revisionslistan"
 
-#: builtin/notes.c:32
-msgid "git notes merge --commit [-v | -q]"
-msgstr "git notes merge --commit [-v | -q]"
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "kan inte hämta patch-id"
 
-#: builtin/notes.c:33
-msgid "git notes merge --abort [-v | -q]"
-msgstr "git notes merge --abort [-v | -q]"
+#: builtin/log.c:1408
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "använd [PATCH n/m] även för en ensam patch"
 
-#: builtin/notes.c:34
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr "git notes [--ref <anteckningsref>] remove [<objekt>...]"
+#: builtin/log.c:1411
+msgid "use [PATCH] even with multiple patches"
+msgstr "använd [PATCH] även för flera patchar"
 
-#: builtin/notes.c:35
-msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
-msgstr "git notes [--ref <anteckningsref>] prune [-n | -v]"
+#: builtin/log.c:1415
+msgid "print patches to standard out"
+msgstr "skriv patcharna på standard ut"
 
-#: builtin/notes.c:36
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr "git notes [--ref <anteckningsref>] get-ref"
+#: builtin/log.c:1417
+msgid "generate a cover letter"
+msgstr "generera ett följebrev"
 
-#: builtin/notes.c:41
-msgid "git notes [list [<object>]]"
-msgstr "git notes [list [<objekt>]]"
+#: builtin/log.c:1419
+msgid "use simple number sequence for output file names"
+msgstr "använd enkel nummersekvens för utdatafilnamn"
 
-#: builtin/notes.c:46
-msgid "git notes add [<options>] [<object>]"
-msgstr "git notes add [<flaggor>] [<objekt>]"
+#: builtin/log.c:1420
+msgid "sfx"
+msgstr "sfx"
 
-#: builtin/notes.c:51
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr "git notes copy [<flaggor>] <från-objekt> <till-objekt>"
+#: builtin/log.c:1421
+msgid "use <sfx> instead of '.patch'"
+msgstr "använd <sfx> istället för \".patch\""
 
-#: builtin/notes.c:52
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr "git notes copy --stdin [<från-objekt> <till-objekt>]..."
+#: builtin/log.c:1423
+msgid "start numbering patches at <n> instead of 1"
+msgstr "börja numrera patchar på <n> istället för 1"
 
-#: builtin/notes.c:57
-msgid "git notes append [<options>] [<object>]"
-msgstr "git notes append [<flaggor>] [<objekt>]"
+#: builtin/log.c:1425
+msgid "mark the series as Nth re-roll"
+msgstr "markera serien som N:te försök"
 
-#: builtin/notes.c:62
-msgid "git notes edit [<object>]"
-msgstr "git notes edit [<objekt>]"
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Använd  [RFC PATCH] istället för [PATCH]"
 
-#: builtin/notes.c:67
-msgid "git notes show [<object>]"
-msgstr "git notes show [<objekt>]"
+#: builtin/log.c:1430
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "Använd [<prefix>] istället för [PATCH]"
 
-#: builtin/notes.c:72
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr "git notes merge [<flaggor>] <anteckningsref>"
+#: builtin/log.c:1433
+msgid "store resulting files in <dir>"
+msgstr "spara filerna i <katalog>"
 
-#: builtin/notes.c:73
-msgid "git notes merge --commit [<options>]"
-msgstr "git notes merge --commit [<flaggor>]"
+#: builtin/log.c:1436
+msgid "don't strip/add [PATCH]"
+msgstr "ta inte bort eller lägg till [PATCH]"
 
-#: builtin/notes.c:74
-msgid "git notes merge --abort [<options>]"
-msgstr "git notes merge --abort [<flaggor>]"
+#: builtin/log.c:1439
+msgid "don't output binary diffs"
+msgstr "skriv inte binära diffar"
 
-#: builtin/notes.c:79
-msgid "git notes remove [<object>]"
-msgstr "git notes remove [<objekt>]"
+#: builtin/log.c:1441
+msgid "output all-zero hash in From header"
+msgstr "använd hashvärde med nollor i From-huvud"
 
-#: builtin/notes.c:84
-msgid "git notes prune [<options>]"
-msgstr "git notes prune [<flaggor>]"
+#: builtin/log.c:1443
+msgid "don't include a patch matching a commit upstream"
+msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
 
-#: builtin/notes.c:89
-msgid "git notes get-ref"
-msgstr "git notes get-ref"
+#: builtin/log.c:1445
+msgid "show patch format instead of default (patch + stat)"
+msgstr "visa patchformat istället för standard (patch + stat)"
 
-#: builtin/notes.c:147
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr "kunde inte starta \"show\" för objektet \"%s\""
+#: builtin/log.c:1447
+msgid "Messaging"
+msgstr "E-post"
 
-#: builtin/notes.c:151
-msgid "could not read 'show' output"
-msgstr "kunde inte läsa utdata från \"show\""
+#: builtin/log.c:1448
+msgid "header"
+msgstr "huvud"
 
-#: builtin/notes.c:159
-#, c-format
-msgid "failed to finish 'show' for object '%s'"
-msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
+#: builtin/log.c:1449
+msgid "add email header"
+msgstr "lägg till e-posthuvud"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "kunde inte skapa filen \"%s\""
+#: builtin/log.c:1450 builtin/log.c:1452
+msgid "email"
+msgstr "epost"
 
-#: builtin/notes.c:193
-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/log.c:1450
+msgid "add To: header"
+msgstr "Lägg till mottagarhuvud (\"To:\")"
 
-#: builtin/notes.c:202
-msgid "unable to write note object"
-msgstr "kunde inte skriva anteckningsobjekt"
+#: builtin/log.c:1452
+msgid "add Cc: header"
+msgstr "Lägg till kopiehuvud (\"Cc:\")"
 
-#: builtin/notes.c:204
-#, c-format
-msgid "The note contents have been left in %s"
-msgstr "Anteckningens innehåll har lämnats kvar i %s"
+#: builtin/log.c:1454
+msgid "ident"
+msgstr "ident"
 
-#: builtin/notes.c:232 builtin/tag.c:440
-#, c-format
-msgid "cannot read '%s'"
-msgstr "kunde inte läsa \"%s\""
+#: builtin/log.c:1455
+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/notes.c:234 builtin/tag.c:443
-#, c-format
-msgid "could not open or read '%s'"
-msgstr "kunde inte öppna eller läsa \"%s\""
+#: builtin/log.c:1457
+msgid "message-id"
+msgstr "meddelande-id"
 
-#: 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:880 builtin/tag.c:456
-#, c-format
-msgid "Failed to resolve '%s' as a valid ref."
-msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
+#: builtin/log.c:1458
+msgid "make first mail a reply to <message-id>"
+msgstr "Gör det första brevet ett svar till <meddelande-id>"
 
-#: builtin/notes.c:256
-#, c-format
-msgid "Failed to read object '%s'."
-msgstr "Kunde inte läsa objektet \"%s\"."
+#: builtin/log.c:1459 builtin/log.c:1462
+msgid "boundary"
+msgstr "gräns"
 
-#: builtin/notes.c:260
-#, c-format
-msgid "Cannot read note data from non-blob object '%s'."
-msgstr "kan inte läsa anteckningsdata från icke-blob-objektet \"%s\"."
+#: builtin/log.c:1460
+msgid "attach the patch"
+msgstr "bifoga patchen"
 
-#: 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:945
-msgid "too many parameters"
-msgstr "för många parametrar"
+#: builtin/log.c:1463
+msgid "inline the patch"
+msgstr "gör patchen ett inline-objekt"
 
-#: builtin/notes.c:375 builtin/notes.c:662
-#, c-format
-msgid "No note found for object %s."
-msgstr "Inga anteckningar hittades för objektet %s."
+#: builtin/log.c:1467
+msgid "enable message threading, styles: shallow, deep"
+msgstr "aktivera brevtrådning, typer: shallow, deep"
 
-#: builtin/notes.c:396 builtin/notes.c:559
-msgid "note contents as a string"
-msgstr "anteckningsinnehåll som sträng"
+#: builtin/log.c:1469
+msgid "signature"
+msgstr "signatur"
 
-#: builtin/notes.c:399 builtin/notes.c:562
-msgid "note contents in a file"
-msgstr "anteckningsinnehåll i en fil"
+#: builtin/log.c:1470
+msgid "add a signature"
+msgstr "lägg till signatur"
 
-#: builtin/notes.c:402 builtin/notes.c:565
-msgid "reuse and edit specified note object"
-msgstr "återanvänd och redigera angivet anteckningsobjekt"
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "basincheckning"
 
-#: builtin/notes.c:405 builtin/notes.c:568
-msgid "reuse specified note object"
-msgstr "återanvänd angivet anteckningsobjekt"
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "lägg till förhandskrävd trädinfo i patchserien"
 
-#: builtin/notes.c:408 builtin/notes.c:571
-msgid "allow storing empty note"
-msgstr "tillåt lagra tom anteckning"
+#: builtin/log.c:1474
+msgid "add a signature from a file"
+msgstr "lägg till signatur från fil"
 
-#: builtin/notes.c:409 builtin/notes.c:480
-msgid "replace existing notes"
-msgstr "ersätt befintliga anteckningar"
+#: builtin/log.c:1475
+msgid "don't print the patch filenames"
+msgstr "visa inte filnamn för patchar"
 
-#: builtin/notes.c:434
-#, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-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/log.c:1565
+msgid "-n and -k are mutually exclusive."
+msgstr "-n och -k kan inte användas samtidigt."
 
-#: builtin/notes.c:449 builtin/notes.c:528
-#, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr "Skriver över befintliga anteckningar för objektet %s\n"
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc och -k kan inte användas samtidigt."
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:885
-#, c-format
-msgid "Removing note for object %s\n"
-msgstr "Tar bort anteckning för objektet %s\n"
+#: builtin/log.c:1575
+msgid "--name-only does not make sense"
+msgstr "kan inte använda --name-only"
 
-#: builtin/notes.c:481
-msgid "read objects from stdin"
-msgstr "läs objekt från standard in"
+#: builtin/log.c:1577
+msgid "--name-status does not make sense"
+msgstr "kan inte använda --name-status"
 
-#: builtin/notes.c:483
-msgid "load rewriting config for <command> (implies --stdin)"
-msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
+#: builtin/log.c:1579
+msgid "--check does not make sense"
+msgstr "kan inte använda --check"
 
-#: builtin/notes.c:501
-msgid "too few parameters"
-msgstr "för få parametrar"
+#: builtin/log.c:1609
+msgid "standard output, or directory, which one?"
+msgstr "standard ut, eller katalog, vilken skall det vara?"
 
-#: builtin/notes.c:522
+#: builtin/log.c:1611
 #, c-format
-msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-msgstr ""
-"Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet "
-"%s. Använd \"-f\" för att skriva över befintliga anteckningar"
+msgid "Could not create directory '%s'"
+msgstr "Kunde inte skapa katalogen \"%s\""
 
-#: builtin/notes.c:534
+#: builtin/log.c:1705
 #, c-format
-msgid "Missing notes on source object %s. Cannot copy."
-msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera."
+msgid "unable to read signature file '%s'"
+msgstr "kunde inte läsa signaturfil \"%s\""
+
+#: builtin/log.c:1777
+msgid "Failed to create output files"
+msgstr "Misslyckades skapa utdatafiler"
+
+#: builtin/log.c:1826
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
 
-#: builtin/notes.c:586
+#: builtin/log.c:1880
 #, 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 ""
-"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"
+"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/notes.c:767
-msgid "General options"
-msgstr "Allmänna flaggor"
+#: builtin/ls-files.c:458
+msgid "git ls-files [<options>] [<file>...]"
+msgstr "git ls-files [<flaggor>] [<fil>...]"
 
-#: builtin/notes.c:769
-msgid "Merge options"
-msgstr "Flaggor för sammanslagning"
+#: builtin/ls-files.c:507
+msgid "identify the file status with tags"
+msgstr "identifiera filstatus med taggar"
 
-#: builtin/notes.c:771
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-msgstr ""
-"läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
-"cat_sort_uniq)"
+#: builtin/ls-files.c:509
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
 
-#: builtin/notes.c:773
-msgid "Committing unmerged notes"
-msgstr "Checkar in ej sammanslagna anteckningar"
+#: builtin/ls-files.c:511
+msgid "show cached files in the output (default)"
+msgstr "visa cachade filer i utdata (standard)"
 
-#: builtin/notes.c:775
-msgid "finalize notes merge by committing unmerged notes"
-msgstr ""
-"färdigställ sammanslagning av anteckningar genom att checka in ej "
-"sammanslagna anteckningar"
+#: builtin/ls-files.c:513
+msgid "show deleted files in the output"
+msgstr "visa borttagna filer i utdata"
 
-#: builtin/notes.c:777
-msgid "Aborting notes merge resolution"
-msgstr "Avbryt lösning av sammanslagning av anteckningar"
+#: builtin/ls-files.c:515
+msgid "show modified files in the output"
+msgstr "visa modifierade filer i utdata"
 
-#: builtin/notes.c:779
-msgid "abort notes merge"
-msgstr "avbryt sammanslagning av anteckningar"
+#: builtin/ls-files.c:517
+msgid "show other files in the output"
+msgstr "visa andra filer i utdata"
 
-#: builtin/notes.c:856
-#, 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"
+#: builtin/ls-files.c:519
+msgid "show ignored files in the output"
+msgstr "visa ignorerade filer i utdata"
 
-#: builtin/notes.c:883
-#, c-format
-msgid "Object %s has no note\n"
-msgstr "Objektet %s har ingen anteckning\n"
+#: builtin/ls-files.c:522
+msgid "show staged contents' object name in the output"
+msgstr "visa köat innehålls objektnamn i utdata"
 
-#: builtin/notes.c:895
-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/ls-files.c:524
+msgid "show files on the filesystem that need to be removed"
+msgstr "visa filer i filsystemet som behöver tas bort"
 
-#: builtin/notes.c:898
-msgid "read object names from the standard input"
-msgstr "läs objektnamn från standard in"
+#: builtin/ls-files.c:526
+msgid "show 'other' directories' names only"
+msgstr "visa endast namn för \"andra\" kataloger"
 
-#: builtin/notes.c:979
-msgid "notes-ref"
-msgstr "anteckningar-ref"
+#: builtin/ls-files.c:528
+msgid "show line endings of files"
+msgstr "visa radslut i filer"
 
-#: builtin/notes.c:980
-msgid "use notes from <notes-ref>"
-msgstr "använd anteckningar från <anteckningsref>"
+#: builtin/ls-files.c:530
+msgid "don't show empty directories"
+msgstr "visa inte tomma kataloger"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Okänt underkommando: %s"
+#: builtin/ls-files.c:533
+msgid "show unmerged files in the output"
+msgstr "visa ej sammanslagna filer i utdata"
 
-#: builtin/pack-objects.c:28
-msgid ""
-"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
-msgstr ""
-"git pack-objects --stdout [<flaggor>...] [< <reflista> | < <objektlista>]"
+#: builtin/ls-files.c:535
+msgid "show resolve-undo information"
+msgstr "visa \"resolve-undo\"-information"
 
-#: builtin/pack-objects.c:29
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-"git pack-objects [<flaggor>...] <basnamn> [< <reflista> | < <objektlista>]"
+#: builtin/ls-files.c:537
+msgid "skip files matching pattern"
+msgstr "hoppa över filer som motsvarar mönster"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
-#, c-format
-msgid "deflate error (%d)"
-msgstr "fel i deflate (%d)"
+#: builtin/ls-files.c:540
+msgid "exclude patterns are read from <file>"
+msgstr "exkludera mönster som läses från <fil>"
 
-#: builtin/pack-objects.c:772
-msgid "Writing objects"
-msgstr "Skriver objekt"
+#: builtin/ls-files.c:543
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
 
-#: builtin/pack-objects.c:1012
-msgid "disabling bitmap writing, as some objects are not being packed"
-msgstr "inaktiverar skrivning av bitkarta då några objekt inte packas"
+#: builtin/ls-files.c:545
+msgid "add the standard git exclusions"
+msgstr "lägg till git:s standardexkluderingar"
 
-#: builtin/pack-objects.c:2172
-msgid "Compressing objects"
-msgstr "Komprimerar objekt"
+#: builtin/ls-files.c:548
+msgid "make the output relative to the project top directory"
+msgstr "gör utdata relativ till projektets toppkatalog"
 
-#: builtin/pack-objects.c:2558
-#, c-format
-msgid "unsupported index version %s"
-msgstr "indexversionen %s stöds ej"
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "rekursera ner i undermoduler"
 
-#: builtin/pack-objects.c:2562
-#, c-format
-msgid "bad index version '%s'"
-msgstr "felaktig indexversion \"%s\""
+#: builtin/ls-files.c:553
+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/pack-objects.c:2592
-msgid "do not show progress meter"
-msgstr "visa inte förloppsindikator"
+#: builtin/ls-files.c:554
+msgid "tree-ish"
+msgstr "träd-igt"
 
-#: builtin/pack-objects.c:2594
-msgid "show progress meter"
-msgstr "visa förloppsindikator"
+#: builtin/ls-files.c:555
+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/pack-objects.c:2596
-msgid "show progress meter during object writing phase"
-msgstr "visa förloppsindikator under objektskrivningsfasen"
+#: builtin/ls-files.c:557
+msgid "show debugging data"
+msgstr "visa felsökningsutdata"
 
-#: builtin/pack-objects.c:2599
-msgid "similar to --all-progress when progress meter is shown"
-msgstr "som --all-progress när förloppsindikatorn visas"
+#: 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=<exec>]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [<arkiv> [<referenser>...]]"
 
-#: builtin/pack-objects.c:2600
-msgid "version[,offset]"
-msgstr "version[,offset]"
+#: builtin/ls-remote.c:50
+msgid "do not print remote URL"
+msgstr "visa inte fjärr-URL"
 
-#: builtin/pack-objects.c:2601
-msgid "write the pack index file in the specified idx format version"
-msgstr "skriv paketindexfilen i angiven indexformatversion"
+#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
+msgid "exec"
+msgstr "exec"
 
-#: builtin/pack-objects.c:2604
-msgid "maximum size of each output pack file"
-msgstr "maximal storlek på varje utdatapaketfil"
+#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+msgid "path of git-upload-pack on the remote host"
+msgstr "sökväg till git-upload-pack på fjärren"
 
-#: builtin/pack-objects.c:2606
-msgid "ignore borrowed objects from alternate object store"
-msgstr "ignorera lånade objekt från alternativa objektlager"
+#: builtin/ls-remote.c:56
+msgid "limit to tags"
+msgstr "begränsa till taggar"
 
-#: builtin/pack-objects.c:2608
-msgid "ignore packed objects"
-msgstr "ignorera packade objekt"
+#: builtin/ls-remote.c:57
+msgid "limit to heads"
+msgstr "begränsa till huvuden"
 
-#: builtin/pack-objects.c:2610
-msgid "limit pack window by objects"
-msgstr "begränsa paketfönster efter objekt"
+#: builtin/ls-remote.c:58
+msgid "do not show peeled tags"
+msgstr "visa inte avskalade taggar"
 
-#: builtin/pack-objects.c:2612
-msgid "limit pack window by memory in addition to object limit"
-msgstr "begränsa paketfönster efter minne förutom objektgräns"
+#: builtin/ls-remote.c:60
+msgid "take url.<base>.insteadOf into account"
+msgstr "ta hänsyn till url.<bas>.insteadOf"
 
-#: builtin/pack-objects.c:2614
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr "maximal längd på deltakedja tillåten i slutligt paket"
+#: builtin/ls-remote.c:62
+msgid "exit with exit code 2 if no matching refs are found"
+msgstr "avsluta med felkod 2 om motsvarande referenser inte hittas"
 
-#: builtin/pack-objects.c:2616
-msgid "reuse existing deltas"
-msgstr "återanvänd befintliga delta"
+#: builtin/ls-remote.c:64
+msgid "show underlying ref in addition to the object pointed by it"
+msgstr "visa underliggande referens och objektet det pekar på"
 
-#: builtin/pack-objects.c:2618
-msgid "reuse existing objects"
-msgstr "återanvänd befintliga objekt"
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]"
 
-#: builtin/pack-objects.c:2620
-msgid "use OFS_DELTA objects"
-msgstr "använd OFS_DELTA-objekt"
+#: builtin/ls-tree.c:128
+msgid "only show trees"
+msgstr "visa endast träd"
 
-#: builtin/pack-objects.c:2622
-msgid "use threads when searching for best delta matches"
-msgstr "använd trådar vid sökning efter bästa deltaträffar"
+#: builtin/ls-tree.c:130
+msgid "recurse into subtrees"
+msgstr "rekursera ner i underträd"
 
-#: builtin/pack-objects.c:2624
-msgid "do not create an empty pack output"
-msgstr "försök inte skapa tom paketutdata"
+#: builtin/ls-tree.c:132
+msgid "show trees when recursing"
+msgstr "visa träd medan rekursering"
 
-#: builtin/pack-objects.c:2626
-msgid "read revision arguments from standard input"
-msgstr "läs revisionsargument från standard in"
+#: builtin/ls-tree.c:135
+msgid "terminate entries with NUL byte"
+msgstr "terminera poster med NUL-byte"
 
-#: builtin/pack-objects.c:2628
-msgid "limit the objects to those that are not yet packed"
-msgstr "begränsa objekt till de som ännu inte packats"
+#: builtin/ls-tree.c:136
+msgid "include object size"
+msgstr "inkludera objektstorlek"
 
-#: builtin/pack-objects.c:2631
-msgid "include objects reachable from any reference"
-msgstr "inkludera objekt som kan nås från någon referens"
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+msgid "list only filenames"
+msgstr "visa endast filnamn"
 
-#: builtin/pack-objects.c:2634
-msgid "include objects referred by reflog entries"
-msgstr "inkludera objekt som refereras från referensloggposter"
+#: builtin/ls-tree.c:143
+msgid "use full path names"
+msgstr "använd fullständiga sökvägsnamn"
 
-#: builtin/pack-objects.c:2637
-msgid "include objects referred to by the index"
-msgstr "inkludera objekt som refereras från indexet"
+#: builtin/ls-tree.c:145
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
 
-#: builtin/pack-objects.c:2640
-msgid "output pack to stdout"
-msgstr "skriv paket på standard ut"
+#: builtin/merge.c:46
+msgid "git merge [<options>] [<commit>...]"
+msgstr "git merge [<flaggor>] [<incheckning>...]"
 
-#: builtin/pack-objects.c:2642
-msgid "include tag objects that refer to objects to be packed"
-msgstr "inkludera taggobjekt som refererar objekt som skall packas"
+#: builtin/merge.c:47
+msgid "git merge [<options>] <msg> HEAD <commit>"
+msgstr "git merge [<flaggor>] <meddelande> HEAD <incheckning>"
 
-#: builtin/pack-objects.c:2644
-msgid "keep unreachable objects"
-msgstr "behåll onåbara objekt"
+#: builtin/merge.c:48
+msgid "git merge --abort"
+msgstr "git merge --abort"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "tid"
+#: builtin/merge.c:102
+msgid "switch `m' requires a value"
+msgstr "flaggan \"m\" behöver ett värde"
 
-#: builtin/pack-objects.c:2646
-msgid "unpack unreachable objects newer than <time>"
-msgstr "packa upp onåbara objekt nyare än <tid>"
+#: builtin/merge.c:139
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "Kunde inte hitta sammanslagningsstrategin \"%s\".\n"
 
-#: builtin/pack-objects.c:2649
-msgid "create thin packs"
-msgstr "skapa tunna paket"
+#: builtin/merge.c:140
+#, c-format
+msgid "Available strategies are:"
+msgstr "Tillgängliga strategier är:"
 
-#: builtin/pack-objects.c:2651
-msgid "create packs suitable for shallow fetches"
-msgstr "skapa packfiler lämpade för grunda hämtningar"
+#: builtin/merge.c:145
+#, c-format
+msgid "Available custom strategies are:"
+msgstr "Tillgängliga skräddarsydda strategier är:"
 
-#: builtin/pack-objects.c:2653
-msgid "ignore packs that have companion .keep file"
-msgstr "ignorera paket som har tillhörande .keep-fil"
+#: builtin/merge.c:195 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/pack-objects.c:2655
-msgid "pack compression level"
-msgstr "komprimeringsgrad för paket"
+#: builtin/merge.c:198 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/pack-objects.c:2657
-msgid "do not hide commits by grafts"
-msgstr "göm inte incheckningar med ympningar (\"grafts\")"
+#: builtin/merge.c:199 builtin/pull.c:133
+msgid "(synonym to --stat)"
+msgstr "(synonym till --stat)"
 
-#: builtin/pack-objects.c:2659
-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/merge.c:201 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/pack-objects.c:2661
-msgid "write a bitmap index together with the pack index"
-msgstr "använd bitkartindex tillsammans med packindexet"
+#: builtin/merge.c:204 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/pack-objects.c:2752
-msgid "Counting objects"
-msgstr "Räknar objekt"
+#: builtin/merge.c:206 builtin/pull.c:142
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "utför en incheckning om sammanslagningen lyckades (standard)"
 
-#: builtin/pack-refs.c:6
-msgid "git pack-refs [<options>]"
-msgstr "git pack-refs [<flaggor>]"
+#: builtin/merge.c:208 builtin/pull.c:145
+msgid "edit message before committing"
+msgstr "redigera meddelande innan incheckning"
 
-#: builtin/pack-refs.c:14
-msgid "pack everything"
-msgstr "packa allt"
+#: builtin/merge.c:209
+msgid "allow fast-forward (default)"
+msgstr "tillåt snabbspolning (standard)"
 
-#: builtin/pack-refs.c:15
-msgid "prune loose refs (default)"
-msgstr "ta bort lösa referenser (standard)"
+#: builtin/merge.c:211 builtin/pull.c:151
+msgid "abort if fast-forward is not possible"
+msgstr "avbryt om snabbspolning inte är möjlig"
 
-#: builtin/prune-packed.c:7
-msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
-msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+#: builtin/merge.c:215 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/prune-packed.c:40
-msgid "Removing duplicate objects"
-msgstr "Tar bort duplicerade objekt"
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
+#: builtin/revert.c:89
+msgid "strategy"
+msgstr "strategi"
 
-#: builtin/prune.c:11
-msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
+#: builtin/merge.c:217 builtin/pull.c:159
+msgid "merge strategy to use"
+msgstr "sammanslagningsstrategi att använda"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "ta inte bort, bara visa"
+#: builtin/merge.c:218 builtin/pull.c:162
+msgid "option=value"
+msgstr "alternativ=värde"
 
-#: builtin/prune.c:106 builtin/worktree.c:125
-msgid "report pruned objects"
-msgstr "rapportera borttagna objekt"
+#: builtin/merge.c:219 builtin/pull.c:163
+msgid "option for selected merge strategy"
+msgstr "alternativ för vald sammanslagningsstrategi"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
-msgid "expire objects older than <time>"
-msgstr "låt tid gå ut för objekt äldre än <tid>"
+#: builtin/merge.c:221
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning"
 
-#: builtin/prune.c:123
-msgid "cannot prune in a precious-objects repo"
-msgstr "kan inte rensa i ett \"precious-objekt\"-arkiv"
+#: builtin/merge.c:225
+msgid "abort the current in-progress merge"
+msgstr "avbryt den pågående sammanslagningen"
 
-#: builtin/pull.c:72
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr "git pull [<flaggor>] [<arkiv> [<refspec>...]]"
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "tillåt sammanslagning av orelaterade historier"
 
-#: builtin/pull.c:117
-msgid "Options related to merging"
-msgstr "Alternativ gällande sammanslagning"
+#: builtin/merge.c:255
+msgid "could not run stash."
+msgstr "kunde köra stash."
 
-#: builtin/pull.c:120
-msgid "incorporate changes by rebasing rather than merging"
-msgstr "inlemma ändringar genom ombasering i stället för sammanslagning"
+#: builtin/merge.c:260
+msgid "stash failed"
+msgstr "stash misslyckades"
 
-#: builtin/pull.c:144 builtin/revert.c:105
-msgid "allow fast-forward"
-msgstr "tillåt snabbspolning"
+#: builtin/merge.c:265
+#, c-format
+msgid "not a valid object: %s"
+msgstr "inte ett giltigt objekt: %s"
 
-#: builtin/pull.c:150
-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:284 builtin/merge.c:301
+msgid "read-tree failed"
+msgstr "read-tree misslyckades"
 
-#: builtin/pull.c:164
-msgid "Options related to fetching"
-msgstr "Alternativ gällande hämtningar"
+#: builtin/merge.c:331
+msgid " (nothing to squash)"
+msgstr " (inget att platta till)"
 
-#: builtin/pull.c:186
-msgid "number of submodules pulled in parallel"
-msgstr "antal undermoduler som hämtas parallellt"
+#: builtin/merge.c:342
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "Tillplattningsincheckning -- uppdaterar inte HEAD\n"
 
-#: builtin/pull.c:275
+#: builtin/merge.c:392
 #, c-format
-msgid "Invalid value for pull.ff: %s"
-msgstr "Felaktigt värde för pull.ff: %s"
+msgid "No merge message -- not updating HEAD\n"
+msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n"
 
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "Kan inte hämta med ombasering: Du har oköade ändringar."
+#: builtin/merge.c:443
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr "\"%s\" verkar inte peka på en incheckning"
 
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "Dessutom innehåller dit index ändringar som inte har checkats in."
+#: builtin/merge.c:533
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
 
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr ""
-"Kan inte hämta med ombasering: Ditt index innehåller oincheckade ändringar."
+#: builtin/merge.c:652
+msgid "Not handling anything other than two heads merge."
+msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
 
-#: builtin/pull.c:443
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-msgstr ""
-"Det finns ingen kandidat för ombasering bland referenserna du precis har "
-"hämtat."
+#: builtin/merge.c:666
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "Felaktig flagga för merge-recursive: -X%s"
 
-#: builtin/pull.c:445
-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/merge.c:681
+#, c-format
+msgid "unable to write %s"
+msgstr "kunde inte skriva %s"
 
-#: builtin/pull.c:446
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
+#: builtin/merge.c:733
+#, c-format
+msgid "Could not read from '%s'"
+msgstr "Kunde inte läsa från \"%s\""
+
+#: builtin/merge.c:742
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
-"Det betyder vanligtvis att du använt en jokertecken-refspec som inte\n"
-"motsvarade något i fjärränden."
+"Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra "
+"den.\n"
 
-#: builtin/pull.c:449
+#: builtin/merge.c:748
 #, 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."
+"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 ""
-"Du bad om att hämta från fjärren \"%s\", men angav inte någon\n"
-"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."
+"Ange ett incheckningsmeddelande för att förklara varför sammanslagningen\n"
+"är nödvändig, speciellt om den slår in en uppdaterad uppström i en\n"
+"temagren.\n"
+"\n"
+"Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
+"avbryter incheckningen.\n"
 
-#: builtin/pull.c:454
-msgid "You are not currently on a branch."
-msgstr "Du är inte på någon gren för närvarande."
+#: builtin/merge.c:772
+msgid "Empty commit message."
+msgstr "Tomt incheckningsmeddelande."
 
-#: builtin/pull.c:456 builtin/pull.c:471
-msgid "Please specify which branch you want to rebase against."
-msgstr "Ange vilken gren du vill ombasera mot."
+#: builtin/merge.c:792
+#, c-format
+msgid "Wonderful.\n"
+msgstr "Underbart.\n"
 
-#: builtin/pull.c:458 builtin/pull.c:473
-msgid "Please specify which branch you want to merge with."
-msgstr "Ange vilken gren du vill slå samman med."
+#: builtin/merge.c:847
+#, 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/pull.c:459 builtin/pull.c:474
-msgid "See git-pull(1) for details."
-msgstr "Se git-pull(1) för detaljer."
+#: builtin/merge.c:863
+#, c-format
+msgid "'%s' is not a commit"
+msgstr "\"%s\" är inte en incheckning"
 
-#: builtin/pull.c:469
-msgid "There is no tracking information for the current branch."
-msgstr "Det finns ingen spårningsinformation för aktuell gren."
+#: builtin/merge.c:904
+msgid "No current branch."
+msgstr "Inte på någon gren."
+
+#: builtin/merge.c:906
+msgid "No remote for the current branch."
+msgstr "Ingen fjärr för aktuell gren."
+
+#: builtin/merge.c:908
+msgid "No default upstream defined for the current branch."
+msgstr "Ingen standarduppström angiven för aktuell gren."
 
-#: builtin/pull.c:478
+#: builtin/merge.c:913
 #, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-msgstr ""
-"Om du vill ange spårningsinformation för grenen kan du göra det med:\n"
-"\n"
-" git branch --set-upstream-to=%s/<gren> %s\n"
+msgid "No remote-tracking branch for %s from %s"
+msgstr "Ingen fjärrspårande gren för %s från %s"
 
-#: builtin/pull.c:483
+#: builtin/merge.c:960
 #, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-msgstr ""
-"Dina inställningar anger sammanslagning med referensen \"%s\"\n"
-"från fjärren, men någon sådan referens togs inte emot."
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Felaktigt värde \"%s\" i miljövariabeln \"%s\""
 
-#: builtin/pull.c:841
-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/merge.c:1034
+#, c-format
+msgid "could not close '%s'"
+msgstr "kunde inte stänga \"%s\""
 
-#: builtin/pull.c:870
+#: builtin/merge.c:1061
 #, 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
+msgid "not something we can merge"
+msgstr "inte något vi kan slå ihop"
+
+#: builtin/merge.c:1162
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
+
+#: builtin/merge.c:1178
 msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
 msgstr ""
-"fetch uppdaterade huvudet för aktuell gren.\n"
-"snabbspolar din arbetskatalog från\n"
-"incheckningen %s."
+"Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
+"Checka in dina ändringar innan du slår ihop."
 
-#: builtin/pull.c:875
-#, c-format
+#: builtin/merge.c:1185
 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."
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
 msgstr ""
-"Kan inte snabbspola din arbetskatalog.\n"
-"När du är säker på att du har sparat allt värdefullt i utdata från\n"
-"$ git diff %s\n"
-"kör du\n"
-"$ git reset --hard\n"
-"för att återgå."
+"Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
+"Checka in dina ändringar innan du slår ihop."
 
-#: builtin/pull.c:890
-msgid "Cannot merge multiple branches into empty head."
-msgstr "Kan inte slå ihop flera grenar i ett tomt huvud."
+#: builtin/merge.c:1188
+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/pull.c:894
-msgid "Cannot rebase onto multiple branches."
-msgstr "Kan inte ombasera ovanpå flera grenar."
+#: builtin/merge.c:1197
+msgid "You cannot combine --squash with --no-ff."
+msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/push.c:16
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
+#: builtin/merge.c:1205
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/push.c:89
-msgid "tag shorthand without <tag>"
-msgstr "taggförkortning utan <tagg>"
+#: builtin/merge.c:1222
+msgid "Squash commit into empty head not supported yet"
+msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/push.c:99
-msgid "--delete only accepts plain target ref names"
-msgstr "--delete godtar endast enkla målreferensnamn"
+#: builtin/merge.c:1224
+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/push.c:143
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-"\n"
-"För att välja ett av alternativen permanent, se push.default i \"git help "
-"config\"."
+#: builtin/merge.c:1229
+#, c-format
+msgid "%s - not something we can merge"
+msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/push.c:146
+#: builtin/merge.c:1231
+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
 #, 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 "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
-"Uppströmsgrenen för din nuvarande gren stämmer inte överens\n"
-"med namnet på din aktuella gren. För att sända till uppströmsgrenen\n"
-"i fjärrarkivet använder du\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"För att sända till grenen med samma namn i fjärrarkivet använder du\n"
-"\n"
-"    git push %s %s\n"
-"%s"
+"Incheckningen %s har en obetrodd GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/push.c:161
+#: builtin/merge.c:1290
 #, 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 "Commit %s has a bad GPG signature allegedly by %s."
 msgstr ""
-"Du är inte på någon gren för närvarande.\n"
-"För att sända in historiken som leder till den aktuella (frånkopplat\n"
-"HEAD) situationen använder du\n"
-"\n"
-"    git push %s HEAD:<namn-på-fjärrgren>\n"
+"Incheckningen %s har en felaktig GPG-signatur som påstås vara gjord av %s."
 
-#: builtin/push.c:175
+#: builtin/merge.c:1293
 #, 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 ""
-"Den aktuella grenen %s har ingen uppströmsgren.\n"
-"För att sända aktuell gren och ange fjärrarkiv som uppström använder du\n"
-"\n"
-"    git push --set-upstream %s %s\n"
+msgid "Commit %s does not have a GPG signature."
+msgstr "Incheckning %s har inte någon GPG-signatur."
 
-#: builtin/push.c:183
+#: builtin/merge.c:1296
 #, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända."
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
 
-#: builtin/push.c:186
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "vägrar slå samman orelaterad historik"
+
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Redan à jour."
+
+#: builtin/merge.c:1377
 #, 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 ""
-"Du sänder till fjärren \"%s\", som inte är uppströms för den\n"
-"aktuella grenen \"%s\", utan att tala om för mig vad som\n"
-"skall sändas för att uppdatera fjärrgrenen."
+msgid "Updating %s..%s\n"
+msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/push.c:242
-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/merge.c:1418
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: 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 ""
-"Uppdateringar avvisades då änden på din befintliga gren är bakom\n"
-"dess fjärrmotsvarighet. Integrera fjärrändringarna (t.ex\n"
-"\"git pull ....\") innan du sänder igen.\n"
-"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
+#: builtin/merge.c:1425
+#, c-format
+msgid "Nope.\n"
+msgstr "Nej.\n"
 
-#: 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:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Redan à jour. Toppen!"
+
+#: builtin/merge.c:1456
+msgid "Not possible to fast-forward, aborting."
+msgstr "Kan inte snabbspola, avbryter."
+
+#: builtin/merge.c:1479 builtin/merge.c:1558
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr "Återspolar trädet till orört...\n"
+
+#: builtin/merge.c:1483
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr "Försöker sammanslagningsstrategin %s...\n"
+
+#: builtin/merge.c:1549
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
+
+#: builtin/merge.c:1551
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr "Sammanslagning med strategin %s misslyckades.\n"
+
+#: builtin/merge.c:1560
+#, 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:1572
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
-"Uppdateringar avvisades då änden på en gren som sänds in är bakom dess\n"
-"fjärrmotsvarighet. Checka ut grenen och integrera fjärrändringarna (t.ex.\n"
-"\"git pull ...\") innan du sänder igen.\n"
-"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
+"Automatisk sammanslagning lyckades; stoppar före incheckning som önskat\n"
 
-#: builtin/push.c:261
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgstr "git merge-base [-a | --all] <incheckning> <incheckning>..."
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
+msgstr "git merge-base [-a | --all] --octopus <incheckning>..."
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <incheckning>..."
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <incheckning> <incheckning>"
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point <ref> <incheckning>"
+
+#: builtin/merge-base.c:217
+msgid "output all common ancestors"
+msgstr "skriv ut alla gemensamma anfäder"
+
+#: 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:221
+msgid "list revs not reachable from others"
+msgstr "visa revisioner som inte kan nås från andra"
+
+#: 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:225
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr "se var <incheckning> grenades av från referensloggen från <ref>"
+
+#: builtin/merge-file.c:8
 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."
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
 msgstr ""
-"Uppdateringar avvisades då fjärren innehåller ändringar som du inte\n"
-"har lokalt. Det beror oftast på att ett annat arkiv har sänt in samma\n"
-"referenser. Det kan vara en idé att först integrera fjärrändringarna\n"
-"(t.ex. \"git pull ...\") innan du sänder igen.\n"
-"Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer."
+"git merge-file [<alternativ>] [-L <namn1> [-L <orig> [-L <namn2>]]] <fil1> "
+"<origfil> <fil2>"
 
-#: builtin/push.c:268
-msgid "Updates were rejected because the tag already exists in the remote."
-msgstr "Uppdateringarna avvisades eftersom taggen redan finns på fjärren."
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "sänd resultat till standard ut"
 
-#: 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-file.c:34
+msgid "use a diff3 based merge"
+msgstr "använd diff3-baserad sammanslagning"
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr "för konflikter, använd vår version"
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr "för konflikter, använd deras version"
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr "för konflikter, använd en förenad version"
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr "för konflikter, använd denna markörstorlek"
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr "varna inte om konflikter"
+
+#: builtin/merge-file.c:45
+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]"
+
+#: builtin/mktree.c:152
+msgid "input is NUL terminated"
+msgstr "indata är NUL-terminerad"
+
+#: builtin/mktree.c:153 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "tillåt saknade objekt"
+
+#: builtin/mktree.c:154
+msgid "allow creation of more than one tree"
+msgstr "tillåt skapa mer än ett träd"
+
+#: builtin/mv.c:15
+msgid "git mv [<options>] <source>... <destination>"
+msgstr "git mv [<flaggor>] <källa>... <mål>"
+
+#: builtin/mv.c:70
+#, 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
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr ""
-"Du kan inte uppdatera en fjärr-referens som pekar på ett objekt som\n"
-"inte är en incheckning, eller uppdatera en fjärr-referens så att den\n"
-"pekar på något som inte är en incheckning, utan att använda flaggan\n"
-"\"--force\".\n"
+"Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta"
+
+#: builtin/mv.c:90
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s är i indexet"
+
+#: builtin/mv.c:112
+msgid "force move/rename even if target exists"
+msgstr "tvinga flytta/ändra namn även om målet finns"
+
+#: builtin/mv.c:113
+msgid "skip move/rename errors"
+msgstr "hoppa över fel vid flytt/namnändring"
+
+#: builtin/mv.c:155
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "destinationen \"%s\" är ingen katalog"
+
+#: builtin/mv.c:166
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr "Kontrollerar namnbyte av \"%s\" till \"%s\"\n"
+
+#: builtin/mv.c:170
+msgid "bad source"
+msgstr "felaktig källa"
+
+#: builtin/mv.c:173
+msgid "can not move directory into itself"
+msgstr "kan inte flytta katalog till sig själv"
+
+#: builtin/mv.c:176
+msgid "cannot move directory over file"
+msgstr "kan inte flytta katalog över fil"
+
+#: builtin/mv.c:185
+msgid "source directory is empty"
+msgstr "källkatalogen är tom"
+
+#: builtin/mv.c:210
+msgid "not under version control"
+msgstr "inte versionshanterad"
+
+#: builtin/mv.c:213
+msgid "destination exists"
+msgstr "destinationen finns"
+
+#: builtin/mv.c:221
+#, c-format
+msgid "overwriting '%s'"
+msgstr "skriver över \"%s\""
+
+#: builtin/mv.c:224
+msgid "Cannot overwrite"
+msgstr "Kan inte skriva över"
+
+#: builtin/mv.c:227
+msgid "multiple sources for the same target"
+msgstr "flera källor för samma mål"
+
+#: builtin/mv.c:229
+msgid "destination directory does not exist"
+msgstr "destinationskatalogen finns inte"
+
+#: builtin/mv.c:236
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, källa=%s, mål=%s"
+
+#: builtin/mv.c:257
+#, 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
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "misslyckades byta namn på \"%s\""
+
+#: builtin/name-rev.c:257
+msgid "git name-rev [<options>] <commit>..."
+msgstr "git name-rev [<flaggor>] <incheckning>..."
+
+#: builtin/name-rev.c:258
+msgid "git name-rev [<options>] --all"
+msgstr "git name-rev [<flaggor>] --all"
+
+#: builtin/name-rev.c:259
+msgid "git name-rev [<options>] --stdin"
+msgstr "git name-rev [<flaggor>] --stdin"
+
+#: builtin/name-rev.c:311
+msgid "print only names (no SHA-1)"
+msgstr "skriv endast namn (ingen SHA-1)"
+
+#: builtin/name-rev.c:312
+msgid "only use tags to name the commits"
+msgstr "använd endast taggar för att namnge incheckningar"
+
+#: builtin/name-rev.c:314
+msgid "only use refs matching <pattern>"
+msgstr "använd endast referenser som motsvarar <mönster>"
+
+#: builtin/name-rev.c:316
+msgid "list all commits reachable from all refs"
+msgstr "lista alla incheckningar som kan nås alla referenser"
+
+#: builtin/name-rev.c:317
+msgid "read from stdin"
+msgstr "läs från standard in"
+
+#: builtin/name-rev.c:318
+msgid "allow to print `undefined` names (default)"
+msgstr "tillåt att skriva \"odefinierade\" namn (standard)"
+
+#: builtin/name-rev.c:324
+msgid "dereference tags in the input (internal use)"
+msgstr "avreferera taggar i indata (används internt)"
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]"
+
+#: 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 <anteckningsref>] add [-f] [--allow-empty] [-m <medd> | -F "
+"<fil> | (-c | -C) <objekt>] [<objekt>]"
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+"git notes [--ref <anteckningsref>] copy [-f] <från-objekt> <till-objekt>"
+
+#: 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 <anteckningsref>] append [--allow-empty] [-m <medd> | -F "
+"<fil> | (-c | -C) <objekt>] [<objekt>]"
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+msgstr "git notes [--ref <anteckningsref>] edit [--allow-empty] [<objekt>]"
+
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
+msgstr "git notes [--ref <anteckningsref>] show [<objekt>]"
+
+#: builtin/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+msgstr ""
+"git notes [--ref <anteckningsref>] merge [-v | -q] [-s <strategi>] "
+"<anteckningsref>"
+
+#: 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 <anteckningsref>] remove [<objekt>...]"
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+msgstr "git notes [--ref <anteckningsref>] prune [-n | -v]"
+
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
+msgstr "git notes [--ref <anteckningsref>] get-ref"
+
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [<objekt>]]"
+
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<flaggor>] [<objekt>]"
+
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<flaggor>] <från-objekt> <till-objekt>"
+
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<från-objekt> <till-objekt>]..."
+
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<flaggor>] [<objekt>]"
+
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<objekt>]"
+
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
+msgstr "git notes show [<objekt>]"
+
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
+msgstr "git notes merge [<flaggor>] <anteckningsref>"
+
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<flaggor>]"
+
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<flaggor>]"
+
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<objekt>]"
+
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<flaggor>]"
+
+#: 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 "Skriv/redigera anteckningar för följande objekt:"
+
+#: builtin/notes.c:147
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "kunde inte starta \"show\" för objektet \"%s\""
+
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
+msgstr "kunde inte läsa utdata från \"show\""
+
+#: builtin/notes.c:159
+#, c-format
+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"
+
+#: builtin/notes.c:203
+msgid "unable to write note object"
+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"
+
+#: builtin/notes.c:233 builtin/tag.c:439
+#, c-format
+msgid "cannot read '%s'"
+msgstr "kunde inte läsa \"%s\""
+
+#: builtin/notes.c:235 builtin/tag.c:442
+#, 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:659
+#, 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\"."
+
+#: builtin/notes.c:261
+#, c-format
+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: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:652
+#: builtin/notes.c:802 builtin/notes.c:949 builtin/notes.c:970
+msgid "too many parameters"
+msgstr "för många parametrar"
+
+#: builtin/notes.c:378 builtin/notes.c:665
+#, c-format
+msgid "no note found for object %s."
+msgstr "inga anteckningar hittades för objektet %s."
+
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "note contents as a string"
+msgstr "anteckningsinnehåll som sträng"
+
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "note contents in a file"
+msgstr "anteckningsinnehåll i en fil"
+
+#: 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:408 builtin/notes.c:571
+msgid "reuse specified note object"
+msgstr "återanvänd angivet anteckningsobjekt"
+
+#: builtin/notes.c:411 builtin/notes.c:574
+msgid "allow storing empty note"
+msgstr "tillåt lagra tom anteckning"
+
+#: builtin/notes.c:412 builtin/notes.c:483
+msgid "replace existing notes"
+msgstr "ersätt befintliga anteckningar"
+
+#: builtin/notes.c:437
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+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: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:463 builtin/notes.c:624 builtin/notes.c:889
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr "Tar bort anteckning för objektet %s\n"
+
+#: builtin/notes.c:484
+msgid "read objects from stdin"
+msgstr "läs objekt från standard in"
+
+#: 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:504
+msgid "too few parameters"
+msgstr "för få parametrar"
+
+#: builtin/notes.c:525
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+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:537
+#, c-format
+msgid "missing notes on source object %s. Cannot copy."
+msgstr "anteckningar på källobjektet %s saknas. Kan inte kopiera."
+
+#: 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 ""
+"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:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "misslyckades ta bort referensen NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "misslyckades ta bort referensen NOTES_MERGE_REF"
+
+#: builtin/notes.c:689
+msgid "failed to remove 'git notes merge' worktree"
+msgstr "misslyckades ta bort arbetskatalogen för \"git notes merge\""
+
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "misslyckades läsa references NOTES_MERGE_PARTIAL"
+
+#: builtin/notes.c:711
+msgid "could not find commit from NOTES_MERGE_PARTIAL."
+msgstr "kunde inte hitta incheckning från NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:713
+msgid "could not parse commit from NOTES_MERGE_PARTIAL."
+msgstr "kunde inte tolka incheckning från NOTES_MERGE_PARTIAL."
+
+#: builtin/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "misslyckades bestämma NOTES_MERGE_REF"
+
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "misslyckades färdigställa sammanslagning av anteckningar"
+
+#: builtin/notes.c:755
+#, c-format
+msgid "unknown notes merge strategy %s"
+msgstr "okänd sammanslagningsstrategi för anteckningar: %s"
+
+#: builtin/notes.c:771
+msgid "General options"
+msgstr "Allmänna flaggor"
+
+#: builtin/notes.c:773
+msgid "Merge options"
+msgstr "Flaggor för sammanslagning"
+
+#: builtin/notes.c:775
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+"läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+
+#: builtin/notes.c:777
+msgid "Committing unmerged notes"
+msgstr "Checkar in ej sammanslagna anteckningar"
+
+#: builtin/notes.c:779
+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:781
+msgid "Aborting notes merge resolution"
+msgstr "Avbryt lösning av sammanslagning av anteckningar"
+
+#: builtin/notes.c:783
+msgid "abort notes merge"
+msgstr "avbryt sammanslagning av anteckningar"
+
+#: builtin/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "kan inte blanda --commit, --abort eller -s/--strategy"
+
+#: builtin/notes.c:799
+msgid "must specify a notes ref to merge"
+msgstr "måste ange en antecknings-referens att slå ihop"
+
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "okänd -s/--strategy: %s"
+
+#: builtin/notes.c:860
+#, 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"
+
+#: builtin/notes.c:863
+#, c-format
+msgid "failed to store link to current notes ref (%s)"
+msgstr "misslyckades lagra länk till aktuell anteckningsreferens (%s)"
+
+#: 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 ""
+"Automatisk sammanslagning av anteckningar misslyckades. Rätta konflikter i "
+"%s och checka in resultatet med \"git notes merge --commit\", eller avbryt "
+"sammanslagningen med \"git notes merge --abort\".\n"
+
+#: builtin/notes.c:887
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "Objektet %s har ingen anteckning\n"
+
+#: builtin/notes.c:899
+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:902
+msgid "read object names from the standard input"
+msgstr "läs objektnamn från standard in"
+
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "ta inte bort, bara visa"
+
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "rapportera borttagna anteckningar"
+
+#: builtin/notes.c:983
+msgid "notes-ref"
+msgstr "anteckningar-ref"
+
+#: builtin/notes.c:984
+msgid "use notes from <notes-ref>"
+msgstr "använd anteckningar från <anteckningsref>"
+
+#: builtin/notes.c:1019
+#, c-format
+msgid "unknown subcommand: %s"
+msgstr "okänt underkommando: %s"
+
+#: 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:30
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects [<flaggor>...] <basnamn> [< <reflista> | < <objektlista>]"
+
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
+#, c-format
+msgid "deflate error (%d)"
+msgstr "fel i deflate (%d)"
+
+#: builtin/pack-objects.c:768
+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:781
+msgid "Writing objects"
+msgstr "Skriver objekt"
+
+#: builtin/pack-objects.c:1070
+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:2346
+msgid "Compressing objects"
+msgstr "Komprimerar objekt"
+
+#: builtin/pack-objects.c:2759
+#, c-format
+msgid "unsupported index version %s"
+msgstr "indexversionen %s stöds ej"
+
+#: builtin/pack-objects.c:2763
+#, c-format
+msgid "bad index version '%s'"
+msgstr "felaktig indexversion \"%s\""
+
+#: builtin/pack-objects.c:2793
+msgid "do not show progress meter"
+msgstr "visa inte förloppsindikator"
+
+#: builtin/pack-objects.c:2795
+msgid "show progress meter"
+msgstr "visa förloppsindikator"
+
+#: builtin/pack-objects.c:2797
+msgid "show progress meter during object writing phase"
+msgstr "visa förloppsindikator under objektskrivningsfasen"
+
+#: builtin/pack-objects.c:2800
+msgid "similar to --all-progress when progress meter is shown"
+msgstr "som --all-progress när förloppsindikatorn visas"
+
+#: builtin/pack-objects.c:2801
+msgid "version[,offset]"
+msgstr "version[,offset]"
+
+#: builtin/pack-objects.c:2802
+msgid "write the pack index file in the specified idx format version"
+msgstr "skriv paketindexfilen i angiven indexformatversion"
+
+#: builtin/pack-objects.c:2805
+msgid "maximum size of each output pack file"
+msgstr "maximal storlek på varje utdatapaketfil"
+
+#: builtin/pack-objects.c:2807
+msgid "ignore borrowed objects from alternate object store"
+msgstr "ignorera lånade objekt från alternativa objektlager"
+
+#: builtin/pack-objects.c:2809
+msgid "ignore packed objects"
+msgstr "ignorera packade objekt"
+
+#: builtin/pack-objects.c:2811
+msgid "limit pack window by objects"
+msgstr "begränsa paketfönster efter objekt"
+
+#: builtin/pack-objects.c:2813
+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:2815
+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:2817
+msgid "reuse existing deltas"
+msgstr "återanvänd befintliga delta"
+
+#: builtin/pack-objects.c:2819
+msgid "reuse existing objects"
+msgstr "återanvänd befintliga objekt"
+
+#: builtin/pack-objects.c:2821
+msgid "use OFS_DELTA objects"
+msgstr "använd OFS_DELTA-objekt"
+
+#: builtin/pack-objects.c:2823
+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:2825
+msgid "do not create an empty pack output"
+msgstr "försök inte skapa tom paketutdata"
+
+#: builtin/pack-objects.c:2827
+msgid "read revision arguments from standard input"
+msgstr "läs revisionsargument från standard in"
+
+#: builtin/pack-objects.c:2829
+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:2832
+msgid "include objects reachable from any reference"
+msgstr "inkludera objekt som kan nås från någon referens"
+
+#: builtin/pack-objects.c:2835
+msgid "include objects referred by reflog entries"
+msgstr "inkludera objekt som refereras från referensloggposter"
+
+#: builtin/pack-objects.c:2838
+msgid "include objects referred to by the index"
+msgstr "inkludera objekt som refereras från indexet"
+
+#: builtin/pack-objects.c:2841
+msgid "output pack to stdout"
+msgstr "skriv paket på standard ut"
+
+#: builtin/pack-objects.c:2843
+msgid "include tag objects that refer to objects to be packed"
+msgstr "inkludera taggobjekt som refererar objekt som skall packas"
+
+#: builtin/pack-objects.c:2845
+msgid "keep unreachable objects"
+msgstr "behåll onåbara objekt"
+
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "packa lösa onåbara objekt"
+
+#: builtin/pack-objects.c:2849
+msgid "unpack unreachable objects newer than <time>"
+msgstr "packa upp onåbara objekt nyare än <tid>"
+
+#: builtin/pack-objects.c:2852
+msgid "create thin packs"
+msgstr "skapa tunna paket"
+
+#: builtin/pack-objects.c:2854
+msgid "create packs suitable for shallow fetches"
+msgstr "skapa packfiler lämpade för grunda hämtningar"
+
+#: builtin/pack-objects.c:2856
+msgid "ignore packs that have companion .keep file"
+msgstr "ignorera paket som har tillhörande .keep-fil"
+
+#: builtin/pack-objects.c:2858
+msgid "pack compression level"
+msgstr "komprimeringsgrad för paket"
+
+#: builtin/pack-objects.c:2860
+msgid "do not hide commits by grafts"
+msgstr "göm inte incheckningar med ympningar (\"grafts\")"
+
+#: builtin/pack-objects.c:2862
+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:2864
+msgid "write a bitmap index together with the pack index"
+msgstr "använd bitkartindex tillsammans med packindexet"
+
+#: builtin/pack-objects.c:2993
+msgid "Counting objects"
+msgstr "Räknar objekt"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
+msgstr "git pack-refs [<flaggor>]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "packa allt"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "ta bort lösa referenser (standard)"
+
+#: 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 "Tar bort duplicerade objekt"
+
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
+
+#: builtin/prune.c:106 builtin/worktree.c:128
+msgid "report pruned objects"
+msgstr "rapportera borttagna objekt"
+
+#: builtin/prune.c:109 builtin/worktree.c:130
+msgid "expire objects older than <time>"
+msgstr "låt tid gå ut för objekt äldre än <tid>"
+
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "kan inte rensa i ett \"precious-objekt\"-arkiv"
+
+#: 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:121
+msgid "Options related to merging"
+msgstr "Alternativ gällande sammanslagning"
+
+#: 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:148 builtin/revert.c:101
+msgid "allow fast-forward"
+msgstr "tillåt snabbspolning"
+
+#: 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:173
+msgid "Options related to fetching"
+msgstr "Alternativ gällande hämtningar"
+
+#: builtin/pull.c:195
+msgid "number of submodules pulled in parallel"
+msgstr "antal undermoduler som hämtas parallellt"
+
+#: 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:397
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr ""
+"Det finns ingen kandidat för ombasering bland referenserna du precis har "
+"hämtat."
+
+#: 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:400
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"Det betyder vanligtvis att du använt en jokertecken-refspec som inte\n"
+"motsvarade något i fjärränden."
+
+#: 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 ""
+"Du bad om att hämta från fjärren \"%s\", men angav inte någon\n"
+"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: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: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: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:413 builtin/pull.c:428
+msgid "See git-pull(1) for details."
+msgstr "Se git-pull(1) för detaljer."
+
+#: 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:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<gren>"
+
+#: 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: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:437
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+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:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "ignorera --verify-signatures för ombasering"
+
+#: builtin/pull.c:801
+msgid "--[no-]autostash option is only valid with --rebase."
+msgstr "--[no-]autostash är endast giltig med --rebase."
+
+#: 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: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"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"fetch uppdaterade huvudet för aktuell gren.\n"
+"snabbspolar din arbetskatalog från\n"
+"incheckningen %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 ""
+"Kan inte snabbspola din arbetskatalog.\n"
+"När du är säker på att du har sparat allt värdefullt i utdata från\n"
+"$ git diff %s\n"
+"kör du\n"
+"$ git reset --hard\n"
+"för att återgå."
+
+#: 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:862
+msgid "Cannot rebase onto multiple branches."
+msgstr "Kan inte ombasera ovanpå flera grenar."
+
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
+
+#: builtin/push.c:89
+msgid "tag shorthand without <tag>"
+msgstr "taggförkortning utan <tagg>"
+
+#: builtin/push.c:99
+msgid "--delete only accepts plain target ref names"
+msgstr "--delete godtar endast enkla målreferensnamn"
+
+#: builtin/push.c:143
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr ""
+"\n"
+"För att välja ett av alternativen permanent, se push.default i \"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 ""
+"Uppströmsgrenen för din nuvarande gren stämmer inte överens\n"
+"med namnet på din aktuella gren. För att sända till uppströmsgrenen\n"
+"i fjärrarkivet använder du\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"För att sända till grenen med samma namn i fjärrarkivet använder du\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 ""
+"Du är inte på någon gren för närvarande.\n"
+"För att sända in historiken som leder till den aktuella (frånkopplat\n"
+"HEAD) situationen använder du\n"
+"\n"
+"    git push %s HEAD:<namn-på-fjärrgren>\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 ""
+"Den aktuella grenen %s har ingen uppströmsgren.\n"
+"För att sända aktuell gren och ange fjärrarkiv som uppström använder du\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 "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända."
+
+#: 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 ""
+"Du sänder till fjärren \"%s\", som inte är uppströms för den\n"
+"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
+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
+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 ""
+"Uppdateringar avvisades då änden på din befintliga gren är bakom\n"
+"dess fjärrmotsvarighet. Integrera fjärrändringarna (t.ex\n"
+"\"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
+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 ""
+"Uppdateringar avvisades då änden på en gren som sänds in är bakom dess\n"
+"fjärrmotsvarighet. Checka ut grenen och integrera fjärrändringarna (t.ex.\n"
+"\"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
+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 ""
+"Uppdateringar avvisades då fjärren innehåller ändringar som du inte\n"
+"har lokalt. Det beror oftast på att ett annat arkiv har sänt in samma\n"
+"referenser. Det kan vara en idé att först integrera fjärrändringarna\n"
+"(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
+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
+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 ""
+"Du kan inte uppdatera en fjärr-referens som pekar på ett objekt som\n"
+"inte är en incheckning, eller uppdatera en fjärr-referens så att den\n"
+"pekar på något som inte är en incheckning, utan att använda flaggan\n"
+"\"--force\".\n"
+
+#: builtin/push.c:331
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "Sänder till %s\n"
+
+#: builtin/push.c:335
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr "misslyckades sända vissa referenser till \"%s\""
+
+#: builtin/push.c:366
+#, c-format
+msgid "bad repository '%s'"
+msgstr "felaktigt arkiv \"%s\""
+
+#: 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"
+msgstr ""
+"Ingen destination har angivits.\n"
+"Ange antingen URL:en på kommandoraden eller ställ in ett uppströmsarkiv med\n"
+"\n"
+"    git remote add <namn> <url>\n"
+"\n"
+"och sänd sedan med hjälp av fjärrnamnet\n"
+"\n"
+"    git push <namn>\n"
+
+#: builtin/push.c:385
+msgid "--all and --tags are incompatible"
+msgstr "--all och --tags är inkompatibla"
+
+#: builtin/push.c:386
+msgid "--all can't be combined with refspecs"
+msgstr "--all kan inte kombineras med referensspecifikationer"
+
+#: builtin/push.c:391
+msgid "--mirror and --tags are incompatible"
+msgstr "--mirror och --tags är inkompatibla"
+
+#: builtin/push.c:392
+msgid "--mirror can't be combined with refspecs"
+msgstr "--mirror kan inte kombineras med referensspecifikationer"
+
+#: builtin/push.c:397
+msgid "--all and --mirror are incompatible"
+msgstr "--all och --mirror är inkompatibla"
+
+#: builtin/push.c:515
+msgid "repository"
+msgstr "arkiv"
+
+#: builtin/push.c:516 builtin/send-pack.c:161
+msgid "push all refs"
+msgstr "sänd alla referenser"
+
+#: builtin/push.c:517 builtin/send-pack.c:163
+msgid "mirror all refs"
+msgstr "spegla alla referenser"
+
+#: builtin/push.c:519
+msgid "delete refs"
+msgstr "ta bort referenser"
+
+#: builtin/push.c:520
+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
+msgid "force updates"
+msgstr "tvinga uppdateringar"
+
+#: builtin/push.c:525 builtin/send-pack.c:175
+msgid "refname>:<expect"
+msgstr "refnamn>:<förvänta"
+
+#: builtin/push.c:526 builtin/send-pack.c:176
+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
+msgid "control recursive pushing of submodules"
+msgstr "styr rekursiv insändning av undermoduler"
+
+#: builtin/push.c:531 builtin/send-pack.c:169
+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
+msgid "receive pack program"
+msgstr "program för att ta emot paket"
+
+#: builtin/push.c:534
+msgid "set upstream for git pull/status"
+msgstr "ställ in uppström för git pull/status"
+
+#: builtin/push.c:537
+msgid "prune locally removed refs"
+msgstr "ta bort lokalt borttagna referenser"
+
+#: builtin/push.c:539
+msgid "bypass pre-push hook"
+msgstr "förbigå pre-push-krok"
+
+#: builtin/push.c:540
+msgid "push missing but relevant tags"
+msgstr "sänd in saknade men relevanta taggar"
+
+#: builtin/push.c:543 builtin/send-pack.c:166
+msgid "GPG sign the push"
+msgstr "GPG-signera insändningen"
+
+#: builtin/push.c:545 builtin/send-pack.c:170
+msgid "request atomic transaction on remote side"
+msgstr "begär atomiska transaktioner på fjärrsidan"
+
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "serverspecifik"
+
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr ""
+"inget att checka in\n"
+"flagga att sända"
+
+#: builtin/push.c:560
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr "--delete är inkompatibel med --all, --mirror och --tags"
+
+#: builtin/push.c:562
+msgid "--delete doesn't make sense without any refs"
+msgstr "--delete kan inte användas utan referenser"
+
+#: builtin/push.c:579
+msgid "push options must not have new line characters"
+msgstr "push-flaggor kan inte innehålla radbrytning"
+
+#: 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>]])"
+msgstr ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
+"[-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
+msgid "write resulting index to <file>"
+msgstr "skriv resulterande index till <fil>"
+
+#: builtin/read-tree.c:113
+msgid "only empty the index"
+msgstr "töm bara indexet"
+
+#: builtin/read-tree.c:115
+msgid "Merging"
+msgstr "Sammanslagning"
+
+#: builtin/read-tree.c:117
+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
+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
+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
+msgid "same as -m, but discard unmerged entries"
+msgstr "som -m, men kasta bort ej sammanslagna poster"
+
+#: builtin/read-tree.c:124
+msgid "<subdirectory>/"
+msgstr "<underkatalog>/"
+
+#: builtin/read-tree.c:125
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "läs in trädet i indexet under <underkatalog>/"
+
+#: builtin/read-tree.c:128
+msgid "update working tree with merge result"
+msgstr "uppdatera arbetskatalogen med resultatet från sammanslagningen"
+
+#: builtin/read-tree.c:130
+msgid "gitignore"
+msgstr "gitignore"
+
+#: builtin/read-tree.c:131
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "tillåt explicit ignorerade filer att skrivas över"
+
+#: builtin/read-tree.c:134
+msgid "don't check the working tree after merging"
+msgstr "kontrollera inte arbetskatalogen efter sammanslagning"
+
+#: builtin/read-tree.c:135
+msgid "don't update the index or the work tree"
+msgstr "uppdatera inte indexet eller arbetskatalogen"
+
+#: builtin/read-tree.c:137
+msgid "skip applying sparse checkout filter"
+msgstr "hoppa över att applicera filter för gles utcheckning"
+
+#: builtin/read-tree.c:139
+msgid "debug unpack-trees"
+msgstr "felsök unpack-trees"
+
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <git-katalog>"
+
+#: 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 ""
+"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: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 ""
+"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:1883
+msgid "quiet"
+msgstr "tyst"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Du måste ange en katalog."
+
+#: builtin/reflog.c:423
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
+msgstr "\"%s\" för \"%s\" är inte en giltig tidsstämpel"
+
+#: builtin/reflog.c:540 builtin/reflog.c:545
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "\"%s\" är inte en giltig tidsstämpel"
+
+#: 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 <gren>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <namn> <url>"
+
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <gammal> <ny>"
+
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr "git remote remove <namn>"
+
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <namn> (-a | --auto | -d | --delete | <gren>)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <namn>"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <namn>"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<grupp> | <fjärr>)...]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <namn> <gren>..."
+
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <namn>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <namn> <nyurl> [<gammalurl>]"
+
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <namn> <nyurl>"
+
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <namn> <url>"
+
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<flaggor>] <namn> <url>"
+
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <namn> <gren>..."
+
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <namn> <gren>..."
+
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<flaggor>] <namn>"
+
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<flaggor>] <namn>"
+
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..."
+
+#: builtin/remote.c:94
+#, c-format
+msgid "Updating %s"
+msgstr "Uppdaterar %s"
+
+#: builtin/remote.c:126
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"--mirror är farlig och föråldrad; använd\n"
+"\t --mirror=fetch eller --mirror=push istället"
+
+#: builtin/remote.c:143
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "okänt argument till mirror: %s"
+
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
+msgstr "hämta fjärrgrenarna"
+
+#: builtin/remote.c:161
+msgid "import all tags and associated objects when fetching"
+msgstr "importera alla taggar och associerade objekt vid hämtning"
+
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "eller hämta inte några taggar alls (--no-tags)"
+
+#: builtin/remote.c:166
+msgid "branch(es) to track"
+msgstr "gren(ar) att spåra"
+
+#: builtin/remote.c:167
+msgid "master branch"
+msgstr "huvudgren"
+
+#: builtin/remote.c:168
+msgid "push|fetch"
+msgstr "push|fetch"
+
+#: builtin/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "ställ in arkiv som spegel att sända eller ta emot från"
+
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr "att ange en master-gren ger ingen mening med --mirror"
+
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr "att ange grenar att spåra ger mening bara med hämtningsspeglar"
+
+#: builtin/remote.c:190 builtin/remote.c:629
+#, c-format
+msgid "remote %s already exists."
+msgstr "fjärrarkivet %s finns redan."
+
+#: builtin/remote.c:194 builtin/remote.c:633
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "\"%s\" är inte ett giltigt namn på fjärrarkiv"
+
+#: builtin/remote.c:234
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "Kunde inte skapa master \"%s\""
+
+#: builtin/remote.c:336
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr "Kunde inte hämta mappning för referensspecifikation %s"
+
+#: builtin/remote.c:437 builtin/remote.c:445
+msgid "(matching)"
+msgstr "(matchande)"
+
+#: builtin/remote.c:449
+msgid "(delete)"
+msgstr "(ta bort)"
+
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#, c-format
+msgid "No such remote: %s"
+msgstr "Inget sådant fjärrarkiv: %s"
+
+#: builtin/remote.c:639
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "Kunde inte byta namn på konfigurationssektionen \"%s\" till \"%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 ""
+"Uppdaterar inte icke-standard hämtningsreferensspecifikation\n"
+"\t%s\n"
+"\tUppdatera konfigurationen manuellt om nödvändigt."
+
+#: builtin/remote.c:695
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "misslyckades ta bort \"%s\""
+
+#: builtin/remote.c:729
+#, c-format
+msgid "creating '%s' failed"
+msgstr "misslyckades skapa \"%s\""
+
+#: 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] ""
+"Observera: En gren utanför hierarkin refs/remotes/ togs inte bort;\n"
+"för att ta bort den, använd:"
+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
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "Kunde inte ta bort konfigurationssektionen \"%s\""
+
+#: builtin/remote.c:907
+#, 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
+msgid " tracked"
+msgstr " spårad"
+
+#: builtin/remote.c:912
+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
+msgid " ???"
+msgstr " ???"
+
+#: builtin/remote.c:955
+#, 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
+#, c-format
+msgid "rebases interactively onto remote %s"
+msgstr "ombaseras interaktivt på fjärren %s"
+
+#: builtin/remote.c:964
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "ombaseras på fjärren %s"
+
+#: builtin/remote.c:967
+#, c-format
+msgid " merges with remote %s"
+msgstr " sammanslås med fjärren %s"
+
+#: builtin/remote.c:970
+#, c-format
+msgid "merges with remote %s"
+msgstr "sammanslås med fjärren %s"
+
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    och med fjärren %s\n"
+
+#: builtin/remote.c:1016
+msgid "create"
+msgstr "skapa"
+
+#: builtin/remote.c:1019
+msgid "delete"
+msgstr "ta bort"
+
+#: builtin/remote.c:1023
+msgid "up to date"
+msgstr "àjour"
+
+#: builtin/remote.c:1026
+msgid "fast-forwardable"
+msgstr "kan snabbspolas"
+
+#: builtin/remote.c:1029
+msgid "local out of date"
+msgstr "lokal föråldrad"
+
+#: builtin/remote.c:1036
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s tvingar till %-*s (%s)"
+
+#: builtin/remote.c:1039
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s sänder till %-*s (%s)"
+
+#: builtin/remote.c:1043
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s tvingar till %s"
+
+#: builtin/remote.c:1046
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s sänder till %s"
+
+#: builtin/remote.c:1114
+msgid "do not query remotes"
+msgstr "fråga inte fjärrar"
+
+#: builtin/remote.c:1141
+#, c-format
+msgid "* remote %s"
+msgstr "* fjärr %s"
+
+#: builtin/remote.c:1142
+#, c-format
+msgid "  Fetch URL: %s"
+msgstr "  Hämt-URL: %s"
+
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
+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
+#, c-format
+msgid "  Push  URL: %s"
+msgstr "  Sänd-URL: %s"
+
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  HEAD-gren: %s"
+
+#: builtin/remote.c:1158
+msgid "(not queried)"
+msgstr "(inte förfrågad)"
+
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(okänd)"
+
+#: builtin/remote.c:1164
+#, 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
+#, 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:1205
+msgid " (status not queried)"
+msgstr " (status inte förfrågad)"
+
+#: builtin/remote.c:1188
+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
+msgid "  Local refs will be mirrored by 'git push'"
+msgstr "  Lokala referenser speglas av \"git push\""
+
+#: 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] "  Lokal referens konfigurerad för \"git push\"%s:"
+msgstr[1] "  Lokala referenser konfigurerade för \"git push\"%s:"
+
+#: builtin/remote.c:1223
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
+
+#: builtin/remote.c:1225
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "ta bort refs/remotes/<namn>/HEAD"
+
+#: builtin/remote.c:1240
+msgid "Cannot determine remote HEAD"
+msgstr "Kan inte bestämma HEAD på fjärren"
+
+#: builtin/remote.c:1242
+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:1252
+#, c-format
+msgid "Could not delete %s"
+msgstr "Kunde inte ta bort %s"
+
+#: builtin/remote.c:1260
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr "Inte en giltig referens: %s"
+
+#: builtin/remote.c:1262
+#, c-format
+msgid "Could not setup %s"
+msgstr "Kunde inte ställa in %s"
+
+#: builtin/remote.c:1280
+#, c-format
+msgid " %s will become dangling!"
+msgstr " %s kommer bli dinglande!"
+
+#: builtin/remote.c:1281
+#, c-format
+msgid " %s has become dangling!"
+msgstr " %s har blivit dinglande!"
+
+#: builtin/remote.c:1291
+#, c-format
+msgid "Pruning %s"
+msgstr "Rensar %s"
+
+#: builtin/remote.c:1292
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: builtin/remote.c:1308
+#, c-format
+msgid " * [would prune] %s"
+msgstr " * [skulle rensa] %s"
+
+#: builtin/remote.c:1311
+#, c-format
+msgid " * [pruned] %s"
+msgstr " * [rensad] %s"
+
+#: builtin/remote.c:1356
+msgid "prune remotes after fetching"
+msgstr "rensa fjärrar efter hämtning"
+
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
+#, c-format
+msgid "No such remote '%s'"
+msgstr "Ingen sådan fjärr \"%s\""
+
+#: builtin/remote.c:1435
+msgid "add branch"
+msgstr "lägg till gren"
+
+#: builtin/remote.c:1442
+msgid "no remote specified"
+msgstr "ingen fjärr angavs"
+
+#: builtin/remote.c:1459
+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:1461
+msgid "return all URLs"
+msgstr "returnera alla URL:er"
+
+#: builtin/remote.c:1489
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "ingen URL:er angivna för fjärren \"%s\""
+
+#: builtin/remote.c:1515
+msgid "manipulate push URLs"
+msgstr "manipulera URL:ar för sändning"
+
+#: builtin/remote.c:1517
+msgid "add URL"
+msgstr "lägg till URL"
+
+#: builtin/remote.c:1519
+msgid "delete URLs"
+msgstr "ta bort URL:ar"
+
+#: builtin/remote.c:1526
+msgid "--add --delete doesn't make sense"
+msgstr "--add --delete ger ingen mening"
+
+#: builtin/remote.c:1567
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "Felaktig gammalt URL-mönster: %s"
+
+#: builtin/remote.c:1575
+#, c-format
+msgid "No such URL found: %s"
+msgstr "Ingen sådan URL hittades: %s"
+
+#: builtin/remote.c:1577
+msgid "Will not delete all non-push URLs"
+msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
+
+#: builtin/remote.c:1591
+msgid "be verbose; must be placed before a subcommand"
+msgstr "var pratsam; måste skrivas före ett underkommando"
+
+#: builtin/remote.c:1622
+#, 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
+msgid "pack everything in a single pack"
+msgstr "packa allt i ett enda paket"
+
+#: builtin/repack.c:162
+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
+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
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "sänd --no-reuse-delta till git-pack-objects"
+
+#: builtin/repack.c:169
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr "sänd --no-reuse-object till git-pack-objects"
+
+#: builtin/repack.c:171
+msgid "do not run git-update-server-info"
+msgstr "kör inte git-update-server-info"
+
+#: builtin/repack.c:174
+msgid "pass --local to git-pack-objects"
+msgstr "sänd --local till git-pack-objects"
+
+#: builtin/repack.c:176
+msgid "write bitmap index"
+msgstr "skriv bitkartindex"
+
+#: builtin/repack.c:177
+msgid "approxidate"
+msgstr "cirkadatum"
+
+#: builtin/repack.c:178
+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
+msgid "with -a, repack unreachable objects"
+msgstr "med -a, packa om onåbara objekt"
+
+#: builtin/repack.c:182
+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
+msgid "bytes"
+msgstr "byte"
+
+#: builtin/repack.c:184
+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
+msgid "limits the maximum delta depth"
+msgstr "begränsa maximalt deltadjup"
+
+#: builtin/repack.c:188
+msgid "maximum size of each packfile"
+msgstr "maximal storlek på varje paketfil"
+
+#: builtin/repack.c:190
+msgid "repack objects in packs marked with .keep"
+msgstr "packa om objekt i paket märkta med .keep"
+
+#: builtin/repack.c:200
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "kan inte ta bort paket i ett \"precious-objects\"-arkiv"
+
+#: builtin/repack.c:204
+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
+#, c-format
+msgid "failed to remove '%s'"
+msgstr "misslyckades ta bort \"%s\""
+
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <objekt> <ersättning>"
+
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <objekt>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <incheckning> [<förälder>...]"
 
-#: builtin/push.c:331
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d <objekt>..."
+
+#: builtin/replace.c:23
+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
 #, c-format
-msgid "Pushing to %s\n"
-msgstr "Sänder till %s\n"
+msgid "Not a valid object name: '%s'"
+msgstr "Objektnamnet är inte giltigt: \"%s\""
 
-#: builtin/push.c:335
+#: builtin/replace.c:355
 #, c-format
-msgid "failed to push some refs to '%s'"
-msgstr "misslyckades sända vissa referenser till \"%s\""
+msgid "bad mergetag in commit '%s'"
+msgstr "felaktig sammanslagningstagg i incheckningen \"%s\""
 
-#: builtin/push.c:365
+#: builtin/replace.c:357
 #, c-format
-msgid "bad repository '%s'"
-msgstr "felaktigt arkiv \"%s\""
+msgid "malformed mergetag in commit '%s'"
+msgstr "felformad sammanslagningstagg i incheckningen \"%s\""
 
-#: builtin/push.c:366
+#: builtin/replace.c:368
+#, c-format
 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"
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
 msgstr ""
-"Ingen destination har angivits.\n"
-"Ange antingen URL:en på kommandoraden eller ställ in ett uppströmsarkiv med\n"
-"\n"
-"    git remote add <namn> <url>\n"
-"\n"
-"och sänd sedan med hjälp av fjärrnamnet\n"
-"\n"
-"    git push <namn>\n"
+"den ursprungliga incheckningen \"%s\" innehåller sammanslagningstaggen \"%s"
+"\" som har förkastats; använd --edit istället för --graft"
 
-#: builtin/push.c:381
-msgid "--all and --tags are incompatible"
-msgstr "--all och --tags är inkompatibla"
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "den ursprungliga incheckningen \"%s\" har en gpg-signatur."
 
-#: builtin/push.c:382
-msgid "--all can't be combined with refspecs"
-msgstr "--all kan inte kombineras med referensspecifikationer"
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "signaturen kommer att tas bort i ersättningsincheckningen!"
 
-#: builtin/push.c:387
-msgid "--mirror and --tags are incompatible"
-msgstr "--mirror och --tags är inkompatibla"
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "kunde inte skriva ersättningsincheckning för: \"%s\""
 
-#: builtin/push.c:388
-msgid "--mirror can't be combined with refspecs"
-msgstr "--mirror kan inte kombineras med referensspecifikationer"
+#: builtin/replace.c:432
+msgid "list replace refs"
+msgstr "visa ersättningsreferenser"
 
-#: builtin/push.c:393
-msgid "--all and --mirror are incompatible"
-msgstr "--all och --mirror är inkompatibla"
+#: builtin/replace.c:433
+msgid "delete replace refs"
+msgstr "ta bort ersättningsreferenser"
 
-#: builtin/push.c:505
-msgid "repository"
-msgstr "arkiv"
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "redigera befintligt objekt"
 
-#: builtin/push.c:506 builtin/send-pack.c:161
-msgid "push all refs"
-msgstr "sänd alla referenser"
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "ändra en inchecknings föräldrar"
 
-#: builtin/push.c:507 builtin/send-pack.c:163
-msgid "mirror all refs"
-msgstr "spegla alla referenser"
+#: builtin/replace.c:436
+msgid "replace the ref if it exists"
+msgstr "ersätt referensen om den finns"
 
-#: builtin/push.c:509
-msgid "delete refs"
-msgstr "ta bort referenser"
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "använd inte snygg visning av innehåll för --edit"
 
-#: builtin/push.c:510
-msgid "push tags (can't be used with --all or --mirror)"
-msgstr "sänd taggar (kan inte användas med --all eller --mirror)"
+#: builtin/replace.c:438
+msgid "use this format"
+msgstr "använd detta format"
 
-#: builtin/push.c:513 builtin/send-pack.c:164
-msgid "force updates"
-msgstr "tvinga uppdateringar"
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
-msgid "refname>:<expect"
-msgstr "refnamn>:<förvänta"
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr "registrera rena lösningar i indexet"
 
-#: builtin/push.c:516 builtin/send-pack.c:176
-msgid "require old value of ref to be at this value"
-msgstr "kräv att ref:s tidigare värde är detta"
+#: builtin/reset.c:26
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<incheckning>]"
 
-#: builtin/push.c:519
-msgid "control recursive pushing of submodules"
-msgstr "styr rekursiv insändning av undermoduler"
+#: builtin/reset.c:27
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<träd-igt>] [--] <sökvägar>..."
 
-#: builtin/push.c:521 builtin/send-pack.c:169
-msgid "use thin pack"
-msgstr "använd tunna paket"
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [<träd-igt>] [--] [<sökvägar>...]"
 
-#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
-msgid "receive pack program"
-msgstr "program för att ta emot paket"
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr "blandad"
 
-#: builtin/push.c:524
-msgid "set upstream for git pull/status"
-msgstr "ställ in uppström för git pull/status"
+#: builtin/reset.c:34
+msgid "soft"
+msgstr "mjuk"
 
-#: builtin/push.c:527
-msgid "prune locally removed refs"
-msgstr "ta bort lokalt borttagna referenser"
+#: builtin/reset.c:34
+msgid "hard"
+msgstr "hård"
 
-#: builtin/push.c:529
-msgid "bypass pre-push hook"
-msgstr "förbigå pre-push-krok"
+#: builtin/reset.c:34
+msgid "merge"
+msgstr "sammanslagning"
 
-#: builtin/push.c:530
-msgid "push missing but relevant tags"
-msgstr "sänd in saknade men relevanta taggar"
+#: builtin/reset.c:34
+msgid "keep"
+msgstr "behåll"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
-msgid "GPG sign the push"
-msgstr "GPG-signera insändningen"
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr "Du har inte en giltig HEAD."
 
-#: builtin/push.c:535 builtin/send-pack.c:170
-msgid "request atomic transaction on remote side"
-msgstr "begär atomiska transaktioner på fjärrsidan"
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr "Kunde inte hitta träder för HEAD."
 
-#: builtin/push.c:549
-msgid "--delete is incompatible with --all, --mirror and --tags"
-msgstr "--delete är inkompatibel med --all, --mirror och --tags"
+#: builtin/reset.c:82
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr "Kunde inte hitta träder för %s."
 
-#: builtin/push.c:551
-msgid "--delete doesn't make sense without any refs"
-msgstr "--delete kan inte användas utan referenser"
+#: builtin/reset.c:100
+#, c-format
+msgid "HEAD is now at %s"
+msgstr "HEAD är nu på %s"
 
-#: 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>]])"
-msgstr ""
-"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
-"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
-"index-output=<fil>] (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])"
+#: builtin/reset.c:183
+#, c-format
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "Kan inte utföra en %s återställning mitt i en sammanslagning."
 
-#: builtin/read-tree.c:110
-msgid "write resulting index to <file>"
-msgstr "skriv resulterande index till <fil>"
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr "var tyst, rapportera endast fel"
 
-#: builtin/read-tree.c:113
-msgid "only empty the index"
-msgstr "töm bara indexet"
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr "återställ HEAD och index"
 
-#: builtin/read-tree.c:115
-msgid "Merging"
-msgstr "Sammanslagning"
+#: builtin/reset.c:279
+msgid "reset only HEAD"
+msgstr "återställ endast HEAD"
 
-#: builtin/read-tree.c:117
-msgid "perform a merge in addition to a read"
-msgstr "utför en sammanslagning i tillägg till en läsning"
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr "återställ HEAD, index och arbetskatalog"
 
-#: builtin/read-tree.c:119
-msgid "3-way merge if no file level merging required"
-msgstr "3-vägssammanslagning om sammanslagning på filnivå ej krävs"
+#: builtin/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr "återställ HEAD men behåll lokala ändringar"
 
-#: builtin/read-tree.c:121
-msgid "3-way merge in presence of adds and removes"
-msgstr "3-vägssammanslagning när det finns tillägg och borttagningar"
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr "registrera endast att borttagna sökvägar kommer läggas till senare"
 
-#: builtin/read-tree.c:123
-msgid "same as -m, but discard unmerged entries"
-msgstr "som -m, men kasta bort ej sammanslagna poster"
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "Kunde inte slå upp \"%s\" som en giltig revision."
 
-#: builtin/read-tree.c:124
-msgid "<subdirectory>/"
-msgstr "<underkatalog>/"
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "Kunde inte slå upp \"%s\" som ett giltigt träd."
 
-#: builtin/read-tree.c:125
-msgid "read the tree into the index under <subdirectory>/"
-msgstr "läs in trädet i indexet under <underkatalog>/"
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr "--patch är inkompatibel med --{hard,mixed,soft}"
+
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr ""
+"--mixed rekommenderas inte med sökvägar; använd \"git reset -- <sökvägar>\"."
+
+#: builtin/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "Kan inte göra %s återställning med sökvägar."
 
-#: builtin/read-tree.c:128
-msgid "update working tree with merge result"
-msgstr "uppdatera arbetskatalogen med resultatet från sammanslagningen"
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "%s återställning tillåts inte i ett naket arkiv"
 
-#: builtin/read-tree.c:130
-msgid "gitignore"
-msgstr "gitignore"
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr "-N kan endast användas med --mixed"
 
-#: builtin/read-tree.c:131
-msgid "allow explicitly ignored files to be overwritten"
-msgstr "tillåt explicit ignorerade filer att skrivas över"
+#: builtin/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr "Oköade ändringar efter återställning:"
 
-#: builtin/read-tree.c:134
-msgid "don't check the working tree after merging"
-msgstr "kontrollera inte arbetskatalogen efter sammanslagning"
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
 
-#: builtin/read-tree.c:135
-msgid "don't update the index or the work tree"
-msgstr "uppdatera inte indexet eller arbetskatalogen"
+#: builtin/reset.c:374
+msgid "Could not write new index file."
+msgstr "Kunde inte skriva ny indexfil."
 
-#: builtin/read-tree.c:137
-msgid "skip applying sparse checkout filter"
-msgstr "hoppa över att applicera filter för gles utcheckning"
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr "rev-list stöder inte visning av anteckningar"
 
-#: builtin/read-tree.c:139
-msgid "debug unpack-trees"
-msgstr "felsök unpack-trees"
+#: builtin/rev-parse.c:386
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr "git rev-parse --parseopt [<options>] -- [<argument>...]"
 
-#: builtin/reflog.c:423
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr "\"%s\" för \"%s\" är inte en giltig tidsstämpel"
+#: builtin/rev-parse.c:391
+msgid "keep the `--` passed as an arg"
+msgstr "behåll \"--\" sänt som argument"
 
-#: builtin/reflog.c:540 builtin/reflog.c:545
-#, c-format
-msgid "'%s' is not a valid timestamp"
-msgstr "\"%s\" är inte en giltig tidsstämpel"
+#: builtin/rev-parse.c:393
+msgid "stop parsing after the first non-option argument"
+msgstr "sluta tolka efter första argument som inte är flagga"
 
-#: builtin/remote.c:12
-msgid "git remote [-v | --verbose]"
-msgstr "git remote [-v | --verbose]"
+#: builtin/rev-parse.c:396
+msgid "output in stuck long form"
+msgstr "utdata fast i lång form"
 
-#: builtin/remote.c:13
+#: builtin/rev-parse.c:527
 msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
+"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 ""
-"git remote add [-t <gren>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <namn> <url>"
-
-#: builtin/remote.c:14 builtin/remote.c:34
-msgid "git remote rename <old> <new>"
-msgstr "git remote rename <gammal> <ny>"
-
-#: builtin/remote.c:15 builtin/remote.c:39
-msgid "git remote remove <name>"
-msgstr "git remote remove <namn>"
+"git rev-parse --parseopt [<flaggor>] -- [<argument>...]\n"
+"     eller: git rev-parse --sq-quote [<argument>...]\n"
+"     eller: git rev-parse [<flaggor>] [<argument>...]\n"
+"\n"
+"Kör \"git rev-parse --parseopt -h\" för mer information om den första "
+"varianten."
 
-#: builtin/remote.c:16 builtin/remote.c:44
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr "git remote set-head <namn> (-a | --auto | -d | --delete | <gren>)"
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr "git revert [<flaggor>] <incheckning-igt>..."
 
-#: builtin/remote.c:17
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr "git remote [-v | --verbose] show [-n] <namn>"
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <underkommando>"
 
-#: builtin/remote.c:18
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr "git remote prune [-n | --dry-run] <namn>"
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr "git cherry-pick [<flaggor>] <incheckning-igt>..."
 
-#: builtin/remote.c:19
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-"git remote [-v | --verbose] update [-p | --prune] [(<grupp> | <fjärr>)...]"
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <underkommando>"
 
-#: builtin/remote.c:20
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr "git remote set-branches [--add] <namn> <gren>..."
+#: builtin/revert.c:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: %s kan inte användas med %s"
 
-#: builtin/remote.c:21 builtin/remote.c:70
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr "git remote get-url [--push] [--all] <namn>"
+#: builtin/revert.c:80
+msgid "end revert or cherry-pick sequence"
+msgstr "avsluta revert- eller cherry-pick-sekvens"
 
-#: builtin/remote.c:22 builtin/remote.c:75
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr "git remote set-url [--push] <namn> <nyurl> [<gammalurl>]"
+#: builtin/revert.c:81
+msgid "resume revert or cherry-pick sequence"
+msgstr "återuppta revert- eller cherry-pick-sekvens"
 
-#: builtin/remote.c:23 builtin/remote.c:76
-msgid "git remote set-url --add <name> <newurl>"
-msgstr "git remote set-url --add <namn> <nyurl>"
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr "avbryt revert- eller cherry-pick-sekvens"
 
-#: builtin/remote.c:24 builtin/remote.c:77
-msgid "git remote set-url --delete <name> <url>"
-msgstr "git remote set-url --delete <namn> <url>"
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr "checka inte in automatiskt"
 
-#: builtin/remote.c:29
-msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [<flaggor>] <namn> <url>"
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr "redigera incheckningsmeddelandet"
 
-#: builtin/remote.c:49
-msgid "git remote set-branches <name> <branch>..."
-msgstr "git remote set-branches <namn> <gren>..."
+#: builtin/revert.c:87
+msgid "parent number"
+msgstr "nummer på förälder"
 
-#: builtin/remote.c:50
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add <namn> <gren>..."
+#: builtin/revert.c:89
+msgid "merge strategy"
+msgstr "sammanslagningsstrategi"
 
-#: builtin/remote.c:55
-msgid "git remote show [<options>] <name>"
-msgstr "git remote show [<flaggor>] <namn>"
+#: builtin/revert.c:90
+msgid "option"
+msgstr "alternativ"
 
-#: builtin/remote.c:60
-msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [<flaggor>] <namn>"
+#: builtin/revert.c:91
+msgid "option for merge strategy"
+msgstr "alternativ för sammanslagningsstrategi"
 
-#: builtin/remote.c:65
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..."
+#: builtin/revert.c:100
+msgid "append commit name"
+msgstr "lägg till incheckningsnamn"
 
-#: builtin/remote.c:94
-#, c-format
-msgid "Updating %s"
-msgstr "Uppdaterar %s"
+#: builtin/revert.c:102
+msgid "preserve initially empty commits"
+msgstr "behåll incheckningar som börjar som tomma"
 
-#: builtin/remote.c:126
-msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
-msgstr ""
-"--mirror är farlig och föråldrad; använd\n"
-"\t --mirror=fetch eller --mirror=push istället"
+#: builtin/revert.c:103
+msgid "allow commits with empty messages"
+msgstr "tillåt incheckningar med tomt meddelande"
 
-#: builtin/remote.c:143
-#, c-format
-msgid "unknown mirror argument: %s"
-msgstr "okänt argument till mirror: %s"
+#: builtin/revert.c:104
+msgid "keep redundant, empty commits"
+msgstr "behåll redundanta, tomma incheckningar"
 
-#: builtin/remote.c:159
-msgid "fetch the remote branches"
-msgstr "hämta fjärrgrenarna"
+#: builtin/revert.c:192
+msgid "revert failed"
+msgstr "\"revert\" misslyckades"
 
-#: builtin/remote.c:161
-msgid "import all tags and associated objects when fetching"
-msgstr "importera alla taggar och associerade objekt vid hämtning"
+#: builtin/revert.c:205
+msgid "cherry-pick failed"
+msgstr "\"cherry-pick\" misslyckades"
 
-#: builtin/remote.c:164
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr "eller hämta inte några taggar alls (--no-tags)"
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr "git rm [<flaggor>] [--] <fil>..."
 
-#: builtin/remote.c:166
-msgid "branch(es) to track"
-msgstr "gren(ar) att spåra"
+#: 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/remote.c:167
-msgid "master branch"
-msgstr "huvudgren"
+#: 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/remote.c:168
-msgid "push|fetch"
-msgstr "push|fetch"
+#: 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] ""
+"följande fil har köat innehåll som skiljer sig både från filen och HEAD:"
+msgstr[1] ""
+"följande filer har köat innehåll som skiljer sig både från filen och HEAD:"
 
-#: builtin/remote.c:169
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr "ställ in arkiv som spegel att sända eller ta emot från"
+#: builtin/rm.c:235
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(använd -f för att tvinga borttagning)"
 
-#: builtin/remote.c:181
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr "att ange en master-gren ger ingen mening med --mirror"
+#: 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] "följande fil har ändringar köade i indexet:"
+msgstr[1] "följande filer har ändringar köade i indexet:"
 
-#: builtin/remote.c:183
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr "att ange grenar att spåra ger mening bara med hämtningsspeglar"
+#: builtin/rm.c:243 builtin/rm.c:254
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr ""
+"\n"
+"(använd --cached för att behålla filen eller -f för att tvinga borttagning)"
 
-#: builtin/remote.c:190 builtin/remote.c:633
-#, c-format
-msgid "remote %s already exists."
-msgstr "fjärrarkivet %s finns redan."
+#: builtin/rm.c:251
+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/remote.c:194 builtin/remote.c:637
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr "\"%s\" är inte ett giltigt namn på fjärrarkiv"
+#: builtin/rm.c:269
+msgid "do not list removed files"
+msgstr "lista inte borttagna filer"
 
-#: builtin/remote.c:234
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr "Kunde inte skapa master \"%s\""
+#: builtin/rm.c:270
+msgid "only remove from the index"
+msgstr "ta bara bort från indexet"
 
-#: builtin/remote.c:336
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr "Kunde inte hämta mappning för referensspecifikation %s"
+#: builtin/rm.c:271
+msgid "override the up-to-date check"
+msgstr "överstyr àjour-testet"
 
-#: builtin/remote.c:437 builtin/remote.c:445
-msgid "(matching)"
-msgstr "(matchande)"
+#: builtin/rm.c:272
+msgid "allow recursive removal"
+msgstr "tillåt rekursiv borttagning"
 
-#: builtin/remote.c:449
-msgid "(delete)"
-msgstr "(ta bort)"
+#: builtin/rm.c:274
+msgid "exit with a zero status even if nothing matched"
+msgstr "avsluta med nollstatus även om inget träffades"
 
-#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
+#: builtin/rm.c:335
 #, c-format
-msgid "No such remote: %s"
-msgstr "Inget sådant fjärrarkiv: %s"
+msgid "not removing '%s' recursively without -r"
+msgstr "tar inte bort \"%s\" rekursivt utan -r"
 
-#: builtin/remote.c:643
+#: builtin/rm.c:374
 #, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr "Kunde inte byta namn på konfigurationssektionen \"%s\" till \"%s\""
+msgid "git rm: unable to remove %s"
+msgstr "git rm: kan inte ta bort %s"
 
-#: builtin/remote.c:663
-#, c-format
+#: builtin/send-pack.c:18
 msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
+"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 ""
-"Uppdaterar inte icke-standard hämtningsreferensspecifikation\n"
-"\t%s\n"
-"\tUppdatera konfigurationen manuellt om nödvändigt."
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<värd>:]<katalog> "
+"[<ref>...]\n"
+"  --all och explicit angiven <ref> är ömsesidigt uteslutande."
 
-#: builtin/remote.c:699
-#, c-format
-msgid "deleting '%s' failed"
-msgstr "misslyckades ta bort \"%s\""
+#: builtin/send-pack.c:160
+msgid "remote name"
+msgstr "fjärrnamn"
 
-#: builtin/remote.c:733
-#, c-format
-msgid "creating '%s' failed"
-msgstr "misslyckades skapa \"%s\""
+#: builtin/send-pack.c:171
+msgid "use stateless RPC protocol"
+msgstr "använd tillståndslöst RPC-protokoll"
 
-#: builtin/remote.c:796
-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] ""
-"Observera: En gren utanför hierarkin refs/remotes/ togs inte bort;\n"
-"för att ta bort den, använd:"
-msgstr[1] ""
-"Observera: Några grenar utanför hierarkin refs/remotes/ togs inte bort;\n"
-"för att ta bort dem, använd:"
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr "läs referenser från standard in"
 
-#: builtin/remote.c:810
-#, c-format
-msgid "Could not remove config section '%s'"
-msgstr "Kunde inte ta bort konfigurationssektionen \"%s\""
+#: builtin/send-pack.c:173
+msgid "print status from remote helper"
+msgstr "visa status från fjärrhjälpare"
 
-#: builtin/remote.c:911
-#, c-format
-msgid " new (next fetch will store in remotes/%s)"
-msgstr " ny (nästa hämtning sparar i remotes/%s)"
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr "git shortlog [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
 
-#: builtin/remote.c:914
-msgid " tracked"
-msgstr " spårad"
+#: builtin/shortlog.c:242
+msgid "sort output according to the number of commits per author"
+msgstr "sortera utdata enligt antal incheckningar per författare"
 
-#: builtin/remote.c:916
-msgid " stale (use 'git remote prune' to remove)"
-msgstr " förlegad (använd \"git remote prune\" för att ta bort)"
+#: builtin/shortlog.c:244
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr "Undertryck beskrivningar, visa bara antal incheckningar"
 
-#: builtin/remote.c:918
-msgid " ???"
-msgstr " ???"
+#: builtin/shortlog.c:246
+msgid "Show the email address of each author"
+msgstr "Visa e-postadress för varje författare"
 
-#: builtin/remote.c:959
-#, c-format
-msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr "ogiltig branch.%s.merge; kan inte ombasera över > 1 gren"
+#: builtin/shortlog.c:247
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
 
-#: builtin/remote.c:967
-#, c-format
-msgid "rebases interactively onto remote %s"
-msgstr "ombaseras interaktivt på fjärren %s"
+#: builtin/shortlog.c:248
+msgid "Linewrap output"
+msgstr "Radbryt utdata"
 
-#: builtin/remote.c:971
-#, c-format
-msgid " merges with remote %s"
-msgstr " sammanslås med fjärren %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"
+"\t\t[--current] [--color[=<när>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <mönster>)...]"
 
-#: builtin/remote.c:972
-msgid "    and with remote"
-msgstr "    och med fjärren"
+#: builtin/show-branch.c:14
+msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr "git show-branch (-g | --reflog)[=<n>[,<bas>]] [--list] [<ref>]"
 
-#: builtin/remote.c:974
+#: builtin/show-branch.c:375
 #, c-format
-msgid "merges with remote %s"
-msgstr "sammanslås med fjärren %s"
-
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   och med fjärren"
-
-#: builtin/remote.c:1021
-msgid "create"
-msgstr "skapa"
-
-#: builtin/remote.c:1024
-msgid "delete"
-msgstr "ta bort"
-
-#: builtin/remote.c:1028
-msgid "up to date"
-msgstr "àjour"
-
-#: builtin/remote.c:1031
-msgid "fast-forwardable"
-msgstr "kan snabbspolas"
-
-#: builtin/remote.c:1034
-msgid "local out of date"
-msgstr "lokal föråldrad"
+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/remote.c:1041
+#: builtin/show-branch.c:541
 #, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr "    %-*s tvingar till %-*s (%s)"
+msgid "no matching refs with %s"
+msgstr "inga motsvarande referenser med %s"
 
-#: builtin/remote.c:1044
-#, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr "    %-*s sänder till %-*s (%s)"
+#: builtin/show-branch.c:639
+msgid "show remote-tracking and local branches"
+msgstr "visa fjärrspårande och lokala grenar"
 
-#: builtin/remote.c:1048
-#, c-format
-msgid "    %-*s forces to %s"
-msgstr "    %-*s tvingar till %s"
+#: builtin/show-branch.c:641
+msgid "show remote-tracking branches"
+msgstr "visa fjärrspårande grenar"
 
-#: builtin/remote.c:1051
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr "    %-*s sänder till %s"
+#: builtin/show-branch.c:643
+msgid "color '*!+-' corresponding to the branch"
+msgstr "färga \"*!+-\" enligt grenen"
 
-#: builtin/remote.c:1119
-msgid "do not query remotes"
-msgstr "fråga inte fjärrar"
+#: builtin/show-branch.c:645
+msgid "show <n> more commits after the common ancestor"
+msgstr "visa <n> ytterligare incheckningar efter gemensam anfader"
 
-#: builtin/remote.c:1146
-#, c-format
-msgid "* remote %s"
-msgstr "* fjärr %s"
+#: builtin/show-branch.c:647
+msgid "synonym to more=-1"
+msgstr "synonym till more=-1"
 
-#: builtin/remote.c:1147
-#, c-format
-msgid "  Fetch URL: %s"
-msgstr "  Hämt-URL: %s"
+#: builtin/show-branch.c:648
+msgid "suppress naming strings"
+msgstr "undertyck namnsträngar"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
-msgid "(no URL)"
-msgstr "(ingen URL)"
+#: builtin/show-branch.c:650
+msgid "include the current branch"
+msgstr "inkludera aktuell gren"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
-#, c-format
-msgid "  Push  URL: %s"
-msgstr "  Sänd-URL: %s"
+#: builtin/show-branch.c:652
+msgid "name commits with their object names"
+msgstr "namnge incheckningar med deras objektnamn"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
-#, c-format
-msgid "  HEAD branch: %s"
-msgstr "  HEAD-gren: %s"
+#: builtin/show-branch.c:654
+msgid "show possible merge bases"
+msgstr "visa möjliga sammanslagningsbaser"
 
-#: builtin/remote.c:1167
-#, 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/show-branch.c:656
+msgid "show refs unreachable from any other ref"
+msgstr "visa referenser som inte kan nås från någon annan referens"
 
-#: builtin/remote.c:1179
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] "  Fjärrgren:%s"
-msgstr[1] "  Fjärrgrenar:%s"
+#: builtin/show-branch.c:658
+msgid "show commits in topological order"
+msgstr "visa incheckningar i topologisk ordning"
 
-#: builtin/remote.c:1182 builtin/remote.c:1209
-msgid " (status not queried)"
-msgstr " (status inte förfrågad)"
+#: builtin/show-branch.c:661
+msgid "show only commits not on the first branch"
+msgstr "visa endast incheckningar inte på den första grenen"
 
-#: builtin/remote.c:1191
-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/show-branch.c:663
+msgid "show merges reachable from only one tip"
+msgstr "visa sammanslagningar som endast kan nås från en spets"
 
-#: builtin/remote.c:1199
-msgid "  Local refs will be mirrored by 'git push'"
-msgstr "  Lokala referenser speglas av \"git push\""
+#: builtin/show-branch.c:665
+msgid "topologically sort, maintaining date order where possible"
+msgstr "sortera topologiskt, behåll datumordning när möjligt"
 
-#: builtin/remote.c:1206
-#, 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/show-branch.c:668
+msgid "<n>[,<base>]"
+msgstr "<n>[,<bas>]"
 
-#: builtin/remote.c:1227
-msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
+#: builtin/show-branch.c:669
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "visa <n> nyaste refloggposter med början på bas"
 
-#: builtin/remote.c:1229
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr "ta bort refs/remotes/<namn>/HEAD"
+#: builtin/show-branch.c:703
+msgid ""
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
+msgstr ""
+"--reflog är inkompatibel med --all, --remotes, --independent eller --merge-"
+"base"
 
-#: builtin/remote.c:1244
-msgid "Cannot determine remote HEAD"
-msgstr "Kan inte bestämma HEAD på fjärren"
+#: builtin/show-branch.c:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "inga grenar angavs, och HEAD är inte giltigt"
 
-#: builtin/remote.c:1246
-msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr "Flera HEAD-grenar på fjärren. Välj en explicit med:"
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "--reflog behöver ett namn på en gren"
 
-#: builtin/remote.c:1256
+#: builtin/show-branch.c:733
 #, c-format
-msgid "Could not delete %s"
-msgstr "Kunde inte ta bort %s"
+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/remote.c:1264
+#: builtin/show-branch.c:737
 #, c-format
-msgid "Not a valid ref: %s"
-msgstr "Inte en giltig referens: %s"
+msgid "no such ref %s"
+msgstr "ingen sådan referens %s"
 
-#: builtin/remote.c:1266
+#: builtin/show-branch.c:829
 #, c-format
-msgid "Could not setup %s"
-msgstr "Kunde inte ställa in %s"
+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/remote.c:1284
+#: builtin/show-branch.c:833
 #, c-format
-msgid " %s will become dangling!"
-msgstr " %s kommer bli dinglande!"
+msgid "'%s' is not a valid ref."
+msgstr "\"%s\" är inte en giltig referens."
 
-#: builtin/remote.c:1285
+#: builtin/show-branch.c:836
 #, c-format
-msgid " %s has become dangling!"
-msgstr " %s har blivit dinglande!"
+msgid "cannot find commit %s (%s)"
+msgstr "hittar inte incheckning %s (%s)"
 
-#: builtin/remote.c:1295
-#, c-format
-msgid "Pruning %s"
-msgstr "Rensar %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[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mönster>...]"
 
-#: builtin/remote.c:1296
-#, c-format
-msgid "URL: %s"
-msgstr "URL: %s"
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<mönster>]"
 
-#: builtin/remote.c:1312
-#, c-format
-msgid " * [would prune] %s"
-msgstr " * [skulle rensa] %s"
+#: builtin/show-ref.c:165
+msgid "only show tags (can be combined with heads)"
+msgstr "visa endast taggar (kan kombineras med huvuden)"
 
-#: builtin/remote.c:1315
-#, c-format
-msgid " * [pruned] %s"
-msgstr " * [rensad] %s"
+#: builtin/show-ref.c:166
+msgid "only show heads (can be combined with tags)"
+msgstr "visa endast huvuden (kan kombineras med taggar)"
 
-#: builtin/remote.c:1360
-msgid "prune remotes after fetching"
-msgstr "rensa fjärrar efter hämtning"
+#: builtin/show-ref.c:167
+msgid "stricter reference checking, requires exact ref path"
+msgstr "striktare referenskontroll, kräver exakt referenssökväg"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
-#, c-format
-msgid "No such remote '%s'"
-msgstr "Ingen sådan fjärr \"%s\""
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr "visa HEAD-refrens, även när den skulle filtreras ut"
 
-#: builtin/remote.c:1439
-msgid "add branch"
-msgstr "lägg till gren"
+#: builtin/show-ref.c:174
+msgid "dereference tags into object IDs"
+msgstr "avreferera taggar till objekt-id"
 
-#: builtin/remote.c:1446
-msgid "no remote specified"
-msgstr "ingen fjärr angavs"
+#: builtin/show-ref.c:176
+msgid "only show SHA1 hash using <n> digits"
+msgstr "visa SHA1-hash endast med <n> siffror"
 
-#: builtin/remote.c:1463
-msgid "query push URLs rather than fetch URLs"
-msgstr "fråga sänd-URL:er istället för hämta-URL:er"
+#: builtin/show-ref.c:180
+msgid "do not print results to stdout (useful with --verify)"
+msgstr "visa inte resultat på standard ut (användbart med --verify)"
 
-#: builtin/remote.c:1465
-msgid "return all URLs"
-msgstr "returnera alla URL:er"
+#: builtin/show-ref.c:182
+msgid "show refs from stdin that aren't in local repository"
+msgstr "visa referenser från standard in som inte finns i lokalt arkiv"
 
-#: builtin/remote.c:1493
-#, c-format
-msgid "no URLs configured for remote '%s'"
-msgstr "ingen URL:er angivna för fjärren \"%s\""
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
 
-#: builtin/remote.c:1519
-msgid "manipulate push URLs"
-msgstr "manipulera URL:ar för sändning"
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
 
-#: builtin/remote.c:1521
-msgid "add URL"
-msgstr "lägg till URL"
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "hoppa över och ta bort alla rader som inleds med kommentarstecken"
 
-#: builtin/remote.c:1523
-msgid "delete URLs"
-msgstr "ta bort URL:ar"
+#: builtin/stripspace.c:38
+msgid "prepend comment character and space to each line"
+msgstr "lägg in kommentarstecken och blanksteg först på varje rad"
 
-#: builtin/remote.c:1530
-msgid "--add --delete doesn't make sense"
-msgstr "--add --delete ger ingen mening"
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
+#, c-format
+msgid "No such ref: %s"
+msgstr "Ingen sådan referens: %s"
 
-#: builtin/remote.c:1571
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr "Felaktig gammalt URL-mönster: %s"
+msgid "Expecting a full ref name, got %s"
+msgstr "Förväntade fullt referensnamn, fick %s"
 
-#: builtin/remote.c:1579
+#: builtin/submodule--helper.c:71
 #, c-format
-msgid "No such URL found: %s"
-msgstr "Ingen sådan URL hittades: %s"
+msgid "cannot strip one component off url '%s'"
+msgstr "kan inte ta bort en komponent från url:en \"%s\""
 
-#: builtin/remote.c:1581
-msgid "Will not delete all non-push URLs"
-msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
+msgid "alternative anchor for relative paths"
+msgstr "alternativa ankare för relativa sökvägar"
 
-#: builtin/remote.c:1595
-msgid "be verbose; must be placed before a subcommand"
-msgstr "var pratsam; måste skrivas före ett underkommando"
+#: builtin/submodule--helper.c:287
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<sökväg>] [<sökväg>...]"
 
-#: builtin/repack.c:17
-msgid "git repack [<options>]"
-msgstr "git repack [<flaggor>]"
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, 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/repack.c:159
-msgid "pack everything in a single pack"
-msgstr "packa allt i ett enda paket"
+#: builtin/submodule--helper.c:369
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "Misslyckades registrera url för undermodulsökväg \"%s\""
 
-#: builtin/repack.c:161
-msgid "same as -a, and turn unreachable objects loose"
-msgstr "samma som -a, och gör onåbara objekt lösa"
+#: builtin/submodule--helper.c:373
+#, c-format
+msgid "Submodule '%s' (%s) registered for path '%s'\n"
+msgstr "Undermodulen \"%s\" (%s) registrerad för sökvägen \"%s\"\n"
 
-#: builtin/repack.c:164
-msgid "remove redundant packs, and run git-prune-packed"
-msgstr "ta bort överflödiga paket, och kör git-prune-packed"
+#: builtin/submodule--helper.c:383
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "varning: kommandouppdateringsläge föreslogs för undermodulen \"%s\"\n"
 
-#: builtin/repack.c:166
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr "sänd --no-reuse-delta till git-pack-objects"
+#: builtin/submodule--helper.c:390
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr "Misslyckades registrera uppdateringsläge för undermodulsökväg \"%s\""
 
-#: builtin/repack.c:168
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr "sänd --no-reuse-object till git-pack-objects"
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr "Dölj utdata från initiering av undermodul"
 
-#: builtin/repack.c:170
-msgid "do not run git-update-server-info"
-msgstr "kör inte git-update-server-info"
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<sökväg>]"
 
-#: builtin/repack.c:173
-msgid "pass --local to git-pack-objects"
-msgstr "sänd --local till git-pack-objects"
+#: builtin/submodule--helper.c:435
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <sökväg>"
 
-#: builtin/repack.c:175
-msgid "write bitmap index"
-msgstr "skriv bitkartindex"
+#: builtin/submodule--helper.c:441
+#, 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/repack.c:176
-msgid "approxidate"
-msgstr "cirkadatum"
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
+#, c-format
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "undermodulen \"%s\" kan inte lägga till alternativ: %s"
 
-#: builtin/repack.c:177
-msgid "with -A, do not loosen objects older than this"
-msgstr "med -A, lös inte upp objekt äldre än detta"
+#: builtin/submodule--helper.c:563
+#, c-format
+msgid "Value '%s' for submodule.alternateErrorStrategy is not recognized"
+msgstr "Värdet \"%s\" i submodule.alternateErrorStrategy förstås inte"
 
-#: builtin/repack.c:179
-msgid "size of the window used for delta compression"
-msgstr "storlek på fönster använt för deltakomprimering"
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "Värdet \"%s\" i submodule.alternateLocation förstås inte"
 
-#: builtin/repack.c:180 builtin/repack.c:184
-msgid "bytes"
-msgstr "byte"
+#: builtin/submodule--helper.c:593
+msgid "where the new submodule will be cloned to"
+msgstr "var den nya undermodulen skall klonas till"
 
-#: builtin/repack.c:181
-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/submodule--helper.c:596
+msgid "name of the new submodule"
+msgstr "namn på den nya undermodulen"
 
-#: builtin/repack.c:183
-msgid "limits the maximum delta depth"
-msgstr "begränsa maximalt deltadjup"
+#: builtin/submodule--helper.c:599
+msgid "url where to clone the submodule from"
+msgstr "URL att klona undermodulen från"
 
-#: builtin/repack.c:185
-msgid "maximum size of each packfile"
-msgstr "maximal storlek på varje paketfil"
+#: builtin/submodule--helper.c:605
+msgid "depth for shallow clones"
+msgstr "djup för grunda kloner"
 
-#: builtin/repack.c:187
-msgid "repack objects in packs marked with .keep"
-msgstr "packa om objekt i paket märkta med .keep"
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "tvinga kloningsförlopp"
 
-#: builtin/repack.c:197
-msgid "cannot delete packs in a precious-objects repo"
-msgstr "kan inte ta bort paket i ett \"precious-objects\"-arkiv"
+#: 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=<sökväg>] [--quiet] [--reference "
+"<arkvi>] [--name <namn>] [--depth <djup>] --url <url> --path <sökväg>"
 
-#: builtin/repack.c:381
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
-msgid "removing '%s' failed"
-msgstr "misslyckades ta bort \"%s\""
-
-#: builtin/replace.c:19
-msgid "git replace [-f] <object> <replacement>"
-msgstr "git replace [-f] <objekt> <ersättning>"
-
-#: builtin/replace.c:20
-msgid "git replace [-f] --edit <object>"
-msgstr "git replace [-f] --edit <objekt>"
-
-#: builtin/replace.c:21
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr "git replace [-f] --graft <incheckning> [<förälder>...]"
-
-#: builtin/replace.c:22
-msgid "git replace -d <object>..."
-msgstr "git replace -d <objekt>..."
+msgid "could not create directory '%s'"
+msgstr "kunde inte skapa katalogen \"%s\""
 
-#: builtin/replace.c:23
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr "git replace [--format=<format>] [-l [<mönster>]]"
+#: builtin/submodule--helper.c:644
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "misslyckades klona \"%s\" till undermodulsökvägen \"%s\""
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/submodule--helper.c:660
 #, c-format
-msgid "Not a valid object name: '%s'"
-msgstr "Objektnamnet är inte giltigt: \"%s\""
+msgid "cannot open file '%s'"
+msgstr "kan inte öppna filen \"%s\""
 
-#: builtin/replace.c:355
+#: builtin/submodule--helper.c:665
 #, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr "felaktig sammanslagningstagg i incheckningen \"%s\""
+msgid "could not close file %s"
+msgstr "kunde inte stänga filen %s"
 
-#: builtin/replace.c:357
+#: builtin/submodule--helper.c:672
 #, c-format
-msgid "malformed mergetag in commit '%s'"
-msgstr "felformad sammanslagningstagg i incheckningen \"%s\""
+msgid "could not get submodule directory for '%s'"
+msgstr "kunde inte få tag i undermodulkatalog för \"%s\""
 
-#: builtin/replace.c:368
+#: builtin/submodule--helper.c:726
 #, c-format
-msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
-msgstr ""
-"den ursprungliga incheckningen \"%s\" innehåller sammanslagningstaggen \"%s"
-"\" som har förkastats; använd --edit istället för --graft"
+msgid "Submodule path '%s' not initialized"
+msgstr "Undermodulsökvägen \"%s\" har inte initierats"
 
-#: builtin/replace.c:401
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "Kanske menade du att använda \"update --init\"?"
+
+#: builtin/submodule--helper.c:756
 #, c-format
-msgid "the original commit '%s' has a gpg signature."
-msgstr "den ursprungliga incheckningen \"%s\" har en gpg-signatur."
+msgid "Skipping unmerged submodule %s"
+msgstr "Hoppar över ej sammanslagen undermodul %s"
 
-#: builtin/replace.c:402
-msgid "the signature will be removed in the replacement commit!"
-msgstr "signaturen kommer att tas bort i ersättningsincheckningen!"
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "Hoppar över undermodulen \"%s\""
 
-#: builtin/replace.c:408
+#: builtin/submodule--helper.c:913
 #, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr "kunde inte skriva ersättningsincheckning för: \"%s\""
+msgid "Failed to clone '%s'. Retry scheduled"
+msgstr "Misslyckades klona \"%s\". Nytt försök planlagt"
 
-#: builtin/replace.c:432
-msgid "list replace refs"
-msgstr "visa ersättningsreferenser"
+#: builtin/submodule--helper.c:924
+#, c-format
+msgid "Failed to clone '%s' a second time, aborting"
+msgstr "Misslyckades klona \"%s\" för andra gången, avbryter"
 
-#: builtin/replace.c:433
-msgid "delete replace refs"
-msgstr "ta bort ersättningsreferenser"
+#: builtin/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr "sökväg inuti arbetskatalogen"
 
-#: builtin/replace.c:434
-msgid "edit existing object"
-msgstr "redigera befintligt objekt"
+#: builtin/submodule--helper.c:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "sökväg inuti arbetskatalogen, genom nästlade undermodulgränser"
 
-#: builtin/replace.c:435
-msgid "change a commit's parents"
-msgstr "ändra en inchecknings föräldrar"
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout eller none"
 
-#: builtin/replace.c:436
-msgid "replace the ref if it exists"
-msgstr "ersätt referensen om den finns"
+#: builtin/submodule--helper.c:956
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "Skapa en grund klon trunkerad till angivet antal revisioner"
 
-#: builtin/replace.c:437
-msgid "do not pretty-print contents for --edit"
-msgstr "använd inte snygg visning av innehåll för --edit"
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr "parallella jobb"
 
-#: builtin/replace.c:438
-msgid "use this format"
-msgstr "använd detta format"
+#: builtin/submodule--helper.c:961
+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/rerere.c:12
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+#: builtin/submodule--helper.c:962
+msgid "don't print cloning progress"
+msgstr "skriv inte klonförlopp"
 
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr "registrera rena lösningar i indexet"
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<sökväg>] [<sökväg>...]"
 
-#: builtin/reset.c:26
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "felaktigt värde för parametern update"
+
+#: builtin/submodule--helper.c:1050
+#, 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] [<incheckning>]"
+"Undermodulens (%s) gren inställd på att ärva gren från huvudprojektet, men "
+"huvudprojektet är inte på någon gren"
 
-#: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <träd-igt> [--] <sökvägar>..."
+#: builtin/submodule--helper.c:1100
+msgid "submodule--helper subcommand must be called with a subcommand"
+msgstr "underkommandot submodule--helper måste anropas med ett underkommando"
 
-#: builtin/reset.c:28
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr "git reset --patch [<träd-igt>] [--] [<sökvägar>...]"
+#: builtin/submodule--helper.c:1107
+#, c-format
+msgid "'%s' is not a valid submodule--helper subcommand"
+msgstr "\"%s\" är inte ett giltigt underkommando till submodule--helper"
 
-#: builtin/reset.c:34
-msgid "mixed"
-msgstr "blandad"
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr "git symbolic-ref [<flaggor>] <namn> [<ref>]"
 
-#: builtin/reset.c:34
-msgid "soft"
-msgstr "mjuk"
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr "git symbolic-ref -d [-q] <namn>"
 
-#: builtin/reset.c:34
-msgid "hard"
-msgstr "hård"
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr ""
+"undertryck felmeddelanden för icke-symboliska (frånkopplade) referenser"
 
-#: builtin/reset.c:34
-msgid "merge"
-msgstr "sammanslagning"
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "ta bort symbolisk referens"
 
-#: builtin/reset.c:34
-msgid "keep"
-msgstr "behåll"
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "förkorta ref-utdata"
 
-#: builtin/reset.c:74
-msgid "You do not have a valid HEAD."
-msgstr "Du har inte en giltig HEAD."
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr "skäl"
 
-#: builtin/reset.c:76
-msgid "Failed to find tree of HEAD."
-msgstr "Kunde inte hitta träder för HEAD."
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr "skäl till uppdateringen"
 
-#: builtin/reset.c:82
+#: 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 <nyckel-id>] [-f] [-m <medd> | -F <fil>] <taggnamn> "
+"[<huvud>]"
+
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <taggnamn>..."
+
+#: 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[<antal>]] [--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 "Failed to find tree of %s."
-msgstr "Kunde inte hitta träder för %s."
+msgid "tag name too long: %.*s..."
+msgstr "taggnamnet för långt: %.*s..."
 
-#: builtin/reset.c:100
+#: builtin/tag.c:86
 #, c-format
-msgid "HEAD is now at %s"
-msgstr "HEAD är nu på %s"
+msgid "tag '%s' not found."
+msgstr "taggen \"%s\" hittades inte."
 
-#: builtin/reset.c:183
+#: builtin/tag.c:101
 #, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr "Kan inte utföra en %s återställning mitt i en sammanslagning."
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "Tog bort tagg \"%s\" (var %s)\n"
 
-#: builtin/reset.c:276
-msgid "be quiet, only report errors"
-msgstr "var tyst, rapportera endast fel"
+#: builtin/tag.c:117
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+"\n"
+"Skriv ett meddelande för taggen:\n"
+"  %s\n"
+"Rader som inleds med \"%c\" ignoreras.\n"
 
-#: builtin/reset.c:278
-msgid "reset HEAD and index"
-msgstr "återställ HEAD och index"
+#: builtin/tag.c:121
+#, 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 ""
+"\n"
+"Skriv ett meddelande för taggen:\n"
+"  %s\n"
+"Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
+"du vill.\n"
 
-#: builtin/reset.c:279
-msgid "reset only HEAD"
-msgstr "återställ endast HEAD"
+#: builtin/tag.c:199
+msgid "unable to sign the tag"
+msgstr "kunde inte signera taggen"
 
-#: builtin/reset.c:281 builtin/reset.c:283
-msgid "reset HEAD, index and working tree"
-msgstr "återställ HEAD, index och arbetskatalog"
+#: builtin/tag.c:201
+msgid "unable to write tag file"
+msgstr "kunde inte skriva tagg-filen"
 
-#: builtin/reset.c:285
-msgid "reset HEAD but keep local changes"
-msgstr "återställ HEAD men behåll lokala ändringar"
+#: builtin/tag.c:226
+msgid "bad object type."
+msgstr "felaktig objekttyp"
 
-#: builtin/reset.c:288
-msgid "record only the fact that removed paths will be added later"
-msgstr "registrera endast att borttagna sökvägar kommer läggas till senare"
+#: builtin/tag.c:239
+msgid "tag header too big."
+msgstr "tagghuvud för stort."
 
-#: builtin/reset.c:305
-#, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr "Kunde inte slå upp \"%s\" som en giltig revision."
+#: builtin/tag.c:275
+msgid "no tag message?"
+msgstr "inget taggmeddelande?"
 
-#: builtin/reset.c:313
+#: builtin/tag.c:281
 #, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr "Kunde inte slå upp \"%s\" som ett giltigt träd."
+msgid "The tag message has been left in %s\n"
+msgstr "Taggmeddelandet har lämnats i %s\n"
 
-#: builtin/reset.c:322
-msgid "--patch is incompatible with --{hard,mixed,soft}"
-msgstr "--patch är inkompatibel med --{hard,mixed,soft}"
+#: builtin/tag.c:339
+msgid "list tag names"
+msgstr "lista taggnamn"
 
-#: builtin/reset.c:331
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-"--mixed rekommenderas inte med sökvägar; använd \"git reset -- <sökvägar>\"."
+#: builtin/tag.c:341
+msgid "print <n> lines of each tag message"
+msgstr "visa <n> rader från varje taggmeddelande"
 
-#: builtin/reset.c:333
-#, c-format
-msgid "Cannot do %s reset with paths."
-msgstr "Kan inte göra %s återställning med sökvägar."
+#: builtin/tag.c:343
+msgid "delete tags"
+msgstr "ta bort taggar"
 
-#: builtin/reset.c:343
-#, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr "%s återställning tillåts inte i ett naket arkiv"
+#: builtin/tag.c:344
+msgid "verify tags"
+msgstr "verifiera taggar"
 
-#: builtin/reset.c:347
-msgid "-N can only be used with --mixed"
-msgstr "-N kan endast användas med --mixed"
+#: builtin/tag.c:346
+msgid "Tag creation options"
+msgstr "Alternativ för att skapa taggar"
 
-#: builtin/reset.c:364
-msgid "Unstaged changes after reset:"
-msgstr "Oköade ändringar efter återställning:"
+#: builtin/tag.c:348
+msgid "annotated tag, needs a message"
+msgstr "annoterad tagg, behöver meddelande"
+
+#: builtin/tag.c:350
+msgid "tag message"
+msgstr "taggmeddelande"
+
+#: builtin/tag.c:352
+msgid "annotated and GPG-signed tag"
+msgstr "annoterad och GPG-signerad tagg"
+
+#: builtin/tag.c:356
+msgid "use another key to sign the tag"
+msgstr "använd annan nyckel för att signera taggen"
+
+#: builtin/tag.c:357
+msgid "replace the tag if exists"
+msgstr "ersätt taggen om den finns"
+
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "skapa en reflog"
+
+#: builtin/tag.c:360
+msgid "Tag listing options"
+msgstr "Alternativ för listning av taggar"
+
+#: builtin/tag.c:361
+msgid "show tag list in columns"
+msgstr "lista taggar i spalter"
 
-#: builtin/reset.c:370
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
+#: builtin/tag.c:362 builtin/tag.c:363
+msgid "print only tags that contain the commit"
+msgstr "visa endast taggar som innehåller incheckningen"
 
-#: builtin/reset.c:374
-msgid "Could not write new index file."
-msgstr "Kunde inte skriva ny indexfil."
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "visa endast taggar som slagits samman"
 
-#: builtin/rev-list.c:350
-msgid "rev-list does not support display of notes"
-msgstr "rev-list stöder inte visning av anteckningar"
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "visa endast taggar som ej slagits samman"
 
-#: builtin/rev-parse.c:358
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr "git rev-parse --parseopt [<options>] -- [<argument>...]"
+#: builtin/tag.c:370
+msgid "print only tags of the object"
+msgstr "visa endast taggar för objektet"
 
-#: builtin/rev-parse.c:363
-msgid "keep the `--` passed as an arg"
-msgstr "behåll \"--\" sänt som argument"
+#: builtin/tag.c:399
+msgid "--column and -n are incompatible"
+msgstr "--column och -n är inkompatibla"
 
-#: builtin/rev-parse.c:365
-msgid "stop parsing after the first non-option argument"
-msgstr "sluta tolka efter första argument som inte är flagga"
+#: builtin/tag.c:419
+msgid "-n option is only allowed with -l."
+msgstr "Flaggan -n är endast tillåten tillsammans med -l."
 
-#: builtin/rev-parse.c:368
-msgid "output in stuck long form"
-msgstr "utdata fast i lång form"
+#: builtin/tag.c:421
+msgid "--contains option is only allowed with -l."
+msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
 
-#: 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."
-msgstr ""
-"git rev-parse --parseopt [<flaggor>] -- [<argument>...]\n"
-"     eller: git rev-parse --sq-quote [<argument>...]\n"
-"     eller: git rev-parse [<flaggor>] [<argument>...]\n"
-"\n"
-"Kör \"git rev-parse --parseopt -h\" för mer information om den första "
-"varianten."
+#: 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/revert.c:22
-msgid "git revert [<options>] <commit-ish>..."
-msgstr "git revert [<flaggor>] <incheckning-igt>..."
+#: 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/revert.c:23
-msgid "git revert <subcommand>"
-msgstr "git revert <underkommando>"
+#: builtin/tag.c:433
+msgid "only one -F or -m option is allowed."
+msgstr "endast en av flaggorna -F eller -m tillåts."
 
-#: builtin/revert.c:28
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr "git cherry-pick [<flaggor>] <incheckning-igt>..."
+#: builtin/tag.c:452
+msgid "too many params"
+msgstr "för många parametrar"
 
-#: builtin/revert.c:29
-msgid "git cherry-pick <subcommand>"
-msgstr "git cherry-pick <underkommando>"
+#: builtin/tag.c:458
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "\"%s\" är inte ett giltigt taggnamn."
 
-#: builtin/revert.c:71
+#: builtin/tag.c:463
 #, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr "%s: %s kan inte användas med %s"
+msgid "tag '%s' already exists"
+msgstr "taggen \"%s\" finns redan"
 
-#: builtin/revert.c:80
-msgid "end revert or cherry-pick sequence"
-msgstr "avsluta revert- eller cherry-pick-sekvens"
+#: builtin/tag.c:491
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
 
-#: builtin/revert.c:81
-msgid "resume revert or cherry-pick sequence"
-msgstr "återuppta revert- eller cherry-pick-sekvens"
+#: builtin/unpack-objects.c:493
+msgid "Unpacking objects"
+msgstr "Packar upp objekt"
 
-#: builtin/revert.c:82
-msgid "cancel revert or cherry-pick sequence"
-msgstr "avbryt revert- eller cherry-pick-sekvens"
+#: builtin/update-index.c:79
+#, c-format
+msgid "failed to create directory %s"
+msgstr "misslyckades skapa katalogen %s"
 
-#: builtin/revert.c:83
-msgid "don't automatically commit"
-msgstr "checka inte in automatiskt"
+#: builtin/update-index.c:85
+#, c-format
+msgid "failed to stat %s"
+msgstr "misslyckades ta status på %s"
 
-#: builtin/revert.c:84
-msgid "edit the commit message"
-msgstr "redigera incheckningsmeddelandet"
+#: builtin/update-index.c:95
+#, c-format
+msgid "failed to create file %s"
+msgstr "misslyckades skapa filen %s"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "nummer på förälder"
+#: builtin/update-index.c:103
+#, c-format
+msgid "failed to delete file %s"
+msgstr "misslyckades ta bort filen %s"
 
-#: builtin/revert.c:89
-msgid "merge strategy"
-msgstr "sammanslagningsstrategi"
+#: builtin/update-index.c:110 builtin/update-index.c:212
+#, c-format
+msgid "failed to delete directory %s"
+msgstr "misslyckades ta bort katalogen %s"
 
-#: builtin/revert.c:90
-msgid "option"
-msgstr "alternativ"
+#: builtin/update-index.c:133
+#, c-format
+msgid "Testing mtime in '%s' "
+msgstr "Testar mtime i \"%s\""
 
-#: builtin/revert.c:91
-msgid "option for merge strategy"
-msgstr "alternativ för sammanslagningsstrategi"
+#: builtin/update-index.c:145
+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/revert.c:104
-msgid "append commit name"
-msgstr "lägg till incheckningsnamn"
+#: builtin/update-index.c:158
+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/revert.c:106
-msgid "preserve initially empty commits"
-msgstr "behåll incheckningar som börjar som tomma"
+#: builtin/update-index.c:171
+msgid "directory stat info changes after updating a file"
+msgstr "stat-informationen för en katalog ändras när filer uppdateras"
 
-#: builtin/revert.c:107
-msgid "allow commits with empty messages"
-msgstr "tillåt incheckningar med tomt meddelande"
+#: builtin/update-index.c:182
+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/revert.c:108
-msgid "keep redundant, empty commits"
-msgstr "behåll redundanta, tomma incheckningar"
+#: builtin/update-index.c:193
+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/revert.c:112
-msgid "program error"
-msgstr "programfel"
+#: builtin/update-index.c:206
+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/revert.c:197
-msgid "revert failed"
-msgstr "\"revert\" misslyckades"
+#: builtin/update-index.c:213
+msgid " OK"
+msgstr " OK"
 
-#: builtin/revert.c:212
-msgid "cherry-pick failed"
-msgstr "\"cherry-pick\" misslyckades"
+#: builtin/update-index.c:564
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr "git update-index [<flaggor>] [--] [<fil>...]"
 
-#: builtin/rm.c:17
-msgid "git rm [<options>] [--] <file>..."
-msgstr "git rm [<flaggor>] [--] <fil>..."
+#: builtin/update-index.c:919
+msgid "continue refresh even when index needs update"
+msgstr "fortsätt uppdatera även när index inte är àjour"
 
-#: 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/update-index.c:922
+msgid "refresh: ignore submodules"
+msgstr "refresh: ignorera undermoduler"
 
-#: 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/update-index.c:925
+msgid "do not ignore new files"
+msgstr "ignorera inte nya filer"
 
-#: 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] ""
-"följande fil har köat innehåll som skiljer sig både från filen och HEAD:"
-msgstr[1] ""
-"följande filer har köat innehåll som skiljer sig både från filen och HEAD:"
+#: builtin/update-index.c:927
+msgid "let files replace directories and vice-versa"
+msgstr "låt filer ersätta kataloger och omvänt"
 
-#: builtin/rm.c:235
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-"\n"
-"(använd -f för att tvinga borttagning)"
+#: builtin/update-index.c:929
+msgid "notice files missing from worktree"
+msgstr "lägg märke till filer som saknas i arbetskatalogen"
 
-#: 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] "följande fil har ändringar köade i indexet:"
-msgstr[1] "följande filer har ändringar köade i indexet:"
+#: builtin/update-index.c:931
+msgid "refresh even if index contains unmerged entries"
+msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
 
-#: builtin/rm.c:243 builtin/rm.c:254
-msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
-msgstr ""
-"\n"
-"(använd --cached för att behålla filen eller -f för att tvinga borttagning)"
+#: builtin/update-index.c:934
+msgid "refresh stat information"
+msgstr "uppdatera statusinformation"
 
-#: builtin/rm.c:251
-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/update-index.c:938
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "som --refresh, men ignorera assume-unchanged-inställning"
+
+#: builtin/update-index.c:942
+msgid "<mode>,<object>,<path>"
+msgstr "<läge>,<objekt>,<sökväg>"
 
-#: builtin/rm.c:269
-msgid "do not list removed files"
-msgstr "lista inte borttagna filer"
+#: builtin/update-index.c:943
+msgid "add the specified entry to the index"
+msgstr "lägg till angiven post i indexet"
 
-#: builtin/rm.c:270
-msgid "only remove from the index"
-msgstr "ta bara bort från indexet"
+#: builtin/update-index.c:952
+msgid "mark files as \"not changing\""
+msgstr "markera filer som \"ändras inte\""
 
-#: builtin/rm.c:271
-msgid "override the up-to-date check"
-msgstr "överstyr àjour-testet"
+#: builtin/update-index.c:955
+msgid "clear assumed-unchanged bit"
+msgstr "rensa \"assume-unchanged\"-biten"
 
-#: builtin/rm.c:272
-msgid "allow recursive removal"
-msgstr "tillåt rekursiv borttagning"
+#: builtin/update-index.c:958
+msgid "mark files as \"index-only\""
+msgstr "markera filer som \"endast index\""
 
-#: builtin/rm.c:274
-msgid "exit with a zero status even if nothing matched"
-msgstr "avsluta med nollstatus även om inget träffades"
+#: builtin/update-index.c:961
+msgid "clear skip-worktree bit"
+msgstr "töm \"skip-worktree\"-biten"
 
-#: builtin/rm.c:317
-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/update-index.c:964
+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/rm.c:335
-#, c-format
-msgid "not removing '%s' recursively without -r"
-msgstr "tar inte bort \"%s\" rekursivt utan -r"
+#: builtin/update-index.c:966
+msgid "remove named paths even if present in worktree"
+msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
 
-#: builtin/rm.c:374
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr "git rm: kan inte ta bort %s"
+#: builtin/update-index.c:968
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr "med --stdin: indatarader termineras med null-byte"
 
-#: 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=<git-"
-"receive-pack>] [--verbose] [--thin] [--atomic] [<värd>:]<katalog> "
-"[<ref>...]\n"
-"  --all och explicit angiven <ref> är ömsesidigt uteslutande."
+#: builtin/update-index.c:970
+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/send-pack.c:160
-msgid "remote name"
-msgstr "fjärrnamn"
+#: builtin/update-index.c:974
+msgid "add entries from standard input to the index"
+msgstr "lägg poster från standard in till indexet"
 
-#: builtin/send-pack.c:171
-msgid "use stateless RPC protocol"
-msgstr "använd tillståndslöst RPC-protokoll"
+#: builtin/update-index.c:978
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
 
-#: builtin/send-pack.c:172
-msgid "read refs from stdin"
-msgstr "läs referenser från standard in"
+#: builtin/update-index.c:982
+msgid "only update entries that differ from HEAD"
+msgstr "uppdatera endast poster som skiljer sig från HEAD"
 
-#: builtin/send-pack.c:173
-msgid "print status from remote helper"
-msgstr "visa status från fjärrhjälpare"
+#: builtin/update-index.c:986
+msgid "ignore files missing from worktree"
+msgstr "ignorera filer som saknas i arbetskatalogen"
 
-#: builtin/shortlog.c:13
-msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
-msgstr "git shortlog [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]"
+#: builtin/update-index.c:989
+msgid "report actions to standard output"
+msgstr "rapportera åtgärder på standard ut"
 
-#: builtin/shortlog.c:242
-msgid "sort output according to the number of commits per author"
-msgstr "sortera utdata enligt antal incheckningar per författare"
+#: builtin/update-index.c:991
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr "(för porslin) glöm sparade olösta konflikter"
 
-#: builtin/shortlog.c:244
-msgid "Suppress commit descriptions, only provides commit count"
-msgstr "Undertryck beskrivningar, visa bara antal incheckningar"
+#: builtin/update-index.c:995
+msgid "write index in this format"
+msgstr "skriv index i detta format"
 
-#: builtin/shortlog.c:246
-msgid "Show the email address of each author"
-msgstr "Visa e-postadress för varje författare"
+#: builtin/update-index.c:997
+msgid "enable or disable split index"
+msgstr "aktivera eller inaktivera delat index"
 
-#: builtin/shortlog.c:247
-msgid "w[,i1[,i2]]"
-msgstr "w[,i1[,i2]]"
+#: builtin/update-index.c:999
+msgid "enable/disable untracked cache"
+msgstr "aktivera/inaktivera ospårad cache"
 
-#: builtin/shortlog.c:248
-msgid "Linewrap output"
-msgstr "Radbryt utdata"
+#: builtin/update-index.c:1001
+msgid "test if the filesystem supports untracked cache"
+msgstr "testa om filsystemet stöder ospårad cache"
 
-#: builtin/show-branch.c:10
+#: builtin/update-index.c:1003
+msgid "enable untracked cache without testing the filesystem"
+msgstr "aktivera ospårad cache utan att testa filsystemet"
+
+#: builtin/update-index.c:1119
 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>)...]"
+"core.untrackedCache is set to true; remove or change it, if you really want "
+"to disable the untracked cache"
 msgstr ""
-"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
-"\t\t[--current] [--color[=<när>] | --no-color] [--sparse]\n"
-"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
-"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <mönster>)...]"
-
-#: builtin/show-branch.c:14
-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
-msgid "show remote-tracking and local branches"
-msgstr "visa fjärrspårande och lokala grenar"
+"core.untrackedCache är satt till true; ta bort eller ändra det om du "
+"verkligen vill inaktivera den ospårade cachen"
 
-#: builtin/show-branch.c:642
-msgid "show remote-tracking branches"
-msgstr "visa fjärrspårande grenar"
+#: builtin/update-index.c:1123
+msgid "Untracked cache disabled"
+msgstr "Ospårad cache är inaktiverad"
 
-#: builtin/show-branch.c:644
-msgid "color '*!+-' corresponding to the branch"
-msgstr "färga \"*!+-\" enligt grenen"
+#: 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 är satt till false; ta bort eller ändra det om du "
+"verkligen vill aktivera den ospårade cachen"
 
-#: builtin/show-branch.c:646
-msgid "show <n> more commits after the common ancestor"
-msgstr "visa <n> ytterligare incheckningar efter gemensam anfader"
+#: builtin/update-index.c:1135
+#, c-format
+msgid "Untracked cache enabled for '%s'"
+msgstr "Ospårad cache är aktiverad för \"%s\""
 
-#: builtin/show-branch.c:648
-msgid "synonym to more=-1"
-msgstr "synonym till more=-1"
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr "git update-ref [<flaggor>] -d <refnamn> [<gammaltvärde>]"
 
-#: builtin/show-branch.c:649
-msgid "suppress naming strings"
-msgstr "undertyck namnsträngar"
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr "git update-ref [<flaggor>]    <refnamn> <gammaltvärde> [<nyttvärde>]"
 
-#: builtin/show-branch.c:651
-msgid "include the current branch"
-msgstr "inkludera aktuell gren"
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr "git update-ref [<flaggor>] --stdin [-z]"
 
-#: builtin/show-branch.c:653
-msgid "name commits with their object names"
-msgstr "namnge incheckningar med deras objektnamn"
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr "ta bort referensen"
 
-#: builtin/show-branch.c:655
-msgid "show possible merge bases"
-msgstr "visa möjliga sammanslagningsbaser"
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr "uppdatera <refnamn> inte det den pekar på"
 
-#: builtin/show-branch.c:657
-msgid "show refs unreachable from any other ref"
-msgstr "visa referenser som inte kan nås från någon annan referens"
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr "standard in har NUL-terminerade argument"
 
-#: builtin/show-branch.c:659
-msgid "show commits in topological order"
-msgstr "visa incheckningar i topologisk ordning"
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
+msgstr "läs uppdateringar från standard in"
 
-#: builtin/show-branch.c:662
-msgid "show only commits not on the first branch"
-msgstr "visa endast incheckningar inte på den första grenen"
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
 
-#: builtin/show-branch.c:664
-msgid "show merges reachable from only one tip"
-msgstr "visa sammanslagningar som endast kan nås från en spets"
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "uppdatera informationsfilerna från grunden"
 
-#: builtin/show-branch.c:666
-msgid "topologically sort, maintaining date order where possible"
-msgstr "sortera topologiskt, behåll datumordning när möjligt"
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr "git verify-commit [-v | --verbose] <incheckning>..."
 
-#: builtin/show-branch.c:669
-msgid "<n>[,<base>]"
-msgstr "<n>[,<bas>]"
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr "visa innehåll för incheckning"
 
-#: builtin/show-branch.c:670
-msgid "show <n> most recent ref-log entries starting at base"
-msgstr "visa <n> nyaste refloggposter med början på bas"
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+msgid "print raw gpg status output"
+msgstr "visa råa gpg-statusdata"
 
-#: 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[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mönster>...]"
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <paket>..."
 
-#: builtin/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr "git show-ref --exclude-existing[=<mönster>]"
+#: builtin/verify-pack.c:64
+msgid "verbose"
+msgstr "pratsam"
 
-#: builtin/show-ref.c:165
-msgid "only show tags (can be combined with heads)"
-msgstr "visa endast taggar (kan kombineras med huvuden)"
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
+msgstr "visa endast statistik"
 
-#: builtin/show-ref.c:166
-msgid "only show heads (can be combined with tags)"
-msgstr "visa endast huvuden (kan kombineras med taggar)"
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v | --verbose] <tag>..."
+msgstr "git verify-tag [-v | --verbose] <tagg>..."
 
-#: builtin/show-ref.c:167
-msgid "stricter reference checking, requires exact ref path"
-msgstr "striktare referenskontroll, kräver exakt referenssökväg"
+#: builtin/verify-tag.c:34
+msgid "print tag contents"
+msgstr "visa innehåll för tag"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
-msgid "show the HEAD reference, even if it would be filtered out"
-msgstr "visa HEAD-refrens, även när den skulle filtreras ut"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<flaggor>] <sökväg> [<gren>]"
 
-#: builtin/show-ref.c:174
-msgid "dereference tags into object IDs"
-msgstr "avreferera taggar till objekt-id"
+#: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<flaggor>]"
 
-#: builtin/show-ref.c:176
-msgid "only show SHA1 hash using <n> digits"
-msgstr "visa SHA1-hash endast med <n> siffror"
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<flaggor>] <sökväg>"
 
-#: builtin/show-ref.c:180
-msgid "do not print results to stdout (useful with --verify)"
-msgstr "visa inte resultat på standard ut (användbart med --verify)"
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
+msgstr "git worktree prune [<flaggor>]"
 
-#: builtin/show-ref.c:182
-msgid "show refs from stdin that aren't in local repository"
-msgstr "visa referenser från standard in som inte finns i lokalt arkiv"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock <sökväg>"
 
-#: builtin/stripspace.c:17
-msgid "git stripspace [-s | --strip-comments]"
-msgstr "git stripspace [-s | --strip-comments]"
+#: builtin/worktree.c:42
+#, c-format
+msgid "Removing worktrees/%s: not a valid directory"
+msgstr "Tar bort worktrees/%s: inte en giltig katalog"
 
-#: builtin/stripspace.c:18
-msgid "git stripspace [-c | --comment-lines]"
-msgstr "git stripspace [-c | --comment-lines]"
+#: builtin/worktree.c:48
+#, c-format
+msgid "Removing worktrees/%s: gitdir file does not exist"
+msgstr "Tar bort worktrees/%s: gitdir-filen existerar inte"
 
-#: builtin/stripspace.c:35
-msgid "skip and remove all lines starting with comment character"
-msgstr "hoppa över och ta bort alla rader som inleds med kommentarstecken"
+#: builtin/worktree.c:53
+#, 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/stripspace.c:38
-msgid "prepend comment character and space to each line"
-msgstr "lägg in kommentarstecken och blanksteg först på varje rad"
+#: builtin/worktree.c:64
+#, c-format
+msgid "Removing worktrees/%s: invalid gitdir file"
+msgstr "Tar bort worktrees/%s: felaktig gitdir-fil"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
-msgid "alternative anchor for relative paths"
-msgstr "alternativa ankare för relativa sökvägar"
+#: builtin/worktree.c:80
+#, 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/submodule--helper.c:78
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr "git submodule--helper list [--prefix=<sökväg>] [<sökväg>...]"
+#: builtin/worktree.c:204
+#, c-format
+msgid "'%s' already exists"
+msgstr "\"%s\" finns redan"
 
-#: builtin/submodule--helper.c:108
-msgid "git submodule--helper name <path>"
-msgstr "git submodule--helper name <sökväg>"
+#: builtin/worktree.c:236
+#, c-format
+msgid "could not create directory of '%s'"
+msgstr "kunde inte skapa katalogen \"%s\""
 
-#: builtin/submodule--helper.c:114
+#: builtin/worktree.c:272
 #, c-format
-msgid "no submodule mapping found in .gitmodules for path '%s'"
-msgstr "hittade ingen undermodulmappning i .gitmodules för sökvägen \"%s\""
+msgid "Preparing %s (identifier %s)"
+msgstr "Förbereder %s (identifieraren %s)"
 
-#: builtin/submodule--helper.c:164
-msgid "where the new submodule will be cloned to"
-msgstr "var den nya undermodulen skall klonas till"
+#: builtin/worktree.c:323
+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/submodule--helper.c:167
-msgid "name of the new submodule"
-msgstr "namn på den nya undermodulen"
+#: builtin/worktree.c:325
+msgid "create a new branch"
+msgstr "skapa en ny gren"
 
-#: builtin/submodule--helper.c:170
-msgid "url where to clone the submodule from"
-msgstr "URL att klona undermodulen från"
+#: builtin/worktree.c:327
+msgid "create or reset a branch"
+msgstr "skapa eller återställ en gren"
 
-#: builtin/submodule--helper.c:176
-msgid "depth for shallow clones"
-msgstr "djup för grunda kloner"
+#: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "befolka den nya arbetskatalogen"
 
-#: builtin/submodule--helper.c:182
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
-msgstr ""
-"git submodule--helper clone [--prefix=<sökväg>] [--quiet] [--reference "
-"<arkvi>] [--name <namn>] [--url <url>][--depth <djup>] [--] [<sökväg>...]"
+#: builtin/worktree.c:337
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "-b, -B och --detach är ömsesidigt uteslutande"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "kunde inte skapa katalogen \"%s\""
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "orsak till lås"
 
-#: builtin/submodule--helper.c:198
+#: builtin/worktree.c:482 builtin/worktree.c:515
 #, c-format
-msgid "clone of '%s' into submodule path '%s' failed"
-msgstr "misslyckades klona \"%s\" till undermodulsökvägen \"%s\""
+msgid "'%s' is not a working tree"
+msgstr "\"%s\" är inte en arbetskatalog"
+
+#: builtin/worktree.c:484 builtin/worktree.c:517
+msgid "The main working tree cannot be locked or unlocked"
+msgstr "Huvudarbetskatalogen kan inte låsas eller låsas upp"
 
-#: builtin/submodule--helper.c:221
+#: builtin/worktree.c:489
 #, c-format
-msgid "cannot open file '%s'"
-msgstr "kan inte öppna filen \"%s\""
+msgid "'%s' is already locked, reason: %s"
+msgstr "\"%s\" är redan låst, orsak: %s"
 
-#: builtin/submodule--helper.c:226
+#: builtin/worktree.c:491
 #, c-format
-msgid "could not close file %s"
-msgstr "kunde inte stänga filen %s"
+msgid "'%s' is already locked"
+msgstr "\"%s\" är redan låst"
 
-#: builtin/submodule--helper.c:241
+#: builtin/worktree.c:519
 #, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr "kunde inte få tag i undermodulkatalog för \"%s\""
+msgid "'%s' is not locked"
+msgstr "\"%s\" är inte låst"
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr ""
-"ödesdigert: underkommandot submodule--helper måste anropas med ett "
-"underkommando"
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 
-#: builtin/submodule--helper.c:274
-#, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr ""
-"ödesdigert: \"%s\" är inte ett giltigt underkommando till submodule--helper"
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<prefix>/"
 
-#: builtin/symbolic-ref.c:7
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr "git symbolic-ref [<flaggor>] <namn> [<ref>]"
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "visa trädobjekt för underkatalogen <prefix>"
 
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr "git symbolic-ref -d [-q] <namn>"
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "endast användbart vid felsökning"
 
-#: builtin/symbolic-ref.c:40
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
-"undertryck felmeddelanden för icke-symboliska (frånkopplade) referenser"
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<flaggor>] <katalog>"
 
-#: builtin/symbolic-ref.c:41
-msgid "delete symbolic ref"
-msgstr "ta bort symbolisk referens"
+#: upload-pack.c:1028
+msgid "quit after a single request/response exchange"
+msgstr "avsluta omedelbart efter första anrop/svar-utväxling"
 
-#: builtin/symbolic-ref.c:42
-msgid "shorten ref output"
-msgstr "förkorta ref-utdata"
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "avsluta omedelbart efter inledande kungörelse av referenser"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason"
-msgstr "skäl"
+#: upload-pack.c:1032
+msgid "do not try <directory>/.git/ if <directory> is no Git directory"
+msgstr "testa inte <katalog>/.git/ om <katalog> inte är en Git-katalog"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason of the update"
-msgstr "skäl till uppdateringen"
+#: upload-pack.c:1034
+msgid "interrupt transfer after <n> seconds of inactivity"
+msgstr "avbryt överföringen efter <n> sekunders inaktivitet"
 
-#: builtin/tag.c:23
+#: credential-cache--daemon.c:223
+#, c-format
 msgid ""
-"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
-"[<head>]"
+"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 ""
-"git tag [-a | -s | -u <nyckel-id>] [-f] [-m <medd> | -F <fil>] <taggnamn> "
-"[<huvud>]"
+"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"
 
-#: builtin/tag.c:24
-msgid "git tag -d <tagname>..."
-msgstr "git tag -d <taggnamn>..."
+#: credential-cache--daemon.c:271
+msgid "print debugging messages to stderr"
+msgstr "skriv felsökningsmeddelanden på standard fel"
 
-#: builtin/tag.c:25
+#: git.c:14
 msgid ""
-"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
-"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+"'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 tag -l [-n[<antal>]] [--contains <incheckning>] [--points-at <objekt>]\n"
-"\t\t[--format=<format>] [--[no-]merged [<incheckning>]] [<mönster>...]"
+"\"git help -a\" och \"git help -g\" visar tillgängliga underkommandon och\n"
+"några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
+"<koncept>\" för att läsa mer om specifika underkommandon och koncept."
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <taggnamn>..."
+#: http.c:342
+msgid "Delegation control is not supported with cURL < 7.22.0"
+msgstr "Delegerad styrning stöds inte av cURL < 7.22.0"
 
-#: builtin/tag.c:80
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "taggnamnet för långt: %.*s..."
+#: http.c:351
+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"
 
-#: builtin/tag.c:85
-#, c-format
-msgid "tag '%s' not found."
-msgstr "taggen \"%s\" hittades inte."
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
+msgstr "starta arbetskatalog (se också: git help tutorial)"
 
-#: builtin/tag.c:100
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr "Tog bort tagg \"%s\" (var %s)\n"
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr "jobba med aktuell förändring (se också: git help everyday)"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "kunde inte bekräfta taggen \"%s\""
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr "utforska historiken och tillståndet (se också: git help revisions)"
 
-#: builtin/tag.c:122
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-"\n"
-"Skriv ett meddelande för taggen:\n"
-"  %s\n"
-"Rader som inleds med \"%c\" ignoreras.\n"
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr "utöka, markera och justera din gemensamma historik"
 
-#: builtin/tag.c:126
-#, 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 ""
-"\n"
-"Skriv ett meddelande för taggen:\n"
-"  %s\n"
-"Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
-"du vill.\n"
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr "samarbeta (se också: git help workflows)"
 
-#: builtin/tag.c:199
-msgid "unable to sign the tag"
-msgstr "kunde inte signera taggen"
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr "Lägg filinnehåll till indexet"
 
-#: builtin/tag.c:201
-msgid "unable to write tag file"
-msgstr "kunde inte skriva tagg-filen"
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr "Använd binärsökning för att hitta ändringen som introducerade ett fel"
 
-#: builtin/tag.c:226
-msgid "bad object type."
-msgstr "felaktig objekttyp"
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr "Visa, skapa eller ta bort grenar"
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "tagghuvud för stort."
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr "Byt till en ny gren eller återställ filer i arbetskatalogen"
+
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr "Klona ett arkiv till en ny katalog"
+
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr "Protokollför ändringar i arkivet"
+
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr "Visa ändringar mellan incheckningar, med arbetskatalogen, osv"
+
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr "Hämta objekt och referenser från annat arkiv"
+
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr "Visa rader som motsvarar mönster"
+
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "Skapa tomt Git-arkiv eller ominitiera ett befintligt"
+
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr "Visa incheckningsloggar"
+
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr "Slå ihop två eller flera utvecklingshistorier"
+
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "Flytta eller byt namn på en fil, katalog eller symbolisk länk"
 
-#: builtin/tag.c:275
-msgid "no tag message?"
-msgstr "inget taggmeddelande?"
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "Hämta från och integrera med annat arkiv eller en lokal gren"
 
-#: builtin/tag.c:281
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr "Taggmeddelandet har lämnats i %s\n"
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr "Uppdatera fjärr-referenser och tillhörande objekt"
 
-#: builtin/tag.c:339
-msgid "list tag names"
-msgstr "lista taggnamn"
+#: common-cmds.h:32
+msgid "Reapply commits on top of another base tip"
+msgstr "Applicera incheckningar på nytt ovanpå en annan bastopp"
 
-#: builtin/tag.c:341
-msgid "print <n> lines of each tag message"
-msgstr "visa <n> rader från varje taggmeddelande"
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr "Återställ aktuell HEAD till angivet tillstånd"
 
-#: builtin/tag.c:343
-msgid "delete tags"
-msgstr "ta bort taggar"
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr "Ta bort filer från arbetskatalogen och från indexet"
 
-#: builtin/tag.c:344
-msgid "verify tags"
-msgstr "verifiera taggar"
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr "Visa olika sorters objekt"
 
-#: builtin/tag.c:346
-msgid "Tag creation options"
-msgstr "Alternativ för att skapa taggar"
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr "Visa status för arbetskatalogen"
 
-#: builtin/tag.c:348
-msgid "annotated tag, needs a message"
-msgstr "annoterad tagg, behöver meddelande"
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr "Skapa, visa, ta bort eller verifiera GPG-signerat taggobjekt"
 
-#: builtin/tag.c:350
-msgid "tag message"
-msgstr "taggmeddelande"
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr "giltig-till"
 
-#: builtin/tag.c:352
-msgid "annotated and GPG-signed tag"
-msgstr "annoterad och GPG-signerad tagg"
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr "ingen funktion (bakåtkompatibilitet)"
 
-#: builtin/tag.c:356
-msgid "use another key to sign the tag"
-msgstr "använd annan nyckel för att signera taggen"
+#: parse-options.h:238
+msgid "be more verbose"
+msgstr "var mer pratsam"
 
-#: builtin/tag.c:357
-msgid "replace the tag if exists"
-msgstr "ersätt taggen om den finns"
+#: parse-options.h:240
+msgid "be more quiet"
+msgstr "var mer tyst"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
-msgid "create a reflog"
-msgstr "skapa en reflog"
+#: parse-options.h:246
+msgid "use <n> digits to display SHA-1s"
+msgstr "använd <n> siffror för att visa SHA-1:or"
 
-#: builtin/tag.c:360
-msgid "Tag listing options"
-msgstr "Alternativ för listning av taggar"
+#: rerere.h:40
+msgid "update the index with reused conflict resolution if possible"
+msgstr "uppdatera indexet med återanvänd konfliktlösning om möjligt"
 
-#: builtin/tag.c:361
-msgid "show tag list in columns"
-msgstr "lista taggar i spalter"
+#: git-bisect.sh:54
+msgid "You need to start by \"git bisect start\""
+msgstr "Du måste starta med \"git bisect start\""
 
-#: builtin/tag.c:362 builtin/tag.c:363
-msgid "print only tags that contain the commit"
-msgstr "visa endast taggar som innehåller incheckningen"
+#. 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 "Vill du att jag ska göra det åt dig [Y=ja/N=nej]?"
 
-#: builtin/tag.c:364
-msgid "print only tags that are merged"
-msgstr "visa endast taggar som slagits samman"
+#: git-bisect.sh:121
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "flaggan känns inte igen: \"$arg\""
 
-#: builtin/tag.c:365
-msgid "print only tags that are not merged"
-msgstr "visa endast taggar som ej slagits samman"
+#: git-bisect.sh:125
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "\"$arg\" verkar inte vara en giltig revision"
 
-#: builtin/tag.c:370
-msgid "print only tags of the object"
-msgstr "visa endast taggar för objektet"
+#: git-bisect.sh:154
+msgid "Bad HEAD - I need a HEAD"
+msgstr "Felaktigt HEAD - Jag behöver ett HEAD"
 
-#: builtin/tag.c:399
-msgid "--column and -n are incompatible"
-msgstr "--column och -n är inkompatibla"
+#: git-bisect.sh:167
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgstr ""
+"Misslyckades checka ut \"$start_head\". Försök \"git bisect reset "
+"<giltig_gren>\""
 
-#: builtin/tag.c:419
-msgid "-n option is only allowed with -l."
-msgstr "Flaggan -n är endast tillåten tillsammans med -l."
+# cogito-relaterat
+#: git-bisect.sh:177
+msgid "won't bisect on cg-seek'ed tree"
+msgstr "kör inte \"bisect\" på träd där \"cg-seek\" använts"
 
-#: builtin/tag.c:421
-msgid "--contains option is only allowed with -l."
-msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
+#: git-bisect.sh:181
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "Felaktigt HEAD - konstig symbolisk referens"
 
-#: builtin/tag.c:423
-msgid "--points-at option is only allowed with -l."
-msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
+#: git-bisect.sh:233
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "Felaktigt argument till bisect_write: $state"
 
-#: 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"
+#: git-bisect.sh:262
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "Felaktig rev-indata: $arg"
 
-#: builtin/tag.c:433
-msgid "only one -F or -m option is allowed."
-msgstr "endast en av flaggorna -F eller -m tillåts."
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Felaktig rev-indata: $bisected_head"
 
-#: builtin/tag.c:453
-msgid "too many params"
-msgstr "för många parametrar"
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "Felaktig rev-indata: $rev"
 
-#: builtin/tag.c:459
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr "\"%s\" är inte ett giltigt taggnamn."
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "\"git bisect $TERM_BAD\" kan bara ta ett argument."
 
-#: builtin/tag.c:464
-#, c-format
-msgid "tag '%s' already exists"
-msgstr "taggen \"%s\" finns redan"
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr ""
+"Varning: utför \"bisect\" med endast en dålig (\"$TERM_BAD\") incheckning"
 
-#: builtin/tag.c:489
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
+#. 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 "Är du säker [Y=ja/N=nej]? "
 
-#: builtin/unpack-objects.c:490
-msgid "Unpacking objects"
-msgstr "Packar upp objekt"
+#: 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 ""
+"Du måste ange åtminstone en dålig (\"$bad_syn\") och en bra (\"$good_syn\") "
+"version.\n"
+"(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
+"detta.)"
 
-#: builtin/update-index.c:79
-#, c-format
-msgid "failed to create directory %s"
-msgstr "misslyckades skapa katalogen %s"
+#: 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 ""
+"Du måste starta med \"git bisect start\".\n"
+"Du måste sedan ange åtminstone en bra (\"$good_syn\") och en dålig "
+"(\"$bad_syn\") version.\n"
+"(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
+"detta.)"
 
-#: builtin/update-index.c:85
-#, c-format
-msgid "failed to stat %s"
-msgstr "misslyckades ta status på %s"
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr "Vi utför ingen bisect för tillfället."
 
-#: builtin/update-index.c:95
-#, c-format
-msgid "failed to create file %s"
-msgstr "misslyckades skapa filen %s"
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "\"$invalid\" är inte en giltig incheckning"
 
-#: builtin/update-index.c:103
-#, c-format
-msgid "failed to delete file %s"
-msgstr "misslyckades ta bort filen %s"
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+"Kunde inte checka ut original-HEAD \"$branch\".\n"
+"Försök \"git bisect reset <incheckning>\"."
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
-#, c-format
-msgid "failed to delete directory %s"
-msgstr "misslyckades ta bort katalogen %s"
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr "Ingen loggfil angiven"
 
-#: builtin/update-index.c:133
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr "Testar mtime i \"%s\""
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr "kan inte läsa $file för uppspelning"
 
-#: builtin/update-index.c:145
-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"
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr "?? vad menar du?"
+
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr "kör $command"
 
-#: builtin/update-index.c:158
-msgid "directory stat info does not change after adding a new directory"
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
-"stat-informationen för en katalog ändras inte när nya kataloger läggs till"
+"\"bisect\"-körningen misslyckades:\n"
+"felkod $res från \"$command\" är < 0 eller >= 128"
 
-#: builtin/update-index.c:171
-msgid "directory stat info changes after updating a file"
-msgstr "stat-informationen för en katalog ändras när filer uppdateras"
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr "\"bisect\"-körningen kan inte fortsätta längre"
 
-#: builtin/update-index.c:182
-msgid "directory stat info changes after adding a file inside subdirectory"
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
 msgstr ""
-"stat-informationen för en katalog ändras när filer läggs till i en "
-"underkatalog"
+"\"bisect\"-körningen misslyckades:\n"
+"\"bisect_state $state\" avslutades med felkoden $res"
 
-#: builtin/update-index.c:193
-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"
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr "\"bisect\"-körningen lyckades"
 
-#: builtin/update-index.c:206
-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"
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "termerna måste vara olika"
 
-#: builtin/update-index.c:213
-msgid " OK"
-msgstr " OK"
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "\"$term\" är inte en giltig term"
 
-#: builtin/update-index.c:575
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr "git update-index [<flaggor>] [--] [<fil>...]"
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "kan inte använda det inbyggda kommandot \"$term\" som term"
 
-#: builtin/update-index.c:930
-msgid "continue refresh even when index needs update"
-msgstr "fortsätt uppdatera även när index inte är àjour"
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "kan inte ändra betydelsen av termen \"$term\""
 
-#: builtin/update-index.c:933
-msgid "refresh: ignore submodules"
-msgstr "refresh: ignorera undermoduler"
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr ""
+"Ogiltigt kommando: du utför just nu en \"bisect\" med $TERM_BAD/$TERM_GOOD."
 
-#: builtin/update-index.c:936
-msgid "do not ignore new files"
-msgstr "ignorera inte nya filer"
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "inga termer angivna"
 
-#: builtin/update-index.c:938
-msgid "let files replace directories and vice-versa"
-msgstr "låt filer ersätta kataloger och omvänt"
+#: 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 ""
+"ogiltigt argument $arg för \"git bisect terms\".\n"
+"Flaggor som stöds är: --term-good|--term-old och --term-bad|--term-new."
 
-#: builtin/update-index.c:940
-msgid "notice files missing from worktree"
-msgstr "lägg märke till filer som saknas i arbetskatalogen"
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr ""
+"Fel: Dina lokala ändringar av följande filer skulle skrivas över av "
+"sammanslagning"
 
-#: builtin/update-index.c:942
-msgid "refresh even if index contains unmerged entries"
-msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "Automatisk sammanslagning misslyckades."
 
-#: builtin/update-index.c:945
-msgid "refresh stat information"
-msgstr "uppdatera statusinformation"
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "Borde inte använda octopus."
 
-#: builtin/update-index.c:949
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr "som --refresh, men ignorera assume-unchanged-inställning"
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Kunde inte hitta gemensam incheckning med $pretty_name"
 
-#: builtin/update-index.c:953
-msgid "<mode>,<object>,<path>"
-msgstr "<läge>,<objekt>,<sökväg>"
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Redan à jour med $pretty_name"
 
-#: builtin/update-index.c:954
-msgid "add the specified entry to the index"
-msgstr "lägg till angiven post i indexet"
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Snabbspolar till: $pretty_name"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "Försök enkel sammanslagning med $pretty_name"
 
-#: builtin/update-index.c:959
-msgid "override the executable bit of the listed files"
-msgstr "överstyr exekveringsbiten för angivna filer"
+#: git-merge-octopus.sh:102
+msgid "Simple merge did not work, trying automatic merge."
+msgstr "Enkel sammanslagning misslyckades, försöker automatisk sammanslagning."
 
-#: builtin/update-index.c:963
-msgid "mark files as \"not changing\""
-msgstr "markera filer som \"ändras inte\""
+#: 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 ""
+"När du har löst problemet kör du \"git rebase --continue\".\n"
+"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\"."
 
-#: builtin/update-index.c:966
-msgid "clear assumed-unchanged bit"
-msgstr "rensa \"assume-unchanged\"-biten"
+#: git-rebase.sh:156 git-rebase.sh:395
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "Kunde inte flytta tillbaka till $head_name"
 
-#: builtin/update-index.c:969
-msgid "mark files as \"index-only\""
-msgstr "markera filer som \"endast index\""
+#: git-rebase.sh:167
+msgid "Applied autostash."
+msgstr "Tillämpade autostash."
 
-#: builtin/update-index.c:972
-msgid "clear skip-worktree bit"
-msgstr "töm \"skip-worktree\"-biten"
+#: git-rebase.sh:170
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "Kan inte spara $stash_sha1"
 
-#: builtin/update-index.c:975
-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"
+#: 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"
 
-#: builtin/update-index.c:977
-msgid "remove named paths even if present in worktree"
-msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
+#: git-rebase.sh:210
+msgid "The pre-rebase hook refused to rebase."
+msgstr "Kroken pre-rebase vägrade ombaseringen."
 
-#: builtin/update-index.c:979
-msgid "with --stdin: input lines are terminated by null bytes"
-msgstr "med --stdin: indatarader termineras med null-byte"
+#: git-rebase.sh:215
+msgid "It looks like git-am is in progress. Cannot rebase."
+msgstr "Det verkar som en git-am körs. Kan inte ombasera."
 
-#: builtin/update-index.c:981
-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"
+#: git-rebase.sh:356
+msgid "No rebase in progress?"
+msgstr "Ingen ombasering pågår?"
 
-#: builtin/update-index.c:985
-msgid "add entries from standard input to the index"
-msgstr "lägg poster från standard in till indexet"
+#: git-rebase.sh:367
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering."
 
-#: builtin/update-index.c:989
-msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
+#: git-rebase.sh:374
+msgid "Cannot read HEAD"
+msgstr "Kan inte läsa HEAD"
 
-#: builtin/update-index.c:993
-msgid "only update entries that differ from HEAD"
-msgstr "uppdatera endast poster som skiljer sig från HEAD"
+#: git-rebase.sh:377
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+"Du måste redigera alla sammanslagningskonflikter och\n"
+"därefter markera dem som lösta med git add"
 
-#: builtin/update-index.c:997
-msgid "ignore files missing from worktree"
-msgstr "ignorera filer som saknas i arbetskatalogen"
+#: git-rebase.sh:414
+#, 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 ""
+"Det verkar som katalogen $state_dir_base redan existerar, och\n"
+"jag undrar om du redan är mitt i en annan ombasering. Om så är\n"
+"fallet, försök\n"
+"\t$cmd_live_rebase\n"
+"Om så inte är fallet, kör\n"
+"\t$cmd_clear_stale_rebase\n"
+"och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
+"något av värde där."
 
-#: builtin/update-index.c:1000
-msgid "report actions to standard output"
-msgstr "rapportera åtgärder på standard ut"
+#: git-rebase.sh:465
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "ogiltig uppström $upstream_name"
 
-#: builtin/update-index.c:1002
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr "(för porslin) glöm sparade olösta konflikter"
+#: git-rebase.sh:489
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
+msgstr "$onto_name: mer än en sammanslagningsbas finns"
 
-#: builtin/update-index.c:1006
-msgid "write index in this format"
-msgstr "skriv index i detta format"
+#: git-rebase.sh:492 git-rebase.sh:496
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr "$onto_name: ingen sammanslagningsbas finns"
 
-#: builtin/update-index.c:1008
-msgid "enable or disable split index"
-msgstr "aktivera eller inaktivera delat index"
+#: git-rebase.sh:501
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr "Peka på en giltig incheckning: $onto_name"
 
-#: builtin/update-index.c:1010
-msgid "enable/disable untracked cache"
-msgstr "aktivera/inaktivera ospårad cache"
+#: git-rebase.sh:524
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "ödesdigert: ingen sådan gren: $branch_name"
 
-#: builtin/update-index.c:1012
-msgid "test if the filesystem supports untracked cache"
-msgstr "testa om filsystemet stöder ospårad cache"
+#: git-rebase.sh:557
+msgid "Cannot autostash"
+msgstr "Kan inte utföra \"autostash\""
 
-#: builtin/update-index.c:1014
-msgid "enable untracked cache without testing the filesystem"
-msgstr "aktivera ospårad cache utan att testa filsystemet"
+#: git-rebase.sh:562
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "Skapade autostash: $stash_abbrev"
 
-#: builtin/update-index.c:1134
-msgid "Untracked cache disabled"
-msgstr "Ospårad cache är inaktiverad"
+#: git-rebase.sh:566
+msgid "Please commit or stash them."
+msgstr "Checka in eller använd \"stash\" på dem."
 
-#: builtin/update-index.c:1146
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr "Ospårad cache är aktiverad för \"%s\""
+#: git-rebase.sh:586
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr "Aktuell gren $branch_name är à jour."
 
-#: builtin/update-ref.c:9
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr "git update-ref [<flaggor>] -d <refnamn> [<gammaltvärde>]"
+#: git-rebase.sh:590
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
+msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
 
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr "git update-ref [<flaggor>]    <refnamn> <gammaltvärde> [<nyttvärde>]"
+#: git-rebase.sh:601
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "Ändringar från $mb till $onto:"
+
+#: git-rebase.sh:610
+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
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "Snabbspolade $branch_name till $onto_name."
 
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr "git update-ref [<flaggor>] --stdin [-z]"
+#: git-stash.sh:50
+msgid "git stash clear with parameters is unimplemented"
+msgstr "\"git stash clear\" med parametrar har inte implementerats"
 
-#: builtin/update-ref.c:363
-msgid "delete the reference"
-msgstr "ta bort referensen"
+#: git-stash.sh:73
+msgid "You do not have the initial commit yet"
+msgstr "Du har inte den första incheckningen ännu"
 
-#: builtin/update-ref.c:365
-msgid "update <refname> not the one it points to"
-msgstr "uppdatera <refnamn> inte det den pekar på"
+#: git-stash.sh:88
+msgid "Cannot save the current index state"
+msgstr "Kan inte spara aktuellt tillstånd för indexet"
 
-#: builtin/update-ref.c:366
-msgid "stdin has NUL-terminated arguments"
-msgstr "standard in har NUL-terminerade argument"
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Kan inte spara ospårade filer"
 
-#: builtin/update-ref.c:367
-msgid "read updates from stdin"
-msgstr "läs uppdateringar från standard in"
+#: git-stash.sh:123 git-stash.sh:136
+msgid "Cannot save the current worktree state"
+msgstr "Kan inte spara aktuellt tillstånd för arbetskatalogen"
 
-#: builtin/update-server-info.c:6
-msgid "git update-server-info [--force]"
-msgstr "git update-server-info [--force]"
+#: git-stash.sh:140
+msgid "No changes selected"
+msgstr "Inga ändringar valda"
 
-#: builtin/update-server-info.c:14
-msgid "update the info files from scratch"
-msgstr "uppdatera informationsfilerna från grunden"
+#: git-stash.sh:143
+msgid "Cannot remove temporary index (can't happen)"
+msgstr "Kan inte ta bort temporärt index (kan inte inträffa)"
 
-#: builtin/verify-commit.c:17
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr "git verify-commit [-v | --verbose] <incheckning>..."
+#: git-stash.sh:156
+msgid "Cannot record working tree state"
+msgstr "Kan inte registrera tillstånd för arbetskatalog"
 
-#: builtin/verify-commit.c:72
-msgid "print commit contents"
-msgstr "visa innehåll för incheckning"
+#: git-stash.sh:188
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr "Kan inte uppdatera $ref_stash med $w_commit"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
-msgid "print raw gpg status output"
-msgstr "visa råa gpg-statusdata"
+#. 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'"
+msgstr ""
+"fel: felaktig flagga för \"stash save\": $option\n"
+"     För att ange ett meddelande, använd git stash save -- \"$option\""
 
-#: builtin/verify-pack.c:54
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <paket>..."
+#: git-stash.sh:251
+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."
 
-#: builtin/verify-pack.c:64
-msgid "verbose"
-msgstr "pratsam"
+#: git-stash.sh:259
+msgid "No local changes to save"
+msgstr "Inga lokala ändringar att spara"
 
-#: builtin/verify-pack.c:66
-msgid "show statistics only"
-msgstr "visa endast statistik"
+#: git-stash.sh:263
+msgid "Cannot initialize stash"
+msgstr "Kan inte initiera \"stash\""
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <tagg>..."
+#: git-stash.sh:267
+msgid "Cannot save the current status"
+msgstr "Kan inte spara aktuell status"
 
-#: builtin/verify-tag.c:83
-msgid "print tag contents"
-msgstr "visa innehåll för tag"
+#: git-stash.sh:268
+#, sh-format
+msgid "Saved working directory and index state $stash_msg"
+msgstr "Sparade arbetskatalogen och indexstatus $stash_msg"
 
-#: builtin/worktree.c:15
-msgid "git worktree add [<options>] <path> [<branch>]"
-msgstr "git worktree add [<flaggor>] <sökväg> [<gren>]"
+#: git-stash.sh:285
+msgid "Cannot remove worktree changes"
+msgstr "Kan inte ta bort ändringar i arbetskatalogen"
 
-#: builtin/worktree.c:16
-msgid "git worktree prune [<options>]"
-msgstr "git worktree prune [<flaggor>]"
+#: git-stash.sh:403
+#, sh-format
+msgid "unknown option: $opt"
+msgstr "okänd flagga: $opt"
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<flaggor>]"
+#: git-stash.sh:416
+msgid "No stash found."
+msgstr "Ingen \"stash\" hittades."
 
-#: builtin/worktree.c:39
-#, c-format
-msgid "Removing worktrees/%s: not a valid directory"
-msgstr "Tar bort worktrees/%s: inte en giltig katalog"
+#: git-stash.sh:423
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "För många revisioner angivna: $REV"
 
-#: builtin/worktree.c:45
-#, c-format
-msgid "Removing worktrees/%s: gitdir file does not exist"
-msgstr "Tar bort worktrees/%s: gitdir-filen existerar inte"
+#: git-stash.sh:438
+#, sh-format
+msgid "$reference is not a valid reference"
+msgstr "$reference är inte en giltig referens"
 
-#: builtin/worktree.c:50
-#, c-format
-msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
-msgstr "Tar bort worktrees/%s: kan inte läsa gitdir-filen (%s)"
+#: git-stash.sh:466
+#, sh-format
+msgid "'$args' is not a stash-like commit"
+msgstr "\"$args\" är inte en \"stash\"-liknande incheckning"
 
-#: builtin/worktree.c:61
-#, c-format
-msgid "Removing worktrees/%s: invalid gitdir file"
-msgstr "Tar bort worktrees/%s: felaktig gitdir-fil"
+#: git-stash.sh:477
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "\"$args\" är inte en \"stash\"-referens"
 
-#: builtin/worktree.c:77
-#, 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"
+#: git-stash.sh:485
+msgid "unable to refresh index"
+msgstr "kan inte uppdatera indexet"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "misslyckades ta bort: %s"
+#: git-stash.sh:489
+msgid "Cannot apply a stash in the middle of a merge"
+msgstr "Kan inte tillämpa en \"stash\" mitt i en sammanslagning"
 
-#: builtin/worktree.c:201
-#, c-format
-msgid "'%s' already exists"
-msgstr "\"%s\" finns redan"
+#: git-stash.sh:497
+msgid "Conflicts in index. Try without --index."
+msgstr "Konflikter i indexet. Testa utan --index."
 
-#: builtin/worktree.c:233
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr "kunde inte skapa katalogen \"%s\""
+#: git-stash.sh:499
+msgid "Could not save index tree"
+msgstr "Kunde inte spara indexträd"
 
-#: builtin/worktree.c:269
-#, c-format
-msgid "Preparing %s (identifier %s)"
-msgstr "Förbereder %s (identifieraren %s)"
+#: git-stash.sh:508
+msgid "Could not restore untracked files from stash"
+msgstr "Kunde inte återställa ospårade filer från stash"
 
-#: builtin/worktree.c:317
-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"
+#: git-stash.sh:533
+msgid "Cannot unstage modified files"
+msgstr "Kan inte ta bort ändrade filer ur kön"
 
-#: builtin/worktree.c:319
-msgid "create a new branch"
-msgstr "skapa en ny gren"
+#: git-stash.sh:548
+msgid "Index was not unstashed."
+msgstr "Indexet har inte tagits ur kön."
 
-#: builtin/worktree.c:321
-msgid "create or reset a branch"
-msgstr "skapa eller återställ en gren"
+#: git-stash.sh:562
+msgid "The stash is kept in case you need it again."
+msgstr "\"Stash\":en behålls ifall du behöver den igen."
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "koppla från HEAD vid namngiven incheckning"
+#: git-stash.sh:571
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "Kastade ${REV} ($s)"
 
-#: builtin/worktree.c:329
-msgid "-b, -B, and --detach are mutually exclusive"
-msgstr "-b, -B och --detach är ömsesidigt uteslutande"
+#: git-stash.sh:572
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: builtin/write-tree.c:13
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+#: git-stash.sh:580
+msgid "No branch name specified"
+msgstr "Inget grennamn angavs"
 
-#: builtin/write-tree.c:26
-msgid "<prefix>/"
-msgstr "<prefix>/"
+#: git-stash.sh:652
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
-#: builtin/write-tree.c:27
-msgid "write tree object for a subdirectory <prefix>"
-msgstr "visa trädobjekt för underkatalogen <prefix>"
+#: git-submodule.sh:184
+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å"
 
-#: builtin/write-tree.c:30
-msgid "only useful for debugging"
-msgstr "endast användbart vid felsökning"
+#: git-submodule.sh:194
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
 
-#: credential-cache--daemon.c:262
-msgid "print debugging messages to stderr"
-msgstr "skriv felsökningsmeddelanden på standard fel"
+#: git-submodule.sh:211
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git.c:14
+#: git-submodule.sh:215
+#, 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."
+"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 help -a\" och \"git help -g\" visar tillgängliga underkommandon och\n"
-"några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
-"<koncept>\" för att läsa mer om specifika underkommandon och koncept."
+"Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
+"$sm_path\n"
+"Använd -f om du verkligen vill lägga till den"
 
-#: http.c:321
-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"
+#: git-submodule.sh:233
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
 
-#: common-cmds.h:9
-msgid "start a working area (see also: git help tutorial)"
-msgstr "starta arbetskatalog (se också: git help tutorial)"
+#: git-submodule.sh:235
+#, 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"
 
-#: common-cmds.h:10
-msgid "work on the current change (see also: git help everyday)"
-msgstr "jobba med aktuell förändring (se också: git help everyday)"
+#: git-submodule.sh:243
+#, 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):"
 
-#: common-cmds.h:11
-msgid "examine the history and state (see also: git help revisions)"
-msgstr "utforska historiken och tillståndet (se också: git help revisions)"
+#: git-submodule.sh:245
+#, 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 ""
+"Om du vill återanvända den lokala git-katalogen instället för att klona på "
+"nytt från\n"
+"  $realrepo\n"
+"kan du använda flaggan \"--force\". Om den lokala git-katalogen inte är "
+"korrekt\n"
+"arkiv eller om du är osäker på vad det här betyder, välj ett annat namn med\n"
+"flaggan \"--name\"."
 
-#: common-cmds.h:12
-msgid "grow, mark and tweak your common history"
-msgstr "utöka, markera och justera din gemensamma historik"
+#: git-submodule.sh:251
+#, sh-format
+msgid "Reactivating local git directory for submodule '$sm_name'."
+msgstr "Aktiverar lokal git-katalog för undermodulen \"$sm_name\" på nytt."
 
-#: common-cmds.h:13
-msgid "collaborate (see also: git help workflows)"
-msgstr "samarbeta (se också: git help workflows)"
+#: git-submodule.sh:263
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Kan inte checka ut undermodulen \"$sm_path\""
+
+#: git-submodule.sh:268
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
+
+#: git-submodule.sh:277
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: common-cmds.h:17
-msgid "Add file contents to the index"
-msgstr "Lägg filinnehåll till indexet"
+#: git-submodule.sh:324
+#, sh-format
+msgid "Entering '$displaypath'"
+msgstr "Går in i \"$displaypath\""
 
-#: common-cmds.h:18
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr "Använd binärsökning för att hitta ändringen som introducerade ett fel"
+#: git-submodule.sh:344
+#, sh-format
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr ""
+"Stoppar på \"$displaypath\"; skriptet returnerade en status skild från noll."
 
-#: common-cmds.h:19
-msgid "List, create, or delete branches"
-msgstr "Visa, skapa eller ta bort grenar"
+#: git-submodule.sh:415
+#, sh-format
+msgid "pathspec and --all are incompatible"
+msgstr "sökvägsangivelse och --all är inkompatibla"
 
-#: common-cmds.h:20
-msgid "Switch branches or restore working tree files"
-msgstr "Byt till en ny gren eller återställ filer i arbetskatalogen"
+#: git-submodule.sh:420
+#, sh-format
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "Använd \"--all\" om du verkligen vill avinitiera alla undermoduler"
 
-#: common-cmds.h:21
-msgid "Clone a repository into a new directory"
-msgstr "Klona ett arkiv till en ny katalog"
+#: 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 ""
+"Undermodulsarbetskatalogen \"$displaypath\" innehåller en .git-katalog\n"
+"(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
 
-#: common-cmds.h:22
-msgid "Record changes to the repository"
-msgstr "Protokollför ändringar i arkivet"
+#: git-submodule.sh:448
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr ""
+"Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
+"kastar bort dem"
 
-#: common-cmds.h:23
-msgid "Show changes between commits, commit and working tree, etc"
-msgstr "Visa ändringar mellan incheckningar, med arbetskatalogen, osv"
+#: git-submodule.sh:451
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "Rensade katalogen \"$displaypath\""
 
-#: common-cmds.h:24
-msgid "Download objects and refs from another repository"
-msgstr "Hämta objekt och referenser från annat arkiv"
+#: git-submodule.sh:452
+#, sh-format
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
 
-#: common-cmds.h:25
-msgid "Print lines matching a pattern"
-msgstr "Visa rader som motsvarar mönster"
+#: git-submodule.sh:455
+#, sh-format
+msgid "Could not create empty submodule directory '$displaypath'"
+msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
 
-#: common-cmds.h:26
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr "Skapa tomt Git-arkiv eller ominitiera ett befintligt"
+#: git-submodule.sh:464
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr ""
+"Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
 
-#: common-cmds.h:27
-msgid "Show commit logs"
-msgstr "Visa incheckningsloggar"
+#: git-submodule.sh:617
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\""
 
-#: common-cmds.h:28
-msgid "Join two or more development histories together"
-msgstr "Slå ihop två eller flera utvecklingshistorier"
+#: git-submodule.sh:627
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
 
-#: common-cmds.h:29
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr "Flytta eller byt namn på en fil, katalog eller symbolisk länk"
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+msgstr ""
+"Kan inte hitta aktuell revision för ${remote_name}/${branch} i "
+"undermodulsökvägen \"$sm_path\""
 
-#: common-cmds.h:30
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr "Hämta från och integrera med annat arkiv eller en lokal gren"
+#: git-submodule.sh:650
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
 
-#: common-cmds.h:31
-msgid "Update remote refs along with associated objects"
-msgstr "Uppdatera fjärr-referenser och tillhörande objekt"
+#: 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 ""
+"Hämtade i undermodulssökvägen \"$displaypath\", men den innehöll inte $sha1. "
+"Direkt hämtning av incheckningen misslyckades."
 
-#: common-cmds.h:32
-msgid "Reapply commits on top of another base tip"
-msgstr "Applicera incheckningar på nytt ovanpå en annan bastopp"
+#: git-submodule.sh:663
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: common-cmds.h:33
-msgid "Reset current HEAD to the specified state"
-msgstr "Återställ aktuell HEAD till angivet tillstånd"
+#: git-submodule.sh:664
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
 
-#: common-cmds.h:34
-msgid "Remove files from the working tree and from the index"
-msgstr "Ta bort filer från arbetskatalogen och från indexet"
+#: git-submodule.sh:668
+#, sh-format
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: common-cmds.h:35
-msgid "Show various types of objects"
-msgstr "Visa olika sorters objekt"
+#: git-submodule.sh:669
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
 
-#: common-cmds.h:36
-msgid "Show the working tree status"
-msgstr "Visa status för arbetskatalogen"
+#: git-submodule.sh:674
+#, sh-format
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: common-cmds.h:37
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr "Skapa, visa, ta bort eller verifiera GPG-signerat taggobjekt"
+#: git-submodule.sh:675
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
 
-#: parse-options.h:145
-msgid "expiry-date"
-msgstr "giltig-till"
+#: git-submodule.sh:680
+#, sh-format
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+msgstr ""
+"Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$displaypath\""
 
-#: parse-options.h:160
-msgid "no-op (backward compatibility)"
-msgstr "ingen funktion (bakåtkompatibilitet)"
+#: git-submodule.sh:681
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": \"$command $sha1\""
 
-#: parse-options.h:237
-msgid "be more verbose"
-msgstr "var mer pratsam"
+#: git-submodule.sh:712
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
 
-#: parse-options.h:239
-msgid "be more quiet"
-msgstr "var mer tyst"
+#: git-submodule.sh:820
+msgid "The --cached option cannot be used with the --files option"
+msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
-#: parse-options.h:245
-msgid "use <n> digits to display SHA-1s"
-msgstr "använd <n> siffror för att visa SHA-1:or"
+#: git-submodule.sh:872
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "oväntat läge $mod_dst"
 
-#: rerere.h:38
-msgid "update the index with reused conflict resolution if possible"
-msgstr "uppdatera indexet med återanvänd konfliktlösning om möjligt"
+#: git-submodule.sh:892
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_src"
 
-#: git-bisect.sh:55
-msgid "You need to start by \"git bisect start\""
-msgstr "Du måste starta med \"git bisect start\""
+#: git-submodule.sh:895
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
+msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_dst"
 
-#. 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 "Vill du att jag ska göra det åt dig [Y=ja/N=nej]?"
+#: git-submodule.sh:898
+#, 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-bisect.sh:122
+#: git-submodule.sh:1045
 #, sh-format
-msgid "unrecognised option: '$arg'"
-msgstr "flaggan känns inte igen: \"$arg\""
+msgid "Failed to recurse into submodule path '$sm_path'"
+msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-bisect.sh:126
+#: git-submodule.sh:1112
 #, sh-format
-msgid "'$arg' does not appear to be a valid revision"
-msgstr "\"$arg\" verkar inte vara en giltig revision"
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 
-#: git-bisect.sh:155
-msgid "Bad HEAD - I need a HEAD"
-msgstr "Felaktigt HEAD - Jag behöver ett HEAD"
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "Se git-${cmd}(1) för detaljer."
 
-#: git-bisect.sh:168
+#: git-rebase--interactive.sh:131
 #, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Ombaserar ($new_count/$total)"
+
+#: git-rebase--interactive.sh:147
 msgid ""
-"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+"\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 ""
-"Misslyckades checka ut \"$start_head\". Försök \"git bisect reset "
-"<giltig_gren>\""
+"\n"
+"Kommandon:\n"
+" p, pick = använd incheckning\n"
+" r, reword = använd incheckning, men redigera incheckningsmeddelandet\n"
+" e, edit = använd incheckning, men stanna för tillägg\n"
+" s, squash = använd incheckning, men infoga i föregående incheckning\n"
+" f, fixup = som \"squash\", men förkasta incheckningsmeddelandet\n"
+" x, exec = kör kommando (resten av raden) i skalet\n"
+" d, drop = ta bort incheckning\n"
+"\n"
+"Du kan byta ordning på raderna, de utförs uppifrån och ned.\n"
 
-# cogito-relaterat
-#: git-bisect.sh:178
-msgid "won't bisect on cg-seek'ed tree"
-msgstr "kör inte \"bisect\" på träd där \"cg-seek\" använts"
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"Ta inte bort rader. Använd \"drop\" för att specifikt förkasta en "
+"incheckning.\n"
 
-#: git-bisect.sh:182
-msgid "Bad HEAD - strange symbolic ref"
-msgstr "Felaktigt HEAD - konstig symbolisk referens"
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"Om du tar bort en rad KOMMER DEN INCHECKNINGEN ATT FÖRLORAS.\n"
 
-#: git-bisect.sh:234
+#: git-rebase--interactive.sh:202
 #, sh-format
-msgid "Bad bisect_write argument: $state"
-msgstr "Felaktigt argument till bisect_write: $state"
+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 ""
+"Du kan utöka incheckningen nu, med\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"När du är nöjd med dina ändringar kör du\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-bisect.sh:263
+#: git-rebase--interactive.sh:227
 #, sh-format
-msgid "Bad rev input: $arg"
-msgstr "Felaktig rev-indata: $arg"
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1: inte en incheckning som kan väljas"
+
+#: git-rebase--interactive.sh:266
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "Felaktigt incheckningsnamn: $sha1"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Anropa \"bisect_state\" med minst ett argument."
+#: git-rebase--interactive.sh:308
+msgid "Cannot write current commit's replacement sha1"
+msgstr "Kan inte skriva ersättnings-sha1 för aktuell incheckning"
 
-#: git-bisect.sh:290
+#: git-rebase--interactive.sh:360
 #, sh-format
-msgid "Bad rev input: $rev"
-msgstr "Felaktig rev-indata: $rev"
+msgid "Fast-forward to $sha1"
+msgstr "Snabbspolade till $sha1"
 
-#: git-bisect.sh:299
+#: git-rebase--interactive.sh:362
 #, sh-format
-msgid "'git bisect $TERM_BAD' can take only one argument."
-msgstr "\"git bisect $TERM_BAD\" kan bara ta ett argument."
+msgid "Cannot fast-forward to $sha1"
+msgstr "Kan inte snabbspola till $sha1"
 
-#: git-bisect.sh:322
+#: git-rebase--interactive.sh:371
 #, sh-format
-msgid "Warning: bisecting only with a $TERM_BAD commit."
-msgstr ""
-"Varning: utför \"bisect\" med endast en dålig (\"$TERM_BAD\") incheckning"
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Kan inte flytta HEAD till $first_parent"
 
-#. 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 "Är du säker [Y=ja/N=nej]? "
+#: git-rebase--interactive.sh:376
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Vägrar utföra \"squash\" på en sammanslagning: $sha1"
 
-#: git-bisect.sh:340
+#: git-rebase--interactive.sh:390
 #, 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 ""
-"Du måste ange åtminstone en dålig (\"$bad_syn\") och en bra (\"$good_syn\") "
-"version.\n"
-"(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
-"detta.)"
+msgid "Error redoing merge $sha1"
+msgstr "Fel när sammanslagningen $sha1 skulle göras om"
 
-#: git-bisect.sh:343
+#: git-rebase--interactive.sh:398
 #, 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 ""
-"Du måste starta med \"git bisect start\".\n"
-"Du måste sedan ange åtminstone en bra (\"$good_syn\") och en dålig "
-"(\"$bad_syn\") version.\n"
-"(Du kan använda \"git bisect $bad_syn\" och \"git bisect $good_syn\" för "
-"detta.)"
+msgid "Could not pick $sha1"
+msgstr "Kunde inte välja $sha1"
 
-#: git-bisect.sh:414 git-bisect.sh:546
-msgid "We are not bisecting."
-msgstr "Vi utför ingen bisect för tillfället."
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "Det här är incheckningsmeddelande ${n}:"
 
-#: git-bisect.sh:421
+#: git-rebase--interactive.sh:412
 #, sh-format
-msgid "'$invalid' is not a valid commit"
-msgstr "\"$invalid\" är inte en giltig incheckning"
+msgid "The commit message #${n} will be skipped:"
+msgstr "Incheckningsmeddelande ${n} kommer hoppas över:"
 
-#: git-bisect.sh:430
+#: 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] "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
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "Kan inte skriva $fixup_msg"
+
+#: git-rebase--interactive.sh:434
+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
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "kunde inte tillämpa $sha1... $rest"
+
+#: git-rebase--interactive.sh:549
 #, sh-format
 msgid ""
-"Could not check out original HEAD '$branch'.\n"
-"Try 'git bisect reset <commit>'."
+"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 ""
-"Kunde inte checka ut original-HEAD \"$branch\".\n"
-"Försök \"git bisect reset <incheckning>\"."
-
-#: git-bisect.sh:458
-msgid "No logfile given"
-msgstr "Ingen loggfil angiven"
+"Kunde inte utöka incheckning efter att ha lyckats välja $sha1... $rest\n"
+"Det är antagligen på grund av ett tomt incheckningsmeddelande, eller att\n"
+"pre-commit-kroken misslyckades. Om pre-commit-kroken misslyckades kanske\n"
+"du måste lösa problemet innan du kan skriva om incheckningsmeddelandet."
 
-#: git-bisect.sh:459
+#: git-rebase--interactive.sh:564
 #, sh-format
-msgid "cannot read $file for replaying"
-msgstr "kan inte läsa $file för uppspelning"
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Stoppade på $sha1_abbrev... $rest"
 
-#: git-bisect.sh:480
-msgid "?? what are you talking about?"
-msgstr "?? vad menar du?"
+#: git-rebase--interactive.sh:579
+#, sh-format
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "Kan inte utföra \"$squash_style\" utan en föregående incheckning"
 
-#: git-bisect.sh:492
+#: git-rebase--interactive.sh:621
 #, sh-format
-msgid "running $command"
-msgstr "kör $command"
+msgid "Executing: $rest"
+msgstr "Kör: $rest"
 
-#: git-bisect.sh:499
+#: git-rebase--interactive.sh:629
 #, sh-format
+msgid "Execution failed: $rest"
+msgstr "Körning misslyckades: $rest"
+
+#: git-rebase--interactive.sh:631
+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
 msgid ""
-"bisect run failed:\n"
-"exit code $res from '$command' is < 0 or >= 128"
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"\"bisect\"-körningen misslyckades:\n"
-"felkod $res från \"$command\" är < 0 eller >= 128"
-
-#: git-bisect.sh:525
-msgid "bisect run cannot continue any more"
-msgstr "\"bisect\"-körningen kan inte fortsätta längre"
+"Du kan rätta problemet och sedan köra\n"
+"\n"
+"\tgit rebase --continue\""
 
-#: git-bisect.sh:531
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:646
 #, sh-format
 msgid ""
-"bisect run failed:\n"
-"'bisect_state $state' exited with error code $res"
+"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 ""
-"\"bisect\"-körningen misslyckades:\n"
-"\"bisect_state $state\" avslutades med felkoden $res"
+"Körningen lyckades: $rest\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"
 
-#: git-bisect.sh:538
-msgid "bisect run success"
-msgstr "\"bisect\"-körningen lyckades"
+#: git-rebase--interactive.sh:657
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Okänt kommando: $command $sha1 $rest"
 
-#: git-bisect.sh:565
-msgid "please use two different terms"
-msgstr "termerna måste vara olika"
+#: git-rebase--interactive.sh:658
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "Rätta det med \"git rebase --edit-todo\"."
 
-#: git-bisect.sh:575
+#: git-rebase--interactive.sh:693
 #, sh-format
-msgid "'$term' is not a valid term"
-msgstr "\"$term\" är inte en giltig term"
+msgid "Successfully rebased and updated $head_name."
+msgstr "Lyckades ombasera och uppdatera $head_name."
 
-#: git-bisect.sh:578
-#, sh-format
-msgid "can't use the builtin command '$term' as a term"
-msgstr "kan inte använda det inbyggda kommandot \"$term\" som term"
+#: git-rebase--interactive.sh:740
+msgid "Could not skip unnecessary pick commands"
+msgstr "Kunde inte hoppa över onödiga \"pick\"-kommandon"
 
-#: git-bisect.sh:587 git-bisect.sh:593
+#: git-rebase--interactive.sh:898
 #, sh-format
-msgid "can't change the meaning of term '$term'"
-msgstr "kan inte ändra betydelsen av termen \"$term\""
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
+msgstr ""
+"Varning: SHA-1 saknas eller inte en incheckning på följande rad:\n"
+" - $line"
 
-#: git-bisect.sh:606
+#: git-rebase--interactive.sh:931
 #, sh-format
-msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
 msgstr ""
-"Ogiltigt kommando: du utför just nu en \"bisect\" med $TERM_BAD/$TERM_GOOD."
+"Varning: kommandot kändes inte igen på följande rad:\n"
+" - $line"
 
-#: git-bisect.sh:636
-msgid "no terms defined"
-msgstr "inga termer angivna"
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "kunde inte koppla från HEAD"
 
-#: git-bisect.sh:653
-#, sh-format
+#: git-rebase--interactive.sh:1008
 msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
-"ogiltigt argument $arg för \"git bisect terms\".\n"
-"Flaggor som stöds är: --term-good|--term-old och --term-bad|--term-new."
+"Varning: vissa incheckningar kan av misstag ha tappats.\n"
+"Tappade incheckningar (nyaste först):"
 
-#: git-rebase.sh:57
+#: git-rebase--interactive.sh:1016
 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"
-"\"."
+"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 ""
-"När du har löst problemet kör du \"git rebase --continue\".\n"
-"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:165
-msgid "Applied autostash."
-msgstr "Tillämpade autostash."
+"För att undvika det här meddelandet kan du använda \"drop\" för att "
+"explicit\n"
+"kasta en incheckning.\n"
+"\n"
+"Använd \"git config rebase.missingCommitsCheck\" för att ändra "
+"varningsnivån.\n"
+"Möjliga bettenden är: \"ignore\" (ignorera), \"warn\" (varna), \"error"
+"\" (fel)."
 
-#: git-rebase.sh:168
+#: git-rebase--interactive.sh:1027
 #, sh-format
-msgid "Cannot store $stash_sha1"
-msgstr "Kan inte spara $stash_sha1"
+msgid ""
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
+msgstr ""
+"Okänt val $check_level för flaggan rebase.missingCommitsCheck. Ignorerar."
 
-#: git-rebase.sh:169
+#: git-rebase--interactive.sh:1044
 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 ""
-"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"
+"Du kan rätta detta med \"git rebase --edit-todo\" följt av \"git rebase --"
+"continue\"."
 
-#: git-rebase.sh:208
-msgid "The pre-rebase hook refused to rebase."
-msgstr "Kroken pre-rebase vägrade ombaseringen."
+#: git-rebase--interactive.sh:1045
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "Eller så kan du avbryta ombaseringen med \"git rebase --abort\"."
 
-#: git-rebase.sh:213
-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--interactive.sh:1069
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Kunde inte ta bort CHERRY_PICK_HEAD"
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "Flaggan --exec måste användas tillsammans med flaggan --interactive"
+#: git-rebase--interactive.sh:1074
+#, 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 ""
+"Du har köade ändringar i din arbetskatalog.\n"
+"Om det är meningen att ändringarna\n"
+"skall läggas in i föregående incheckning, kör:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Om de skall checkas in i en egen incheckning, kör:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"Oavsett vilket, när du är färdig fortsätter du med:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: git-rebase.sh:359
-msgid "No rebase in progress?"
-msgstr "Ingen ombasering pågår?"
+#: git-rebase--interactive.sh:1091
+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.sh:370
-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--interactive.sh:1096
+msgid ""
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
+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.sh:377
-msgid "Cannot read HEAD"
-msgstr "Kan inte läsa HEAD"
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+msgid "Could not commit staged changes."
+msgstr "Kunde inte checka in köade ändringar."
 
-#: git-rebase.sh:380
+#: git-rebase--interactive.sh:1129
 msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
+"\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 ""
-"Du måste redigera alla sammanslagningskonflikter och\n"
-"därefter markera dem som lösta med git add"
+"\n"
+"Du redigerar \"todo\"-filen för en pågående interaktiv ombasering.\n"
+"För att forsätta ombasera efter redigeringen, kör:\n"
+"    git rebase --continue\n"
+"\n"
 
-#: git-rebase.sh:398
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "Kunde inte starta textredigerare"
+
+#: git-rebase--interactive.sh:1150
 #, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Kunde inte flytta tillbaka till $head_name"
+msgid "Could not checkout $switch_to"
+msgstr "Kunde inte checka ut $switch_to"
+
+#: git-rebase--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "Inget HEAD?"
+
+#: git-rebase--interactive.sh:1156
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "Kunde inte skapa temporär $state_dir"
 
-#: git-rebase.sh:417
+#: git-rebase--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "Kunde inte markera som interaktiv"
+
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+msgid "Could not init rewritten commits"
+msgstr "Kunde inte initiera omskrivna incheckningar"
+
+#: git-rebase--interactive.sh:1273
 #, 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:1278
 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"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
 msgstr ""
-"Det verkar som katalogen $state_dir_base redan existerar, och\n"
-"jag undrar om du redan är mitt i en annan ombasering. Om så är\n"
-"fallet, försök\n"
-"\t$cmd_live_rebase\n"
-"Om så inte är fallet, kör\n"
-"\t$cmd_clear_stale_rebase\n"
-"och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
-"något av värde där."
+"\n"
+"Ombaseringen kommer dock att avbrytas om du tar bort allting.\n"
+"\n"
 
-#: git-rebase.sh:468
-#, sh-format
-msgid "invalid upstream $upstream_name"
-msgstr "ogiltig uppström $upstream_name"
+#: git-rebase--interactive.sh:1285
+msgid "Note that empty commits are commented out"
+msgstr "Observera att tomma incheckningar är utkommenterade"
 
-#: git-rebase.sh:492
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
-msgid "$onto_name: there are more than one merge bases"
-msgstr "$onto_name: mer än en sammanslagningsbas finns"
+msgid "usage: $dashless $USAGE"
+msgstr "använd: $dashless $USAGE"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-sh-setup.sh:190
 #, sh-format
-msgid "$onto_name: there is no merge base"
-msgstr "$onto_name: ingen sammanslagningsbas finns"
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr "Kunde inte byta katalog till $cdup, toppnivån på arbetskatalogen"
 
-#: git-rebase.sh:504
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid "Does not point to a valid commit: $onto_name"
-msgstr "Peka på en giltig incheckning: $onto_name"
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr "ödesdigetrt: $program_name kan inte användas utan arbetskatalog."
 
-#: git-rebase.sh:527
-#, sh-format
-msgid "fatal: no such branch: $branch_name"
-msgstr "ödesdigert: ingen sådan gren: $branch_name"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "Kan inte ombasera: Du har oköade ändringar."
 
-#: git-rebase.sh:560
-msgid "Cannot autostash"
-msgstr "Kan inte utföra \"autostash\""
+#: git-sh-setup.sh:223
+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-rebase.sh:565
+#: git-sh-setup.sh:229
 #, sh-format
-msgid "Created autostash: $stash_abbrev"
-msgstr "Skapade autostash: $stash_abbrev"
+msgid "Cannot $action: You have unstaged changes."
+msgstr "Kan inte $action: Du har oköade ändringar."
 
-#: git-rebase.sh:569
-msgid "Please commit or stash them."
-msgstr "Checka in eller använd \"stash\" på dem."
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
+msgstr ""
+"Kan inte ombasera: Ditt index innehåller ändringar som inte checkats in."
 
-#: git-rebase.sh:589
-#, sh-format
-msgid "Current branch $branch_name is up to date."
-msgstr "Aktuell gren $branch_name är à jour."
+#: 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-rebase.sh:593
+#: git-sh-setup.sh:248
 #, sh-format
-msgid "Current branch $branch_name is up to date, rebase forced."
-msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
+msgid "Cannot $action: Your index contains uncommitted changes."
+msgstr ""
+"Kan inte $action: Ditt index innehåller ändringar som inte checkats in."
 
-#: git-rebase.sh:604
-#, sh-format
-msgid "Changes from $mb to $onto:"
-msgstr "Ändringar från $mb till $onto:"
+#: 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-rebase.sh:613
-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-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å."
 
-#: git-rebase.sh:623
-#, sh-format
-msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr "Snabbspolade $branch_name till $onto_name."
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "Kunde inte bestämma absolut sökväg till git-katalogen"
 
-#: git-stash.sh:51
-msgid "git stash clear with parameters is unimplemented"
-msgstr "\"git stash clear\" med parametrar har inte implementerats"
+#~ msgid "Could not write to %s"
+#~ msgstr "Kunde inte skriva till %s"
 
-#: git-stash.sh:74
-msgid "You do not have the initial commit yet"
-msgstr "Du har inte den första incheckningen ännu"
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Fel vid ombrytning av %s."
 
-#: git-stash.sh:89
-msgid "Cannot save the current index state"
-msgstr "Kan inte spara aktuellt tillstånd för indexet"
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"."
 
-#: git-stash.sh:124 git-stash.sh:137
-msgid "Cannot save the current worktree state"
-msgstr "Kan inte spara aktuellt tillstånd för arbetskatalogen"
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "Kan inte utföra \"revert\" under en annan \"revert\"."
 
-#: git-stash.sh:141
-msgid "No changes selected"
-msgstr "Inga ändringar valda"
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "Kan inte utföra \"cherry-pick\" under en annan \"cherry-pick\"."
 
-#: git-stash.sh:144
-msgid "Cannot remove temporary index (can't happen)"
-msgstr "Kan inte ta bort temporärt index (kan inte inträffa)"
+#~ msgid "Could not parse line %d."
+#~ msgstr "Kan inte tolka rad %d."
 
-#: git-stash.sh:157
-msgid "Cannot record working tree state"
-msgstr "Kan inte registrera tillstånd för arbetskatalog"
+#~ msgid "Could not open %s"
+#~ msgstr "Kunde inte öppna %s"
 
-#: git-stash.sh:189
-#, sh-format
-msgid "Cannot update $ref_stash with $w_commit"
-msgstr "Kan inte uppdatera $ref_stash med $w_commit"
+#~ msgid "Could not read %s."
+#~ msgstr "kunde inte läsa %s."
 
-#. 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
-msgid ""
-"error: unknown option for 'stash save': $option\n"
-"       To provide a message, use git stash save -- '$option'"
-msgstr ""
-"fel: felaktig flagga för \"stash save\": $option\n"
-"     För att ange ett meddelande, använd git stash save -- \"$option\""
+#~ 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"
+
+#~ msgid "bad numeric config value '%s' for '%s' in blob %s: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i blob:en %s: "
+#~ "ogiltig enhet"
 
-#: git-stash.sh:260
-msgid "No local changes to save"
-msgstr "Inga lokala ändringar att spara"
+#~ msgid "bad numeric config value '%s' for '%s' in file %s: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i filen %s: "
+#~ "ogiltig enhet"
 
-#: git-stash.sh:264
-msgid "Cannot initialize stash"
-msgstr "Kan inte initiera \"stash\""
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in standard input: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i standard in: "
+#~ "ogiltig enhet"
 
-#: git-stash.sh:268
-msgid "Cannot save the current status"
-msgstr "Kan inte spara aktuell status"
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in submodule-blob %s: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i undermodul-"
+#~ "blob:en %s: ogiltig enhet"
 
-#: git-stash.sh:286
-msgid "Cannot remove worktree changes"
-msgstr "Kan inte ta bort ändringar i arbetskatalogen"
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in command line %s: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i kommandoraden "
+#~ "%s: ogiltig enhet"
 
-#: git-stash.sh:405
-#, sh-format
-msgid "unknown option: $opt"
-msgstr "okänd flagga: $opt"
+#~ msgid "bad numeric config value '%s' for '%s' in %s: invalid unit"
+#~ msgstr ""
+#~ "felaktigt numeriskt konfigurationsvärde \"%s\" för \"%s\" i %s: ogiltig "
+#~ "enhet"
 
-#: git-stash.sh:415
-msgid "No stash found."
-msgstr "Ingen \"stash\" hittades."
+#~ msgid "This is the 2nd commit message:"
+#~ msgstr "Det här är 2:a incheckningsmeddelandet:"
 
-#: git-stash.sh:422
-#, sh-format
-msgid "Too many revisions specified: $REV"
-msgstr "För många revisioner angivna: $REV"
+#~ msgid "This is the 3rd commit message:"
+#~ msgstr "Det här är 3:e incheckningsmeddelandet:"
 
-#: git-stash.sh:428
-#, sh-format
-msgid "$reference is not a valid reference"
-msgstr "$reference är inte en giltig referens"
+#~ msgid "This is the 4th commit message:"
+#~ msgstr "Det här är 4:e incheckningsmeddelandet:"
 
-#: git-stash.sh:456
-#, sh-format
-msgid "'$args' is not a stash-like commit"
-msgstr "\"$args\" är inte en \"stash\"-liknande incheckning"
+#~ msgid "This is the 5th commit message:"
+#~ msgstr "Det här är 5:e incheckningsmeddelandet:"
 
-#: git-stash.sh:467
-#, sh-format
-msgid "'$args' is not a stash reference"
-msgstr "\"$args\" är inte en \"stash\"-referens"
+#~ msgid "This is the 6th commit message:"
+#~ msgstr "Det här är 6:e incheckningsmeddelandet:"
 
-#: git-stash.sh:475
-msgid "unable to refresh index"
-msgstr "kan inte uppdatera indexet"
+#~ msgid "This is the 7th commit message:"
+#~ msgstr "Det här är 7:e incheckningsmeddelandet:"
 
-#: git-stash.sh:479
-msgid "Cannot apply a stash in the middle of a merge"
-msgstr "Kan inte tillämpa en \"stash\" mitt i en sammanslagning"
+#~ msgid "This is the 8th commit message:"
+#~ msgstr "Det här är 8:e incheckningsmeddelandet:"
 
-#: git-stash.sh:487
-msgid "Conflicts in index. Try without --index."
-msgstr "Konflikter i indexet. Testa utan --index."
+#~ msgid "This is the 9th commit message:"
+#~ msgstr "Det här är 9:e incheckningsmeddelandet:"
 
-#: git-stash.sh:489
-msgid "Could not save index tree"
-msgstr "Kunde inte spara indexträd"
+#~ msgid "This is the 10th commit message:"
+#~ msgstr "Det här är 10:e incheckningsmeddelandet:"
 
-#: git-stash.sh:523
-msgid "Cannot unstage modified files"
-msgstr "Kan inte ta bort ändrade filer ur kön"
+#~ msgid "This is the ${n}th commit message:"
+#~ msgstr "Det här är ${n}:e incheckningsmeddelandet:"
 
-#: git-stash.sh:538
-msgid "Index was not unstashed."
-msgstr "Indexet har inte tagits ur kön."
+#~ msgid "This is the ${n}st commit message:"
+#~ msgstr "Det här är ${n}:a incheckningsmeddelandet:"
 
-#: git-stash.sh:561
-#, sh-format
-msgid "Dropped ${REV} ($s)"
-msgstr "Kastade ${REV} ($s)"
+#~ msgid "This is the ${n}nd commit message:"
+#~ msgstr "Det här är ${n}:a incheckningsmeddelandet:"
 
-#: git-stash.sh:562
-#, sh-format
-msgid "${REV}: Could not drop stash entry"
-msgstr "${REV}: Kunde inte kasta \"stash\"-post"
+#~ msgid "This is the ${n}rd commit message:"
+#~ msgstr "Det här är ${n}:e incheckningsmeddelandet:"
 
-#: git-stash.sh:570
-msgid "No branch name specified"
-msgstr "Inget grennamn angavs"
+#~ msgid "The 1st commit message will be skipped:"
+#~ msgstr "1:a incheckningsmeddelandet kommer hoppas över:"
 
-#: git-stash.sh:642
-msgid "(To restore them type \"git stash apply\")"
-msgstr "(För att återställa dem, skriv \"git stash apply\")"
+#~ msgid "The 2nd commit message will be skipped:"
+#~ msgstr "2:a incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "kan inte ta bort en komponent från url:en \"$remoteurl\""
+#~ msgid "The 3rd commit message will be skipped:"
+#~ msgstr "3:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:281
-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å"
+#~ msgid "The 4th commit message will be skipped:"
+#~ msgstr "4:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:291
-#, sh-format
-msgid "repo URL: '$repo' must be absolute or begin with ./|../"
-msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
+#~ msgid "The 5th commit message will be skipped:"
+#~ msgstr "5:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:308
-#, sh-format
-msgid "'$sm_path' already exists in the index"
-msgstr "\"$sm_path\" finns redan i indexet"
+#~ msgid "The 6th commit message will be skipped:"
+#~ msgstr "6:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:312
-#, 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 ""
-"Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
-"$sm_path\n"
-"Använd -f om du verkligen vill lägga till den"
+#~ msgid "The 7th commit message will be skipped:"
+#~ msgstr "7:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:330
-#, sh-format
-msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
+#~ msgid "The 8th commit message will be skipped:"
+#~ msgstr "8:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:332
-#, 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"
+#~ msgid "The 9th commit message will be skipped:"
+#~ msgstr "9:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:340
-#, 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):"
+#~ msgid "The 10th commit message will be skipped:"
+#~ msgstr "10:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
-"För att återanvända den lokala git-katalogen istället för att på nytt klona "
-"från"
+#~ msgid "The ${n}th commit message will be skipped:"
+#~ msgstr "${n}:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"använd flaggan \"--force\". Om den lokala git-katalogen inte är riktigt arkiv"
+#~ msgid "The ${n}st commit message will be skipped:"
+#~ msgstr "${n}:a incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:345
-#, sh-format
-msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-"eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--name"
-"\"."
+#~ msgid "The ${n}nd commit message will be skipped:"
+#~ msgstr "${n}:a incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:347
-#, sh-format
-msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr "Aktiverar lokal git-katalog för undermodulen \"$sm_name\" på nytt."
+#~ msgid "The ${n}rd commit message will be skipped:"
+#~ msgstr "${n}:e incheckningsmeddelandet kommer hoppas över:"
 
-#: git-submodule.sh:359
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Kan inte checka ut undermodulen \"$sm_path\""
+#~ msgid "could not run gpg."
+#~ msgstr "kunde inte köra gpg."
 
-#: git-submodule.sh:364
-#, sh-format
-msgid "Failed to add submodule '$sm_path'"
-msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
+#~ msgid "gpg did not accept the data"
+#~ msgstr "gpg godtog inte data"
 
-#: git-submodule.sh:373
-#, sh-format
-msgid "Failed to register submodule '$sm_path'"
-msgstr "Misslyckades registrera undermodulen \"$sm_path\""
+#~ msgid "unsupported object type in the tree"
+#~ msgstr "objekttyp som ej stöds upptäcktes i trädet"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Går in i \"$prefix$displaypath\""
+#~ msgid "Fatal merge failure, shouldn't happen."
+#~ msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
 
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr ""
-"Stoppar på \"$prefix$displaypath\"; skriptet returnerade en status skild "
-"från noll."
+#~ msgid "Unprocessed path??? %s"
+#~ msgstr "Obehandlad sökväg??? %s"
 
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr ""
-"Hittade ingen url för undermodulsökvägen \"$displaypath\" i .gitmodules"
+#~ msgid "Error wrapping up %s"
+#~ msgstr "Fel vid ombrytning av %s"
 
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\""
+#~ msgid "Cannot %s during a %s"
+#~ msgstr "kan inte %s under en %s"
 
-#: git-submodule.sh:494
-#, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr ""
-"Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\""
+#~ msgid "Can't cherry-pick into empty head"
+#~ msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
 
-#: git-submodule.sh:511
-#, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr ""
-"Misslyckades registrera uppdateringsläge för undermodulsökväg \"$displaypath"
-"\""
+#~ msgid "could not open %s for writing"
+#~ msgstr "kunde inte öppna %s för skrivning"
 
-#: git-submodule.sh:549
-#, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Använd \".\" om du verkligen vill avinitiera alla undermoduler"
+#~ msgid "bug: unhandled unmerged status %x"
+#~ msgstr "programfel: ej hanterad \"unmerged\"-status %x"
 
-#: git-submodule.sh:566
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr ""
-"Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
+#~ msgid "bug: unhandled diff status %c"
+#~ msgstr "programfel: diff-status %c ej hanterad"
 
-#: git-submodule.sh:567
-#, sh-format
-msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
-"(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
+#~ msgid "read of %s failed"
+#~ msgstr "misslyckades läsa %s"
 
-#: git-submodule.sh:573
-#, sh-format
-msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
-msgstr ""
-"Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
-"kastar bort dem"
+#~ msgid "could not write branch description template"
+#~ msgstr "kunde inte skriva grenbeskrivningsmall"
 
-#: git-submodule.sh:576
-#, sh-format
-msgid "Cleared directory '$displaypath'"
-msgstr "Rensade katalogen \"$displaypath\""
+#~ msgid "corrupt index file"
+#~ msgstr "indexfilen är trasig"
 
-#: git-submodule.sh:577
-#, sh-format
-msgid "Could not remove submodule work tree '$displaypath'"
-msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
+#~ msgid "detach the HEAD at named commit"
+#~ msgstr "koppla från HEAD vid namngiven incheckning"
 
-#: git-submodule.sh:580
-#, sh-format
-msgid "Could not create empty submodule directory '$displaypath'"
-msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
+# Vague original, not networking-related, but rather related to the actual
+# objects downloaded.
+#~ msgid "Checking connectivity... "
+#~ msgstr "Kontrollerar om vi fick alla objekt..."
 
-#: git-submodule.sh:589
-#, sh-format
-msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
-msgstr ""
-"Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
+#~ msgid "  (unable to update local ref)"
+#~ msgstr "  (kunde inte uppdatera lokal ref)"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"Undermodulen \"$displaypath\" har inte initierats\n"
-"Kanske du vill köra \"update --init\"?"
+#~ msgid "Reinitialized existing"
+#~ msgstr "Ominitierade befintligt"
 
-#: git-submodule.sh:736
-#, sh-format
-msgid "Unable to find current revision in submodule path '$displaypath'"
-msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\""
+#~ msgid "Initialized empty"
+#~ msgstr "Initierade tomt"
 
-#: git-submodule.sh:745
-#, sh-format
-msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
+#~ msgid " shared"
+#~ msgstr " delat"
 
-#: git-submodule.sh:768
-#, sh-format
-msgid "Unable to fetch in submodule path '$displaypath'"
-msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
+#~ msgid "Verify that the named commit has a valid GPG signature"
+#~ msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
 
-#: git-submodule.sh:788
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
+#~ msgid "Writing SQUASH_MSG"
+#~ msgstr "Skriver SQUASH_MSG"
 
-#: git-submodule.sh:789
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
+#~ msgid "Finishing SQUASH_MSG"
+#~ msgstr "Avslutar SQUASH_MSG"
 
-#: git-submodule.sh:793
-#, sh-format
-msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
-msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
+#~ msgid "   and with remote"
+#~ msgstr "   och med fjärren"
 
-#: git-submodule.sh:794
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
+#~ msgid "removing '%s' failed"
+#~ msgstr "misslyckades ta bort \"%s\""
 
-#: git-submodule.sh:799
-#, sh-format
-msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
-msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$displaypath\""
+#~ msgid "program error"
+#~ msgstr "programfel"
 
-#: git-submodule.sh:800
-#, sh-format
-msgid "Submodule path '$displaypath': merged in '$sha1'"
-msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
+#~ msgid "Please call 'bisect_state' with at least one argument."
+#~ msgstr "Anropa \"bisect_state\" med minst ett argument."
 
-#: git-submodule.sh:805
-#, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr ""
-"Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$prefix$sm_path\""
+#~ msgid ""
+#~ "If you want to reuse this local git directory instead of cloning again "
+#~ "from"
+#~ msgstr ""
+#~ "För att återanvända den lokala git-katalogen istället för att på nytt "
+#~ "klona från"
 
-#: git-submodule.sh:806
-#, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\""
+#~ msgid ""
+#~ "use the '--force' option. If the local git directory is not the correct "
+#~ "repo"
+#~ msgstr ""
+#~ "använd flaggan \"--force\". Om den lokala git-katalogen inte är riktigt "
+#~ "arkiv"
 
-#: git-submodule.sh:836
-#, sh-format
-msgid "Failed to recurse into submodule path '$displaypath'"
-msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
+#~ msgid ""
+#~ "or you are unsure what this means choose another name with the '--name' "
+#~ "option."
+#~ msgstr ""
+#~ "eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--"
+#~ "name\"."
 
-#: git-submodule.sh:944
-msgid "The --cached option cannot be used with the --files option"
-msgstr "Flaggan --cached kan inte användas med flaggan --files"
+#~ msgid "Submodule work tree '$displaypath' contains a .git directory"
+#~ msgstr ""
+#~ "Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
 
-#: git-submodule.sh:996
-#, sh-format
-msgid "unexpected mode $mod_dst"
-msgstr "oväntat läge $mod_dst"
+#~ msgid ""
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ msgstr ""
+#~ "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
 
-#: git-submodule.sh:1016
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_src"
-msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_src"
+#~ msgid "'%s': %s"
+#~ msgstr "\"%s\": %s"
 
-#: git-submodule.sh:1019
-#, sh-format
-msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
-msgstr "  Varning: $display_name innehåller inte incheckningen $sha1_dst"
+#~ msgid "unable to access '%s': %s"
+#~ msgstr "kan inte komma åt \"%s\": %s"
 
-#: git-submodule.sh:1022
-#, 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"
+#~ msgid "could not open '%s' for reading: %s"
+#~ msgstr "kunde inte öppna \"%s\" för läsning: %s"
 
-#: git-submodule.sh:1047
-msgid "blob"
-msgstr "blob"
+#~ msgid "could not open '%s' for writing: %s"
+#~ msgstr "Kunde inte öppna \"%s\" för skrivning: %s"
 
-#: git-submodule.sh:1165
-#, sh-format
-msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
+#~ msgid "    git branch -d %s\n"
+#~ msgstr "    git branch -d %s\n"
 
-#: git-submodule.sh:1229
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "Synkroniserar undermodul-url för \"$displaypath\""
+#~ msgid "    git branch --set-upstream-to %s\n"
+#~ msgstr "    git branch --set-upstream-to %s\n"
+
+#~ msgid "cannot open %s: %s\n"
+#~ msgstr "kan inte öppna %s: %s\n"
+
+#~ 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"
+
+#~ msgid "could not verify the tag '%s'"
+#~ msgstr "kunde inte bekräfta taggen \"%s\""
+
+#~ msgid "failed to remove: %s"
+#~ msgstr "misslyckades ta bort: %s"
+
+#~ msgid "The --exec option must be used with the --interactive option"
+#~ msgstr "Flaggan --exec måste användas tillsammans med flaggan --interactive"
+
+#~ msgid ""
+#~ "Submodule path '$displaypath' not initialized\n"
+#~ "Maybe you want to use 'update --init'?"
+#~ msgstr ""
+#~ "Undermodulen \"$displaypath\" har inte initierats\n"
+#~ "Kanske du vill köra \"update --init\"?"
 
 #~ msgid "Forward-port local commits to the updated upstream head"
 #~ msgstr "Framåtanpassa lokala kommandon på uppdaterat uppströmshuvud"
@@ -12253,9 +14912,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "Could not append '%s'"
 #~ msgstr "Kunde inte lägga till på \"%s\""
 
-#~ msgid "Could not set '%s'"
-#~ msgstr "Kunde inte sätta \"%s\""
-
 #~ msgid "Missing author: %s"
 #~ msgstr "Författare saknas: %s"
 
@@ -12334,9 +14990,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "-b and -B are mutually exclusive"
 #~ msgstr "-b och -B kan inte användas samtidigt"
 
-#~ msgid "You need to set your committer info first"
-#~ msgstr "Du måste ställa in din incheckarinformation först"
-
 #~ msgid ""
 #~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
 #~ "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
@@ -12380,17 +15033,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ "Rätta dem i din arbetskatalog och använd sedan \"git add/rm <fil>\"\n"
 #~ "där det är lämpligt för att ange lösning och checka in."
 
-#~ msgid "Pull is not possible because you have unmerged files."
-#~ msgstr ""
-#~ "Du kan inte göra en \"pull\" då du har ändringar som inte checkats in."
-
-#~ msgid ""
-#~ "You have not concluded your merge (MERGE_HEAD exists).\n"
-#~ "Please, commit your changes before you can merge."
-#~ msgstr ""
-#~ "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
-#~ "Checka in dina ändringar innan du kan slå ihop."
-
 #~ msgid "no branch specified"
 #~ msgstr "inget grennamn angavs"
 
@@ -12442,9 +15084,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "Failed to lock HEAD during fast_forward_to"
 #~ msgstr "Misslyckades låsa HEAD under \"fast_forward_to\""
 
-#~ msgid "invalid commit: %s"
-#~ msgstr "felaktig incheckning: %s"
-
 #~ msgid "cannot lock HEAD ref"
 #~ msgstr "kunde inte låsa HEAD-referens"
 
@@ -12592,13 +15231,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "sökvägar avdelas med null-tecken"
 
-#~ msgid ""
-#~ "The following untracked files would NOT be saved but need to be removed "
-#~ "by stash save:"
-#~ msgstr ""
-#~ "Följande ospårade ändringar skulle INTE sparas utan måste tas bort med "
-#~ "\"stash save\":"
-
 #~ msgid ""
 #~ "Aborting. Consider using either the --force or --include-untracked option."
 #~ msgstr ""
@@ -12617,15 +15249,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "You cannot combine --no-ff with --ff-only."
 #~ msgstr "Du kan inte kombinera --no-ff med --ff-only."
 
-#~ msgid ""
-#~ "submodule '%s' (or one of its nested submodules) uses a .git directory\n"
-#~ "(use 'rm -rf' if you really want to remove it including all of its "
-#~ "history)"
-#~ msgstr ""
-#~ "undermodulen \"%s\" (eller en av dess undermoduler) använder en .git-"
-#~ "katalog\n"
-#~ "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
-
 #~ msgid ""
 #~ "'%s' has changes staged in the index\n"
 #~ "(use --cached to keep the file, or -f to force removal)"
@@ -12693,9 +15316,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ msgid "Not removing %s\n"
 #~ msgstr "Tar inte bort %s\n"
 
-#~ msgid "Could not read index"
-#~ msgstr "Kunde inte läsa indexet"
-
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <namn> (-a | -d | <gren>])"
 
@@ -12758,9 +15378,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 #~ 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."
 
@@ -12787,6 +15404,3 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
 
 #~ msgid "%s; will overwrite!"
 #~ msgstr "%s; kommer skriva över!"
-
-#~ msgid "Failed to write current notes tree to database"
-#~ msgstr "Kunde inte skriva aktuellt anteckningsträd till databasen"
index edd8e29322ca7926694ea99114b6ee19ee86b1c3..1d9544fd7803faefc0a8af559146aa2ccc1f1c3e 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,12 +6,12 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git v2.8.0-rc0\n"
+"Project-Id-Version: git v2.11.0\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2016-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-21 07:14+0700\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 23:00+0800\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
-"Language-Team: Vietnamese <gnome-vi-list@gnome.org>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +27,39 @@ msgstr ""
 msgid "hint: %.*s\n"
 msgstr "gợi ý: %.*s\n"
 
-#: advice.c:88
+#: advice.c:83
+msgid "Cherry-picking is not possible because you have unmerged files."
+msgstr ""
+"Cherry là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+
+#: advice.c:85
+msgid "Committing is not possible because you have unmerged files."
+msgstr ""
+"Commit là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+
+#: advice.c:87
+msgid "Merging is not possible because you have unmerged files."
+msgstr ""
+"Merge là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+
+#: advice.c:89
+msgid "Pulling is not possible because you have unmerged files."
+msgstr ""
+"Pull là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+
+#: advice.c:91
+msgid "Reverting is not possible because you have unmerged files."
+msgstr ""
+"Revert là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+
+#: advice.c:93
+#, c-format
+msgid "It is not possible to %s because you have unmerged files."
+msgstr ""
+"Nó là không thể thực hiện với %s bởi vì bạn có những tập tin chưa được hòa "
+"trộn."
+
+#: 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."
@@ -36,12246 +68,14877 @@ msgstr ""
 "và sau đó dùng lệnh “git add/rm <tập-tin>”\n"
 "dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao."
 
-#: advice.c:101 builtin/merge.c:1226
+#: advice.c:109
+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
 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)."
 
-#: advice.c:103
+#: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Vui lòng chuyển giao các thay đổi trước khi hòa trộn."
 
-#: advice.c:104
+#: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Thoát ra bởi vì việc hòa trộn không hoàn tất."
 
-#: 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
+#: 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 <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"
+"Chú ý: đang lấy ra “%s”.\n"
+"\n"
+"Bạn đang ở tình trạng “detached HEAD”. Bạn có thể xem qua, tạo các thay\n"
+"đổi thử nghiệm và chuyển giao chúng, bạn có thể loại bỏ bất kỳ lần chuyển\n"
+"giao nào trong tình trạng này mà không cần đụng chậm đến bất kỳ nhánh nào\n"
+"bằng cách thực hiện lần lấy ra khác nữa.\n"
+"\n"
+"Nếu bạn muốn tạo một nhánh mới để giữ lại các lần chuyển giao bạn tạo,\n"
+"bạn có thể làm thế (ngay bây giờ hay sau này) bằng cách chạy lệnh checkout\n"
+"lần nữa với tùy chọn -b. Ví dụ:\n"
+"\n"
+"  git checkout -b <tên-nhánh-mới>\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 "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào"
-
-#: archive.c:429
-msgid "fmt"
-msgstr "định_dạng"
+msgid "unrecognized whitespace option '%s'"
+msgstr "không nhận ra tùy chọn về khoảng trắng “%s”"
 
-#: archive.c:429
-msgid "archive format"
-msgstr "định dạng lưu trữ"
+#: 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:430 builtin/log.c:1232
-msgid "prefix"
-msgstr "tiền_tố"
+#: 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: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:127
+msgid "--cached and --3way cannot be used together."
+msgstr "--cached và --3way không thể dùng cùng nhau."
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547 builtin/blame.c:2548
-#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989
-#: builtin/grep.c:720 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 "tập_tin"
+#: apply.c:130
+msgid "--3way outside a repository"
+msgstr "--3way ở ngoài một kho chứa"
 
-#: 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:141
+msgid "--index outside a repository"
+msgstr "--index ở ngoài một kho chứa"
 
-#: archive.c:435
-msgid "read .gitattributes in working directory"
-msgstr "đọc .gitattributes trong thư mục làm việc"
+#: apply.c:144
+msgid "--cached outside a repository"
+msgstr "--cached ở ngoài một kho chứa"
 
-#: 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: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:437
-msgid "store only"
-msgstr "chỉ lưu (không nén)"
+#: 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:438
-msgid "compress faster"
-msgstr "nén nhanh hơn"
+#: 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:446
-msgid "compress better"
-msgstr "nén nhỏ hơn"
+#: 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:449
-msgid "list supported archive formats"
-msgstr "liệt kê các kiểu nén được hỗ trợ"
+#: 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:451 builtin/archive.c:90 builtin/clone.c:78
-msgid "repo"
-msgstr "kho"
+#: 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: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: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:453 builtin/archive.c:92 builtin/notes.c:482
-msgid "command"
-msgstr "lệnh"
+#: apply.c:1488
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "chi tiết: dòng không cần: %.*s"
 
-#: 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: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"
 
-#: attr.c:263
+#: apply.c:1577
+#, c-format
 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."
+"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)"
 
-#: branch.c:53
+#: apply.c:1589
 #, 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 "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)"
 
-#: branch.c:67
+#: 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ũ"
+
+#: apply.c:1761
+msgid "deleted file still has contents"
+msgstr "tập tin đã xóa vẫn còn nội dung"
+
+#: apply.c:1795
 #, 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 "corrupt patch at line %d"
+msgstr "miếng vá hỏng tại dòng %d"
 
-#: branch.c:93
+#: apply.c:1832
 #, 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."
+msgid "new file %s depends on old contents"
+msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
 
-#: branch.c:94
+#: apply.c:1834
 #, 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 "deleted file %s still has contents"
+msgstr "tập tin đã xóa %s vẫn còn nội dung"
 
-#: branch.c:98
+#: apply.c:1837
 #, 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 "** 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"
 
-#: branch.c:99
+#: apply.c:1984
 #, 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 "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"
 
-#: branch.c:104
+#: apply.c:2021
 #, 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 "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"
 
-#: branch.c:105
+#: apply.c:2182
 #, 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 "patch with only garbage at line %d"
+msgstr "vá chỉ với “rác” tại dòng %d"
 
-#: branch.c:109
+#: apply.c:2274
 #, 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."
+msgid "unable to read symlink %s"
+msgstr "không thể đọc liên kết mềm %s"
 
-#: branch.c:110
+#: apply.c:2278
 #, 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."
+msgid "unable to open or read %s"
+msgstr "không thể mở hay đọc %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"
+#: apply.c:2931
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "sai khởi đầu dòng: “%c”"
 
-#: branch.c:156
+#: apply.c:3050
 #, 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 "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)."
 
-#: branch.c:185
+#: apply.c:3062
 #, 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 "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"
 
-#: branch.c:190
+#: apply.c:3068
 #, c-format
-msgid "A branch named '%s' already exists."
-msgstr "Đã có nhánh mang tên “%s”."
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"trong khi đang tìm kiếm cho:\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."
+#: apply.c:3090
+#, 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”"
 
-#: branch.c:218
+#: apply.c:3098
 #, c-format
-msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
 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."
+"không thể reverse-apply một miếng vá nhị phân mà không đảo ngược hunk thành "
+"“%s”"
 
-#: branch.c:220
+#: apply.c:3144
 #, 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"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr ""
+"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 "
+"đủ"
 
-#: branch.c:222
+#: apply.c:3154
+#, 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."
+"the patch applies to '%s' (%s), which does not match the current contents."
 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."
+"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."
 
-#: branch.c:266
+#: apply.c:3162
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "Không phải tên đối tượng hợp lệ: “%s”."
+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"
 
-#: branch.c:286
+#: apply.c:3180
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "Tên đối tượng chưa rõ ràng: “%s”."
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "không thể đọc postimage %s cần thiết cho “%s”"
 
-#: branch.c:291
+#: apply.c:3193
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "Nhánh không hợp lệ: “%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”"
 
-#: branch.c:344
+#: apply.c:3199
 #, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr "“%s” đã sẵn được lấy ra tại “%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)"
 
-#: bundle.c:34
+#: apply.c:3220
 #, 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 "patch failed: %s:%ld"
+msgstr "gặp lỗi khi vá: %s:%ld"
 
-#: bundle.c:61
+#: apply.c:3342
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "phần đầu không được thừa nhận: %s%s (%d)"
+msgid "cannot checkout %s"
+msgstr "không thể lấy ra %s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3390 apply.c:3401 apply.c:3447 setup.c:248
 #, 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:627 sequencer.c:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: 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 "failed to read %s"
+msgstr "gặp lỗi khi đọc %s"
 
-#: bundle.c:185
+#: apply.c:3398
 #, 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 "reading from '%s' beyond a symbolic link"
+msgstr "đọc từ “%s” vượt ra ngoài liên kết mềm"
 
-#: bundle.c:194
+#: apply.c:3427 apply.c:3667
 #, 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"
+msgid "path %s has been renamed/deleted"
+msgstr "đường dẫn %s đã bị xóa hoặc đổi tên"
 
-#: bundle.c:353
+#: apply.c:3510 apply.c:3681
 #, 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 "%s: does not exist in index"
+msgstr "%s: không tồn tại trong bảng mục lục"
 
-#: bundle.c:443 builtin/log.c:157 builtin/log.c:1372 builtin/shortlog.c:273
+#: apply.c:3519 apply.c:3689
 #, c-format
-msgid "unrecognized argument: %s"
-msgstr "đối số không được thừa nhận: %s"
+msgid "%s: does not match index"
+msgstr "%s: không khớp trong mục lục"
 
-#: bundle.c:449
-msgid "Refusing to create empty bundle."
-msgstr "Từ chối tạo một bó dữ liệu trống rỗng."
+#: apply.c:3554
+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”."
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "không thể tạo “%s”"
+msgid "Falling back to three-way merge...\n"
+msgstr "Đang trở lại hòa trộn “3-đường”…\n"
 
-#: bundle.c:480
-msgid "index-pack died"
-msgstr "mục lục gói đã chết"
+#: apply.c:3573 apply.c:3577
+#, c-format
+msgid "cannot read the current contents of '%s'"
+msgstr "không thể đọc nội dung hiện hành của “%s”"
 
-#: color.c:275
+#: apply.c:3589
 #, c-format
-msgid "invalid color value: %.*s"
-msgstr "giá trị màu không hợp lệ: %.*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"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
-msgstr "không thể phân tích cú pháp %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "Đã áp dụng miếng vá %s với các xung đột.\n"
 
-#: commit.c:42
+#: apply.c:3608
 #, 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 to '%s' cleanly.\n"
+msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ.\n"
 
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr "hết bộ nhớ"
+#: apply.c:3634
+msgid "removal patch leaves file contents"
+msgstr "loại bỏ miếng vá để lại nội dung tập tin"
 
-#: config.c:475 config.c:477
+#: apply.c:3706
 #, c-format
-msgid "bad config line %d in %s %s"
-msgstr "tập tin cấu hình sai tại dòng %d trong %s %s"
+msgid "%s: wrong type"
+msgstr "%s: sai kiểu"
 
-#: config.c:593
+#: apply.c:3708
 #, c-format
-msgid "bad numeric config value '%s' for '%s' in %s %s: %s"
-msgstr "sai giá trị bằng số của cấu hình “%s” cho “%s” trong %s %s: %s"
+msgid "%s has type %o, expected %o"
+msgstr "%s có kiểu %o, cần %o"
 
-#: config.c:595
+#: apply.c:3859 apply.c:3861
 #, 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 "invalid path '%s'"
+msgstr "đường dẫn không hợp lệ “%s”"
 
-#: config.c:680
+#: apply.c:3917
 #, 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”"
+msgid "%s: already exists in index"
+msgstr "%s: đã có từ trước trong bảng mục lục"
 
-#: config.c:758 config.c:769
+#: apply.c:3920
 #, c-format
-msgid "bad zlib compression level %d"
-msgstr "mức nén zlib %d là sai"
+msgid "%s: already exists in working directory"
+msgstr "%s: đã sẵn có trong thư mục đang làm việc"
 
-#: config.c:891
+#: apply.c:3940
 #, 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:1220
-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:1281
-msgid "unknown error occured 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"
+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)"
 
-#: config.c:1629
+#: apply.c:3945
 #, 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"
+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"
 
-#: config.c:1631
+#: apply.c:3965
 #, 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"
+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"
 
-#: config.c:1690
+#: apply.c:3969
 #, c-format
-msgid "%s has multiple values"
-msgstr "%s có đa giá trị"
+msgid "%s: patch does not apply"
+msgstr "%s: miếng vá không được áp dụng"
 
-#: config.c:2226
+#: apply.c:3984
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "Không thể đặt “%s” thành “%s”"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "Không thể chạy “git rev-list”"
+msgid "Checking patch %s..."
+msgstr "Đang kiểm tra miếng vá %s…"
 
-#: connected.c:89
+#: apply.c:4075
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "gặp lỗi khi ghi vào rev-list: %s"
+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"
 
-#: connected.c:97
+#: apply.c:4082
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "gặp lỗi khi đóng đầu vào chuẩn stdin của rev-list: %s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "trong tương lai"
+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"
 
-#: date.c:101
+#: apply.c:4085
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu giây trước"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "thông tin sha1 còn thiếu hay không dùng được(%s)."
 
-#: date.c:108
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu phút trước"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "make_cache_entry gặp lỗi đối với đường dẫn “%s”"
 
-#: date.c:115
+#: apply.c:4094
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu giờ trước"
+msgid "could not add %s to temporary index"
+msgstr "không thể thêm %s vào chỉ mục tạm thời"
 
-#: date.c:122
+#: apply.c:4104
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu ngày trước"
+msgid "could not write temporary index to %s"
+msgstr "không thểghi mục lục tạm vào %s"
 
-#: date.c:128
+#: apply.c:4242
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu tuần trước"
+msgid "unable to remove %s from index"
+msgstr "không thể gỡ bỏ %s từ mục lục"
 
-#: date.c:135
+#: apply.c:4277
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu tháng trước"
+msgid "corrupt patch for submodule %s"
+msgstr "miếng vá sai hỏng cho mô-đun-con %s"
 
-#: date.c:146
+#: apply.c:4283
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu năm"
+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"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4291
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s, %lu tháng trước"
+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"
 
-#: date.c:154 date.c:159
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu năm trước"
+msgid "unable to add cache entry for %s"
+msgstr "không thể thêm mục nhớ đệm cho %s"
 
-#: diffcore-order.c:24
+#: apply.c:4338
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "gặp lỗi khi đọc tập-tin-thứ-tự “%s”"
-
-#: 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"
+msgid "failed to write to '%s'"
+msgstr "gặp lỗi khi ghi vào “%s”"
 
-#: diff.c:115
+#: apply.c:4342
 #, 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"
+msgid "closing file '%s'"
+msgstr "đang đóng tập tin “%s”"
 
-#: diff.c:120
+#: apply.c:4412
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  Không hiểu đối số dirstat “%s”\n"
+msgid "unable to write file '%s' mode %o"
+msgstr "không thể ghi vào tập tin “%s” chế độ %o"
 
-#: diff.c:215
+#: apply.c:4510
 #, 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”"
+msgid "Applied patch %s cleanly."
+msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ."
 
-#: diff.c:267
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
-"%s"
+#: apply.c:4518
+msgid "internal error"
+msgstr "lỗi nội bộ"
 
-#: diff.c:2997
+#: apply.c:4521
 #, 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"
+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…"
 
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow cần chính xác một đặc tả đường dẫn"
+#: apply.c:4532
+#, 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"
 
-#: diff.c:3556
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
-"%s"
+msgid "cannot open %s"
+msgstr "không mở được “%s”"
 
-#: diff.c:3570
+#: apply.c:4554
 #, 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”"
+msgid "Hunk #%d applied cleanly."
+msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 
-#: dir.c:2004
-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"
+#: apply.c:4558
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "đoạn dữ liệu #%d bị từ chối."
 
-#: dir.c:2123
-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."
+#: apply.c:4668
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "bỏ qua đường dẫn “%s”."
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "không thá»\83 chạy gpg."
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "không thừa nhận Ä\91ầu vào"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg đã không chấp nhận dữ liệu"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "không thể đọc tập tin lưu bảng mục lục"
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg gặp lỗi khi ký dữ liệu"
+#: apply.c:4833
+#, c-format
+msgid "can't open patch '%s': %s"
+msgstr "không thể mở miếng vá “%s”: %s"
 
-#: gpg-interface.c:222
+#: apply.c:4858
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "không thể tạo tập tin tạm thời “%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"
 
-#: gpg-interface.c:225
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "gặp lỗi khi ghi chữ ký đính kèm vào “%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."
 
-#: grep.c:1718
+#: apply.c:4872
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "“%s”: không thể đọc %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."
 
-#: grep.c:1735
-#, c-format
-msgid "'%s': %s"
-msgstr "“%s”: %s"
+#: apply.c:4888 builtin/add.c:463 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"
 
-#: grep.c:1746
-#, c-format
-msgid "'%s': short read %s"
-msgstr "“%s”: đọc ngắn %s"
+#: 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 "đường-dẫn"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "các lệnh git sẵn có trong thư mục “%s”:"
+#: apply.c:4920
+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"
 
-#: help.c:212
-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"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
 
-#: help.c:244
-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:"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "số"
 
-#: 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” 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?"
+#: apply.c:4926
+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"
 
-#: help.c:366
-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ả."
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
 
-#: 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'"
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
 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
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "trong %0.1f giây một cách tự động…"
-
-#: help.c:400
-#, 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”."
+"thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"Có phải ý bạn là một trong số những cái này không?"
+#: apply.c:4935
+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"
 
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s: %s - %s"
+#: apply.c:4937
+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"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "gặp lỗi khi đọc bộ nhớ đệm"
+#: apply.c:4939
+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"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-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"
+#: apply.c:4941
+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"
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
-msgstr "(commit sai)\n"
+#: apply.c:4943
+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"
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "addinfo_cache gặp lỗi đối với đường dẫn “%s”"
+#: apply.c:4945
+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"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "gặp lỗi khi xây dựng cây"
+#: apply.c:4947
+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)"
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr "gặp lỗi khi tạo đường dẫn “%s”%s"
+#: apply.c:4949
+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"
 
-#: merge-recursive.c:700
-#, 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"
+#: apply.c:4951
+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"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ": có lẽ là một xung đột D/F?"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
 
-#: merge-recursive.c:725
-#, 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”"
+#: apply.c:4956
+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"
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "không thể đọc đối tượng %s “%s”"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "hành động"
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "đối tượng blob được mong đợi cho %s “%s”"
+#: apply.c:4958
+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"
 
-#: merge-recursive.c:790 builtin/clone.c:374
-#, c-format
-msgid "failed to open '%s'"
-msgstr "gặp lỗi khi mở “%s”"
+#: apply.c:4961 apply.c:4964
+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"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
-msgstr "gặp lỗi khi tạo liên kết mềm (symlink) “%s”"
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "áp dụng miếng vá theo chiều ngược"
 
-#: merge-recursive.c:801
-#, 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”"
+#: apply.c:4969
+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"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
+#: apply.c:4971
+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"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "Không thể thêm %s vào cơ sở dữ liệu"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "cho phép chồng khối nhớ"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)"
+#: 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 "chi tiết"
 
-#: 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."
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
 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)."
+"đã 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"
 
-#: 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."
-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."
+#: apply.c:4979
+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"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "đổi tên"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "gốc"
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "đã đổi tên"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "treo thêm <root> vào tất cả các tên tập tin"
 
-#: merge-recursive.c:1150
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
 
-#: merge-recursive.c:1172
-#, c-format
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
-"tên \"%s\"->\"%s\" trong \"%s\"%s"
+"git archive --remote <kho> [--exec <lệnh>] [<các-tùy-chọn>] <tree-ish> "
+"[<đường-dẫn>…]"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr " (cần giải quyết)"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
 
-#: merge-recursive.c:1231
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
+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"
 
-#: merge-recursive.c:1261
-#, c-format
-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"
+#: archive.c:429
+msgid "fmt"
+msgstr "định_dạng"
 
-#: merge-recursive.c:1460
-#, 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"
+#: archive.c:429
+msgid "archive format"
+msgstr "định dạng lưu trữ"
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
-msgstr "Thêm hòa trộn %s"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "tiền_tố"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
-msgstr "Thay vào đó thêm vào %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"
 
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
-msgstr "không thể đọc đối tượng %s"
+#: archive.c:432 builtin/archive.c:88 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 "tập_tin"
 
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
-msgstr "đối tượng %s không phải là một blob"
+#: 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"
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "sửa đổi"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "đọc .gitattributes trong thư mục làm việc"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "đã sửa"
+#: 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)"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "nội dung"
+#: archive.c:437
+msgid "store only"
+msgstr "chỉ lưu (không nén)"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "thêm/thêm"
+#: archive.c:438
+msgid "compress faster"
+msgstr "nén nhanh hơn"
 
-#: merge-recursive.c:1632
-#, 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:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "Tự-động-hòa-trộn %s"
-
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "mô-đun-con"
-
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
-
-#: merge-recursive.c:1737
-#, c-format
-msgid "Removing %s"
-msgstr "Đang xóa %s"
-
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "tập-tin/thư-mục"
+#: archive.c:446
+msgid "compress better"
+msgstr "nén nhỏ hơn"
 
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "thư-mục/tập-tin"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "liệt kê các kiểu nén được hỗ trợ"
 
-#: merge-recursive.c:1773
-#, 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"
+#: 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 "kho"
 
-#: merge-recursive.c:1783
-#, c-format
-msgid "Adding %s"
-msgstr "Thêm \"%s\""
+#: 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ủ"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "Việc hòa trộn hỏng nghiêm trọng, không nên để xảy ra."
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "lệnh"
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "Ä\90ã cập nhật rá»\93i!"
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "Ä\91Æ°á»\9dng dẫn Ä\91ến lá»\87nh git-upload-pack trên máy chủ"
 
-#: merge-recursive.c:1828
-#, 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"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "Gặp tùy chọn --remote không cần"
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "Đường dẫn chưa được xử lý??? %s"
+#: 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"
 
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "Đang trộn:"
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "Gặp tùy chọn không cần --output"
 
-#: merge-recursive.c:1919
+#: archive.c:487
 #, 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:1956
-msgid "merge returned no commit"
-msgstr "hòa trộn không trả về lần chuyển giao nào"
+msgid "Unknown archive format '%s'"
+msgstr "Không hiểu định dạng “%s”"
 
-#: merge-recursive.c:2013
+#: archive.c:494
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "Không thể phân tích đối tượng “%s”"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "Tham số không được hỗ trợ cho định dạng “%s”: -%d"
 
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "Không thể ghi bảng mục lục"
-
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
 msgstr ""
-"Không thể chuyển giao cây ghi chú chưa được khởi tạo hoặc không được tham "
-"chiếu"
-
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "Giá trị notes.rewriteMode sai: “%s”"
-
-#: notes-utils.c:110
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
+"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."
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bisect.c:441
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "Giá trị %s sai: “%s”"
+msgid "Could not open file '%s'"
+msgstr "Không thể mở tập tin “%s”"
 
-#: object.c:242
+#: bisect.c:446
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "không thể phân tích đối tượng: “%s”"
-
-#: parse-options.c:570
-msgid "..."
-msgstr "…"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "nội dung được trích dẫn sai tập tin “%s”: %s"
 
-#: parse-options.c:588
+#: bisect.c:655
 #, c-format
-msgid "usage: %s"
-msgstr "cách dùng: %s"
+msgid "We cannot bisect more!\n"
+msgstr "Chúng tôi không bisect thêm nữa!\n"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: bisect.c:708
 #, c-format
-msgid "   or: %s"
-msgstr "     hoặc: %s"
+msgid "Not a valid commit name %s"
+msgstr "Không phải tên đối tượng commit %s hợp lệ"
 
-#: parse-options.c:595
+#: bisect.c:732
 #, c-format
-msgid "    %s"
-msgstr "    %s"
-
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-SỐ"
+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"
 
-#: parse-options-cb.c:108
+#: bisect.c:737
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "tên đối tượng dị hình “%s”"
+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"
 
-#: path.c:752
+#: bisect.c:742
 #, 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"
+msgid ""
+"The merge base %s is %s.\n"
+"This means the first '%s' commit is between %s and [%s].\n"
 msgstr ""
-"các cài đặt đặc tả đường dẫn “glob” và “noglob” toàn cục là xung khắc nhau"
+"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"
 
-#: pathspec.c:143
+#: bisect.c:750
+#, c-format
 msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
+"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 ""
-"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"
+"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"
 
-#: pathspec.c:183
+#: bisect.c:763
 #, 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”"
+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."
 
-#: pathspec.c:187
+#: bisect.c:798
 #, 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”"
+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"
 
-#: pathspec.c:205
+#: bisect.c:849
 #, 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”"
+msgid "a %s revision is needed"
+msgstr "cần một điểm xét duyệt %s"
 
-#: pathspec.c:230
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s: “literal” và “glob” xung khắc nhau"
+msgid "could not create file '%s'"
+msgstr "không thể tạo tập tin “%s”"
 
-#: pathspec.c:241
+#: bisect.c:917
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s: “%s” ngoài một kho chứa"
+msgid "could not read file '%s'"
+msgstr "không thể đọc tập tin “%s”"
 
-#: 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”"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "việc đọc tham chiếu bisect gặp lỗi"
 
-#: pathspec.c:353
+#: bisect.c:967
 #, 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"
+msgid "%s was both %s and %s\n"
+msgstr "%s là cả %s và %s\n"
 
-#: pathspec.c:433
+#: bisect.c:975
 #, 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 '.' ?"
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 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:969
-msgid "unable to parse --pretty format"
-msgstr "không thể phân tích định dạng --pretty"
+"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"
 
-#: progress.c:235
-msgid "done"
-msgstr "xong"
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(ước chừng %d bước)"
 
-#: read-cache.c:1281
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-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"
+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"
 
-#: read-cache.c:1291
+#: branch.c:53
 #, c-format
 msgid ""
-"GIT_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 ""
-"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"
+"\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\"."
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: branch.c:67
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "Không thể mở “%s” để ghi"
+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ó."
 
-#: refs/files-backend.c:2374
+#: branch.c:93
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "không thể xóa bỏ tham chiếu %s: %s"
+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."
 
-#: refs/files-backend.c:2377
+#: branch.c:94
 #, c-format
-msgid "could not delete references: %s"
-msgstr "không thể xóa bỏ tham chiếu: %s"
+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."
 
-#: refs/files-backend.c:2386
+#: branch.c:98
 #, c-format
-msgid "could not remove reference %s"
-msgstr "không thể gỡ bỏ tham chiếu: %s"
+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."
 
-#: ref-filter.c:55
+#: branch.c:99
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "cần định dạng: %%(color:<color>)"
+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."
 
-#: ref-filter.c:57
+#: branch.c:104
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "không nhận ra màu: %%(màu:%s)"
+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."
 
-#: ref-filter.c:71
+#: branch.c:105
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "không nhận ra định dạng: %%(%s)"
+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."
 
-#: ref-filter.c:77
+#: branch.c:109
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) không nhận các đối số"
+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."
 
-#: ref-filter.c:84
+#: branch.c:110
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) không nhận các đối số"
+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."
 
-#: 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"
+#: 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"
 
-#: ref-filter.c:103
+#: branch.c:156
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "đối số không được thừa nhận %%(contents): %s"
+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"
 
-#: ref-filter.c:113
+#: branch.c:185
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "đối số không được thừa nhận %%(objectname): %s"
+msgid "'%s' is not a valid branch name."
+msgstr "“%s” không phải là một tên nhánh hợp lệ."
 
-#: ref-filter.c:135
+#: branch.c:190
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "cần định dạng: %%(align:<width>,<position>)"
+msgid "A branch named '%s' already exists."
+msgstr "Đã có nhánh mang tên “%s”."
 
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
-msgstr "vị trí không được thừa nhậ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."
 
-#: ref-filter.c:151
+#: branch.c:218
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "chiều rộng không được thừa nhận:%s"
+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."
 
-#: ref-filter.c:157
+#: branch.c:220
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "đối số không được thừa nhận %%(align): %s"
+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"
 
-#: ref-filter.c:161
-#, 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)"
+#: 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."
 
-#: ref-filter.c:244
+#: branch.c:265
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "tên trường dị hình: %.*s"
+msgid "Not a valid object name: '%s'."
+msgstr "Không phải tên đối tượng hợp lệ: “%s”."
 
-#: ref-filter.c:270
+#: branch.c:285
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "không hiểu tên trường: %.*s"
+msgid "Ambiguous object name: '%s'."
+msgstr "Tên đối tượng chưa rõ ràng: “%s”."
 
-#: ref-filter.c:372
+#: branch.c:290
 #, 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 "Not a valid branch point: '%s'."
+msgstr "Nhánh không hợp lệ: “%s”."
 
-#: ref-filter.c:424
+#: branch.c:344
 #, c-format
-msgid "malformed format string %s"
-msgstr "chuỗi định dạng dị hình %s"
-
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= cần một đối số nguyên dương"
+msgid "'%s' is already checked out at '%s'"
+msgstr "“%s” đã được lấy ra tại “%s” rồi"
 
-#: ref-filter.c:883
+#: branch.c:363
 #, 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 "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"
 
-#: ref-filter.c:1046
+#: bundle.c:34
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "Không hiểu định dạng %.*s %s"
+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)"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: bundle.c:61
 #, c-format
-msgid "missing object %s for %s"
-msgstr "thiếu đối tượng %s cho %s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "phần đầu không được thừa nhận: %s%s (%d)"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, 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 "could not open '%s'"
+msgstr "không thể mở “%s”"
 
-#: ref-filter.c:1311
+#: 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: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 "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 "malformed object at '%s'"
-msgstr "đối tượng dị hình tại “%s”"
+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:"
 
-#: ref-filter.c:1373
+#: 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 "ignoring ref with broken name %s"
-msgstr "đang lờ đi tham chiếu với tên hỏng %s"
+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:"
 
-#: ref-filter.c:1378
+#: 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 "ignoring broken ref %s"
-msgstr "đang lờ đi tham chiếu hỏng %s"
+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"
 
-#: ref-filter.c:1651
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, c-format
-msgid "format: %%(end) atom missing"
-msgstr "định dạng: thiếu nguyên tử %%(end)"
+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."
 
-#: ref-filter.c:1705
+#: bundle.c:463
 #, c-format
-msgid "malformed object name %s"
-msgstr "tên đối tượng dị hình %s"
+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"
 
-#: remote.c:745
+#: color.c:290
 #, 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 "invalid color value: %.*s"
+msgstr "giá trị màu không hợp lệ: %.*s"
 
-#: remote.c:749
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, 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 parse %s"
+msgstr "không thể phân tích cú pháp %s"
 
-#: remote.c:753
+#: commit.c:42
 #, c-format
-msgid "%s tracks both %s and %s"
-msgstr "%s theo dõi cả %s và %s"
+msgid "%s %s is not a commit!"
+msgstr "%s %s không phải là một lần chuyển giao!"
 
-#: remote.c:761
-msgid "Internal error"
-msgstr "Lỗi nội bộ"
+#: commit.c:1514
+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"
 
-#: 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ả"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "hết bộ nhớ"
 
-#: remote.c:1686
+#: config.c:516
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "không có nhánh nào như thế: “%s”"
+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"
 
-#: remote.c:1689
+#: config.c:520
 #, 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 "bad config line %d in file %s"
+msgstr "cấu hình sai tại dòng %d trong tập tin %s"
 
-#: remote.c:1695
+#: config.c:524
 #, 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 "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"
 
-#: remote.c:1710
+#: config.c:528
 #, 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 "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"
 
-#: remote.c:1725
+#: config.c:532
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "nhánh “%s” không có máy chủ để đẩy lên"
+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"
 
-#: remote.c:1736
+#: config.c:536
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
+msgid "bad config line %d in %s"
+msgstr "cấu hình sai tại dòng %d trong %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”)"
+#: config.c:655
+msgid "out of range"
+msgstr "nằm ngoài phạm vi"
 
-#: 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"
+#: config.c:655
+msgid "invalid unit"
+msgstr "đơn vị không hợp lệ"
 
-#: remote.c:2073
+#: config.c:661
 #, 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 "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"
 
-#: remote.c:2080
+#: config.c:666
 #, 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 "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"
 
-#: remote.c:2084
+#: config.c:669
 #, 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 "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"
 
-#: remote.c:2093
+#: config.c:672
 #, 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 "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"
 
-#: remote.c:2104
+#: config.c:675
 #, 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"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 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"
+"sai giá trị bằng số của cấu hình “%s” cho “%s” trong submodule-blob %s: %s"
 
-#: revision.c:2131
-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"
+#: 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"
 
-#: revision.c:2134
+#: config.c:681
 #, 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:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent xung khắc với --bisect"
+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"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "gặp lỗi khi mở “/dev/null”"
+#: config.c:768
+#, 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”"
 
-#: run-command.c:94
+#: config.c:852 config.c:863
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "dup2(%d,%d) gặp lỗi"
+msgid "bad zlib compression level %d"
+msgstr "mức nén zlib %d là sai"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "gặp lỗi khi ký chứng thực đẩy"
+#: config.c:978
+#, 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"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "không thể phân tích cấu hình dòng lệnh"
 
-#: send-pack.c:406
-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"
+#: config.c:1362
+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"
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "kết thúc nhận không hỗ trợ đẩy --atomic"
+#: config.c:1716
+#, 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"
 
-#: 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>”"
+#: config.c:1718
+#, 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"
 
-#: 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”"
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s có đa giá trị"
 
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
+#: config.c:2311
 #, c-format
-msgid "Could not write to %s"
-msgstr "Không thể ghi vào %s"
+msgid "could not set '%s' to '%s'"
+msgstr "không thể đặt “%s” thành “%s”"
 
-#: sequencer.c:193
+#: config.c:2313
 #, c-format
-msgid "Error wrapping up %s"
-msgstr "Lỗi bao bọc %s"
+msgid "could not unset '%s'"
+msgstr "không thể thôi đặt “%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."
+#: 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"
 
-#: 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."
+#: 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ó."
 
-#: 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ý."
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "Đang kiểm tra kết nối"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
-#, 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"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "Không thể chạy “git rev-list”"
 
-#: sequencer.c:318
-msgid "Could not resolve HEAD commit\n"
-msgstr "Không thể phân giải lần chuyển giao HEAD\n"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "gặp lỗi khi ghi vào rev-list"
 
-#: sequencer.c:338
-msgid "Unable to update cache tree\n"
-msgstr "Không thể cập nhật cây bộ nhớ đệm\n"
+#: 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"
 
-#: sequencer.c:390
+#: convert.c:201
 #, 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 ""
+"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."
 
-#: sequencer.c:395
+#: convert.c:205
 #, 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"
-
-#: sequencer.c:460
-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."
+msgid "CRLF would be replaced by LF in %s."
+msgstr "CRLF nên được thay bằng LF trong %s."
 
-#: sequencer.c:479
+#: convert.c:211
 #, 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 ""
+"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."
 
-#: sequencer.c:487
+#: convert.c:215
 #, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "Lần chuyển giao %s không có cha mẹ %d"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "LF nên thay bằng CRLF trong %s"
 
-#: sequencer.c:491
+#: date.c:97
+msgid "in the future"
+msgstr "trong tương lai"
+
+#: date.c:103
 #, 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 "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu giây trước"
 
-#. 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: không thể phân tích lần chuyển giao mẹ của %s"
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu phút trước"
 
-#: sequencer.c:508
+#: date.c:117
 #, 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 "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu giờ trước"
 
-#: sequencer.c:594
+#: date.c:124
 #, c-format
-msgid "could not revert %s... %s"
-msgstr "không thể hoàn nguyên %s… %s"
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu ngày trước"
 
-#: sequencer.c:595
+#: date.c:130
 #, c-format
-msgid "could not apply %s... %s"
-msgstr "không thể áp dụng miếng vá %s… %s"
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu tuần trước"
 
-#: sequencer.c:630
-msgid "empty commit set passed"
-msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
+#: date.c:137
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu tháng trước"
 
-#: sequencer.c:638
+#: date.c:148
 #, 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 "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu năm"
 
-#: sequencer.c:642
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:151
 #, 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 "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s, %lu tháng trước"
 
-#: sequencer.c:702
+#: date.c:156 date.c:161
 #, c-format
-msgid "Cannot %s during a %s"
-msgstr "Không thể %s trong khi %s"
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu năm trước"
 
-#: sequencer.c:724
+#: diffcore-order.c:24
 #, c-format
-msgid "Could not parse line %d."
-msgstr "Không phân tích được dòng %d."
+msgid "failed to read orderfile '%s'"
+msgstr "gặp lỗi khi đọc tập-tin-thứ-tự “%s”"
 
-#: sequencer.c:729
-msgid "No commits parsed."
-msgstr "Không có lần chuyển giao nào được phân tích."
+#: 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"
 
-#: sequencer.c:741
+#: diff.c:62
 #, c-format
-msgid "Could not open %s"
-msgstr "Không thể mở %s"
+msgid "option '%s' requires a value"
+msgstr "tùy chọn “%s” yêu cầu một giá trị"
 
-#: sequencer.c:745
+#: diff.c:124
 #, c-format
-msgid "Could not read %s."
-msgstr "Không thể đọc %s."
+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"
 
-#: sequencer.c:752
+#: diff.c:129
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "Bảng chỉ thị không thể dùng được: %s"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  Không hiểu đối số dirstat “%s”\n"
 
-#: sequencer.c:782
+#: diff.c:283
 #, c-format
-msgid "Invalid key: %s"
-msgstr "Khóa không Ä\91úng: %s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "Không hiá»\83u giá trá»\8b cho biến cấu hình â\80\9cdiff.submoduleâ\80\9d: â\80\9c%sâ\80\9d"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: diff.c:346
 #, c-format
-msgid "Invalid value for %s: %s"
-msgstr "Giá trị không hợp lệ %s: %s"
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
+"%s"
 
-#: sequencer.c:795
+#: diff.c:3087
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "Bảng tùy chọn dị hình: %s"
+msgid "external diff died, stopping at %s"
+msgstr "phần mềm diff ở bên ngoài đã chết, dừng tại %s"
 
-#: sequencer.c:814
-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"
+#: diff.c:3412
+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"
 
-#: sequencer.c:815
-msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
-msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow cần chính xác một đặc tả đường dẫn"
 
-#: sequencer.c:819
+#: diff.c:3665
 #, c-format
-msgid "Could not create sequencer directory %s"
-msgstr "Không thể tạo thư mục xếp dãy %s"
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
+"%s"
 
-#: sequencer.c:835 sequencer.c:917
+#: diff.c:3679
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "Lỗi bao bọc %s."
-
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "không cherry-pick hay hoàn nguyên trong tiến trình"
+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”"
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "không thể phân giải HEAD"
+#: diff.c:4700
+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."
 
-#: sequencer.c:858
-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"
+#: diff.c:4703
+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."
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: diff.c:4706
 #, c-format
-msgid "cannot open %s: %s"
-msgstr "không thể mở %s: %s"
+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."
 
-#: sequencer.c:881
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "không thể đọc %s: %s"
+#: dir.c:1866
+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"
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "gặp kết thúc tập tin đột xuất"
+#: dir.c:1985
+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."
 
-#: sequencer.c:888
-#, 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"
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack: cần danh sách shallow"
+
+#: fetch-pack.c:225
+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"
 
-#: sequencer.c:910
+#: fetch-pack.c:243
 #, c-format
-msgid "Could not format %s."
-msgstr "Không thể định dạng “%s”."
+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”"
 
-#: sequencer.c:1055
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc cần multi_ack_detailed"
+
+#: fetch-pack.c:381
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s: không thể cherry-pick một %s"
+msgid "invalid shallow line: %s"
+msgstr "dòng shallow không hợp lệ: %s"
 
-#: sequencer.c:1058
+#: fetch-pack.c:387
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s: điểm xét duyệt sai"
+msgid "invalid unshallow line: %s"
+msgstr "dòng unshallow không hợp lệ: %s"
 
-#: sequencer.c:1092
-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"
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "Không tìm thấy đối tượng: %s"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "lỗi trong đối tượng: %s"
 
-#: setup.c:246
+#: fetch-pack.c:394
 #, c-format
-msgid "failed to read %s"
-msgstr "gặp lỗi khi đọc %s"
+msgid "no shallow found: %s"
+msgstr "không tìm shallow nào: %s"
 
-#: sha1_file.c:1080
-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 à?)"
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "cần shallow/unshallow, nhưng lại nhận được %s"
 
-#: sha1_file.c:2459
+#: fetch-pack.c:436
 #, 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 "got %s %d %s"
+msgstr "nhận %s %d - %s"
 
-#: sha1_file.c:2463
+#: fetch-pack.c:450
 #, 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 "invalid commit %s"
+msgstr "lần chuyển giao %s không hợp lệ"
 
-#: 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\""
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "chịu thua"
 
-#: submodule.c:62 submodule.c:96
-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"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "xong"
 
-#: submodule.c:66 submodule.c:100
+#: fetch-pack.c:505
 #, 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"
+msgid "got %s (%d) %s"
+msgstr "nhận %s (%d) %s"
 
-#: submodule.c:74
+#: fetch-pack.c:551
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "Không thể cập nhật mục .gitmodules %s"
+msgid "Marking %s as complete"
+msgstr "Đánh dấu %s là đã hoàn thành"
 
-#: submodule.c:107
+#: fetch-pack.c:697
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
+msgid "already have %s (%s)"
+msgstr "đã sẵn có %s (%s)"
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack: không thể rẽ nhánh sideband demultiplexer"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "chạy lệnh kéo theo “%s” gặp lỗi"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "lỗi giao thức: phần đầu gói bị sai"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: fetch-pack.c:799
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "không hiểu giá trị “%s” cho khóa “%s”"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack: không thể rẽ nhánh %s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: fetch-pack.c:815
 #, c-format
-msgid "more than one %s"
-msgstr "nhiều hơn một %s"
+msgid "%s failed"
+msgstr "%s gặp lỗi"
 
-#: trailer.c:582
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "thẻ thừa trống rỗng trong phần thừa “%.*s”"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "có lỗi trong sideband demultiplexer"
 
-#: trailer.c:702
-#, c-format
-msgid "could not read input file '%s'"
-msgstr "không đọc được tập tin đầu vào “%s”"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "Máy chủ không hỗ trợ máy khách shallow"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "không thể đọc từ đầu vào tiêu chuẩn"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "Máy chủ hỗ trợ multi_ack_detailed"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "không thể lấy thông tin thống kê về %s"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "Máy chủ hỗ trợ no-done"
 
-#: trailer.c:859
-#, c-format
-msgid "file %s is not a regular file"
-msgstr "\"%s\" không phải là tập tin bình thường"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "Máy chủ hỗ trợ multi_ack"
 
-#: trailer.c:861
-#, c-format
-msgid "file %s is not writable by user"
-msgstr "tập tin %s người dùng không thể ghi được"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "Máy chủ hỗ trợ side-band-64k"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "không thể tạo tập tin tạm thời"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "Máy chủ hỗ trợ side-band"
 
-#: trailer.c:912
-#, 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"
-
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "Không thể đọc tham chiếu %s"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "Máy chủ hỗ trợ allow-tip-sha1-in-want"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "Đang lấy ra các tập tin"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "Máy chủ hỗ trợ allow-reachable-sha1-in-want"
 
-#: 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ố “://”"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "Máy chủ hỗ trợ ofs-delta"
 
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: fetch-pack.c:890
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "thoát chuỗi %XX không hợp lệ"
+msgid "Server version is %.*s"
+msgstr "Phiên bản máy chủ là %.*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:”"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "Máy chủ không hỗ trợ --shallow-since"
 
-#: 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"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "Máy chủ không hỗ trợ --shallow-exclude"
 
-#: 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"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "Máy chủ không hỗ trợ --deepen"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "tên cổng không hợp lệ"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "không có lần chuyển giao chung nào"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "đoạn đường dẫn “..” không hợp lệ"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack: fetch gặp lỗi."
 
-#: wrapper.c:222 wrapper.c:381
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "không thể mở “%s” để đọc và ghi"
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "không khớp phần đầu máy chủ"
 
-#: wrapper.c:224 wrapper.c:383
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr "không thể mở “%s” để ghi"
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg gặp lỗi khi ký dữ liệu"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr "không thể mở “%s” để đọc"
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "không thể tạo tập tin tạm thời"
 
-#: wrapper.c:611
+#: gpg-interface.c:217
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "không thể truy cập “%s”: %s"
+msgid "failed writing detached signature to '%s'"
+msgstr "gặp lỗi khi ghi chữ ký đính kèm vào “%s”"
 
-#: wrapper.c:632
+#: grep.c:1782
 #, c-format
-msgid "unable to access '%s'"
-msgstr "không thể truy cập “%s”"
-
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "Không thể lấy thư mục làm việc hiện hành"
+msgid "'%s': unable to read %s"
+msgstr "“%s”: không thể đọc %s"
 
-#: wrapper.c:667
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "could not open %s for writing"
-msgstr "không thể mở %s để ghi"
+msgid "failed to stat '%s'"
+msgstr "gặp lỗi khi lấy thống kê về “%s”"
 
-#: wrapper.c:678 builtin/am.c:410
+#: grep.c:1810
 #, c-format
-msgid "could not write to %s"
-msgstr "không thể ghi vào %s"
+msgid "'%s': short read"
+msgstr "“%s”: đọc ngắn"
 
-#: wrapper.c:684
+#: help.c:203
 #, c-format
-msgid "could not close %s"
-msgstr "không thể đóng %s"
+msgid "available git commands in '%s'"
+msgstr "các lệnh git sẵn có trong thư mục “%s”:"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "Những đường dẫn chưa được hòa trộn:"
+#: help.c:210
+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"
 
-#: wt-status.c:176 wt-status.c:203
-#, 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)"
+#: help.c:241
+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:"
 
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (dùng \"git rm --cached <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
+#: help.c:306
+#, 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” 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?"
 
-#: wt-status.c:182
-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)"
+#: help.c:361
+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ả."
 
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+#: help.c:383
+#, 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 ""
-"  (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)"
-
-#: wt-status.c:186
-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)"
+"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”"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "Những thay đổi sẽ được chuyển giao:"
+#: help.c:388
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "trong %0.1f giây một cách tự động…"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "Các thay đổi chưa được đặt lên bệ phóng để chuyển giao:"
+#: help.c:395
+#, 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”."
 
-#: wt-status.c:219
-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)"
+#: help.c:399 help.c:465
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Có phải ý bạn là một trong số những cái này không?"
 
-#: wt-status.c:221
-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)"
+#: help.c:461
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
 
-#: wt-status.c:222
+#: ident.c:334
 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)"
-
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
+"\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 ""
-"  (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)"
+"\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"
 
-#: wt-status.c:236
+#: lockfile.c:152
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+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 ""
-"  (dùng \"git %s <tập-tin>…\" để thêm vào những gì cần được chuyển giao)"
-
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "bị xóa bởi cả hai:"
-
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "được thêm vào bởi chúng ta:"
-
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "bị xóa đi bởi họ:"
+"Không thể tạo “%s.lock”: %s.\n"
+"\n"
+"Tiến trình git khác có lẽ đang chạy ở kho này, ví dụ\n"
+"một trình soạn thảo được mở bởi “git commit”. Vui lòng chắc chắn\n"
+"rằng mọi tiến trình đã chấm dứt và sau đó thử lại. Nếu vẫn lỗi,\n"
+"một tiến trình git có lẽ đã đổ vỡ khi thực hiện ở kho này trước đó:\n"
+"gõ bỏ tập tin một cách thủ công để tiếp tục."
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "được thêm vào bởi họ:"
+#: lockfile.c:160
+#, c-format
+msgid "Unable to create '%s.lock': %s"
+msgstr "Không thể tạo “%s.lock”: %s"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "bị xóa bởi chúng ta:"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "gặp lỗi khi đọc bộ nhớ đệm"
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "được thêm vào bởi cả hai:"
+#: 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 "không thể ghi tập tin lưu bảng mục lục mới"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "bị sửa bởi cả hai:"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(commit sai)\n"
 
-#: wt-status.c:265
+#: merge-recursive.c:231
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "lỗi: không thể tiếp nhận trạng thái chưa hòa trộn %x"
-
-#: wt-status.c:273
-msgid "new file:"
-msgstr "tập tin mới:"
-
-#: wt-status.c:275
-msgid "copied:"
-msgstr "đã chép:"
+msgid "addinfo_cache failed for path '%s'"
+msgstr "addinfo_cache gặp lỗi đối với đường dẫn “%s”"
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "đã xóa:"
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "gặp lỗi khi xây dựng cây"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "đã sửa:"
+#: merge-recursive.c:720
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr "gặp lỗi khi tạo đường dẫn “%s”%s"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "đã đổi tên:"
+#: merge-recursive.c:731
+#, 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"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "đổi-kiểu:"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ": có lẽ là một xung đột D/F?"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "không hiểu:"
+#: merge-recursive.c:754
+#, 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”"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "chưa hòa trộn:"
+#: merge-recursive.c:796 builtin/cat-file.c:34
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "không thể đọc đối tượng %s “%s”"
 
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "lần chuyển giao mới, "
+#: merge-recursive.c:798
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "đối tượng blob được mong đợi cho %s “%s”"
 
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "nội dung bị sửa đổi, "
+#: merge-recursive.c:822
+#, c-format
+msgid "failed to open '%s': %s"
+msgstr "gặp lỗi khi mở “%s”: %s"
 
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "nội dung chưa được theo dõi, "
+#: merge-recursive.c:833
+#, 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"
 
-#: wt-status.c:390
+#: merge-recursive.c:838
 #, c-format
-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 "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”"
 
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
+#: merge-recursive.c:982
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "Không thể thêm %s vào cơ sở dữ liệu"
 
-#: wt-status.c:837
+#: merge-recursive.c:1081 merge-recursive.c:1095
+#, c-format
 msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
 msgstr ""
-"Không động đến đường ở trên.\n"
-"Mọi thứ phía dưới sẽ được xóa bỏ."
+"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)."
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "Bạn có những đường dẫn chưa được hòa trộn."
-
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
-
-#: wt-status.c:954
-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."
-
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
+#: merge-recursive.c:1087 merge-recursive.c:1100
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %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 trong %s. Phiên bản %s của %s "
+"còn lại trong cây (tree) tại %s."
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "Bạn đang ở giữa của một phiên “am”."
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "đổi tên"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "Miếng vá hiện tại bị trống rỗng."
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "đã đổi tên"
 
-#: wt-status.c:974
-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\")"
+#: merge-recursive.c:1200
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
 
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (dùng \"git am --skip\" để bỏ qua miếng vá này)"
+#: merge-recursive.c:1225
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
+"tên \"%s\"->\"%s\" trong \"%s\"%s"
 
-#: wt-status.c:978
-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)"
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr " (cần giải quyết)"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "Không thực hiện lệnh nào."
+#: merge-recursive.c:1292
+#, c-format
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
 
-#: wt-status.c:1108
+#: merge-recursive.c:1325
 #, 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 "Renaming %s to %s and %s to %s instead"
+msgstr "Đang đổi tên %s thành %s thay vì %s thành %s"
 
-#: wt-status.c:1119
+#: merge-recursive.c:1531
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (xem thêm trong %s)"
+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"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "Không có lệnh nào còn lại."
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
+msgstr "Thêm hòa trộn %s"
 
-#: wt-status.c:1127
+#: merge-recursive.c:1553 merge-recursive.c:1766
 #, 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 "Adding as %s instead"
+msgstr "Thay vào đó thêm vào %s"
 
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (dùng lệnh \"git rebase --edit-todo\" để xem và sửa)"
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
+msgstr "không thể đọc đối tượng %s"
 
-#: wt-status.c:1148
+#: merge-recursive.c:1613
 #, 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 "object %s is not a blob"
+msgstr "đối tượng %s không phải là một blob"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "sửa đổi"
 
-#: wt-status.c:1167
-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\")"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "đã sửa"
 
-#: wt-status.c:1169
-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)"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "nội dung"
 
-#: wt-status.c:1171
-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)"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "thêm/thêm"
 
-#: wt-status.c:1177
-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\")"
+#: merge-recursive.c:1718
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "Đã bỏ qua %s (đã có sẵn lần hòa trộn này)"
 
-#: wt-status.c:1181
+#: merge-recursive.c:1732
 #, c-format
-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”."
+msgid "Auto-merging %s"
+msgstr "Tự-động-hòa-trộn %s"
 
-#: wt-status.c:1186
-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."
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "mô-đun-con"
 
-#: wt-status.c:1189
-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\")"
+#: merge-recursive.c:1737
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: wt-status.c:1193
+#: merge-recursive.c:1831
 #, 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”."
+msgid "Removing %s"
+msgstr "Đang xóa %s"
 
-#: wt-status.c:1198
-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."
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "tập-tin/thư-mục"
 
-#: wt-status.c:1201
-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)"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "thư-mục/tập-tin"
 
-#: wt-status.c:1203
-msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+#: merge-recursive.c:1868
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 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)"
+"XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là "
+"%s"
 
-#: wt-status.c:1213
+#: merge-recursive.c:1877
 #, 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 "Adding %s"
+msgstr "Thêm \"%s\""
 
-#: wt-status.c:1218
-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\")"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "Đã cập nhật rồi!"
 
-#: wt-status.c:1221
-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\")"
+#: merge-recursive.c:1923
+#, 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"
 
-#: wt-status.c:1223
-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)"
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "Đang trộn:"
 
-#: wt-status.c:1232
+#: merge-recursive.c:2019
 #, 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 "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "tìm thấy %u tổ tiên chung:"
 
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "hòa trộn không trả về lần chuyển giao nào"
 
-#: wt-status.c:1240
-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\")"
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "Không thể phân tích đối tượng “%s”"
 
-#: wt-status.c:1242
-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)"
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "Không thể ghi bảng mục lục"
 
-#: wt-status.c:1253
+#: notes-merge.c:273
 #, c-format
-msgid "You are currently bisecting, started from branch '%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 ""
-"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”."
+"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."
 
-#: wt-status.c:1257
-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)."
+#: 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)."
 
-#: wt-status.c:1260
-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)"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr ""
+"Không thể chuyển giao cây ghi chú chưa được khởi tạo hoặc không được tham "
+"chiếu"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "Trên nhánh "
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "Giá trị notes.rewriteMode sai: “%s”"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "rebase đang được thực hiện: lên trên "
+#. 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 "Giá trị %s sai: “%s”"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "HEAD được tách rời tại "
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "không thể phân tích đối tượng: “%s”"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "HEAD được tách rời từ "
+#: parse-options.c:572
+msgid "..."
+msgstr ""
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "Hiện tại chẳng ở nhánh nào cả."
+#: parse-options.c:590
+#, c-format
+msgid "usage: %s"
+msgstr "cách dùng: %s"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "Lần chuyển giao khởi tạo"
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
+#, c-format
+msgid "   or: %s"
+msgstr "     hoặc: %s"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "Những tập tin chưa được theo dõi"
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "Những tập tin bị lờ đi"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-SỐ"
 
-#: wt-status.c:1494
+#: parse-options-cb.c:108
 #, 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')."
+msgid "malformed object name '%s'"
+msgstr "tên đối tượng dị hình “%s”"
+
+#: path.c:826
+#, 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"
 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 cài đặt đặc tả đường dẫn “glob” và “noglob” toàn cục là xung khắc nhau"
+
+#: 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"
 
-#: wt-status.c:1500
+#: pathspec.c:183
 #, 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"
+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”"
 
-#: wt-status.c:1502
-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)"
+#: 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”"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "Không có thay đổi nào"
+#: 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”"
 
-#: wt-status.c:1513
+#: pathspec.c:230
 #, c-format
-msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-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"
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: “literal” và “glob” xung khắc nhau"
 
-#: wt-status.c:1516
+#: pathspec.c:241
 #, 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 "%s: '%s' is outside repository"
+msgstr "%s: “%s” ngoài một kho chứa"
 
-#: wt-status.c:1519
+#: 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”"
+
+#: 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:408
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
 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"
+"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"
 
-#: wt-status.c:1522
+#: pathspec.c:440
 #, c-format
-msgid "nothing added to commit but untracked files present\n"
+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:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
 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"
+"Ở đâ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à “.”?"
 
-#: wt-status.c:1525
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "không thể phân tích định dạng --pretty"
+
+#: read-cache.c:1315
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
 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"
+"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"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: read-cache.c:1325
 #, c-format
-msgid "nothing to commit\n"
-msgstr "không có gì để chuyển giao\n"
+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"
 
-#: wt-status.c:1531
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr ""
-"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
+msgid "Could not open '%s' for writing"
+msgstr "Không thể mở “%s” để ghi"
 
-#: wt-status.c:1535
+#: refs/files-backend.c:2481
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
+msgid "could not delete reference %s: %s"
+msgstr "không thể xóa bỏ tham chiếu %s: %s"
 
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "Lần chuyển giao khởi tạo trên "
+#: refs/files-backend.c:2484
+#, c-format
+msgid "could not delete references: %s"
+msgstr "không thể xóa bỏ tham chiếu: %s"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD (không nhánh)"
+#: refs/files-backend.c:2493
+#, c-format
+msgid "could not remove reference %s"
+msgstr "không thể gỡ bỏ tham chiếu: %s"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "đã ra đi"
+#: ref-filter.c:55
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "cần định dạng: %%(color:<color>)"
 
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "đằng sau "
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "không nhận ra màu: %%(màu:%s)"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "phía trước "
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "không nhận ra định dạng: %%(%s)"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: ref-filter.c:77
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) không nhận các đối số"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<các-tùy-chọn>] [--]  <pathspec>…"
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) không nhận các đối số"
 
-#: builtin/add.c:65
+#: ref-filter.c:101
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "trạng thái lệnh diff không như mong đợi %c"
+msgid "positive value expected contents:lines=%s"
+msgstr "cần nội dung mang giá trị dương:lines=%s"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "Cập nhật tập tin gặp lỗi"
+#: ref-filter.c:103
+#, c-format
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "đối số không được thừa nhận %%(contents): %s"
 
-#: builtin/add.c:80
+#: ref-filter.c:113
 #, c-format
-msgid "remove '%s'\n"
-msgstr "gỡ bỏ “%s”\n"
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "đối số không được thừa nhận %%(objectname): %s"
 
-#: builtin/add.c:134
-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:"
+#: ref-filter.c:135
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "cần định dạng: %%(align:<width>,<position>)"
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "Không thể đọc bảng mục lục"
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "vị trí không được thừa nhận:%s"
 
-#: builtin/add.c:205
+#: ref-filter.c:151
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "Không thể mở “%s” để ghi."
+msgid "unrecognized width:%s"
+msgstr "chiều rộng không được thừa nhận:%s"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "Không thể ghi ra miếng vá"
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "đối số không được thừa nhận %%(align): %s"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "gặp lỗi khi sửa miếng vá"
+#: ref-filter.c:161
+#, 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)"
 
-#: builtin/add.c:215
+#: ref-filter.c:244
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "không thể lấy thông tin thống kê về “%s”"
+msgid "malformed field name: %.*s"
+msgstr "tên trường dị hình: %.*s"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "Miếng vá trống rỗng. Nên bỏ qua."
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "không hiểu tên trường: %.*s"
 
-#: builtin/add.c:222
+#: ref-filter.c:372
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "Không thể áp dụng miếng vá “%s”"
+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"
 
-#: builtin/add.c:232
-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"
+#: ref-filter.c:424
+#, c-format
+msgid "malformed format string %s"
+msgstr "chuỗi định dạng dị hình %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:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "chạy thử"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= cần một đối số nguyên dương"
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "chi tiết"
+#: ref-filter.c:883
+#, 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"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "sửa bằng cách tương tác"
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "Không hiểu định dạng %.*s %s"
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "chọn “hunks” theo kiểu tương tác"
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "thiếu đối tượng %s cho %s"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "sửa diff hiện nay và áp dụng nó"
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer gặp lỗi trên %s cho %s"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "cho phép thêm các tập tin bị bỏ qua khác"
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "đối tượng dị hình tại “%s”"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "cập nhật các tập tin được theo dõi"
-
-#: builtin/add.c:257
-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"
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "đang lờ đi tham chiếu với tên hỏng %s"
 
-#: builtin/add.c:258
-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"
+#: ref-filter.c:1378
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "đang lờ đi tham chiếu hỏng %s"
 
-#: builtin/add.c:261
-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)"
+#: ref-filter.c:1633
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "định dạng: thiếu nguyên tử %%(end)"
 
-#: builtin/add.c:263
-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"
+#: ref-filter.c:1687
+#, c-format
+msgid "malformed object name %s"
+msgstr "tên đối tượng dị hình %s"
 
-#: builtin/add.c:264
-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"
+#: remote.c:746
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Không thể lấy về cả %s và %s cho %s"
 
-#: builtin/add.c:265
-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ử"
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s thường theo dõi %s, không phải %s"
 
-#: builtin/add.c:287
+#: remote.c:754
 #, 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 "%s tracks both %s and %s"
+msgstr "%s theo dõi cả %s và %s"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "thêm tập tin gặp lỗi"
+#: remote.c:762
+msgid "Internal error"
+msgstr "Lỗi nội bộ"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A và -u xung khắc nhau"
+#: 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ả"
 
-#: builtin/add.c:337
-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"
+#: remote.c:1686
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "không có nhánh nào như thế: “%s”"
 
-#: builtin/add.c:352
+#: remote.c:1689
 #, 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"
+msgid "no upstream configured for branch '%s'"
+msgstr "không có thượng nguồn được cấu hình cho nhánh “%s”"
 
-#: builtin/add.c:353
+#: remote.c:1695
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Có lẽ ý bạn là “git add .” phải không?\n"
+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ủ"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "tập tin ghi bảng mục lục bị hỏng"
+#: remote.c:1710
+#, 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ộ"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-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"
+#: remote.c:1725
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "nhánh “%s” không có máy chủ để đẩy lên"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: remote.c:1736
 #, c-format
-msgid "could not read '%s'"
-msgstr "Không thể đọc “%s”."
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "không thể phân tích cú pháp văn lệnh tác giả"
+#: 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"
 
-#: builtin/am.c:507
+#: remote.c:2073
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "“%s” bị xóa bởi móc applypatch-msg"
+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"
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: remote.c:2080
 #, c-format
-msgid "Malformed input line: '%s'."
-msgstr "Dòng đầu vào dị hình: “%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"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: remote.c:2084
 #, 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”"
+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"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "fseek gặp lỗi"
+#: 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"
 
-#: builtin/am.c:772 builtin/am.c:860
+#: remote.c:2093
 #, c-format
-msgid "could not open '%s' for reading: %s"
-msgstr "không thể mở “%s” để đọc: %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] ""
+"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"
 
-#: builtin/am.c:779
-#, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "Không thể mở “%s” để ghi: %s"
+#: 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"
 
-#: builtin/am.c:788
+#: remote.c:2104
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "không thể phân tích cú pháp “%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] ""
+"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"
 
-#: builtin/am.c:853
-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"
+#: 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"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "dấu thời gian không hợp lệ"
+#: 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"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "dòng Ngày tháng không hợp lệ"
+#: revision.c:2161
+#, 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ả"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "độ lệch múi giờ không hợp lệ"
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent xung khắc với --bisect"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "Dò tìm định dạng miếng vá gặp lỗi."
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "gặp lỗi khi mở “/dev/null”"
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: run-command.c:108
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "tạo thư mục \"%s\" gặp lỗi"
-
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) gặp lỗi"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "không thể ghi tập tin lưu mục lục"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "gặp lỗi khi ký chứng thực đẩy"
 
-#: 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\"."
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
 
-#: builtin/am.c:1189
-#, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
 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/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\"."
+"đừ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"
 
-#: 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?"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "kết thúc nhận không hỗ trợ đẩy --atomic"
 
-#: builtin/am.c:1402 builtin/log.c:1350
-#, c-format
-msgid "invalid ident line: %s"
-msgstr "dòng thụt lề không hợp lệ: %s"
+#: send-pack.c:429
+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"
 
-#: 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”"
+#: sequencer.c:171
+msgid "revert"
+msgstr "hoàn nguyên"
 
-#: builtin/am.c:1631
-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”."
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "cherry-pick"
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
+#: sequencer.c:228
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
 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ở…"
+"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>”"
 
-#: builtin/am.c:1652
+#: sequencer.c:231
 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 ""
-"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ó."
+"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”"
 
-#: builtin/am.c:1658
-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”…"
+#: sequencer.c:244 sequencer.c:1209
+#, c-format
+msgid "could not lock '%s'"
+msgstr "không thể khóa “%s”"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "Gặp lỗi khi trộn vào các thay đổi."
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "không thể ghi vào “%s”"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-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"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "không thể ghi eol vào “%s”"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "áp dụng vào một lịch sử trống rỗng"
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
+#, c-format
+msgid "failed to finalize '%s'."
+msgstr "gặp lỗi khi finalize “%s”"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
+#, c-format
+msgid "could not read '%s'"
+msgstr "Không thể đọc “%s”."
 
-#: builtin/am.c:1749 builtin/am.c:1753
+#: sequencer.c:305
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "không thể phục hồi: %s không tồn tại."
+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."
 
-#: builtin/am.c:1769
-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"
+#: sequencer.c:309
+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ý."
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "Thân của lần chuyển giao là:"
+#: sequencer.c:324
+#, c-format
+msgid "%s: fast-forward"
+msgstr "%s: chuyển-tiếp-nhanh"
 
-#. 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:1784
-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/am.c:1834
-#, 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)"
-
-#: builtin/am.c:1869 builtin/am.c:1941
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "Applying: %.*s"
-msgstr "Áp dụng: %.*s"
+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"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "không thể phân giải lần chuyển giao HEAD\n"
 
-#: builtin/am.c:1893
-#, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "Gặp lỗi khi vá tại %s %.*s"
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "không thể cập nhật cây bộ nhớ đệm\n"
 
-#: builtin/am.c:1899
+#: sequencer.c:483
 #, 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ỗi thì được tìm thấy trong: %s"
-
-#: builtin/am.c:1944
-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/am.c:1951
 msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
+"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 ""
-"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” à?"
+"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"
+"  git commit --amend %s\n"
+"\n"
+"Nếu chúng có ý là đi đến lần chuyển giao mới, thì chạy:\n"
+"\n"
+"  git commit %s\n"
+"\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"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: sequencer.c:567
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "không thể phân tích đối tượng “%s”."
+msgid "could not parse commit %s\n"
+msgstr "không thể phân tích lần chuyển giao %s\n"
 
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "gặp lỗi khi dọn bảng mục lục"
+#: sequencer.c:572
+#, 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"
 
-#: builtin/am.c:2145
-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"
+#: sequencer.c:656
+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."
 
-#: builtin/am.c:2206
+#: sequencer.c:675
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "Giá trị không hợp lệ cho --patch-format: %s"
+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."
 
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "lần chuyển giao %s không có cha mẹ %d"
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
+#: sequencer.c:687
+#, 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."
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "chạy kiểu tương tác"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, 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"
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "tùy chọn lịch sử -- không-toán-tử"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %s"
+msgstr "không thể lấy ghi chú lần chuyển giao cho %s"
 
-#: builtin/am.c:2250
-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"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "không thể hoàn nguyên %s… %s"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "im lặng"
+#: sequencer.c:798
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "không thể áp dụng miếng vá %s… %s"
 
-#: builtin/am.c:2253
-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"
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "chuyển mã thành utf8 (mặc định)"
+#: sequencer.c:843
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: gặp lỗi đọc bảng mục lục"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "chuyển cờ -k cho git-mailinfo"
+#: sequencer.c:850
+#, 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"
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "chuyển cờ -b cho git-mailinfo"
+#: sequencer.c:944
+#, c-format
+msgid "invalid line %d: %.*s"
+msgstr "dòng không hợp lệ %d: %.*s"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "chuyển cờ -m cho git-mailinfo"
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "không có lần chuyển giao nào được phân tích."
 
-#: builtin/am.c:2264
-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"
+#: sequencer.c:966
+#, c-format
+msgid "could not read '%s'."
+msgstr "không thể đọc “%s”."
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr ""
-"đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "bảng chỉ thị không thể dùng được: %s"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-msgstr "cắt mọi thứ trước dòng scissors"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "không thể cherry-pick trong khi hoàn nguyên."
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "hành động"
+#: sequencer.c:985
+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."
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "chuyển nó qua git-apply"
+#: sequencer.c:1028
+#, c-format
+msgid "invalid key: %s"
+msgstr "khóa không đúng: %s"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "gốc"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "giá trị cho %s không hợp lệ: %s"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "đường-dẫn"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "bảng tùy chọn dị hình: “%s”"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131 builtin/pull.c:185
-#: 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"
+#: sequencer.c:1101
+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"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-msgstr "số"
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "định dạng"
+#: sequencer.c:1106
+#, c-format
+msgid "could not create sequencer directory '%s'"
+msgstr "không thể tạo thư mục xếp dãy “%s”"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-msgstr "định dạng (các) miếng vá theo"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "không thể khóa HEAD"
 
-#: builtin/am.c:2302
-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"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "không cherry-pick hay hoàn nguyên trong tiến trình"
 
-#: builtin/am.c:2304
-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"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "không thể phân giải HEAD"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "đồng nghĩa với --continue"
+#: sequencer.c:1155 sequencer.c:1189
+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"
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "bỏ qua miếng vá hiện hành"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "không mở được “%s”"
 
-#: builtin/am.c:2313
-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á."
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "không thể đọc “%s”: %s"
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "nói dối về ngày chuyển giao"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "gặp kết thúc tập tin đột xuất"
 
-#: builtin/am.c:2319
-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ả"
+#: sequencer.c:1184
+#, 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"
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "mã-số-khóa"
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: không thể cherry-pick một %s"
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "lần chuyển giao ký-GPG"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: điểm xét duyệt sai"
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(dùng nội bộ cho git-rebase)"
+#: sequencer.c:1391
+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"
 
-#: builtin/am.c:2340
+#: setup.c:160
+#, 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."
+"%s: no such path in the working tree.\n"
+"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 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:2347
-msgid "failed to read the index"
-msgstr "gặp lỗi đọc bảng mục lục"
+"%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ộ."
 
-#: builtin/am.c:2362
+#: setup.c:173
 #, 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 ""
+"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 ""
+"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>…]”"
 
-#: builtin/am.c:2386
+#: setup.c:223
 #, c-format
 msgid ""
-"Stray %s directory found.\n"
-"Use \"git am --abort\" to remove it."
+"ambiguous argument '%s': both revision and filename\n"
+"Use '--' to separate paths from revisions, like this:\n"
+"'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"Tìm thấy thư mục lạc %s.\n"
-"Dùng \"git am --abort\" để loại bỏ nó đi."
+"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>…]”"
 
-#: builtin/am.c:2392
-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."
+#: setup.c:468
+#, 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"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<các-tùy-chọn>] [<miếng-vá>…]"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "tìm thấy phần mở rộng kho chưa biết:"
 
-#: builtin/apply.c:111
+#: setup.c:762
 #, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "không nhận ra tùy chọn về khoảng trắng “%s”"
+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"
 
-#: builtin/apply.c:126
-#, 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”"
+#: 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"
+
+#: 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"
 
-#: builtin/apply.c:818
+#: setup.c:920
 #, c-format
-msgid "Cannot prepare timestamp regexp %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 ""
-"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 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)."
 
-#: builtin/apply.c:827
+#: setup.c:927
 #, 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 "Cannot change to '%s/..'"
+msgstr "Không thể chuyển sang “%s/..”"
 
-#: builtin/apply.c:908
+#: setup.c:989
 #, 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"
+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."
 
-#: builtin/apply.c:940
+#: sha1_file.c:473
 #, 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"
+msgid "path '%s' does not exist"
+msgstr "đường dẫn “%s” không tồn tại"
 
-#: builtin/apply.c:944
+#: sha1_file.c:499
 #, 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 "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/apply.c:945
+#: sha1_file.c:505
 #, 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 "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/apply.c:952
+#: sha1_file.c:511
 #, 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"
+msgid "reference repository '%s' is shallow"
+msgstr "kho tham chiếu “%s” là nông"
 
-#: builtin/apply.c:1415
+#: sha1_file.c:519
 #, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "chi tiết: dòng không cần: %.*s"
+msgid "reference repository '%s' is grafted"
+msgstr "kho tham chiếu “%s” bị cấy ghép"
+
+#: sha1_file.c:1159
+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 à?)"
 
-#: builtin/apply.c:1472
+#: sha1_file.c:2592
 #, 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"
+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 à?)"
 
-#: builtin/apply.c:1489
+#: sha1_file.c:2596
 #, 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 "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 à?)"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "tập tin mới phụ thuộc vào nội dung cũ"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "tóm lược SHA1 %s chưa rõ ràng"
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "tập tin đã xóa vẫn còn nội dung"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "Các ứng cử là:"
 
-#: builtin/apply.c:1683
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr "miếng vá hỏng tại dòng %d"
+#: 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 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\""
 
-#: builtin/apply.c:1719
-#, 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ũ"
+#: submodule.c:64 submodule.c:98
+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"
 
-#: builtin/apply.c:1721
+#: submodule.c:68 submodule.c:102
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "tập tin đã xóa %s vẫn còn nội dung"
+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"
 
-#: builtin/apply.c:1724
+#: submodule.c:76
 #, 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 update .gitmodules entry %s"
+msgstr "Không thể cập nhật mục .gitmodules %s"
 
-#: builtin/apply.c:1870
+#: submodule.c:109
 #, 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"
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
 
-#: builtin/apply.c:1899
-#, 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"
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
 
-#: builtin/apply.c:2050
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr "vá chỉ với “rác” tại dòng %d"
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "không cho phép giá trị âm ở submodule.fetchJobs"
 
-#: builtin/apply.c:2140
+#: submodule-config.c:358
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "không thể đọc liên kết mềm %s"
+msgid "invalid value for %s"
+msgstr "giá trị cho %s không hợp lệ"
 
-#: builtin/apply.c:2144
+#: trailer.c:238
 #, c-format
-msgid "unable to open or read %s"
-msgstr "không thể mở hay đọc %s"
+msgid "running trailer command '%s' failed"
+msgstr "chạy lệnh kéo theo “%s” gặp lỗi"
 
-#: builtin/apply.c:2777
+#: trailer.c:471 trailer.c:475 trailer.c:479 trailer.c:533 trailer.c:537
+#: trailer.c:541
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "sai khởi đầu dòng: “%c”"
+msgid "unknown value '%s' for key '%s'"
+msgstr "không hiểu giá trị “%s” cho khóa “%s”"
 
-#: builtin/apply.c:2896
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
 #, 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)."
+msgid "more than one %s"
+msgstr "nhiều hơn một %s"
 
-#: builtin/apply.c:2908
+#: trailer.c:672
 #, 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"
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "thẻ thừa trống rỗng trong phần thừa “%.*s”"
 
-#: builtin/apply.c:2914
+#: trailer.c:695
 #, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-"trong khi đang tìm kiếm cho:\n"
-"%.*s"
+msgid "could not read input file '%s'"
+msgstr "không đọc được tập tin đầu vào “%s”"
 
-#: builtin/apply.c:2934
-#, 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”"
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "không thể đọc từ đầu vào tiêu chuẩn"
 
-#: builtin/apply.c:3035
+#: trailer.c:929 builtin/am.c:44
 #, 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 "could not stat %s"
+msgstr "không thể lấy thông tin thống kê về %s"
 
-#: builtin/apply.c:3041
+#: trailer.c:931
 #, 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 "file %s is not a regular file"
+msgstr "\"%s\" không phải là tập tin bình thường"
 
-#: builtin/apply.c:3062
+#: trailer.c:933
 #, c-format
-msgid "patch failed: %s:%ld"
-msgstr "gặp lỗi khi vá: %s:%ld"
+msgid "file %s is not writable by user"
+msgstr "tập tin %s người dùng không thể ghi được"
 
-#: builtin/apply.c:3186
-#, c-format
-msgid "cannot checkout %s"
-msgstr "không thể lấy ra %s"
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "không thể tạo tập tin tạm thời"
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: trailer.c:983
 #, c-format
-msgid "read of %s failed"
-msgstr "đọc %s gặp lỗi"
+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"
 
-#: builtin/apply.c:3239
+#: transport.c:62
 #, 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 "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"
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
+#: transport.c:151
 #, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "đường dẫn %s đã bị xóa hoặc đổi tên"
+msgid "transport: invalid depth option '%s'"
+msgstr "vận chuyển: tùy chọn độ sâu “%s” không hợp lệ"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: transport.c:817
 #, 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 ""
+"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"
 
-#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: transport.c:821
 #, c-format
-msgid "%s: %s"
-msgstr "%s: %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"
+"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"
 
-#: builtin/apply.c:3357 builtin/apply.c:3511
+#: transport.c:829
+msgid "Aborting."
+msgstr "Bãi bỏ."
+
+#: transport-helper.c:1075
 #, c-format
-msgid "%s: does not match index"
-msgstr "%s: không khớp trong mục lục"
+msgid "Could not read ref %s"
+msgstr "Không thể đọc tham chiếu %s"
 
-#: builtin/apply.c:3459
-msgid "removal patch leaves file contents"
-msgstr "loại bỏ miếng vá để lại nội dung tập tin"
+#: tree-walk.c:31
+msgid "too-short tree object"
+msgstr "đối tượng cây quá ngắn"
+
+#: tree-walk.c:37
+msgid "malformed mode in tree entry"
+msgstr "chế độ dị hình trong đề mục cây"
 
-#: builtin/apply.c:3528
+#: 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"
+
+#: unpack-trees.c:64
 #, c-format
-msgid "%s: wrong type"
-msgstr "%s: sai kiểu"
+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."
 
-#: builtin/apply.c:3530
+#: unpack-trees.c:66
 #, c-format
-msgid "%s has type %o, expected %o"
-msgstr "%s có kiểu %o, cầ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"
 
-#: builtin/apply.c:3689 builtin/apply.c:3691
+#: unpack-trees.c:69
 #, c-format
-msgid "invalid path '%s'"
-msgstr "đường dẫn không hợp lệ “%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 ""
+"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."
 
-#: builtin/apply.c:3746
+#: unpack-trees.c:71
 #, c-format
-msgid "%s: already exists in index"
-msgstr "%s: đã có từ trước trong bảng mục lục"
+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"
 
-#: builtin/apply.c:3749
+#: unpack-trees.c:74
 #, c-format
-msgid "%s: already exists in working directory"
-msgstr "%s: đã sẵn có trong thư mục đang làm việc"
+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."
 
-#: builtin/apply.c:3769
+#: unpack-trees.c:76
 #, 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 ""
+"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"
 
-#: builtin/apply.c:3774
+#: unpack-trees.c:81
 #, 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 ""
+"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"
 
-#: builtin/apply.c:3794
+#: unpack-trees.c:85
 #, 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 ""
+"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."
 
-#: builtin/apply.c:3798
+#: unpack-trees.c:87
 #, c-format
-msgid "%s: patch does not apply"
-msgstr "%s: miếng vá không được áp dụng"
+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"
 
-#: builtin/apply.c:3812
+#: unpack-trees.c:90
 #, c-format
-msgid "Checking patch %s..."
-msgstr "Đang kiểm tra miếng vá %s…"
+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."
 
-#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#: unpack-trees.c:92
 #, 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 ""
+"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"
 
-#: builtin/apply.c:4048
+#: unpack-trees.c:95
 #, c-format
-msgid "unable to remove %s from index"
-msgstr "không thể gỡ bỏ %s từ mục lục"
+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."
 
-#: builtin/apply.c:4077
+#: unpack-trees.c:97
 #, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "miếng vá sai hỏng cho mô-đun-con %s"
+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"
 
-#: builtin/apply.c:4081
+#: unpack-trees.c:102
 #, 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"
+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/apply.c:4086
+#: unpack-trees.c:104
 #, 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"
+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/apply.c:4089 builtin/apply.c:4197
+#: unpack-trees.c:107
 #, c-format
-msgid "unable to add cache entry for %s"
-msgstr "không thể thêm mục nhớ đệm cho %s"
+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/apply.c:4122
+#: unpack-trees.c:109
 #, c-format
-msgid "closing file '%s'"
-msgstr "đang đóng tập tin “%s”"
+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/apply.c:4171
+#: unpack-trees.c:112
 #, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr "không thể ghi vào tập tin “%s” chế độ %o"
+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/apply.c:4258
+#: unpack-trees.c:114
 #, c-format
-msgid "Applied patch %s cleanly."
-msgstr "Đã áp dụng miếng vá %s một cách sạch sẽ."
+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"
 
-#: builtin/apply.c:4266
-msgid "internal error"
-msgstr "lỗi nội bộ"
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "Mục “%s” đè lên “%s”. Không thể buộc."
 
-#: builtin/apply.c:4269
+#: unpack-trees.c:124
 #, 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 ""
+"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/apply.c:4279
+#: unpack-trees.c:126
 #, 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 ""
+"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/apply.c:4300
+#: unpack-trees.c:128
 #, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "Khối nhớ #%d được áp dụng gọn gàng."
+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/apply.c:4303
+#: unpack-trees.c:205
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "đoạn dữ liệu #%d bị từ chối."
+msgid "Aborting\n"
+msgstr "Bãi bỏ\n"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "không thừa nhận đầu vào"
-
-#: builtin/apply.c:4404
-msgid "unable to read index file"
-msgstr "không thể đọc tập tin lưu bảng mục lục"
-
-#: builtin/apply.c:4507
-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/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
-
-#: builtin/apply.c:4513
-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"
+#: unpack-trees.c:237
+msgid "Checking out files"
+msgstr "Đang lấy ra các tập tin"
 
-#: builtin/apply.c:4516
-msgid "ignore additions made by the patch"
-msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
+#: 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ố “://”"
 
-#: builtin/apply.c:4518
-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"
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "thoát chuỗi %XX không hợp lệ"
 
-#: builtin/apply.c:4522
-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"
+#: 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:”"
 
-#: builtin/apply.c:4524
-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"
+#: 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"
 
-#: builtin/apply.c:4526
-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"
+#: 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"
 
-#: builtin/apply.c:4528
-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"
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "tên cổng không hợp lệ"
 
-#: builtin/apply.c:4530
-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"
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "đoạn đường dẫn “..” không hợp lệ"
 
-#: builtin/apply.c:4532
-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"
+#: worktree.c:282
+#, c-format
+msgid "failed to read '%s'"
+msgstr "gặp lỗi khi đọc “%s”"
 
-#: builtin/apply.c:4534
-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)"
+#: 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/apply.c:4536
-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"
+#: 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/apply.c:4538
-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"
+#: 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 "không thể mở “%s” để đọc"
 
-#: builtin/apply.c:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
+#: wrapper.c:605 wrapper.c:626
+#, c-format
+msgid "unable to access '%s'"
+msgstr "không thể truy cập “%s”"
 
-#: builtin/apply.c:4543
-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"
+#: 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"
 
-#: builtin/apply.c:4545
-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"
+#: wrapper.c:658
+#, c-format
+msgid "could not write to %s"
+msgstr "không thể ghi vào %s"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-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"
+#: wrapper.c:660
+#, c-format
+msgid "could not close %s"
+msgstr "không thể đóng %s"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "áp dụng miếng vá theo chiều ngược"
+#: wt-status.c:151
+msgid "Unmerged paths:"
+msgstr "Những đường dẫn chưa được hòa trộn:"
 
-#: builtin/apply.c:4556
-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"
+#: wt-status.c:178 wt-status.c:205
+#, 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)"
 
-#: builtin/apply.c:4558
-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"
+#: 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/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "cho phép chồng khối nhớ"
+#: 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/apply.c:4563
-msgid "tolerate incorrectly detected missing new-line at the end of file"
+#: wt-status.c:186 wt-status.c:190
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 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"
+"  (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/apply.c:4566
-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"
+#: 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/apply.c:4569
-msgid "prepend <root> to all filenames"
-msgstr "treo thêm <root> vào tất cả các tên tập tin"
+#: wt-status.c:199 wt-status.c:945
+msgid "Changes to be committed:"
+msgstr "Những thay đổi sẽ được chuyển giao:"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way ở ngoài một kho chứa"
+#: wt-status.c:217 wt-status.c:954
+msgid "Changes not staged for commit:"
+msgstr "Các thay đổi chưa được đặt lên bệ phóng để chuyển giao:"
 
-#: builtin/apply.c:4599
-msgid "--index outside a repository"
-msgstr "--index ở ngoài một kho chứa"
+#: 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/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached ở ngoài một kho chứa"
+#: 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/apply.c:4621
-#, c-format
-msgid "can't open patch '%s'"
-msgstr "không thể mở miếng vá “%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/apply.c:4635
-#, 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"
+#: 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/apply.c:4641 builtin/apply.c:4651
+#: wt-status.c:238
 #, 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."
+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/archive.c:17
-#, c-format
-msgid "could not create archive file '%s'"
-msgstr "không thể tạo tập tin kho (lưu trữ, nén) “%s”"
+#: wt-status.c:253
+msgid "both deleted:"
+msgstr "bị xóa bởi cả hai:"
 
-#: builtin/archive.c:20
-msgid "could not redirect output"
-msgstr "không thể chuyển hướng kết xuất"
+#: wt-status.c:255
+msgid "added by us:"
+msgstr "được thêm vào bởi chúng ta:"
 
-#: builtin/archive.c:37
-msgid "git archive: Remote with no URL"
-msgstr "git archive: Máy chủ không có địa chỉ URL"
+#: wt-status.c:257
+msgid "deleted by them:"
+msgstr "bị xóa đi bởi họ:"
 
-#: builtin/archive.c:58
-msgid "git archive: expected ACK/NAK, got EOF"
-msgstr "git archive: cần ACK/NAK, nhưng lại nhận được EOF"
+#: wt-status.c:259
+msgid "added by them:"
+msgstr "được thêm vào bởi họ:"
 
-#: builtin/archive.c:61
-#, c-format
-msgid "git archive: NACK %s"
-msgstr "git archive: NACK %s"
+#: wt-status.c:261
+msgid "deleted by us:"
+msgstr "bị xóa bởi chúng ta:"
 
-#: builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "lỗi máy chủ: %s"
+#: wt-status.c:263
+msgid "both added:"
+msgstr "được thêm vào bởi cả hai:"
 
-#: builtin/archive.c:64
-msgid "git archive: protocol error"
-msgstr "git archive: lỗi giao thức"
+#: wt-status.c:265
+msgid "both modified:"
+msgstr "bị sửa bởi cả hai:"
 
-#: builtin/archive.c:68
-msgid "git archive: expected a flush"
-msgstr "git archive: cần một flush (đẩy dữ liệu lên đĩa)"
+#: wt-status.c:275
+msgid "new file:"
+msgstr "tập tin mới:"
 
-#: builtin/bisect--helper.c:7
-msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr "git bisect--helper --next-all [--no-checkout]"
+#: wt-status.c:277
+msgid "copied:"
+msgstr "đã chép:"
 
-#: builtin/bisect--helper.c:17
-msgid "perform 'git bisect next'"
-msgstr "thực hiện “git bisect next”"
+#: wt-status.c:279
+msgid "deleted:"
+msgstr "đã xóa:"
 
-#: builtin/bisect--helper.c:19
-msgid "update BISECT_HEAD instead of checking out the current commit"
-msgstr ""
-"cập nhật BISECT_HEAD thay vì lấy ra (checking out) lần chuyển giao hiện hành"
+#: wt-status.c:281
+msgid "modified:"
+msgstr "đã sửa:"
 
-#: builtin/blame.c:33
-msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
-msgstr "git blame [<các-tùy-chọn>] [<rev-opts>] [<rev>] [--] <tập-tin>"
+#: wt-status.c:283
+msgid "renamed:"
+msgstr "đã đổi tên:"
 
-#: builtin/blame.c:38
-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)"
+#: wt-status.c:285
+msgid "typechange:"
+msgstr "đổi-kiểu:"
 
-#: builtin/blame.c:1782
-msgid "Blaming lines"
-msgstr "Các dòng blame"
+#: wt-status.c:287
+msgid "unknown:"
+msgstr "không hiểu:"
 
-#: builtin/blame.c:2530
-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"
+#: wt-status.c:289
+msgid "unmerged:"
+msgstr "chưa hòa trộn:"
 
-#: builtin/blame.c:2531
-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)"
+#: wt-status.c:371
+msgid "new commits, "
+msgstr "lần chuyển giao mới, "
 
-#: builtin/blame.c:2532
-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:2533
-msgid "Show work cost statistics"
-msgstr "Hiển thị thống kê công sức làm việc"
+#: wt-status.c:373
+msgid "modified content, "
+msgstr "nội dung bị sửa đổi, "
 
-#: builtin/blame.c:2534
-msgid "Force progress reporting"
-msgstr "Ép buộc báo cáo tiến triển công việc"
+#: wt-status.c:375
+msgid "untracked content, "
+msgstr "nội dung chưa được theo dõi, "
 
-#: builtin/blame.c:2535
-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”"
+#: wt-status.c:818
+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/blame.c:2536
-msgid "Show original filename (Default: auto)"
-msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
+#: wt-status.c:820
+msgid "Submodule changes to be committed:"
+msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
 
-#: builtin/blame.c:2537
-msgid "Show original linenumber (Default: off)"
-msgstr "Hiển thị số dòng gốc (Mặc định: off)"
+#: wt-status.c:901
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"Không động đến đường ở trên.\n"
+"Mọi thứ phía dưới sẽ được xóa bỏ."
 
-#: builtin/blame.c:2538
-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"
+#: wt-status.c:1013
+msgid "You have unmerged paths."
+msgstr "Bạn có những đường dẫn chưa được hòa trộn."
 
-#: builtin/blame.c:2539
-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"
+#: wt-status.c:1016
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (sửa các xung đột rồi chạy \"git commit\")"
 
-#: builtin/blame.c:2540
-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)"
+#: wt-status.c:1018
+msgid "  (use \"git merge --abort\" to abort the merge)"
+msgstr "  (dùng \"git merge --abort\" để bãi bỏ việc hòa trộn)"
 
-#: builtin/blame.c:2541
-msgid "Show raw timestamp (Default: off)"
-msgstr "Hiển thị dấu vết thời gian dạng thô (Mặc định: off)"
+#: wt-status.c:1023
+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/blame.c:2542
-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)"
+#: wt-status.c:1026
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
 
-#: builtin/blame.c:2543
-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)"
+#: wt-status.c:1036
+msgid "You are in the middle of an am session."
+msgstr "Bạn đang ở giữa của một phiên “am”."
 
-#: builtin/blame.c:2544
-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)"
+#: wt-status.c:1039
+msgid "The current patch is empty."
+msgstr "Miếng vá hiện tại bị trống rỗng."
 
-#: builtin/blame.c:2545
-msgid "Ignore whitespace differences"
-msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
+#: wt-status.c:1043
+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/blame.c:2546
-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"
+#: wt-status.c:1045
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (dùng \"git am --skip\" để bỏ qua miếng vá này)"
 
-#: builtin/blame.c:2547
-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”"
+#: wt-status.c:1047
+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/blame.c:2548
-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"
+#: wt-status.c:1172
+msgid "No commands done."
+msgstr "Không thực hiện lệnh nào."
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
-msgid "score"
-msgstr "điểm số"
+#: wt-status.c:1175
+#, 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):"
 
-#: builtin/blame.c:2549
-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"
+#: wt-status.c:1186
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (xem thêm trong %s)"
 
-#: builtin/blame.c:2550
-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"
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "Không có lệnh nào còn lại."
 
-#: builtin/blame.c:2551
-msgid "n,m"
-msgstr "n,m"
+#: wt-status.c:1194
+#, 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):"
 
-#: builtin/blame.c:2551
-msgid "Process only line range n,m, counting from 1"
-msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1"
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (dùng lệnh \"git rebase --edit-todo\" để xem và sửa)"
 
-#. 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:2640
-msgid "4 years, 11 months ago"
-msgstr "4 năm, 11 tháng trước"
+#: wt-status.c:1215
+#, 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”."
 
-#: builtin/branch.c:25
-msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
-msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--merged | --no-merged]"
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
 
-#: builtin/branch.c:26
-msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
-msgstr "git branch [<các-tùy-chọn>] [-l] [-f] <tên-nhánh> [<điểm-đầu>]"
+#: wt-status.c:1234
+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\")"
 
-#: builtin/branch.c:27
-msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
-msgstr "git branch [<các-tùy-chọn>] [-r] (-d | -D) <tên-nhánh> …"
+#: wt-status.c:1236
+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/branch.c:28
-msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
-msgstr "git branch [<các-tùy-chọn>] (-m | -M) [<nhánh-cũ>] <nhánh-mới>"
+#: wt-status.c:1238
+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/branch.c:29
-msgid "git branch [<options>] [-r | -a] [--points-at]"
-msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--points-at]"
+#: wt-status.c:1244
+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\")"
 
-#: builtin/branch.c:142
+#: wt-status.c:1248
 #, c-format
 msgid ""
-"deleting branch '%s' that has been merged to\n"
-"         '%s', but not yet merged to HEAD."
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
 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."
+"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/branch.c:146
-#, 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:1253
+msgid "You are currently splitting a commit during a rebase."
 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."
+"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/branch.c:160
-#, 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”"
+#: wt-status.c:1256
+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/branch.c:164
+#: wt-status.c:1260
 #, 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'."
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
 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”."
+"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/branch.c:177
-msgid "Update of config-file failed"
-msgstr "Cập nhật tập tin cấu hình gặp lỗi"
+#: wt-status.c:1265
+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/branch.c:205
-msgid "cannot use -a with -d"
-msgstr "không thể dùng tùy chọn -a với -d"
+#: wt-status.c:1268
+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/branch.c:211
-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"
+#: wt-status.c:1270
+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/branch.c:219
+#: wt-status.c:1280
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Không thể xóa nhánh “%s” cái mà bạn hiện nay đang ở."
+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/branch.c:235
-#, 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”."
+#: wt-status.c:1285
+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/branch.c:236
-#, c-format
-msgid "branch '%s' not found."
-msgstr "không tìm thấy nhánh “%s”."
+#: wt-status.c:1288
+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/branch.c:251
-#, 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”"
+#: wt-status.c:1290
+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/branch.c:252
+#: wt-status.c:1299
 #, c-format
-msgid "Error deleting branch '%s'"
-msgstr "Gặp lỗi khi xóa bỏ nhánh “%s”"
+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/branch.c:259
-#, 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"
+#: wt-status.c:1304
+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/branch.c:260
-#, c-format
-msgid "Deleted branch %s (was %s).\n"
-msgstr "Nhánh “%s” đã bị xóa (từng là %s)\n"
+#: wt-status.c:1307
+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\")"
 
-#: builtin/branch.c:303
-#, c-format
-msgid "[%s: gone]"
-msgstr "[%s: đã ra đi]"
+#: wt-status.c:1309
+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/branch.c:308
+#: wt-status.c:1320
 #, c-format
-msgid "[%s]"
-msgstr "[%s]"
+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/branch.c:313
-#, c-format
-msgid "[%s: behind %d]"
-msgstr "[%s: đứng sau %d]"
+#: wt-status.c:1324
+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/branch.c:315
-#, c-format
-msgid "[behind %d]"
-msgstr "[đằng sau %d]"
+#: wt-status.c:1327
+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/branch.c:319
-#, c-format
-msgid "[%s: ahead %d]"
-msgstr "[%s: phía trước %d]"
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "Trên nhánh "
 
-#: builtin/branch.c:321
-#, c-format
-msgid "[ahead %d]"
-msgstr "[phía trước %d]"
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
 
-#: builtin/branch.c:324
-#, c-format
-msgid "[%s: ahead %d, behind %d]"
-msgstr "[%s: trước %d, sau %d]"
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "rebase đang được thực hiện: lên trên "
 
-#: builtin/branch.c:327
-#, c-format
-msgid "[ahead %d, behind %d]"
-msgstr "[trước %d, sau %d]"
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "HEAD được tách rời tại "
 
-#: builtin/branch.c:340
-msgid " **** invalid ref ****"
-msgstr " **** tham chiếu không hợp lệ ****"
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "HEAD được tách rời từ "
 
-#: builtin/branch.c:366
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr "(không nhánh, đang cải tổ %s)"
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "Hiện tại chẳng ở nhánh nào cả."
 
-#: builtin/branch.c:369
-#, 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)"
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "Lần chuyển giao khởi tạo"
 
-#: builtin/branch.c:375
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "Những tập tin chưa được theo dõi"
+
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "Những tập tin bị lờ đi"
+
+#: wt-status.c:1580
 #, c-format
-msgid "(HEAD detached at %s)"
-msgstr "(HEAD được tách rời tại %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 ""
+"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/branch.c:378
+#: wt-status.c:1586
 #, c-format
-msgid "(HEAD detached from %s)"
-msgstr "(HEAD được tách rời từ %s)"
+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/branch.c:382
-msgid "(no branch)"
-msgstr "(không nhánh)"
+#: wt-status.c:1588
+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/branch.c:524
-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ả."
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "Không có thay đổi nào"
 
-#: builtin/branch.c:534
+#: wt-status.c:1599
 #, c-format
-msgid "Invalid branch name: '%s'"
-msgstr "Tên nhánh không hợp lệ: “%s”"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+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"
 
-#: builtin/branch.c:549
-msgid "Branch rename failed"
-msgstr "Gặp lỗi khi đổi tên nhánh"
+#: wt-status.c:1602
+#, 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"
 
-#: builtin/branch.c:553
+#: wt-status.c:1605
 #, c-format
-msgid "Renamed a misnamed branch '%s' away"
-msgstr "Đã đổi tên nhánh khuyết danh “%s” đi"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\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 (dùng \"git add\" để đưa vào theo dõi)\n"
 
-#: builtin/branch.c:557
+#: wt-status.c:1608
 #, 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!"
+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/branch.c:564
-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"
+#: wt-status.c:1611
+#, c-format
+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/branch.c:586
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "không thể ghi vào mẫu mô tả nhánh: %s"
+msgid "nothing to commit\n"
+msgstr "không có gì để chuyển giao\n"
 
-#: builtin/branch.c:615
-msgid "Generic options"
-msgstr "Tùy chọn chung"
+#: wt-status.c:1617
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
 
-#: builtin/branch.c:617
-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"
+#: wt-status.c:1621
+#, 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"
 
-#: builtin/branch.c:618
-msgid "suppress informational messages"
-msgstr "không xuất các thông tin"
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "Lần chuyển giao khởi tạo trên "
 
-#: builtin/branch.c:619
-msgid "set up tracking mode (see git-pull(1))"
-msgstr "cài đặt chế độ theo dõi (xem git-pull(1))"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD (không nhánh)"
 
-#: builtin/branch.c:621
-msgid "change upstream info"
-msgstr "thay đổi thông tin thượng nguồn"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "đã ra đi"
 
-#: builtin/branch.c:625
-msgid "use colored output"
-msgstr "tô màu kết xuất"
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "đằng sau "
 
-#: builtin/branch.c:626
-msgid "act on remote-tracking branches"
-msgstr "thao tác trên nhánh “remote-tracking”"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "phía trước "
 
-#: builtin/branch.c:628 builtin/branch.c:629
-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"
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
+#, c-format
+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."
 
-#: builtin/branch.c:632
-msgid "Specific git-branch actions:"
-msgstr "Hành động git-branch:"
+#: wt-status.c:2276
+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/branch.c:633
-msgid "list both remote-tracking and local branches"
-msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
+#: wt-status.c:2278
+#, c-format
+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/branch.c:635
-msgid "delete fully merged branch"
-msgstr "xóa một toàn bộ nhánh đã hòa trộn"
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "gặp lỗi khi bỏ liên kết (unlink) “%s”"
 
-#: builtin/branch.c:636
-msgid "delete branch (even if not merged)"
-msgstr "xóa nhánh (cho dù là chưa được hòa trộn)"
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<các-tùy-chọn>] [--]  <pathspec>…"
 
-#: builtin/branch.c:637
-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/add.c:80
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/branch.c:638
-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/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "Cập nhật tập tin gặp lỗi"
 
-#: builtin/branch.c:639
-msgid "list branch names"
-msgstr "liệt kê các tên nhánh"
+#: builtin/add.c:95
+#, c-format
+msgid "remove '%s'\n"
+msgstr "gỡ bỏ “%s”\n"
 
-#: builtin/branch.c:640
-msgid "create the branch's reflog"
-msgstr "tạo reflog của nhánh"
+#: 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/branch.c:642
-msgid "edit the description for the branch"
-msgstr "sửa mô tả cho nhánh"
+#: builtin/add.c:209 builtin/rev-parse.c:840
+msgid "Could not read the index"
+msgstr "Không thể đọc bảng mục lục"
 
-#: builtin/branch.c:643
-msgid "force creation, move/rename, deletion"
-msgstr "buộc tạo, di chuyển/đổi tên, xóa"
+#: builtin/add.c:220
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "Không thể mở “%s” để ghi."
 
-#: builtin/branch.c:644
-msgid "print only branches that are merged"
-msgstr "chỉ hiển thị những nhánh mà nó được hòa trộn"
+#: builtin/add.c:224
+msgid "Could not write patch"
+msgstr "Không thể ghi ra miếng vá"
 
-#: builtin/branch.c:645
-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/add.c:227
+msgid "editing patch failed"
+msgstr "gặp lỗi khi sửa miếng vá"
 
-#: builtin/branch.c:646
-msgid "list branches in columns"
-msgstr "liệt kê các nhánh trong các cột"
+#: builtin/add.c:230
+#, c-format
+msgid "Could not stat '%s'"
+msgstr "không thể lấy thông tin thống kê về “%s”"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
-msgid "key"
-msgstr "khóa"
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "Miếng vá trống rỗng. Nên bỏ qua."
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
-msgid "field name to sort on"
-msgstr "tên trường cần sắp xếp"
+#: builtin/add.c:237
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "Không thể áp dụng miếng vá “%s”"
 
-#: builtin/branch.c:650 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 "đối tượng"
+#: 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/branch.c:651
-msgid "print only branches of the object"
-msgstr "chỉ hiển thị các nhánh của đối tượng"
+#: 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 "chạy thử"
 
-#: builtin/branch.c:669
-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/add.c:269
+msgid "interactive picking"
+msgstr "sửa bằng cách tương tác"
 
-#: builtin/branch.c:673 builtin/clone.c:705
-msgid "HEAD not found below refs/heads!"
-msgstr "không tìm thấy HEAD ở dưới refs/heads!"
+#: builtin/add.c:270 builtin/checkout.c:1156 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "chọn “hunks” theo kiểu tương tác"
 
-#: builtin/branch.c:693
-msgid "--column and --verbose are incompatible"
-msgstr "tùy chọn --column và --verbose xung khắc nhau"
+#: builtin/add.c:271
+msgid "edit current diff and apply"
+msgstr "sửa diff hiện nay và áp dụng nó"
 
-#: builtin/branch.c:704 builtin/branch.c:746
-msgid "branch name required"
-msgstr "cần chỉ ra tên nhánh"
+#: 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/branch.c:722
-msgid "Cannot give description to detached HEAD"
-msgstr "Không thể đưa ra mô tả HEAD đã tách rời"
+#: builtin/add.c:273
+msgid "update tracked files"
+msgstr "cập nhật các tập tin được theo dõi"
 
-#: builtin/branch.c:727
-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/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/branch.c:734
-#, c-format
-msgid "No commit on branch '%s' yet."
-msgstr "Vẫn chưa chuyển giao trên nhánh “%s”."
+#: builtin/add.c:275
+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"
 
-#: builtin/branch.c:737
-#, c-format
-msgid "No branch named '%s'."
-msgstr "Không có nhánh nào có tên “%s”."
+#: 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/branch.c:752
-msgid "too many branches for a rename operation"
-msgstr "quá nhiều nhánh dành cho thao tác đổi tên"
+#: 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/branch.c:757
-msgid "too many branches to set new upstream"
-msgstr "quá nhiều nhánh được đặt cho thượng nguồn mới"
+#: 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/branch.c:761
-#, c-format
-msgid ""
-"could not set upstream of HEAD to %s when it does not point to any branch."
+#: builtin/add.c:282
+msgid "check if - even missing - files are ignored in dry run"
 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ả."
+"kiểm tra xem - thậm chí thiếu - tập tin bị bỏ qua trong quá trình chạy thử"
 
-#: builtin/branch.c:764 builtin/branch.c:786 builtin/branch.c:807
-#, c-format
-msgid "no such branch '%s'"
-msgstr "không có nhánh nào như thế “%s”"
+#: builtin/add.c:283 builtin/update-index.c:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/branch.c:768
-#, c-format
-msgid "branch '%s' does not exist"
-msgstr "chưa có nhánh “%s”"
-
-#: builtin/branch.c:780
-msgid "too many branches to unset upstream"
-msgstr "quá nhiều nhánh để bỏ đặt thượng nguồn"
-
-#: builtin/branch.c:784
-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/add.c:283 builtin/update-index.c:948
+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/branch.c:790
+#: builtin/add.c:305
 #, c-format
-msgid "Branch '%s' has no upstream information"
-msgstr "Nhánh “%s” không có thông tin thượng nguồn"
+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/branch.c:804
-msgid "it does not make sense to create 'HEAD' manually"
-msgstr "không hợp lý khi tạo “HEAD” thủ công"
+#: builtin/add.c:312
+msgid "adding files failed"
+msgstr "thêm tập tin gặp lỗi"
 
-#: builtin/branch.c:810
-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/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/branch.c:813
+#: builtin/add.c:359
 #, c-format
-msgid ""
-"The --set-upstream flag is deprecated and will be removed. Consider using --"
-"track or --set-upstream-to\n"
-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"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "--chmod tham số “%s” phải hoặc là -x hay +x"
 
-#: builtin/branch.c:830
+#: builtin/add.c:374
 #, c-format
-msgid ""
-"\n"
-"If you wanted to make '%s' track '%s', do this:\n"
-"\n"
-msgstr ""
-"\n"
-"Nếu bạn muốn “%s” theo dõi “%s”, thực hiện lệnh sau:\n"
-"\n"
+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/branch.c:831
+#: builtin/add.c:375
 #, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
+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: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 "tập tin ghi bảng mục lục bị hỏng"
+
+#: builtin/am.c:414
+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/branch.c:832
+#: builtin/am.c:491
 #, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "“%s” bị xóa bởi móc applypatch-msg"
 
-#: builtin/bundle.c:51
+#: builtin/am.c:532
 #, c-format
-msgid "%s is okay\n"
-msgstr "“%s” tốt\n"
+msgid "Malformed input line: '%s'."
+msgstr "Dòng đầu vào dị hình: “%s”."
 
-#: builtin/bundle.c:64
-msgid "Need a repository to create a bundle."
-msgstr "Cần một kho chứa để có thể tạo một bundle."
+#: builtin/am.c:569
+#, 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”"
 
-#: builtin/bundle.c:68
-msgid "Need a repository to unbundle."
-msgstr "Cần một kho chứa để có thể giải nén một bundle."
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek gặp lỗi"
 
-#: 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|"
-"<kiểu>|--textconv) <đối_tượng>"
+#: builtin/am.c:775
+#, c-format
+msgid "could not parse patch '%s'"
+msgstr "không thể phân tích cú pháp “%s”"
 
-#: builtin/cat-file.c:429
-msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
-msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+#: builtin/am.c:840
+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/cat-file.c:466
-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/am.c:887
+msgid "invalid timestamp"
+msgstr "dấu thời gian không hợp lệ"
 
-#: builtin/cat-file.c:467
-msgid "show object type"
-msgstr "hiển thị kiểu đối tượng"
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "dòng Ngày tháng không hợp lệ"
 
-#: builtin/cat-file.c:468
-msgid "show object size"
-msgstr "hiển thị kích thước đối tượng"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "độ lệch múi giờ không hợp lệ"
 
-#: builtin/cat-file.c:470
-msgid "exit with zero when there's no error"
-msgstr "thoát với 0 khi không có lỗi"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "Dò tìm định dạng miếng vá gặp lỗi."
 
-#: builtin/cat-file.c:471
-msgid "pretty-print object's content"
-msgstr "in nội dung đối tượng dạng dễ đọc"
+#: builtin/am.c:989 builtin/clone.c:379
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr "tạo thư mục \"%s\" gặp lỗi"
 
-#: builtin/cat-file.c:473
-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/am.c:993
+msgid "Failed to split patches."
+msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
 
-#: builtin/cat-file.c:475
-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/am.c:1125 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/cat-file.c:476
-msgid "buffer --batch output"
-msgstr "đệm kết xuất --batch"
+#: builtin/am.c:1176
+#, 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\"."
 
-#: builtin/cat-file.c:478
-msgid "show info and content of objects fed from the standard input"
+#: builtin/am.c:1177
+#, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
 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:481
-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"
+"Nếu bạn muốn bỏ qua miếng vá này, hãy chạy lệnh \"%s --skip\" để thay thế."
 
-#: builtin/cat-file.c:484
-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/am.c:1178
+#, 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\"."
 
-#: builtin/cat-file.c:486
-msgid "show all objects with --batch or --batch-check"
-msgstr "hiển thị mọi đối tượng với --batch hay --batch-check"
+#: builtin/am.c:1316
+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/check-attr.c:11
-msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
-msgstr "git check-attr [-a | --all | <attr>…] [--] tên-đường-dẫn…"
+#: builtin/am.c:1390 builtin/log.c:1550
+#, c-format
+msgid "invalid ident line: %s"
+msgstr "dòng thụt lề không hợp lệ: %s"
 
-#: builtin/check-attr.c:12
-msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
-msgstr "git check-attr --stdin [-z] [-a | --all | <attr>…]"
+#: builtin/am.c:1417
+#, c-format
+msgid "unable to parse commit %s"
+msgstr "không thể phân tích lần chuyển giao “%s”"
 
-#: builtin/check-attr.c:19
-msgid "report all attributes set on file"
-msgstr "báo cáo tất cả các thuộc tính đặt trên tập tin"
+#: builtin/am.c:1610
+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/check-attr.c:20
-msgid "use .gitattributes only from the index"
-msgstr "chỉ dùng .gitattributes từ bảng mục lục"
+#: builtin/am.c:1612
+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/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:97
-msgid "read file names from stdin"
-msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn"
+#: builtin/am.c:1631
+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/check-attr.c:23 builtin/check-ignore.c:24
-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/am.c:1637
+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/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
-msgid "suppress progress reporting"
-msgstr "chặn các báo cáo tiến trình hoạt động"
+#: builtin/am.c:1662
+msgid "Failed to merge in the changes."
+msgstr "Gặp lỗi khi trộn vào các thay đổi."
 
-#: builtin/check-ignore.c:26
-msgid "show non-matching input paths"
-msgstr "hiển thị những đường dẫn đầu vào không khớp với mẫu"
+#: builtin/am.c:1686 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"
 
-#: builtin/check-ignore.c:28
-msgid "ignore index when checking"
-msgstr "bỏ qua mục lục khi kiểm tra"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "áp dụng vào một lịch sử trống rỗng"
 
-#: builtin/check-ignore.c:154
-msgid "cannot specify pathnames with --stdin"
-msgstr "không thể chỉ định các tên đường dẫn với --stdin"
+#: builtin/am.c:1706 builtin/commit.c:1769 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"
 
-#: builtin/check-ignore.c:157
-msgid "-z only makes sense with --stdin"
-msgstr "-z chỉ hợp lý với --stdin"
+#: builtin/am.c:1739 builtin/am.c:1743
+#, c-format
+msgid "cannot resume: %s does not exist."
+msgstr "không thể phục hồi: %s không tồn tại."
 
-#: builtin/check-ignore.c:159
-msgid "no path specified"
-msgstr "chưa chỉ ra đường dẫn"
+#: builtin/am.c:1759
+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/check-ignore.c:163
-msgid "--quiet is only valid with a single pathname"
-msgstr "--quiet chỉ hợp lệ với tên đường dẫn đơn"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "Thân của lần chuyển giao là:"
 
-#: builtin/check-ignore.c:165
-msgid "cannot have both --quiet and --verbose"
-msgstr "không thể dùng cả hai tùy chọn --quiet và --verbose"
+#. 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 ""
+"Á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/check-ignore.c:168
-msgid "--non-matching is only valid with --verbose"
-msgstr "tùy-chọn --non-matching chỉ hợp lệ khi dùng với --verbose"
+#: builtin/am.c:1824
+#, 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)"
 
-#: builtin/check-mailmap.c:8
-msgid "git check-mailmap [<options>] <contact>..."
-msgstr "git check-mailmap [<các-tùy-chọn>] <danh-bạ>…"
+#: builtin/am.c:1861 builtin/am.c:1933
+#, c-format
+msgid "Applying: %.*s"
+msgstr "Áp dụng: %.*s"
 
-#: builtin/check-mailmap.c:13
-msgid "also read contacts from stdin"
-msgstr "đồng thời đọc các danh bạ từ đầu vào tiêu chuẩn"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
 
-#: builtin/check-mailmap.c:24
+#: builtin/am.c:1885
 #, c-format
-msgid "unable to parse contact: %s"
-msgstr "không thể phân tích danh bạ: “%s”"
+msgid "Patch failed at %s %.*s"
+msgstr "Gặp lỗi khi vá tại %s %.*s"
 
-#: builtin/check-mailmap.c:47
-msgid "no contacts specified"
-msgstr "chưa chỉ ra danh bạ"
+#: builtin/am.c:1891
+#, 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ỗi thì được tìm thấy trong: %s"
 
-#: builtin/checkout-index.c:127
-msgid "git checkout-index [<options>] [--] [<file>...]"
-msgstr "git checkout-index [<các-tùy-chọn>] [--] [<tập-tin>…]"
+#: 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 ""
+"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/checkout-index.c:144
-msgid "stage should be between 1 and 3 or all"
-msgstr "stage nên giữa 1 và 3 hay all"
+#: builtin/am.c:1943
+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/checkout-index.c:160
-msgid "check out all files in the index"
-msgstr "lấy ra toàn bộ các tập tin trong bảng mục lục"
+#: builtin/am.c:2051 builtin/am.c:2055 builtin/am.c:2067 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”."
 
-#: builtin/checkout-index.c:161
-msgid "force overwrite of existing files"
-msgstr "ép buộc ghi đè lên tập tin đã sẵn có từ trước"
+#: builtin/am.c:2103
+msgid "failed to clean index"
+msgstr "gặp lỗi khi dọn bảng mục lục"
 
-#: builtin/checkout-index.c:163
-msgid "no warning for existing files and files not in index"
+#: builtin/am.c:2137
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
 msgstr ""
-"không cảnh báo cho những tập tin tồn tại và không có trong bảng mục lục"
+"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/checkout-index.c:165
-msgid "don't checkout new files"
-msgstr "không checkout các tập tin mới"
+#: builtin/am.c:2200
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "Giá trị không hợp lệ cho --patch-format: %s"
 
-#: builtin/checkout-index.c:167
-msgid "update stat information in the index file"
-msgstr "cập nhật thông tin thống kê trong tập tin lưu bảng mục lục mới"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
 
-#: builtin/checkout-index.c:171
-msgid "read list of paths from the standard input"
-msgstr "đọc danh sách đường dẫn từ đầu vào tiêu chuẩn"
+#: builtin/am.c:2234
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
 
-#: builtin/checkout-index.c:173
-msgid "write the content to temporary files"
-msgstr "ghi nội dung vào tập tin tạm"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "chạy kiểu tương tác"
 
-#: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
-msgid "string"
-msgstr "chuỗi"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "tùy chọn lịch sử -- không-toán-tử"
 
-#: builtin/checkout-index.c:175
-msgid "when creating files, prepend <string>"
-msgstr "khi tạo các tập tin, nối thêm <chuỗi>"
+#: builtin/am.c:2244
+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/checkout-index.c:177
-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/am.c:2245 builtin/init-db.c:483 builtin/prune-packed.c:57
+#: builtin/repack.c:172
+msgid "be quiet"
+msgstr "im lặng"
 
-#: builtin/checkout.c:25
-msgid "git checkout [<options>] <branch>"
-msgstr "git checkout [<các-tùy-chọn>] <nhánh>"
+#: builtin/am.c:2247
+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/checkout.c:26
-msgid "git checkout [<options>] [<branch>] -- <file>..."
-msgstr "git checkout [<các-tùy-chọn>] [<nhánh>] -- <tập-tin>…"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "chuyển mã thành utf8 (mặc định)"
 
-#: builtin/checkout.c:134 builtin/checkout.c:167
-#, 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/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "chuyển cờ -k cho git-mailinfo"
 
-#: builtin/checkout.c:136 builtin/checkout.c:169
-#, 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/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "chuyển cờ -b cho git-mailinfo"
 
-#: builtin/checkout.c:152
-#, 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/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "chuyển cờ -m cho git-mailinfo"
 
-#: builtin/checkout.c:196
-#, 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/am.c:2258
+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/checkout.c:213
-#, c-format
-msgid "path '%s': cannot merge"
-msgstr "đường dẫn “%s”: không thể hòa trộn"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
 
-#: builtin/checkout.c:230
-#, 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/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "cắt mọi thứ trước dòng scissors"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
-#, 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/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 "chuyển nó qua git-apply"
 
-#: builtin/checkout.c:263 builtin/checkout.c:266
-#, c-format
-msgid "'%s' cannot be used with %s"
-msgstr "không được dùng “%s” với %s"
+#: 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/checkout.c:269
-#, 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/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "định dạng"
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "tập tin ghi bảng mục lục bị hỏng"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "định dạng (các) miếng vá theo"
 
-#: builtin/checkout.c:340 builtin/checkout.c:347
-#, c-format
-msgid "path '%s' is unmerged"
-msgstr "đường dẫn “%s” không được hòa trộn"
+#: builtin/am.c:2296
+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/checkout.c:496
-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/am.c:2298
+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/checkout.c:623
-#, 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/am.c:2301
+msgid "synonyms for --continue"
+msgstr "đồng nghĩa với --continue"
 
-#: builtin/checkout.c:661
-msgid "HEAD is now at"
-msgstr "HEAD hiện giờ tại"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "bỏ qua miếng vá hiện hành"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
-msgid "unable to update HEAD"
-msgstr "không thể cập nhật HEAD"
+#: builtin/am.c:2307
+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/checkout.c:669
-#, c-format
-msgid "Reset branch '%s'\n"
-msgstr "Đặt lại nhánh “%s”\n"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "nói dối về ngày chuyển giao"
 
-#: builtin/checkout.c:672
-#, c-format
-msgid "Already on '%s'\n"
-msgstr "Đã sẵn sàng trên “%s”\n"
+#: builtin/am.c:2313
+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/checkout.c:676
-#, c-format
-msgid "Switched to and reset branch '%s'\n"
-msgstr "Đã chuyển tới và đặt lại nhánh “%s”\n"
+#: 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 "mã-số-khóa"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
-#, c-format
-msgid "Switched to a new branch '%s'\n"
-msgstr "Đã chuyển đến nhánh mới “%s”\n"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "lần chuyển giao ký-GPG"
 
-#: builtin/checkout.c:680
-#, c-format
-msgid "Switched to branch '%s'\n"
-msgstr "Đã chuyển đến nhánh “%s”\n"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(dùng nội bộ cho git-rebase)"
 
-#: builtin/checkout.c:732
-#, c-format
-msgid " ... and %d more.\n"
-msgstr " … và nhiều hơn %d.\n"
+#: 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 ""
+"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/checkout.c:738
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "gặp lỗi đọc bảng mục lục"
+
+#: builtin/am.c:2356
 #, 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] ""
-"Cảnh báo: bạn đã rời bỏ %d lần chuyển giao lại đằng sau, không được kết nối "
-"đến\n"
-"bất kỳ nhánh nào của bạn:\n"
-"\n"
-"%s\n"
+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/checkout.c:757
+#: builtin/am.c:2380
 #, 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ếu bạn muốn giữ (chúng) nó bằng cách tạo ra một nhánh mới, đây có lẽ là\n"
-"một thời điểm thích hợp để làm thế bằng lệnh:\n"
-"\n"
-" git branch <tên_nhánh_mới> %s\n"
-"\n"
-
-#: builtin/checkout.c:793
-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"
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"Tìm thấy thư mục lạc %s.\n"
+"Dùng \"git am --abort\" để loại bỏ nó đi."
 
-#: builtin/checkout.c:797
-msgid "Previous HEAD position was"
-msgstr "Vị trí trước kia của HEAD là"
+#: builtin/am.c:2386
+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/checkout.c:824 builtin/checkout.c:1063
-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/apply.c:8
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<các-tùy-chọn>] [<miếng-vá>…]"
 
-#: builtin/checkout.c:969
+#: builtin/archive.c:17
 #, 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."
+msgid "could not create archive file '%s'"
+msgstr "không thể tạo tập tin kho (lưu trữ, nén) “%s”"
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
-#, c-format
-msgid "invalid reference: %s"
-msgstr "tham chiếu không hợp lệ: %s"
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr "không thể chuyển hướng kết xuất"
 
-#: builtin/checkout.c:1038
-#, c-format
-msgid "reference is not a tree: %s"
-msgstr "tham chiếu không phải là một cây:%s"
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: Máy chủ không có địa chỉ URL"
 
-#: builtin/checkout.c:1077
-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/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: cần ACK/NAK, nhưng lại nhận được EOF"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/archive.c:61
 #, 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"
+msgid "git archive: NACK %s"
+msgstr "git archive: NACK %s"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: builtin/archive.c:63
 #, c-format
-msgid "'%s' cannot be used with '%s'"
-msgstr "“%s” không thể được dùng với “%s”"
+msgid "remote error: %s"
+msgstr "lỗi máy chủ: %s"
 
-#: builtin/checkout.c:1104
-#, 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/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: lỗi giao thức"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
-msgid "branch"
-msgstr "nhánh"
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: cần một flush (đẩy dữ liệu lên đĩa)"
 
-#: builtin/checkout.c:1138
-msgid "create and checkout a new branch"
-msgstr "tạo và checkout một nhánh mới"
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
 
-#: builtin/checkout.c:1140
-msgid "create/reset and checkout a branch"
-msgstr "tạo/đặt_lại và checkout một nhánh"
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "thực hiện “git bisect next”"
 
-#: builtin/checkout.c:1141
-msgid "create reflog for new branch"
-msgstr "tạo reflog cho nhánh mới"
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr ""
+"cập nhật BISECT_HEAD thay vì lấy ra (checking out) lần chuyển giao hiện hành"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "rời bỏ HEAD tại lần chuyển giao danh nghĩa"
+#: builtin/blame.c:33
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+msgstr "git blame [<các-tùy-chọn>] [<rev-opts>] [<rev>] [--] <tập-tin>"
 
-#: builtin/checkout.c:1143
-msgid "set upstream info for new branch"
-msgstr "đặt thông tin thượng nguồn cho nhánh mới"
+#: builtin/blame.c:38
+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/checkout.c:1145
-msgid "new-branch"
-msgstr "nhánh-mới"
+#: builtin/blame.c:1781
+msgid "Blaming lines"
+msgstr "Các dòng blame"
 
-#: builtin/checkout.c:1145
-msgid "new unparented branch"
-msgstr "nhánh không cha mới"
+#: builtin/blame.c:2577
+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/checkout.c:1146
-msgid "checkout our version for unmerged files"
+#: builtin/blame.c:2578
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
 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"
+"Hiển thị SHA-1 trắng cho những lần chuyển giao biên giới (Mặc định: off)"
 
-#: builtin/checkout.c:1148
-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/blame.c:2579
+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/checkout.c:1150
-msgid "force checkout (throw away local modifications)"
-msgstr "ép buộc lấy ra (bỏ đi những thay đổi nội bộ)"
+#: builtin/blame.c:2580
+msgid "Show work cost statistics"
+msgstr "Hiển thị thống kê công sức làm việc"
 
-#: builtin/checkout.c:1151
-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/blame.c:2581
+msgid "Force progress reporting"
+msgstr "Ép buộc báo cáo tiến triển công việc"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
-msgid "update ignored files (default)"
-msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
+#: builtin/blame.c:2582
+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/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
-msgid "style"
-msgstr "kiểu"
+#: builtin/blame.c:2583
+msgid "Show original filename (Default: auto)"
+msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
 
-#: builtin/checkout.c:1154
-msgid "conflict style (merge or diff3)"
-msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
+#: builtin/blame.c:2584
+msgid "Show original linenumber (Default: off)"
+msgstr "Hiển thị số dòng gốc (Mặc định: off)"
 
-#: builtin/checkout.c:1157
-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/blame.c:2585
+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/checkout.c:1159
-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/blame.c:2586
+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/checkout.c:1161
-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/blame.c:2587
+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/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 builtin/push.c:526
-#: builtin/send-pack.c:168
-msgid "force progress reporting"
-msgstr "ép buộc báo cáo tiến triển công việc"
+#: builtin/blame.c:2588
+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/checkout.c:1193
-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/blame.c:2589
+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/checkout.c:1210
-msgid "--track needs a branch name"
-msgstr "--track cần tên một nhánh"
+#: builtin/blame.c:2590
+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/checkout.c:1215
-msgid "Missing branch name; try -b"
-msgstr "Thiếu tên nhánh; hãy thử -b"
+#: builtin/blame.c:2591
+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/checkout.c:1251
-msgid "invalid path specification"
-msgstr "đường dẫn đã cho không hợp lệ"
+#: builtin/blame.c:2592
+msgid "Ignore whitespace differences"
+msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra"
 
-#: builtin/checkout.c:1258
-#, 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:2599
+msgid "Use an experimental indent-based heuristic to improve diffs"
+msgstr "Dùng một phỏng đoán dựa trên thụt lề thử nghiệm để tăng cường các diff"
+
+#: builtin/blame.c:2600
+msgid "Use an experimental blank-line-based heuristic to improve diffs"
 msgstr ""
-"Không thể cập nhật và chuyển thành nhánh “%s” cùng lúc\n"
-"Bạn đã có ý định checkout “%s” cái mà không thể được phân giải như là lần "
-"chuyển giao?"
+"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"
 
-#: builtin/checkout.c:1263
-#, 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/blame.c:2602
+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/checkout.c:1267
-msgid ""
-"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
-"checking out of the index."
+#: builtin/blame.c:2603
+msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr ""
-"git checkout: --ours/--theirs, --force và --merge là xung khắc với nhau khi\n"
-"checkout bảng mục lục (index)."
+"Sử dụng điểm xét duyệt (revision) từ <tập tin> thay vì gọi “git-rev-list”"
 
-#: 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 <mẫu>] [-x | -X] [--] <đường-dẫn>…"
+#: builtin/blame.c:2604
+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/clean.c:29
-#, c-format
-msgid "Removing %s\n"
-msgstr "Đang gỡ bỏ %s\n"
+#: builtin/blame.c:2605 builtin/blame.c:2606
+msgid "score"
+msgstr "điểm số"
 
-#: builtin/clean.c:30
-#, c-format
-msgid "Would remove %s\n"
-msgstr "Có thể gỡ bỏ %s\n"
+#: builtin/blame.c:2605
+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/clean.c:31
-#, c-format
-msgid "Skipping repository %s\n"
-msgstr "Đang bỏ qua kho chứa %s\n"
+#: builtin/blame.c:2606
+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/clean.c:32
-#, c-format
-msgid "Would skip repository %s\n"
-msgstr "Nên bỏ qua kho chứa %s\n"
+#: builtin/blame.c:2607
+msgid "n,m"
+msgstr "n,m"
 
-#: builtin/clean.c:33
-#, c-format
-msgid "failed to remove %s"
-msgstr "gặp lỗi khi gỡ bỏ %s"
+#: builtin/blame.c:2607
+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/clean.c:291
-msgid ""
-"Prompt help:\n"
-"1          - select a numbered item\n"
-"foo        - select item based on unique prefix\n"
-"           - (empty) select nothing"
+#: builtin/blame.c:2654
+msgid "--progress can't be used with --incremental or porcelain formats"
 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ả"
+"--progress không được dùng cùng với --incremental hay các định dạng porcelain"
 
-#: builtin/clean.c:295
+#. 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:2700
+msgid "4 years, 11 months ago"
+msgstr "4 năm, 11 tháng trước"
+
+#: builtin/blame.c:2780
+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:2800
+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:2805
+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:2832
 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"
+"--reverse --first-parent together require range along first-parent chain"
 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"
-"*          - chọn tất\n"
-"           - (để trống) kết thúc việc chọn"
+"--reverse --first-parent cùng nhau yêu cầu vùng cùng với chuỗi cha-mẹ-đầu-"
+"tiên"
 
-#: builtin/clean.c:511
+#: builtin/blame.c:2843
 #, c-format
-msgid "Huh (%s)?"
-msgstr "Hả (%s)?"
+msgid "no such path %s in %s"
+msgstr "không có đường dẫn %s trong “%s”"
 
-#: builtin/clean.c:653
+#: builtin/blame.c:2854
 #, c-format
-msgid "Input ignore patterns>> "
-msgstr "Mẫu để lọc các tập tin đầu vào cần lờ đi>> "
+msgid "cannot read blob %s for path %s"
+msgstr "không thể đọc blob %s cho đường dẫn “%s”"
 
-#: builtin/clean.c:690
+#: builtin/blame.c:2873
 #, 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"
+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/clean.c:711
-msgid "Select items to delete"
-msgstr "Chọn mục muốn xóa"
+#: 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]"
 
-#. TRANSLATORS: Make sure to keep [y/N] as is
-#: builtin/clean.c:752
-#, c-format
-msgid "Remove %s [y/N]? "
-msgstr "Xóa bỏ “%s” [y/N]? "
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+msgstr "git branch [<các-tùy-chọn>] [-l] [-f] <tên-nhánh> [<điểm-đầu>]"
 
-#: builtin/clean.c:777
-msgid "Bye."
-msgstr "Tạm biệt."
-
-#: 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               - bắt đầu dọn dẹp\n"
-"filter by pattern   - loại trừ các mục khỏi việc xóa\n"
-"select by numbers   - chọn các mục cần xóa bằng số\n"
-"ask each            - xác nhận trước mỗi lần xóa (giống như \"rm -i\")\n"
-"quit                - dừng việc dọn dẹp lại\n"
-"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
-msgid "*** Commands ***"
-msgstr "*** Lệnh ***"
-
-#: builtin/clean.c:813
-msgid "What now"
-msgstr "Giờ thì sao"
-
-#: builtin/clean.c:821
-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
-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
-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
-msgid "force"
-msgstr "ép buộc"
-
-#: builtin/clean.c:872
-msgid "interactive cleaning"
-msgstr "dọn bằng kiểu tương tác"
-
-#: builtin/clean.c:874
-msgid "remove whole directories"
-msgstr "gỡ bỏ toàn bộ thư mục"
-
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 builtin/show-ref.c:182
-msgid "pattern"
-msgstr "mẫu"
-
-#: builtin/clean.c:876
-msgid "add <pattern> to ignore rules"
-msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
-
-#: builtin/clean.c:877
-msgid "remove ignored files, too"
-msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
+#: builtin/branch.c:28
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+msgstr "git branch [<các-tùy-chọn>] [-r] (-d | -D) <tên-nhánh> …"
 
-#: builtin/clean.c:879
-msgid "remove only ignored files"
-msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
+#: builtin/branch.c:29
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+msgstr "git branch [<các-tùy-chọn>] (-m | -M) [<nhánh-cũ>] <nhánh-mới>"
 
-#: builtin/clean.c:897
-msgid "-x and -X cannot be used together"
-msgstr "-x và -X không thể dùng cùng nhau"
+#: builtin/branch.c:30
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<các-tùy-chọn>] [-r | -a] [--points-at]"
 
-#: builtin/clean.c:901
+#: builtin/branch.c:143
+#, c-format
 msgid ""
-"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
-"clean"
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
 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)"
+"đ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/clean.c:904
+#: builtin/branch.c:147
+#, c-format
 msgid ""
-"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
-"refusing to clean"
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
 msgstr ""
-"clean.requireForce mặc định được đặt là 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)"
+"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/clone.c:37
-msgid "git clone [<options>] [--] <repo> [<dir>]"
-msgstr "git clone [<các-tùy-chọn>] [--] <kho> [<t.mục>]"
+#: builtin/branch.c:161
+#, 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/clone.c:60
-msgid "don't create a checkout"
-msgstr "không tạo một checkout"
+#: 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 ""
+"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/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
-msgid "create a bare repository"
-msgstr "tạo kho thuần"
+#: builtin/branch.c:178
+msgid "Update of config-file failed"
+msgstr "Cập nhật tập tin cấu hình gặp lỗi"
 
-#: builtin/clone.c:65
-msgid "create a mirror repository (implies bare)"
-msgstr "tạo kho bản sao (ý là kho thuần)"
+#: builtin/branch.c:206
+msgid "cannot use -a with -d"
+msgstr "không thể dùng tùy chọn -a với -d"
 
-#: builtin/clone.c:67
-msgid "to clone from a local repository"
-msgstr "để nhân bản từ kho nội bộ"
+#: builtin/branch.c:212
+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/clone.c:69
-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/branch.c:226
+#, 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/clone.c:71
-msgid "setup as shared repository"
-msgstr "cài đặt đây là kho chia sẻ"
+#: builtin/branch.c:241
+#, 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/clone.c:73 builtin/clone.c:75
-msgid "initialize submodules in the clone"
-msgstr "khởi tạo mô-đun-con trong bản sao"
+#: builtin/branch.c:242
+#, c-format
+msgid "branch '%s' not found."
+msgstr "không tìm thấy nhánh “%s”."
 
-#: builtin/clone.c:76 builtin/init-db.c:466
-msgid "template-directory"
-msgstr "thư-mục-mẫu"
+#: builtin/branch.c:257
+#, 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/clone.c:77 builtin/init-db.c:467
-msgid "directory from which templates will be used"
-msgstr "thư mục mà tại đó các mẫu sẽ được dùng"
+#: builtin/branch.c:258
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr "Gặp lỗi khi xóa bỏ nhánh “%s”"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
-msgid "reference repository"
-msgstr "kho tham chiếu"
+#: builtin/branch.c:265
+#, 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/clone.c:81
-msgid "use --reference only while cloning"
-msgstr "chỉ dùng --reference khi nhân bản"
+#: builtin/branch.c:266
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
+msgstr "Nhánh “%s” đã bị xóa (từng là %s)\n"
 
-#: builtin/clone.c:82 builtin/column.c:26 builtin/merge-file.c:44
-msgid "name"
-msgstr "tên"
+#: builtin/branch.c:312
+#, c-format
+msgid "[%s: gone]"
+msgstr "[%s: đã ra đi]"
 
-#: builtin/clone.c:83
-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/branch.c:317
+#, c-format
+msgid "[%s]"
+msgstr "[%s]"
 
-#: builtin/clone.c:85
-msgid "checkout <branch> instead of the remote's HEAD"
-msgstr "lấy ra <nhánh> thay cho HEAD của máy chủ"
+#: builtin/branch.c:322
+#, c-format
+msgid "[%s: behind %d]"
+msgstr "[%s: đứng sau %d]"
 
-#: builtin/clone.c:87
-msgid "path to git-upload-pack on the remote"
-msgstr "đường dẫn đến git-upload-pack trên máy chủ"
+#: builtin/branch.c:324
+#, c-format
+msgid "[behind %d]"
+msgstr "[đằng sau %d]"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665 builtin/pull.c:193
-msgid "depth"
-msgstr "độ-sâu"
+#: builtin/branch.c:328
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr "[%s: phía trước %d]"
 
-#: builtin/clone.c:89
-msgid "create a shallow clone of that depth"
-msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
+#: builtin/branch.c:330
+#, c-format
+msgid "[ahead %d]"
+msgstr "[phía trước %d]"
 
-#: builtin/clone.c:91
-msgid "clone only one branch, HEAD or --branch"
-msgstr "chỉ nhân bản một nhánh, HEAD hoặc --branch"
+#: builtin/branch.c:333
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr "[%s: trước %d, sau %d]"
 
-#: builtin/clone.c:92 builtin/init-db.c:475
-msgid "gitdir"
-msgstr "gitdir"
+#: builtin/branch.c:336
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr "[trước %d, sau %d]"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
-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/branch.c:349
+msgid " **** invalid ref ****"
+msgstr " **** tham chiếu không hợp lệ ****"
 
-#: builtin/clone.c:94
-msgid "key=value"
-msgstr "khóa=giá_trị"
+#: builtin/branch.c:375
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(không nhánh, đang cải tổ %s)"
 
-#: builtin/clone.c:95
-msgid "set config inside the new repository"
-msgstr "đặt cấu hình bên trong một kho chứa mới"
+#: 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)"
 
-#: builtin/clone.c:96 builtin/fetch.c:131 builtin/push.c:536
-msgid "use IPv4 addresses only"
-msgstr "chỉ dùng địa chỉ IPv4"
+#. 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)"
 
-#: builtin/clone.c:98 builtin/fetch.c:133 builtin/push.c:538
-msgid "use IPv6 addresses only"
-msgstr "chỉ dùng địa chỉ IPv6"
+#. 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/clone.c:239
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-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/branch.c:393
+msgid "(no branch)"
+msgstr "(không nhánh)"
 
-#: builtin/clone.c:305
+#: builtin/branch.c:544
 #, 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ợ."
+msgid "Branch %s is being rebased at %s"
+msgstr "Nhánh %s đang được cải tổ lại tại %s"
 
-#: builtin/clone.c:307
+#: builtin/branch.c:548
 #, 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ộ."
+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/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "kho tham chiếu “%s” là nông"
+#: builtin/branch.c:563
+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/clone.c:315
+#: builtin/branch.c:573
 #, c-format
-msgid "reference repository '%s' is grafted"
-msgstr "kho tham chiếu “%s” bị cấy ghép"
+msgid "Invalid branch name: '%s'"
+msgstr "Tên nhánh không hợp lệ: “%s”"
+
+#: builtin/branch.c:590
+msgid "Branch rename failed"
+msgstr "Gặp lỗi khi đổi tên nhánh"
 
-#: builtin/clone.c:380 builtin/diff.c:84
+#: builtin/branch.c:594
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "gặp lỗi khi lấy thống kê về “%s”"
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "Đã đổi tên nhánh khuyết danh “%s” đi"
 
-#: builtin/clone.c:382
+#: builtin/branch.c:597
 #, 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"
+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/clone.c:396
-#, 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/branch.c:604
+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/clone.c:418
+#: builtin/branch.c:620
 #, c-format
-msgid "failed to create link '%s'"
-msgstr "gặp lỗi khi tạo được liên kết mềm %s"
+msgid ""
+"Please edit the description for the branch\n"
+"  %s\n"
+"Lines starting with '%c' will be stripped.\n"
+msgstr ""
+"Viết các ghi chú cho nhánh:\n"
+"  %s\n"
+"Những dòng được bắt đầu bằng “%c” sẽ được cắt bỏ.\n"
 
-#: builtin/clone.c:422
-#, c-format
-msgid "failed to copy file to '%s'"
-msgstr "gặp lỗi khi sao chép tập tin và “%s”"
+#: builtin/branch.c:651
+msgid "Generic options"
+msgstr "Tùy chọn chung"
 
-#: builtin/clone.c:447 builtin/clone.c:631
-#, c-format
-msgid "done.\n"
-msgstr "hoàn tất.\n"
+#: builtin/branch.c:653
+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/clone.c:459
-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 ""
-"Việc nhân bản thành công, nhưng checkout gặp lỗi.\n"
-"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/branch.c:654
+msgid "suppress informational messages"
+msgstr "không xuất các thông tin"
 
-#: builtin/clone.c:536
-#, 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/branch.c:655
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "cài đặt chế độ theo dõi (xem git-pull(1))"
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "Đang kiểm tra kết nối… "
+#: builtin/branch.c:657
+msgid "change upstream info"
+msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/clone.c:629
-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/branch.c:659
+msgid "upstream"
+msgstr "thượng nguồn"
 
-#: builtin/clone.c:647
-#, c-format
-msgid "unable to update %s"
-msgstr "không thể cập nhật %s"
+#: builtin/branch.c:659
+msgid "change the upstream info"
+msgstr "thay đổi thông tin thượng nguồn"
 
-#: builtin/clone.c:696
-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/branch.c:660
+msgid "Unset the upstream info"
+msgstr "Bỏ đặt thông tin thượng nguồn"
 
-#: builtin/clone.c:727
-msgid "unable to checkout working tree"
-msgstr "không thể lấy ra (checkout) cây làm việc"
+#: builtin/branch.c:661
+msgid "use colored output"
+msgstr "tô màu kết xuất"
 
-#: builtin/clone.c:753
-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/branch.c:662
+msgid "act on remote-tracking branches"
+msgstr "thao tác trên nhánh “remote-tracking”"
 
-#: builtin/clone.c:816
-msgid "cannot repack to clean up"
-msgstr "không thể đóng gói để dọn dẹp"
+#: builtin/branch.c:664 builtin/branch.c:665
+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/clone.c:818
-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/branch.c:668
+msgid "Specific git-branch actions:"
+msgstr "Hành động git-branch:"
 
-#: builtin/clone.c:850
-msgid "Too many arguments."
-msgstr "Có quá nhiều đối số."
+#: builtin/branch.c:669
+msgid "list both remote-tracking and local branches"
+msgstr "liệt kê cả nhánh “remote-tracking” và nội bộ"
 
-#: builtin/clone.c:854
-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/branch.c:671
+msgid "delete fully merged branch"
+msgstr "xóa một toàn bộ nhánh đã hòa trộn"
 
-#: builtin/clone.c:865
-#, c-format
-msgid "--bare and --origin %s options are incompatible."
-msgstr "tùy chọn --bare và --origin %s xung khắc nhau."
+#: builtin/branch.c:672
+msgid "delete branch (even if not merged)"
+msgstr "xóa nhánh (cho dù là chưa được hòa trộn)"
 
-#: builtin/clone.c:868
-msgid "--bare and --separate-git-dir are incompatible."
-msgstr "tùy chọn --bare và --separate-git-dir xung khắc nhau."
+#: builtin/branch.c:673
+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/clone.c:881
-#, c-format
-msgid "repository '%s' does not exist"
-msgstr "kho chứa “%s” chưa tồn tại"
+#: builtin/branch.c:674
+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/clone.c:887 builtin/fetch.c:1174
-#, 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/branch.c:675
+msgid "list branch names"
+msgstr "liệt kê các tên nhánh"
 
-#: builtin/clone.c:897
-#, 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/branch.c:676
+msgid "create the branch's reflog"
+msgstr "tạo reflog của nhánh"
 
-#: builtin/clone.c:907
-#, 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/branch.c:678
+msgid "edit the description for the branch"
+msgstr "sửa mô tả cho nhánh"
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
-#, 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/branch.c:679
+msgid "force creation, move/rename, deletion"
+msgstr "buộc tạo, di chuyển/đổi tên, xóa"
 
-#: builtin/clone.c:925
-#, 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/branch.c:680
+msgid "print only branches that are merged"
+msgstr "chỉ hiển thị những nhánh mà nó được hòa trộn"
 
-#: builtin/clone.c:943
-#, c-format
-msgid "Cloning into bare repository '%s'...\n"
-msgstr "Đang nhân bản thành kho chứa bare “%s”…\n"
+#: builtin/branch.c:681
+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/clone.c:945
-#, c-format
-msgid "Cloning into '%s'...\n"
-msgstr "Đang nhân bản thành “%s”…\n"
+#: builtin/branch.c:682
+msgid "list branches in columns"
+msgstr "liệt kê các nhánh trong các cột"
 
-#: builtin/clone.c:984
-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/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "khóa"
 
-#: builtin/clone.c:987
-msgid "source repository is shallow, ignoring --local"
-msgstr "kho nguồn là nông, nên bỏ qua --local"
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "tên trường cần sắp xếp"
 
-#: builtin/clone.c:992
-msgid "--local is ignored"
-msgstr "--local bị lờ đi"
+#: 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 "đối tượng"
+
+#: builtin/branch.c:687
+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
+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:706
+msgid "HEAD not found below refs/heads!"
+msgstr "không tìm thấy HEAD ở dưới refs/heads!"
+
+#: builtin/branch.c:729
+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
+msgid "branch name required"
+msgstr "cần chỉ ra tên nhánh"
+
+#: builtin/branch.c:758
+msgid "Cannot give description to detached HEAD"
+msgstr "Không thể đưa ra mô tả HEAD đã tách rời"
+
+#: builtin/branch.c:763
+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/clone.c:996
+#: builtin/branch.c:770
 #, 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"
+msgid "No commit on branch '%s' yet."
+msgstr "Vẫn chưa chuyển giao trên nhánh “%s”."
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: builtin/branch.c:773
 #, 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"
+msgid "No branch named '%s'."
+msgstr "Không có nhánh nào có tên “%s”."
 
-#: builtin/clone.c:1056
-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."
+#: builtin/branch.c:788
+msgid "too many branches for a rename operation"
+msgstr "quá nhiều nhánh dành cho thao tác đổi tên"
 
-#: builtin/column.c:9
-msgid "git column [<options>]"
-msgstr "git column [<các-tùy-chọn>]"
+#: builtin/branch.c:793
+msgid "too many branches to set new upstream"
+msgstr "quá nhiều nhánh được đặt cho thượng nguồn mới"
 
-#: builtin/column.c:26
-msgid "lookup config vars"
-msgstr "tìm kiếm biến cấu hình"
+#: builtin/branch.c:797
+#, c-format
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
+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/column.c:27 builtin/column.c:28
-msgid "layout to use"
-msgstr "bố cục để dùng"
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
+#, c-format
+msgid "no such branch '%s'"
+msgstr "không có nhánh nào như thế “%s”"
 
-#: builtin/column.c:29
-msgid "Maximum width"
-msgstr "Độ rộng tối đa"
+#: builtin/branch.c:804
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr "chưa có nhánh “%s”"
 
-#: builtin/column.c:30
-msgid "Padding space on left border"
-msgstr "Chèn thêm khoảng trống vào bên trái"
+#: builtin/branch.c:816
+msgid "too many branches to unset upstream"
+msgstr "quá nhiều nhánh để bỏ đặt thượng nguồn"
 
-#: builtin/column.c:31
-msgid "Padding space on right border"
-msgstr "Chèn thêm khoảng trắng vào bên phải"
+#: builtin/branch.c:820
+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/column.c:32
-msgid "Padding space between columns"
-msgstr "Chèn thêm khoảng trắng giữa các cột"
+#: builtin/branch.c:826
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr "Nhánh “%s” không có thông tin thượng nguồn"
 
-#: builtin/column.c:51
-msgid "--command must be the first argument"
-msgstr "--command phải là đối số đầu tiên"
+#: builtin/branch.c:840
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "không hợp lý khi tạo “HEAD” thủ công"
 
-#: builtin/commit.c:38
-msgid "git commit [<options>] [--] <pathspec>..."
-msgstr "git commit [<các-tùy-chọn>] [--] <pathspec>…"
+#: builtin/branch.c:846
+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/commit.c:43
-msgid "git status [<options>] [--] <pathspec>..."
-msgstr "git status [<các-tùy-chọn>] [--] <pathspec>…"
+#: builtin/branch.c:849
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+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/commit.c:48
+#: builtin/branch.c:866
+#, c-format
 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"
+"If you wanted to make '%s' track '%s', do this:\n"
 "\n"
-"    git commit --amend --reset-author\n"
 msgstr ""
-"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
-"sở\n"
-"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
-"xác không.\n"
-"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
-"trên\n"
-"một cách rõ ràng. Chạy lệnh sau đây là theo các hướng dẫn trong bộ soạn "
-"thảo\n"
-"để chỉnh sửa tập tin cấu hình của mình:\n"
 "\n"
-"    git config --global --edit\n"
-"\n"
-"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho\n"
-"lần chuyển giao này với lệnh:\n"
+"Nếu bạn muốn “%s” theo dõi “%s”, thực hiện lệnh sau:\n"
 "\n"
-"    git commit --amend --reset-author\n"
 
-#: 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 ""
-"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
-"sở\n"
-"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
-"xác không.\n"
-"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
-"trên một cách rõ ràng:\n"
-"\n"
-"    git config --global user.name \"Tên của bạn\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho lần "
-"chuyển giao này với lệnh:\n"
-"\n"
-"    git commit --amend --reset-author\n"
+#: builtin/bundle.c:51
+#, c-format
+msgid "%s is okay\n"
+msgstr "“%s” tốt\n"
 
-#: 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 ""
-"Bạn đã yêu cầu amend (“tu bổ”) phần lớn các lần chuyển giao gần đây, nhưng "
-"làm như thế\n"
-"có thể làm cho nó trở nên trống rỗng. Bạn có thể lặp lại lệnh của mình bằng "
-"--allow-empty,\n"
-"hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n"
-"\"git reset HEAD^\".\n"
+#: builtin/bundle.c:64
+msgid "Need a repository to create a bundle."
+msgstr "Cần một kho chứa để có thể tạo một bundle."
 
-#: builtin/commit.c:78
+#: builtin/bundle.c:68
+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:513
 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"
+"git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -"
+"p | <type> | --textconv | --filters) [--path=<path>] <object>"
 msgstr ""
-"Lần cherry-pick trước hiện nay trống rỗng, có lẽ là bởi vì sự phân giải xung "
-"đột.\n"
-"Nếu bạn vẫn muốn chuyển giao nó cho dù thế nào đi nữa, hãy dùng:\n"
-"\n"
-"    git commit --allow-empty\n"
-"\n"
+"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/commit.c:85
-msgid "Otherwise, please use 'git reset'\n"
-msgstr "Nếu không được thì dùng lệnh \"git reset\"\n"
-
-#: builtin/commit.c:88
+#: builtin/cat-file.c:514
 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"
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 msgstr ""
-"Nếu bạn muốn bỏ qua lần chuyển giao này thì dùng:\n"
-"\n"
-"    git reset\n"
-"\n"
-"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"
+"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
+"filters]"
 
-#: builtin/commit.c:305
-msgid "failed to unpack HEAD tree object"
-msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây"
+#: 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/commit.c:346
-msgid "unable to create temporary index"
-msgstr "không thể tạo bảng mục lục tạm thời"
+#: builtin/cat-file.c:552
+msgid "show object type"
+msgstr "hiển thị kiểu đối tượng"
 
-#: builtin/commit.c:352
-msgid "interactive add failed"
-msgstr "gặp lỗi khi thêm bằng cách tương"
+#: builtin/cat-file.c:553
+msgid "show object size"
+msgstr "hiển thị kích thước đối tượng"
 
-#: builtin/commit.c:365
-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/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/commit.c:367
-msgid "Failed to update main cache tree"
-msgstr "Gặp lỗi khi cập nhật cây bộ nhớ đệm"
+#: builtin/cat-file.c:556
+msgid "pretty-print object's content"
+msgstr "in nội dung đối tượng dạng dễ đọc"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
-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/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/commit.c:445
-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/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/commit.c:447
-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/cat-file.c:561 git-submodule.sh:923
+msgid "blob"
+msgstr "blob"
 
-#: builtin/commit.c:456
-msgid "cannot read the index"
-msgstr "không đọc được bảng mục lục"
+#: 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/commit.c:475
-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/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/commit.c:580
-#, c-format
-msgid "commit '%s' lacks author header"
-msgstr "lần chuyển giao “%s” thiếu phần tác giả ở đầu"
+#: builtin/cat-file.c:565
+msgid "buffer --batch output"
+msgstr "đệm kết xuất --batch"
 
-#: builtin/commit.c:582
-#, 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/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/commit.c:601
-msgid "malformed --author parameter"
-msgstr "đối số cho --author bị dị hình"
+#: 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/commit.c:609
-#, c-format
-msgid "invalid date format: %s"
-msgstr "ngày tháng không hợp lệ: %s"
+#: 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/commit.c:653
-msgid ""
-"unable to select a comment character that is not used\n"
-"in the current commit message"
-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/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"
 
-#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
-#, c-format
-msgid "could not lookup commit %s"
-msgstr "không thể tìm kiếm commit (lần chuyển giao) %s"
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+msgstr "git check-attr [-a | --all | <attr>…] [--] tên-đường-dẫn…"
 
-#: builtin/commit.c:702 builtin/shortlog.c:285
-#, 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/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <attr>…]"
 
-#: builtin/commit.c:704
-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/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "báo cáo tất cả các thuộc tính đặt trên tập tin"
 
-#: builtin/commit.c:708
-#, c-format
-msgid "could not read log file '%s'"
-msgstr "không đọc được tệp nhật ký “%s”"
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "chỉ dùng .gitattributes từ bảng mục lục"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "không thể đọc MERGE_MSG"
+#: 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"
 
-#: builtin/commit.c:734
-msgid "could not read SQUASH_MSG"
-msgstr "không thể đọc SQUASH_MSG"
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+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/commit.c:785
-msgid "could not write commit template"
-msgstr "không thể ghi mẫu chuyển giao"
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
+msgid "suppress progress reporting"
+msgstr "chặn các báo cáo tiến trình hoạt động"
 
-#: builtin/commit.c:803
-#, 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ó trông giống với việc bạn đang chuyển giao một lần hòa trộn.\n"
-"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n"
-"\t%s\n"
-"và thử lại.\n"
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "hiển thị những đường dẫn đầu vào không khớp với mẫu"
 
-#: builtin/commit.c:808
-#, 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ó trông giống với việc bạn đang chuyển giao một lần cherry-pick.\n"
-"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n"
-"\t%s\n"
-"và thử lại.\n"
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "bỏ qua mục lục khi kiểm tra"
 
-#: builtin/commit.c:821
-#, 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 ""
-"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng "
-"được\n"
-"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/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "không thể chỉ định các tên đường dẫn với --stdin"
 
-#: builtin/commit.c:828
-#, 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"
-msgstr ""
-"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng "
-"được\n"
-"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/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "-z chỉ hợp lý với --stdin"
 
-#: builtin/commit.c:848
-#, c-format
-msgid "%sAuthor:    %.*s <%.*s>"
-msgstr "%sTác giả:           %.*s <%.*s>"
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "chưa chỉ ra đường dẫn"
 
-#: builtin/commit.c:856
-#, c-format
-msgid "%sDate:      %s"
-msgstr "%sNgày tháng:        %s"
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "--quiet chỉ hợp lệ với tên đường dẫn đơn"
 
-#: builtin/commit.c:863
-#, c-format
-msgid "%sCommitter: %.*s <%.*s>"
-msgstr "%sNgười chuyển giao: %.*s <%.*s>"
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "không thể dùng cả hai tùy chọn --quiet và --verbose"
 
-#: builtin/commit.c:881
-msgid "Cannot read index"
-msgstr "Không đọc được bảng mục lục"
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "tùy-chọn --non-matching chỉ hợp lệ khi dùng với --verbose"
 
-#: builtin/commit.c:938
-msgid "Error building trees"
-msgstr "Gặp lỗi khi xây dựng cây"
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
+msgstr "git check-mailmap [<các-tùy-chọn>] <danh-bạ>…"
 
-#: builtin/commit.c:953 builtin/tag.c:266
-#, 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/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "đồng thời đọc các danh bạ từ đầu vào tiêu chuẩn"
 
-#: builtin/commit.c:1055
+#: builtin/check-mailmap.c:24
 #, 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ó"
+msgid "unable to parse contact: %s"
+msgstr "không thể phân tích danh bạ: “%s”"
 
-#: builtin/commit.c:1070 builtin/commit.c:1310
-#, 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/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "chưa chỉ ra danh bạ"
 
-#: builtin/commit.c:1107
-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/checkout-index.c:127
+msgid "git checkout-index [<options>] [--] [<file>...]"
+msgstr "git checkout-index [<các-tùy-chọn>] [--] [<tập-tin>…]"
 
-#: builtin/commit.c:1137
-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/checkout-index.c:144
+msgid "stage should be between 1 and 3 or all"
+msgstr "stage nên giữa 1 và 3 hay all"
 
-#: builtin/commit.c:1146
-msgid "You have nothing to amend."
-msgstr "Không có gì để mà “tu bổ” cả."
+#: builtin/checkout-index.c:160
+msgid "check out all files in the index"
+msgstr "lấy ra toàn bộ các tập tin trong bảng mục lục"
 
-#: builtin/commit.c:1149
-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/checkout-index.c:161
+msgid "force overwrite of existing files"
+msgstr "ép buộc ghi đè lên tập tin đã sẵn có từ trước"
 
-#: builtin/commit.c:1151
-msgid "You are in the middle of a cherry-pick -- cannot amend."
+#: builtin/checkout-index.c:163
+msgid "no warning for existing files and files not in index"
 msgstr ""
-"Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện việc “tu "
-"bổ”."
+"không cảnh báo cho những tập tin tồn tại và không có trong bảng mục lục"
 
-#: builtin/commit.c:1154
-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/checkout-index.c:165
+msgid "don't checkout new files"
+msgstr "không checkout các tập tin mới"
 
-#: builtin/commit.c:1164
-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/checkout-index.c:167
+msgid "update stat information in the index file"
+msgstr "cập nhật thông tin thống kê trong tập tin lưu bảng mục lục mới"
 
-#: builtin/commit.c:1166
-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/checkout-index.c:171
+msgid "read list of paths from the standard input"
+msgstr "đọc danh sách đường dẫn từ đầu vào tiêu chuẩn"
 
-#: builtin/commit.c:1174
-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/checkout-index.c:173
+msgid "write the content to temporary files"
+msgstr "ghi nội dung vào tập tin tạm"
 
-#: builtin/commit.c:1191
-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/checkout-index.c:174 builtin/column.c:30
+#: 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 "chuỗi"
 
-#: builtin/commit.c:1193
-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/checkout-index.c:175
+msgid "when creating files, prepend <string>"
+msgstr "khi tạo các tập tin, nối thêm <chuỗi>"
 
-#: builtin/commit.c:1195
-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/checkout-index.c:177
+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/commit.c:1197
-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/checkout.c:25
+msgid "git checkout [<options>] <branch>"
+msgstr "git checkout [<các-tùy-chọn>] <nhánh>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [<options>] [<branch>] -- <file>..."
+msgstr "git checkout [<các-tùy-chọn>] [<nhánh>] -- <tập-tin>…"
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/checkout.c:134 builtin/checkout.c:167
 #, c-format
-msgid "Invalid cleanup mode %s"
-msgstr "Chế độ dọn dẹp không hợp lệ %s"
+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/commit.c:1214
-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/checkout.c:136 builtin/checkout.c:169
+#, 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/commit.c:1324 builtin/commit.c:1605
-msgid "show status concisely"
-msgstr "hiển thị trạng thái ở dạng súc tích"
+#: builtin/checkout.c:152
+#, 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/commit.c:1326 builtin/commit.c:1607
-msgid "show branch information"
-msgstr "hiển thị thông tin nhánh"
+#: builtin/checkout.c:196
+#, 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/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
-msgid "machine-readable output"
-msgstr "kết xuất dạng máy-có-thể-đọc"
+#: builtin/checkout.c:213
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "đường dẫn “%s”: không thể hòa trộn"
 
-#: builtin/commit.c:1331 builtin/commit.c:1611
-msgid "show status in long format (default)"
-msgstr "hiển thị trạng thái ở định dạng dài (mặc định)"
+#: builtin/checkout.c:230
+#, 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/commit.c:1334 builtin/commit.c:1614
-msgid "terminate entries with NUL"
-msgstr "chấm dứt các mục bằng NUL"
+#: 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 "không được dùng “%s” với các đường dẫn cập nhật"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
-#: builtin/fast-export.c:984 builtin/tag.c:353
-msgid "mode"
-msgstr "chế độ"
+#: builtin/checkout.c:262 builtin/checkout.c:265
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "không được dùng “%s” với %s"
 
-#: builtin/commit.c:1337 builtin/commit.c:1617
-msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+#: builtin/checkout.c:268
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
 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:1340
-msgid "show ignored files"
-msgstr "hiển thị các tập tin ẩn"
-
-#: builtin/commit.c:1341 parse-options.h:155
-msgid "when"
-msgstr "khi"
+"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/commit.c:1342
-msgid ""
-"ignore changes to submodules, optional when: all, dirty, untracked. "
-"(Default: all)"
-msgstr ""
-"bỏ qua các thay đổi trong mô-đun-con, tùy chọn khi: all, dirty, untracked. "
-"(Mặc định: all)"
+#: builtin/checkout.c:339 builtin/checkout.c:346
+#, c-format
+msgid "path '%s' is unmerged"
+msgstr "đường dẫn “%s” không được hòa trộn"
 
-#: builtin/commit.c:1344
-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/checkout.c:494
+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/commit.c:1430
-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/checkout.c:624
+#, 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/commit.c:1432
-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/checkout.c:663
+msgid "HEAD is now at"
+msgstr "HEAD hiện giờ tại"
 
-#: builtin/commit.c:1477
-msgid "detached HEAD"
-msgstr "đã rời khỏi HEAD"
+#: builtin/checkout.c:667 builtin/clone.c:660
+msgid "unable to update HEAD"
+msgstr "không thể cập nhật HEAD"
 
-#: builtin/commit.c:1480
-msgid " (root-commit)"
-msgstr " (root-commit)"
+#: builtin/checkout.c:671
+#, c-format
+msgid "Reset branch '%s'\n"
+msgstr "Đặt lại nhánh “%s”\n"
 
-#: builtin/commit.c:1575
-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/checkout.c:674
+#, c-format
+msgid "Already on '%s'\n"
+msgstr "Đã sẵn sàng trên “%s”\n"
 
-#: builtin/commit.c:1576
-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/checkout.c:678
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "Đã chuyển tới và đặt lại nhánh “%s”\n"
 
-#: builtin/commit.c:1578
-msgid "Commit message options"
-msgstr "Các tùy chọn ghi chú commit"
+#: builtin/checkout.c:680 builtin/checkout.c:1069
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "Đã chuyển đến nhánh mới “%s”\n"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
-msgid "read message from file"
-msgstr "đọc chú thích từ tập tin"
+#: builtin/checkout.c:682
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr "Đã chuyển đến nhánh “%s”\n"
 
-#: builtin/commit.c:1580
-msgid "author"
-msgstr "tác giả"
+#: builtin/checkout.c:733
+#, c-format
+msgid " ... and %d more.\n"
+msgstr " … và nhiều hơn %d.\n"
 
-#: builtin/commit.c:1580
-msgid "override author for commit"
-msgstr "ghi đè tác giả cho commit"
+#: builtin/checkout.c:739
+#, 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] ""
+"Cảnh báo: bạn đã rời bỏ %d lần chuyển giao lại đằng sau, không được kết nối "
+"đến\n"
+"bất kỳ nhánh nào của bạn:\n"
+"\n"
+"%s\n"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
-msgid "date"
-msgstr "ngày tháng"
+#: 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"
+"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ếu bạn muốn giữ (chúng) nó bằng cách tạo ra một nhánh mới, đây có lẽ là\n"
+"một thời điểm thích hợp để làm thế bằng lệnh:\n"
+"\n"
+" git branch <tên_nhánh_mới> %s\n"
+"\n"
 
-#: builtin/commit.c:1581
-msgid "override date for commit"
-msgstr "ghi đè ngày tháng cho lần chuyển giao"
+#: builtin/checkout.c:794
+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/commit.c:1582 builtin/merge.c:218 builtin/notes.c:395
-#: builtin/notes.c:558 builtin/tag.c:349
-msgid "message"
-msgstr "chú thích"
+#: builtin/checkout.c:798
+msgid "Previous HEAD position was"
+msgstr "Vị trí trước kia của HEAD là"
 
-#: builtin/commit.c:1582
-msgid "commit message"
-msgstr "chú thích của lần chuyển giao"
+#: builtin/checkout.c:825 builtin/checkout.c:1064
+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/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
-msgid "commit"
-msgstr "lần_chuyển_giao"
+#: builtin/checkout.c:970
+#, 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/commit.c:1583
-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/checkout.c:1010 builtin/worktree.c:214
+#, c-format
+msgid "invalid reference: %s"
+msgstr "tham chiếu không hợp lệ: %s"
 
-#: builtin/commit.c:1584
-msgid "reuse message from specified commit"
-msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho"
+#: builtin/checkout.c:1039
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "tham chiếu không phải là một cây:%s"
 
-#: builtin/commit.c:1585
-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/checkout.c:1078
+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/commit.c:1586
-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/checkout.c:1081 builtin/checkout.c:1085
+#, 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/commit.c:1587
-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/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” không thể được dùng với “%s”"
 
-#: builtin/commit.c:1588 builtin/log.c:1219 builtin/revert.c:86
-msgid "add Signed-off-by:"
-msgstr "(nên dùng) thêm dòng Signed-off-by:"
+#: builtin/checkout.c:1105
+#, 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/commit.c:1589
-msgid "use specified template file"
-msgstr "sử dụng tập tin mẫu đã cho"
+#: 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 "nhánh"
 
-#: builtin/commit.c:1590
-msgid "force edit of commit"
-msgstr "ép buộc sửa lần commit"
+#: builtin/checkout.c:1139
+msgid "create and checkout a new branch"
+msgstr "tạo và checkout một nhánh mới"
 
-#: builtin/commit.c:1591
-msgid "default"
-msgstr "mặc định"
+#: builtin/checkout.c:1141
+msgid "create/reset and checkout a branch"
+msgstr "tạo/đặt_lại và checkout một nhánh"
 
-#: builtin/commit.c:1591 builtin/tag.c:354
-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/checkout.c:1142
+msgid "create reflog for new branch"
+msgstr "tạo reflog cho nhánh mới"
 
-#: builtin/commit.c:1592
-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/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "rời bỏ HEAD tại lần chuyển giao theo tên"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
-#: builtin/revert.c:93
-msgid "GPG sign commit"
-msgstr "ký lần chuyển giao dùng GPG"
+#: builtin/checkout.c:1144
+msgid "set upstream info for new branch"
+msgstr "đặt thông tin thượng nguồn cho nhánh mới"
 
-#: builtin/commit.c:1597
-msgid "Commit contents options"
-msgstr "Các tùy nội dung ghi chú commit"
+#: builtin/checkout.c:1146
+msgid "new-branch"
+msgstr "nhánh-mới"
 
-#: builtin/commit.c:1598
-msgid "commit all changed files"
-msgstr "chuyển giao tất cả các tập tin có thay đổi"
+#: builtin/checkout.c:1146
+msgid "new unparented branch"
+msgstr "nhánh không cha mới"
 
-#: builtin/commit.c:1599
-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/checkout.c:1147
+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/commit.c:1600
-msgid "interactively add files"
-msgstr "thêm các tập-tin bằng tương tác"
+#: builtin/checkout.c:1149
+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/commit.c:1601
-msgid "interactively add changes"
-msgstr "thêm các thay đổi bằng tương tác"
+#: builtin/checkout.c:1151
+msgid "force checkout (throw away local modifications)"
+msgstr "ép buộc lấy ra (bỏ đi những thay đổi nội bộ)"
 
-#: builtin/commit.c:1602
-msgid "commit only specified files"
-msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
+#: builtin/checkout.c:1152
+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/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "vòng qua móc (hook) pre-commit"
+#: builtin/checkout.c:1153 builtin/merge.c:231
+msgid "update ignored files (default)"
+msgstr "cập nhật các tập tin bị bỏ qua (mặc định)"
 
-#: builtin/commit.c:1604
-msgid "show what would be committed"
-msgstr "hiển thị xem cái gì có thể được chuyển giao"
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
+msgid "style"
+msgstr "kiểu"
 
-#: builtin/commit.c:1615
-msgid "amend previous commit"
-msgstr "“tu bổ” (amend) lần commit trước"
+#: builtin/checkout.c:1155
+msgid "conflict style (merge or diff3)"
+msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
 
-#: builtin/commit.c:1616
-msgid "bypass post-rewrite hook"
-msgstr "vòng qua móc (hook) post-rewrite"
+#: builtin/checkout.c:1158
+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/commit.c:1621
-msgid "ok to record an empty change"
-msgstr "ok để ghi lại một thay đổi trống rỗng"
+#: builtin/checkout.c:1160
+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/commit.c:1623
-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/checkout.c:1162
+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/commit.c:1652
-msgid "could not parse HEAD commit"
-msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
+#: 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 "ép buộc báo cáo tiến triển công việc"
 
-#: builtin/commit.c:1698
-#, c-format
-msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
+#: builtin/checkout.c:1194
+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/commit.c:1705
-msgid "could not read MERGE_MODE"
-msgstr "không thể đọc MERGE_MODE"
+#: builtin/checkout.c:1211
+msgid "--track needs a branch name"
+msgstr "--track cần tên một nhánh"
 
-#: builtin/commit.c:1724
-#, 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"
+#: builtin/checkout.c:1216
+msgid "Missing branch name; try -b"
+msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/commit.c:1735
+#: builtin/checkout.c:1252
+msgid "invalid path specification"
+msgstr "đường dẫn đã cho không hợp lệ"
+
+#: builtin/checkout.c:1259
 #, c-format
-msgid "Aborting commit; you did not edit the message.\n"
+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 ""
-"Đang bỏ qua việc chuyển giao; bạn đã không biên soạn phần chú thích "
-"(message).\n"
+"Không thể cập nhật và chuyển thành nhánh “%s” cùng lúc\n"
+"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/commit.c:1740
+#: builtin/checkout.c:1264
 #, 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"
+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/commit.c:1788
+#: builtin/checkout.c:1268
 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."
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
 msgstr ""
-"Kho chứa đã được cập nhật, nhưng không thể ghi vào\n"
-"tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa\n"
-"có bị đầy quá hay quota (hạn nghạch đĩa cứng) bị vượt quá,\n"
-"và sau đó \"git reset HEAD\" để khắc phục."
-
-#: builtin/config.c:9
-msgid "git config [<options>]"
-msgstr "git config [<các-tùy-chọn>]"
+"git checkout: --ours/--theirs, --force và --merge là xung khắc với nhau khi\n"
+"checkout bảng mục lục (index)."
 
-#: builtin/config.c:56
-msgid "Config file location"
-msgstr "Vị trí tập tin cấu hình"
+#: 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 <mẫu>] [-x | -X] [--] <đường-dẫn>…"
 
-#: builtin/config.c:57
-msgid "use global config file"
-msgstr "dùng tập tin cấu hình toàn cục"
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
+msgstr "Đang gỡ bỏ %s\n"
 
-#: builtin/config.c:58
-msgid "use system config file"
-msgstr "sử dụng tập tin cấu hình hệ thống"
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
+msgstr "Có thể gỡ bỏ %s\n"
 
-#: builtin/config.c:59
-msgid "use repository config file"
-msgstr "dùng tập tin cấu hình của kho"
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr "Đang bỏ qua kho chứa %s\n"
 
-#: builtin/config.c:60
-msgid "use given config file"
-msgstr "sử dụng tập tin cấu hình đã cho"
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr "Nên bỏ qua kho chứa %s\n"
 
-#: builtin/config.c:61
-msgid "blob-id"
-msgstr "blob-id"
+#: builtin/clean.c:33
+#, c-format
+msgid "failed to remove %s"
+msgstr "gặp lỗi khi gỡ bỏ %s"
 
-#: builtin/config.c:61
-msgid "read config from given blob object"
+#: 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 ""
+"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ả"
+
+#: 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"
+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"
+"*          - chọn tất\n"
+"           - (để trống) kết thúc việc chọn"
+
+#: builtin/clean.c:511
+#, c-format
+msgid "Huh (%s)?"
+msgstr "Hả (%s)?"
+
+#: builtin/clean.c:653
+#, 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
+#, 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
+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
+#, 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: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               - bắt đầu dọn dẹp\n"
+"filter by pattern   - loại trừ các mục khỏi việc xóa\n"
+"select by numbers   - chọn các mục cần xóa bằng số\n"
+"ask each            - xác nhận trước mỗi lần xóa (giống như \"rm -i\")\n"
+"quit                - dừng việc dọn dẹp lại\n"
+"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
+msgid "*** Commands ***"
+msgstr "*** Lệnh ***"
+
+#: builtin/clean.c:813
+msgid "What now"
+msgstr "Giờ thì sao"
+
+#: builtin/clean.c:821
+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
+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
+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
+msgid "force"
+msgstr "ép buộc"
+
+#: builtin/clean.c:872
+msgid "interactive cleaning"
+msgstr "dọn bằng kiểu tương tác"
+
+#: builtin/clean.c:874
+msgid "remove whole directories"
+msgstr "gỡ bỏ toàn bộ thư mục"
+
+#: 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 "mẫu"
+
+#: builtin/clean.c:876
+msgid "add <pattern> to ignore rules"
+msgstr "thêm <mẫu> vào trong qui tắc bỏ qua"
+
+#: builtin/clean.c:877
+msgid "remove ignored files, too"
+msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua"
+
+#: builtin/clean.c:879
+msgid "remove only ignored files"
+msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua"
+
+#: builtin/clean.c:897
+msgid "-x and -X cannot be used together"
+msgstr "-x và -X không thể dùng cùng nhau"
+
+#: builtin/clean.c:901
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+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
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
+msgstr ""
+"clean.requireForce mặc định được đặt là 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/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
+msgstr "git clone [<các-tùy-chọn>] [--] <kho> [<t.mục>]"
+
+#: builtin/clone.c:65
+msgid "don't create a checkout"
+msgstr "không tạo một checkout"
+
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
+msgid "create a bare repository"
+msgstr "tạo kho thuần"
+
+#: builtin/clone.c:70
+msgid "create a mirror repository (implies bare)"
+msgstr "tạo kho bản sao (ý là kho thuần)"
+
+#: builtin/clone.c:72
+msgid "to clone from a local repository"
+msgstr "để nhân bản từ kho nội bộ"
+
+#: builtin/clone.c:74
+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:76
+msgid "setup as shared repository"
+msgstr "cài đặt đây là kho chia sẻ"
+
+#: builtin/clone.c:78 builtin/clone.c:80
+msgid "initialize submodules in the clone"
+msgstr "khởi tạo mô-đun-con trong bản sao"
+
+#: builtin/clone.c:82
+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:83 builtin/init-db.c:475
+msgid "template-directory"
+msgstr "thư-mục-mẫu"
+
+#: builtin/clone.c:84 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:86 builtin/clone.c:88 builtin/submodule--helper.c:602
+#: builtin/submodule--helper.c:954
+msgid "reference repository"
+msgstr "kho tham chiếu"
+
+#: builtin/clone.c:90
+msgid "use --reference only while cloning"
+msgstr "chỉ dùng --reference khi nhân bản"
+
+#: builtin/clone.c:91 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "tên"
+
+#: builtin/clone.c:92
+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:94
+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:96
+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:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
+msgid "depth"
+msgstr "độ-sâu"
+
+#: builtin/clone.c:98
+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:99 builtin/fetch.c:122 builtin/pack-objects.c:2848
+#: parse-options.h:142
+msgid "time"
+msgstr "thời-gian"
+
+#: builtin/clone.c:100
+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:101 builtin/fetch.c:124
+msgid "revision"
+msgstr "điểm xét duyệt"
+
+#: builtin/clone.c:102 builtin/fetch.c:125
+msgid "deepen history of shallow clone by 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:104
+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:106
+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:107 builtin/init-db.c:484
+msgid "gitdir"
+msgstr "gitdir"
+
+#: builtin/clone.c:108 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:109
+msgid "key=value"
+msgstr "khóa=giá_trị"
+
+#: builtin/clone.c:110
+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:111 builtin/fetch.c:140 builtin/push.c:547
+msgid "use IPv4 addresses only"
+msgstr "chỉ dùng địa chỉ IPv4"
+
+#: builtin/clone.c:113 builtin/fetch.c:142 builtin/push.c:549
+msgid "use IPv6 addresses only"
+msgstr "chỉ dùng địa chỉ IPv6"
+
+#: builtin/clone.c:250
+msgid ""
+"No directory name could be guessed.\n"
+"Please specify a directory on the command line"
+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:303
+#, c-format
+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:375
+#, c-format
+msgid "failed to open '%s'"
+msgstr "gặp lỗi khi mở “%s”"
+
+#: builtin/clone.c:383
+#, 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:397
+#, 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:419
+#, 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:423
+#, 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:448
+#, c-format
+msgid "done.\n"
+msgstr "hoàn tất.\n"
+
+#: 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 ""
+"Việc nhân bản thành công, nhưng checkout gặp lỗi.\n"
+"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:537
+#, 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:632
+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:648
+#, c-format
+msgid "unable to update %s"
+msgstr "không thể cập nhật %s"
+
+#: builtin/clone.c:697
+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:728
+msgid "unable to checkout working tree"
+msgstr "không thể lấy ra (checkout) cây làm việc"
+
+#: builtin/clone.c:768
+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:831
+msgid "cannot repack to clean up"
+msgstr "không thể đóng gói để dọn dẹp"
+
+#: builtin/clone.c:833
+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:866 builtin/receive-pack.c:1895
+msgid "Too many arguments."
+msgstr "Có quá nhiều đối số."
+
+#: builtin/clone.c:870
+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:883
+#, 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:886
+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:899
+#, c-format
+msgid "repository '%s' does not exist"
+msgstr "kho chứa “%s” chưa tồn tại"
+
+#: builtin/clone.c:905 builtin/fetch.c:1338
+#, 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:915
+#, 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:925
+#, 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: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 "không thể tạo các thư mục dẫn đầu của “%s”"
+
+#: builtin/clone.c:943
+#, 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:955
+#, 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:957
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "Đang nhân bản thành “%s”…\n"
+
+#: builtin/clone.c:963
+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:1019
+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:1021
+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:1023
+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:1026
+msgid "source repository is shallow, ignoring --local"
+msgstr "kho nguồn là nông, nên bỏ qua --local"
+
+#: builtin/clone.c:1031
+msgid "--local is ignored"
+msgstr "--local bị lờ đi"
+
+#: builtin/clone.c:1035
+#, 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:1090 builtin/clone.c:1098
+#, 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:1101
+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."
+
+#: builtin/column.c:9
+msgid "git column [<options>]"
+msgstr "git column [<các-tùy-chọn>]"
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "tìm kiếm biến cấu hình"
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "bố cục để dùng"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "Độ rộng tối đa"
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "Chèn thêm khoảng trống vào bên trái"
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "Chèn thêm khoảng trắng vào bên phải"
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "Chèn thêm khoảng trắng giữa các cột"
+
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "--command phải là đối số đầu tiên"
+
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
+msgstr "git commit [<các-tùy-chọn>] [--] <pathspec>…"
+
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
+msgstr "git status [<các-tùy-chọn>] [--] <pathspec>…"
+
+#: 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 ""
+"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
+"sở\n"
+"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
+"xác không.\n"
+"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
+"trên\n"
+"một cách rõ ràng. Chạy lệnh sau đây là theo các hướng dẫn trong bộ soạn "
+"thảo\n"
+"để chỉnh sửa tập tin cấu hình của mình:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho\n"
+"lần chuyển giao này với lệnh:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: 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 ""
+"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
+"sở\n"
+"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
+"xác không.\n"
+"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
+"trên một cách rõ ràng:\n"
+"\n"
+"    git config --global user.name \"Tên của bạn\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho lần "
+"chuyển giao này với lệnh:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: 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 ""
+"Bạn đã yêu cầu amend (“tu bổ”) phần lớn các lần chuyển giao gần đây, nhưng "
+"làm như thế\n"
+"có thể làm cho nó trở nên trống rỗng. Bạn có thể lặp lại lệnh của mình bằng "
+"--allow-empty,\n"
+"hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n"
+"\"git reset HEAD^\".\n"
+
+#: 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 ""
+"Lần cherry-pick trước hiện nay trống rỗng, có lẽ là bởi vì sự phân giải xung "
+"đột.\n"
+"Nếu bạn vẫn muốn chuyển giao nó cho dù thế nào đi nữa, hãy dùng:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "Nếu không được thì dùng lệnh \"git reset\"\n"
+
+#: 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ếu bạn muốn bỏ qua lần chuyển giao này thì dùng:\n"
+"\n"
+"    git reset\n"
+"\n"
+"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: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: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:365
+msgid "interactive add failed"
+msgstr "gặp lỗi khi thêm bằng cách tương"
+
+#: 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: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: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: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: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:469
+msgid "cannot read the index"
+msgstr "không đọc được bảng mục lục"
+
+#: 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: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: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:603
+msgid "malformed --author parameter"
+msgstr "đối số cho --author bị dị hình"
+
+#: builtin/commit.c:611
+#, c-format
+msgid "invalid date format: %s"
+msgstr "ngày tháng không hợp lệ: %s"
+
+#: builtin/commit.c:655
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+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: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:704 builtin/shortlog.c:286
+#, 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: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:710
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "không đọc được tệp nhật ký “%s”"
+
+#: builtin/commit.c:737 builtin/commit.c:745
+msgid "could not read SQUASH_MSG"
+msgstr "không thể đọc SQUASH_MSG"
+
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "không thể đọc MERGE_MSG"
+
+#: builtin/commit.c:796
+msgid "could not write commit template"
+msgstr "không thể ghi mẫu chuyển giao"
+
+#: 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ó trông giống với việc bạn đang chuyển giao một lần hòa trộn.\n"
+"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n"
+"\t%s\n"
+"và thử lại.\n"
+
+#: builtin/commit.c:819
+#, 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ó trông giống với việc bạn đang chuyển giao một lần cherry-pick.\n"
+"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n"
+"\t%s\n"
+"và thử lại.\n"
+
+#: builtin/commit.c:832
+#, 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 ""
+"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng "
+"được\n"
+"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:839
+#, 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"
+msgstr ""
+"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng "
+"được\n"
+"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:859
+#, c-format
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%sTác giả:           %.*s <%.*s>"
+
+#: builtin/commit.c:867
+#, c-format
+msgid "%sDate:      %s"
+msgstr "%sNgày tháng:        %s"
+
+#: builtin/commit.c:874
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%sNgười chuyển giao: %.*s <%.*s>"
+
+#: builtin/commit.c:892
+msgid "Cannot read index"
+msgstr "Không đọc được bảng mục lục"
+
+#: builtin/commit.c:954
+msgid "Error building trees"
+msgstr "Gặp lỗi khi xây dựng cây"
+
+#: builtin/commit.c:969 builtin/tag.c:266
+#, 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: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:1086 builtin/commit.c:1327
+#, 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: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: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:1163
+msgid "You have nothing to amend."
+msgstr "Không có gì để mà “tu bổ” cả."
+
+#: 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: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: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: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: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: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: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: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:1212
+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:1214
+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:1226 builtin/tag.c:474
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "Chế độ dọn dẹp không hợp lệ %s"
+
+#: builtin/commit.c:1231
+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:1341 builtin/commit.c:1617
+msgid "show status concisely"
+msgstr "hiển thị trạng thái ở dạng súc tích"
+
+#: builtin/commit.c:1343 builtin/commit.c:1619
+msgid "show branch information"
+msgstr "hiển thị thông tin nhánh"
+
+#: builtin/commit.c:1345
+msgid "version"
+msgstr "phiên bản"
+
+#: builtin/commit.c:1345 builtin/commit.c:1621 builtin/push.c:522
+#: builtin/worktree.c:440
+msgid "machine-readable output"
+msgstr "kết xuất dạng máy-có-thể-đọc"
+
+#: builtin/commit.c:1348 builtin/commit.c:1623
+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:1351 builtin/commit.c:1626
+msgid "terminate entries with NUL"
+msgstr "chấm dứt các mục bằng NUL"
+
+#: 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 "chế độ"
+
+#: builtin/commit.c:1354 builtin/commit.c:1629
+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:1357
+msgid "show ignored files"
+msgstr "hiển thị các tập tin ẩn"
+
+#: builtin/commit.c:1358 parse-options.h:155
+msgid "when"
+msgstr "khi"
+
+#: builtin/commit.c:1359
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+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:1361
+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:1437
+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:1439
+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:1484
+msgid "detached HEAD"
+msgstr "đã rời khỏi HEAD"
+
+#: builtin/commit.c:1487
+msgid " (root-commit)"
+msgstr " (root-commit)"
+
+#: builtin/commit.c:1587
+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:1588
+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:1590
+msgid "Commit message options"
+msgstr "Các tùy chọn ghi chú commit"
+
+#: builtin/commit.c:1591 builtin/tag.c:351
+msgid "read message from file"
+msgstr "đọc chú thích từ tập tin"
+
+#: builtin/commit.c:1592
+msgid "author"
+msgstr "tác giả"
+
+#: builtin/commit.c:1592
+msgid "override author for commit"
+msgstr "ghi đè tác giả cho commit"
+
+#: builtin/commit.c:1593 builtin/gc.c:326
+msgid "date"
+msgstr "ngày tháng"
+
+#: builtin/commit.c:1593
+msgid "override date for commit"
+msgstr "ghi đè ngày tháng cho lần chuyển giao"
+
+#: builtin/commit.c:1594 builtin/merge.c:220 builtin/notes.c:398
+#: builtin/notes.c:561 builtin/tag.c:349
+msgid "message"
+msgstr "chú thích"
+
+#: builtin/commit.c:1594
+msgid "commit message"
+msgstr "chú thích của lần chuyển giao"
+
+#: 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 "lần_chuyển_giao"
+
+#: builtin/commit.c:1595
+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:1596
+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:1597
+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:1598
+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:1599
+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:1600 builtin/log.c:1413 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr "(nên dùng) thêm dòng Signed-off-by:"
+
+#: builtin/commit.c:1601
+msgid "use specified template file"
+msgstr "sử dụng tập tin mẫu đã cho"
+
+#: builtin/commit.c:1602
+msgid "force edit of commit"
+msgstr "ép buộc sửa lần commit"
+
+#: builtin/commit.c:1603
+msgid "default"
+msgstr "mặc định"
+
+#: builtin/commit.c:1603 builtin/tag.c:354
+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:1604
+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:1606 builtin/merge.c:230 builtin/pull.c:166
+#: builtin/revert.c:93
+msgid "GPG sign commit"
+msgstr "ký lần chuyển giao dùng GPG"
+
+#: builtin/commit.c:1609
+msgid "Commit contents options"
+msgstr "Các tùy nội dung ghi chú commit"
+
+#: builtin/commit.c:1610
+msgid "commit all changed files"
+msgstr "chuyển giao tất cả các tập tin có thay đổi"
+
+#: builtin/commit.c:1611
+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:1612
+msgid "interactively add files"
+msgstr "thêm các tập-tin bằng tương tác"
+
+#: builtin/commit.c:1613
+msgid "interactively add changes"
+msgstr "thêm các thay đổi bằng tương tác"
+
+#: builtin/commit.c:1614
+msgid "commit only specified files"
+msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
+
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "vòng qua móc (hook) pre-commit và commit-msg"
+
+#: builtin/commit.c:1616
+msgid "show what would be committed"
+msgstr "hiển thị xem cái gì có thể được chuyển giao"
+
+#: builtin/commit.c:1627
+msgid "amend previous commit"
+msgstr "“tu bổ” (amend) lần commit trước"
+
+#: builtin/commit.c:1628
+msgid "bypass post-rewrite hook"
+msgstr "vòng qua móc (hook) post-rewrite"
+
+#: builtin/commit.c:1633
+msgid "ok to record an empty change"
+msgstr "ok để ghi lại một thay đổi trống rỗng"
+
+#: builtin/commit.c:1635
+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:1664
+msgid "could not parse HEAD commit"
+msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
+
+#: builtin/commit.c:1712
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "Tập tin MERGE_HEAD sai hỏng (%s)"
+
+#: builtin/commit.c:1719
+msgid "could not read MERGE_MODE"
+msgstr "không thể đọc MERGE_MODE"
+
+#: builtin/commit.c:1738
+#, 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"
+
+#: builtin/commit.c:1749
+#, 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:1754
+#, 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:1802
+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 ""
+"Kho chứa đã được cập nhật, nhưng không thể ghi vào\n"
+"tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa\n"
+"có bị đầy quá hay quota (hạn nghạch đĩa cứng) bị vượt quá,\n"
+"và sau đó \"git reset HEAD\" để khắc phục."
+
+#: builtin/config.c:9
+msgid "git config [<options>]"
+msgstr "git config [<các-tùy-chọn>]"
+
+#: builtin/config.c:55
+msgid "Config file location"
+msgstr "Vị trí tập tin cấu hình"
+
+#: builtin/config.c:56
+msgid "use global config file"
+msgstr "dùng tập tin cấu hình toàn cục"
+
+#: builtin/config.c:57
+msgid "use system config file"
+msgstr "sử dụng tập tin cấu hình hệ thống"
+
+#: builtin/config.c:58
+msgid "use repository config file"
+msgstr "dùng tập tin cấu hình của kho"
+
+#: builtin/config.c:59
+msgid "use given config file"
+msgstr "sử dụng tập tin cấu hình đã cho"
+
+#: builtin/config.c:60
+msgid "blob-id"
+msgstr "blob-id"
+
+#: builtin/config.c:60
+msgid "read config from given blob object"
 msgstr "đọc cấu hình từ đối tượng blob đã cho"
 
-#: builtin/config.c:62
-msgid "Action"
-msgstr "Hành động"
+#: builtin/config.c:61
+msgid "Action"
+msgstr "Hành động"
+
+#: builtin/config.c:62
+msgid "get value: name [value-regex]"
+msgstr "lấy giá-trị: tên [value-regex]"
+
+#: builtin/config.c:63
+msgid "get all values: key [value-regex]"
+msgstr "lấy tất cả giá-trị: khóa [value-regex]"
+
+#: builtin/config.c:64
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "lấy giá trị cho regexp: name-regex [value-regex]"
+
+#: builtin/config.c:65
+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
+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
+msgid "add a new variable: name value"
+msgstr "thêm biến mới: tên giá-trị"
+
+#: builtin/config.c:68
+msgid "remove a variable: name [value-regex]"
+msgstr "gỡ bỏ biến: tên [value-regex]"
+
+#: builtin/config.c:69
+msgid "remove all matches: name [value-regex]"
+msgstr "gỡ bỏ mọi cái khớp: tên [value-regex]"
+
+#: builtin/config.c:70
+msgid "rename section: old-name new-name"
+msgstr "đổi tên phần: tên-cũ tên-mới"
+
+#: builtin/config.c:71
+msgid "remove a section: name"
+msgstr "gỡ bỏ phần: tên"
+
+#: builtin/config.c:72
+msgid "list all"
+msgstr "liệt kê tất"
+
+#: builtin/config.c:73
+msgid "open an editor"
+msgstr "mở một trình biên soạn"
+
+#: builtin/config.c:74
+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
+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
+msgid "Type"
+msgstr "Kiểu"
+
+#: builtin/config.c:77
+msgid "value is \"true\" or \"false\""
+msgstr "giá trị là \"true\" hoặc \"false\""
+
+#: builtin/config.c:78
+msgid "value is decimal number"
+msgstr "giá trị ở dạng số thập phân"
+
+#: builtin/config.c:79
+msgid "value is --bool or --int"
+msgstr "giá trị là --bool hoặc --int"
+
+#: builtin/config.c:80
+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
+msgid "Other"
+msgstr "Khác"
+
+#: builtin/config.c:82
+msgid "terminate values with NUL byte"
+msgstr "chấm dứt giá trị với byte NUL"
+
+#: builtin/config.c:83
+msgid "show variable names only"
+msgstr "chỉ hiển thị các tên biến"
+
+#: builtin/config.c:84
+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
+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
+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
+#, 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 ""
+"# Đây là tập tin cấu hình cho từng người dùng Git.\n"
+"[user]\n"
+"# Vui lòng sửa lại cho thích hợp và bỏ dấu ghi chú các dòng sau:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:613
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "không thể tạo tập tin cấu hình “%s”"
+
+#: 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 ""
+"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: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
+msgid "git describe [<options>] [<commit-ish>...]"
+msgstr "git describe [<các-tùy-chọn>] <commit-ish>*"
+
+#: builtin/describe.c:18
+msgid "git describe [<options>] --dirty"
+msgstr "git describe [<các-tùy-chọn>] --dirty"
+
+#: builtin/describe.c:217
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
+
+#: builtin/describe.c:221
+#, 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
+#, 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
+#, 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
+#, 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
+#, 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
+#, c-format
+msgid "searching to describe %s\n"
+msgstr "Đang tìm kiếm để mô tả %s\n"
+
+#: builtin/describe.c:319
+#, 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
+#, c-format
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+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
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+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
+#, c-format
+msgid "traversed %lu commits\n"
+msgstr "đã xuyên %lu qua lần chuyển giao\n"
+
+#: builtin/describe.c:374
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+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
+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
+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
+msgid "use any ref"
+msgstr "dùng ref bất kỳ"
+
+#: builtin/describe.c:399
+msgid "use any tag, even unannotated"
+msgstr "dùng thẻ bất kỳ, cả khi “unannotated”"
+
+#: builtin/describe.c:400
+msgid "always use long format"
+msgstr "luôn dùng định dạng dài"
+
+#: builtin/describe.c:401
+msgid "only follow first parent"
+msgstr "chỉ theo cha mẹ đầu tiên"
+
+#: builtin/describe.c:404
+msgid "only output exact matches"
+msgstr "chỉ xuất những gì khớp chính xác"
+
+#: builtin/describe.c:406
+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
+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:320
+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
+msgid "mark"
+msgstr "dấu"
+
+#: builtin/describe.c:412
+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
+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
+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
+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
+#, 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
+#, c-format
+msgid "invalid option: %s"
+msgstr "tùy chọn không hợp lệ: %s"
+
+#: builtin/diff.c:361
+msgid "Not a git repository"
+msgstr "Không phải là kho git"
+
+#: builtin/diff.c:404
+#, c-format
+msgid "invalid object '%s' given."
+msgstr "đối tượng đã cho “%s” không hợp lệ."
+
+#: builtin/diff.c:413
+#, c-format
+msgid "more than two blobs given: '%s'"
+msgstr "đã cho nhiều hơn hai đối tượng blob: “%s”"
+
+#: builtin/diff.c:420
+#, c-format
+msgid "unhandled object '%s' given."
+msgstr "đã cho đối tượng không thể nắm giữ “%s”."
+
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [rev-list-opts]"
+
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
+msgstr "hiển thị tiến triển sau <n> đối tượng"
+
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
+msgstr "chọn điều khiển của thẻ đã ký"
+
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
+msgstr "chọn sự xử lý của các thẻ, cái mà đánh thẻ các đối tượng được lọc ra"
+
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
+msgstr "Đổ các đánh dấu này vào tập-tin"
+
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
+msgstr "nhập vào đánh dấu từ tập tin này"
+
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
+msgstr "Làm giả một cái thẻ khi thẻ bị thiếu một cái"
+
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
+msgstr "Xuất ra toàn bộ cây cho mỗi lần chuyển giao"
+
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
+msgstr "Sử dụng tính năng done để chấm dứt luồng dữ liệu"
+
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
+msgstr "Bỏ qua kết xuất của dữ liệu blob"
+
+#: builtin/fast-export.c:998
+msgid "refspec"
+msgstr "refspec"
+
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
+msgstr "Áp dụng refspec cho refs đã xuất"
+
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
+msgstr "kết xuất anonymize"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
+
+#: builtin/fetch.c:22
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<các-tùy-chọn>] [<nhóm>"
+
+#: builtin/fetch.c:23
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<các-tùy-chọn>] [(<kho> | <nhóm>)…]"
+
+#: builtin/fetch.c:24
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<các-tùy-chọn>]"
+
+#: 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: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: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: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:102
+msgid "fetch from multiple remotes"
+msgstr "lấy từ nhiều máy chủ cùng lúc"
+
+#: 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: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:108
+msgid "number of submodules fetched in parallel"
+msgstr "số lượng mô-đun-con được lấy đồng thời"
+
+#: 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:111 builtin/pull.c:191
+msgid "on-demand"
+msgstr "khi-cần"
+
+#: 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:116 builtin/pull.c:200
+msgid "keep downloaded pack"
+msgstr "giữ lại gói đã tải về"
+
+#: 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: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: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:131 builtin/log.c:1433
+msgid "dir"
+msgstr "tmục"
+
+#: 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:135
+msgid "default mode for recursion"
+msgstr "chế độ mặc định cho đệ qui"
+
+#: 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:138 builtin/pull.c:211
+msgid "refmap"
+msgstr "refmap"
+
+#: builtin/fetch.c:139 builtin/pull.c:212
+msgid "specify fetch refmap"
+msgstr "chỉ ra refmap cần lấy về"
+
+#: builtin/fetch.c:398
+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:514
+#, 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:607
+#, c-format
+msgid "object %s not found"
+msgstr "Không tìm thấy đối tượng %s"
+
+#: builtin/fetch.c:611
+msgid "[up to date]"
+msgstr "[đã cập nhật]"
+
+#: builtin/fetch.c:624 builtin/fetch.c:704
+msgid "[rejected]"
+msgstr "[Bị từ chối]"
+
+#: builtin/fetch.c:625
+msgid "can't fetch in current branch"
+msgstr "không thể fetch (lấy) về nhánh hiện hành"
+
+#: builtin/fetch.c:634
+msgid "[tag update]"
+msgstr "[cập nhật thẻ]"
+
+#: builtin/fetch.c:635 builtin/fetch.c:668 builtin/fetch.c:684
+#: builtin/fetch.c:699
+msgid "unable to update local ref"
+msgstr "không thể cập nhật tham chiếu nội bộ"
+
+#: builtin/fetch.c:654
+msgid "[new tag]"
+msgstr "[thẻ mới]"
+
+#: builtin/fetch.c:657
+msgid "[new branch]"
+msgstr "[nhánh mới]"
+
+#: builtin/fetch.c:660
+msgid "[new ref]"
+msgstr "[ref (tham chiếu) mới]"
+
+#: builtin/fetch.c:699
+msgid "forced update"
+msgstr "cưỡng bức cập nhật"
+
+#: builtin/fetch.c:704
+msgid "non-fast-forward"
+msgstr "không-phải-chuyển-tiếp-nhanh"
+
+#: builtin/fetch.c:749
+#, 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:769
+#, 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:856 builtin/fetch.c:952
+#, c-format
+msgid "From %.*s\n"
+msgstr "Từ %.*s\n"
+
+#: 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 ""
+"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:922
+#, 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:923
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (%s đã trở thành không đầu (không được quản lý))"
+
+#: builtin/fetch.c:955
+msgid "[deleted]"
+msgstr "[đã xóa]"
+
+#: builtin/fetch.c:956 builtin/remote.c:1020
+msgid "(none)"
+msgstr "(không)"
+
+#: builtin/fetch.c:979
+#, 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:998
+#, 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:1001
+#, 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:1077
+#, 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:1237
+#, c-format
+msgid "Fetching %s\n"
+msgstr "Đang lấy “%s” về\n"
+
+#: builtin/fetch.c:1239 builtin/remote.c:96
+#, c-format
+msgid "Could not fetch %s"
+msgstr "không thể “%s” về"
+
+#: 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 ""
+"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:1280
+msgid "You need to specify a tag name."
+msgstr "Bạn phải định rõ tên thẻ."
+
+#: builtin/fetch.c:1322
+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:1324
+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:1329
+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:1331
+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:1353
+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:1355
+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:1366
+#, 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:1374
+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ý"
+
+#: 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 <chú_thích>] [--log[=<n>] | --no-log] [--file <tập-"
+"tin>]"
+
+#: 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:666
+msgid "alias for --log (deprecated)"
+msgstr "bí danh cho --log (không được dùng)"
+
+#: builtin/fmt-merge-msg.c:669
+msgid "text"
+msgstr "văn bản"
+
+#: 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:671
+msgid "file to read from"
+msgstr "tập tin để đọc dữ liệu từ đó"
+
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
+msgstr "git for-each-ref [<các-tùy-chọn>] [<mẫu>]"
+
+#: builtin/for-each-ref.c:10
+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>]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<đối_tượng>]]"
+
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
+msgstr "trích dẫn để phù hợp cho hệ vỏ (shell)"
+
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
+msgstr "trích dẫn để phù hợp cho perl"
+
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
+msgstr "trích dẫn để phù hợp cho python"
+
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
+msgstr "trích dẫn để phù hợp cho Tcl"
+
+#: builtin/for-each-ref.c:36
+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"
+
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "chỉ hiển thị những tham chiếu mà nó được hòa trộn"
+
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "chỉ hiển thị những tham chiếu mà nó không được hòa trộn"
+
+#: builtin/for-each-ref.c:45
+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
+msgid "Checking object directories"
+msgstr "Đang kiểm tra các thư mục đối tượng"
+
+#: builtin/fsck.c:588
+msgid "git fsck [<options>] [<object>...]"
+msgstr "git fsck [<các-tùy-chọn>] [<đối-tượng>…]"
+
+#: builtin/fsck.c:594
+msgid "show unreachable objects"
+msgstr "hiển thị các đối tượng không thể đọc được"
+
+#: builtin/fsck.c:595
+msgid "show dangling objects"
+msgstr "hiển thị các đối tượng không được quản lý"
+
+#: builtin/fsck.c:596
+msgid "report tags"
+msgstr "báo cáo các thẻ"
+
+#: builtin/fsck.c:597
+msgid "report root nodes"
+msgstr "báo cáo node gốc"
+
+#: builtin/fsck.c:598
+msgid "make index objects head nodes"
+msgstr "tạo “index objects head nodes”"
+
+#: builtin/fsck.c:599
+msgid "make reflogs head nodes (default)"
+msgstr "tạo “reflogs head nodes” (mặc định)"
+
+#: builtin/fsck.c:600
+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
+msgid "check only connectivity"
+msgstr "chỉ kiểm tra kết nối"
+
+#: builtin/fsck.c:602
+msgid "enable more strict checking"
+msgstr "cho phép kiểm tra hạn chế hơn"
+
+#: builtin/fsck.c:604
+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
+msgid "show progress"
+msgstr "hiển thị quá trình"
+
+#: builtin/fsck.c:606
+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:665
+msgid "Checking objects"
+msgstr "Đang kiểm tra các đối tượng"
+
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
+msgstr "git gc [<các-tùy-chọn>]"
+
+#: builtin/gc.c:72
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "%s không hợp lệ: “%s”"
+
+#: builtin/gc.c:139
+#, 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"
+
+#: 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"
+msgstr ""
+"Lần chạy gc cuối đã báo cáo các vấn đề sau đây. Vui lòng sửa nguyên nhân\n"
+"tận gốc và xóa bỏ %s.\n"
+"Việc tự động dọn dẹp sẽ không thực thi cho đến khi tập tin được xóa bỏ.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
+msgid "prune unreferenced objects"
+msgstr "xóa bỏ các đối tượng không được tham chiếu"
+
+#: builtin/gc.c:329
+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
+msgid "enable auto-gc mode"
+msgstr "bật chế độ auto-gc"
+
+#: builtin/gc.c:331
+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
+#, 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
+#, 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/config.c:63
-msgid "get value: name [value-regex]"
-msgstr "lấy giá-trị: tên [value-regex]"
+#: builtin/gc.c:376
+#, 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/config.c:64
-msgid "get all values: key [value-regex]"
-msgstr "lấy tất cả giá-trị: khóa [value-regex]"
+#: builtin/gc.c:397
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+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/config.c:65
-msgid "get values for regexp: name-regex [value-regex]"
-msgstr "lấy giá trị cho regexp: name-regex [value-regex]"
+#: builtin/gc.c:441
+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/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/grep.c:23
+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/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/grep.c:219
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr "grep: gặp lỗi tạo tuyến (thread): %s"
 
-#: builtin/config.c:68
-msgid "add a new variable: name value"
-msgstr "thêm biến mới: tên giá-trị"
+#: builtin/grep.c:277
+#, 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/config.c:69
-msgid "remove a variable: name [value-regex]"
-msgstr "gỡ bỏ biến: tên [value-regex]"
+#: builtin/grep.c:453 builtin/grep.c:488
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr "không thể đọc cây (%s)"
 
-#: 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/grep.c:503
+#, 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/config.c:71
-msgid "rename section: old-name new-name"
-msgstr "đổi tên phần: tên-cũ tên-mới"
+#: builtin/grep.c:561
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr "chuyển đến “%c” cần một giá trị bằng số"
 
-#: builtin/config.c:72
-msgid "remove a section: name"
-msgstr "gỡ bỏ phần: tên"
+#: builtin/grep.c:647
+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/config.c:73
-msgid "list all"
-msgstr "liệt kê tất"
+#: builtin/grep.c:649
+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/config.c:74
-msgid "open an editor"
-msgstr "mở một trình biên soạn"
+#: builtin/grep.c:651
+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/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/grep.c:653
+msgid "ignore files specified via '.gitignore'"
+msgstr "các tập tin bị bỏ qua được chỉ định thông qua “.gitignore”"
 
-#: 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/grep.c:656
+msgid "show non-matching lines"
+msgstr "hiển thị những dòng không khớp với mẫu"
 
-#: builtin/config.c:77
-msgid "Type"
-msgstr "Kiểu"
+#: builtin/grep.c:658
+msgid "case insensitive matching"
+msgstr "phân biệt HOA/thường"
 
-#: builtin/config.c:78
-msgid "value is \"true\" or \"false\""
-msgstr "giá trị là \"true\" hoặc \"false\""
+#: builtin/grep.c:660
+msgid "match patterns only at word boundaries"
+msgstr "chỉ khớp mẫu tại đường ranh giới từ"
 
-#: builtin/config.c:79
-msgid "value is decimal number"
-msgstr "giá trị ở dạng số thập phân"
+#: builtin/grep.c:662
+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:664
+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:667
+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:669
+msgid "descend at most <depth> levels"
+msgstr "hạ xuống ít nhất là mức <sâu>"
+
+#: builtin/grep.c:673
+msgid "use extended POSIX regular expressions"
+msgstr "dùng biểu thức chính qui POSIX có mở rộng"
+
+#: builtin/grep.c:676
+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:679
+msgid "interpret patterns as fixed strings"
+msgstr "diễn dịch các mẫu như là chuỗi cố định"
+
+#: builtin/grep.c:682
+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:685
+msgid "show line numbers"
+msgstr "hiển thị số của dòng"
+
+#: builtin/grep.c:686
+msgid "don't show filenames"
+msgstr "không hiển thị tên tập tin"
+
+#: builtin/grep.c:687
+msgid "show filenames"
+msgstr "hiển thị các tên tập tin"
+
+#: builtin/grep.c:689
+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:691
+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:693
+msgid "synonym for --files-with-matches"
+msgstr "đồng nghĩa với --files-with-matches"
+
+#: builtin/grep.c:696
+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:698
+msgid "print NUL after filenames"
+msgstr "thêm NUL vào sau tên tập tin"
+
+#: builtin/grep.c:700
+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:701
+msgid "highlight matches"
+msgstr "tô sáng phần khớp mẫu"
+
+#: builtin/grep.c:703
+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:705
+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:708
+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:711
+msgid "show <n> context lines before matches"
+msgstr "hiển thị <n> dòng nội dung trước khớp"
+
+#: builtin/grep.c:713
+msgid "show <n> context lines after matches"
+msgstr "hiển thị <n> dòng nội dung sau khớp"
+
+#: builtin/grep.c:715
+msgid "use <n> worker threads"
+msgstr "dùng <n> tuyến trình làm việc"
+
+#: builtin/grep.c:716
+msgid "shortcut for -C NUM"
+msgstr "dạng viết tắt của -C SỐ"
+
+#: builtin/grep.c:719
+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:721
+msgid "show the surrounding function"
+msgstr "hiển thị hàm bao quanh"
+
+#: builtin/grep.c:724
+msgid "read patterns from file"
+msgstr "đọc mẫu từ tập-tin"
+
+#: builtin/grep.c:726
+msgid "match <pattern>"
+msgstr "match <mẫu>"
+
+#: builtin/grep.c:728
+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:740
+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:742
+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:744
+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:748
+msgid "pager"
+msgstr "dàn trang"
+
+#: builtin/grep.c:748
+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:751
+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:814
+msgid "no pattern given."
+msgstr "chưa chỉ ra mẫu."
+
+#: builtin/grep.c:846 builtin/index-pack.c:1480
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "số tuyến chỉ ra không hợp lệ (%d)"
+
+#: builtin/grep.c:876
+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:902
+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:907
+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:910
+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/config.c:80
-msgid "value is --bool or --int"
-msgstr "giá trị là --bool hoặc --int"
+#: builtin/grep.c:918
+msgid "both --cached and trees are given."
+msgstr "cả hai --cached và các cây phải được chỉ ra."
 
-#: 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/hash-object.c:81
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
+msgstr ""
+"git hash-object [-t <kiểu>] [-w] [--path=<tập-tin> | --no-filters] [--stdin] "
+"[--] <tập-tin>…"
 
-#: builtin/config.c:82
-msgid "Other"
-msgstr "Khác"
+#: builtin/hash-object.c:82
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
 
-#: builtin/config.c:83
-msgid "terminate values with NUL byte"
-msgstr "chấm dứt giá trị với byte NUL"
+#: builtin/hash-object.c:94
+msgid "type"
+msgstr "kiểu"
 
-#: builtin/config.c:84
-msgid "show variable names only"
-msgstr "chỉ hiển thị các tên biến"
+#: builtin/hash-object.c:94
+msgid "object type"
+msgstr "kiểu đối tượng"
 
-#: 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/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/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/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/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/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/config.c:469
-#, c-format
+#: builtin/hash-object.c:100
 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 ""
-"# Đây là tập tin cấu hình cho từng người dùng Git.\n"
-"[user]\n"
-"# Vui lòng sửa lại cho thích hợp và bỏ dấu ghi chú các dòng sau:\n"
-"#\tname = %s\n"
-"#\temail = %s\n"
+"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/config.c:611
-#, c-format
-msgid "cannot create configuration file %s"
-msgstr "không thể tạo tập tin cấu hình “%s”"
+#: 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/count-objects.c:77
-msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr "git count-objects [-v] [-H | --human-readable]"
+#: 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/count-objects.c:87
-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/help.c:43
+msgid "exclude guides"
+msgstr "hướng dẫn loại trừ"
 
-#: builtin/describe.c:17
-msgid "git describe [<options>] [<commit-ish>...]"
-msgstr "git describe [<các-tùy-chọn>] <commit-ish>*"
+#: 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/describe.c:18
-msgid "git describe [<options>] --dirty"
-msgstr "git describe [<các-tùy-chọn>] --dirty"
+#: builtin/help.c:45
+msgid "show man page"
+msgstr "hiển thị trang man"
 
-#: builtin/describe.c:217
-#, c-format
-msgid "annotated tag %s not available"
-msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
+#: 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/describe.c:221
-#, 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/help.c:48
+msgid "show info page"
+msgstr "hiện trang info"
 
-#: builtin/describe.c:223
-#, c-format
-msgid "tag '%s' is really '%s' here"
-msgstr "thẻ “%s” đã thực sự ở đây “%s” rồi"
+#: builtin/help.c:54
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+msgstr "git help [--all] [--guides] [--man | --web | --info] [<lệnh>]"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/help.c:66
 #, c-format
-msgid "Not a valid object name %s"
-msgstr "Không phải tên đối tượng %s hợp lệ"
+msgid "unrecognized help format '%s'"
+msgstr "không nhận ra định dạng trợ giúp “%s”"
 
-#: builtin/describe.c:253
-#, 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/help.c:93
+msgid "Failed to start emacsclient."
+msgstr "Gặp lỗi khi khởi chạy emacsclient."
 
-#: builtin/describe.c:270
-#, 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/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/describe.c:272
+#: builtin/help.c:114
 #, c-format
-msgid "searching to describe %s\n"
-msgstr "Đang tìm kiếm để mô tả %s\n"
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "phiên bản của emacsclient “%d” quá cũ (< 22)."
 
-#: builtin/describe.c:319
+#: builtin/help.c:132 builtin/help.c:153 builtin/help.c:162 builtin/help.c:170
 #, c-format
-msgid "finished search at %s\n"
-msgstr "việc tìm kiếm đã kết thúc tại %s\n"
+msgid "failed to exec '%s'"
+msgstr "gặp lỗi khi thực thi “%s”"
 
-#: builtin/describe.c:346
+#: builtin/help.c:207
 #, c-format
 msgid ""
-"No annotated tags can describe '%s'.\n"
-"However, there were unannotated tags: try --tags."
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
 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."
+"“%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/describe.c:350
+#: builtin/help.c:219
 #, c-format
 msgid ""
-"No tags can describe '%s'.\n"
-"Try --always, or create some tags."
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
 msgstr ""
-"Không có thẻ có thể mô tả “%s”.\n"
-"Hãy thử --always, hoặc tạo một số thẻ."
+"“%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/describe.c:371
+#: builtin/help.c:336
 #, c-format
-msgid "traversed %lu commits\n"
-msgstr "đã xuyên %lu qua lần chuyển giao\n"
+msgid "'%s': unknown man viewer."
+msgstr "“%s”: không rõ chương trình xem man."
 
-#: builtin/describe.c:374
-#, c-format
-msgid ""
-"more than %i tags found; listed %i most recent\n"
-"gave up search at %s\n"
-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/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/describe.c:396
-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/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/describe.c:397
-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/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/describe.c:398
-msgid "use any ref"
-msgstr "dùng ref bất kỳ"
+#: 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/describe.c:399
-msgid "use any tag, even unannotated"
-msgstr "dùng thẻ bất kỳ, cả khi “unannotated”"
+#: builtin/help.c:405
+msgid "A Git glossary"
+msgstr "Thuật ngữ chuyên môn Git"
 
-#: builtin/describe.c:400
-msgid "always use long format"
-msgstr "luôn dùng định dạng dài"
+#: 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/describe.c:401
-msgid "only follow first parent"
-msgstr "chỉ theo cha mẹ đầu tiên"
+#: builtin/help.c:407
+msgid "Defining submodule properties"
+msgstr "Định nghĩa thuộc tính mô-đun-con"
 
-#: builtin/describe.c:404
-msgid "only output exact matches"
-msgstr "chỉ xuất những gì khớp chính xác"
+#: 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/describe.c:406
-msgid "consider <n> most recent tags (default: 10)"
-msgstr "coi như <n> thẻ gần đây nhất (mặc định: 10)"
+#: 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/describe.c:408
-msgid "only consider tags matching <pattern>"
-msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>"
+#: 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/describe.c:410 builtin/name-rev.c:314
-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/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/describe.c:411
-msgid "mark"
-msgstr "dấu"
+#: builtin/help.c:440
+#, c-format
+msgid "`git %s' is aliased to `%s'"
+msgstr "“git %s” được đặt bí danh thành “%s”"
 
-#: builtin/describe.c:412
-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/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: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: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: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: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:279
+msgid "early EOF"
+msgstr "gặp kết thúc tập tin EOF quá sớm"
+
+#: builtin/index-pack.c:280
+msgid "read error on input"
+msgstr "lỗi đọc ở đầu vào"
 
-#: builtin/describe.c:430
-msgid "--long is incompatible with --abbrev=0"
-msgstr "--long là xung khắc với tùy chọn --abbrev=0"
+#: 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/describe.c:456
-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/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/describe.c:476
-msgid "--dirty is incompatible with commit-ishes"
-msgstr "--dirty là xung khắc với các tùy chọn commit-ish"
+#: 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/diff.c:86
+#: builtin/index-pack.c:317
 #, 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"
+msgid "unable to create '%s'"
+msgstr "không thể tạo “%s”"
 
-#: builtin/diff.c:237
+#: builtin/index-pack.c:322
 #, c-format
-msgid "invalid option: %s"
-msgstr "tùy chọn không hợp lệ: %s"
+msgid "cannot open packfile '%s'"
+msgstr "không thể mở packfile “%s”"
 
-#: builtin/diff.c:358
-msgid "Not a git repository"
-msgstr "Không phải là kho git"
+#: builtin/index-pack.c:336
+msgid "pack signature mismatch"
+msgstr "chữ ký cho gói không khớp"
 
-#: builtin/diff.c:401
+#: builtin/index-pack.c:338
 #, c-format
-msgid "invalid object '%s' given."
-msgstr "đối tượng đã cho “%s” không hợp lệ."
+msgid "pack version %<PRIu32> unsupported"
+msgstr "không hỗ trợ phiên bản gói %<PRIu32>"
 
-#: builtin/diff.c:410
+#: builtin/index-pack.c:356
 #, c-format
-msgid "more than two blobs given: '%s'"
-msgstr "đã cho nhiều hơn hai đối tượng blob: “%s”"
+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/diff.c:417
+#: builtin/index-pack.c:478
 #, c-format
-msgid "unhandled object '%s' given."
-msgstr "đã cho đối tượng không thể nắm giữ “%s”."
-
-#: builtin/fast-export.c:25
-msgid "git fast-export [rev-list-opts]"
-msgstr "git fast-export [rev-list-opts]"
-
-#: builtin/fast-export.c:980
-msgid "show progress after <n> objects"
-msgstr "hiển thị tiến triển sau <n> đối tượng"
+msgid "inflate returned %d"
+msgstr "xả nén trả về %d"
 
-#: builtin/fast-export.c:982
-msgid "select handling of signed tags"
-msgstr "chọn điều khiển của thẻ đã ký"
+#: builtin/index-pack.c:527
+msgid "offset value overflow for delta base object"
+msgstr "tràn giá trị khoảng bù cho đối tượng delta cơ sở"
 
-#: builtin/fast-export.c:985
-msgid "select handling of tags that tag filtered objects"
-msgstr "chọn sự xử lý của các thẻ, cái mà đánh thẻ các đối tượng được lọc ra"
+#: builtin/index-pack.c:535
+msgid "delta base offset is out of bound"
+msgstr "khoảng bù cơ sở cho delta nằm ngoài phạm vi"
 
-#: builtin/fast-export.c:988
-msgid "Dump marks to this file"
-msgstr "Đổ các đánh dấu này vào tập-tin"
+#: builtin/index-pack.c:543
+#, c-format
+msgid "unknown object type %d"
+msgstr "không hiểu kiểu đối tượng %d"
 
-#: builtin/fast-export.c:990
-msgid "Import marks from this file"
-msgstr "nhập vào đánh dấu từ tập tin này"
+#: builtin/index-pack.c:574
+msgid "cannot pread pack file"
+msgstr "không thể chạy hàm pread cho tập tin gói"
 
-#: builtin/fast-export.c:992
-msgid "Fake a tagger when tags lack one"
-msgstr "Làm giả một cái thẻ khi thẻ bị thiếu một cái"
+#: 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] "tập tin gói bị kết thúc sớm, thiếu %<PRIuMAX> byte"
 
-#: builtin/fast-export.c:994
-msgid "Output full tree for each commit"
-msgstr "Xuất ra toàn bộ cây cho mỗi lần chuyển giao"
+#: builtin/index-pack.c:602
+msgid "serious inflate inconsistency"
+msgstr "sự mâu thuẫn xả nén nghiêm trọng"
 
-#: builtin/fast-export.c:996
-msgid "Use the done feature to terminate the stream"
-msgstr "Sử dụng tính năng done để chấm dứt luồng dữ liệu"
+#: 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 "SỰ VA CHẠM SHA1 ĐàXẢY RA VỚI %s!"
 
-#: builtin/fast-export.c:997
-msgid "Skip output of blob data"
-msgstr "Bỏ qua kết xuất của dữ liệu blob"
+#: builtin/index-pack.c:751 builtin/pack-objects.c:166
+#: builtin/pack-objects.c:258
+#, c-format
+msgid "unable to read %s"
+msgstr "không thể đọc %s"
 
-#: builtin/fast-export.c:998
-msgid "refspec"
-msgstr "refspec"
+#: builtin/index-pack.c:817
+#, c-format
+msgid "cannot read existing object %s"
+msgstr "không thể đọc đối tượng đã tồn tại %s"
 
-#: builtin/fast-export.c:999
-msgid "Apply refspec to exported refs"
-msgstr "Áp dụng refspec cho refs đã xuất"
+#: builtin/index-pack.c:831
+#, c-format
+msgid "invalid blob object %s"
+msgstr "đối tượng blob không hợp lệ %s"
 
-#: builtin/fast-export.c:1000
-msgid "anonymize output"
-msgstr "kết xuất anonymize"
+#: builtin/index-pack.c:845
+#, c-format
+msgid "invalid %s"
+msgstr "%s không hợp lệ"
 
-#: builtin/fetch.c:20
-msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr "git fetch [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
+#: builtin/index-pack.c:848
+msgid "Error in object"
+msgstr "Lỗi trong đối tượng"
 
-#: builtin/fetch.c:21
-msgid "git fetch [<options>] <group>"
-msgstr "git fetch [<các-tùy-chọn>] [<nhóm>"
+#: builtin/index-pack.c:850
+#, 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/fetch.c:22
-msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr "git fetch --multiple [<các-tùy-chọn>] [(<kho> | <nhóm>)…]"
+#: builtin/index-pack.c:922 builtin/index-pack.c:953
+msgid "failed to apply delta"
+msgstr "gặp lỗi khi áp dụng delta"
 
-#: builtin/fetch.c:23
-msgid "git fetch --all [<options>]"
-msgstr "git fetch --all [<các-tùy-chọn>]"
+#: builtin/index-pack.c:1123
+msgid "Receiving objects"
+msgstr "Đang nhận về các đối tượng"
 
-#: builtin/fetch.c:92 builtin/pull.c:166
-msgid "fetch from all remotes"
-msgstr "lấy về từ tất cả các máy chủ"
+#: builtin/index-pack.c:1123
+msgid "Indexing objects"
+msgstr "Các đối tượng bảng mục lục"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
-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/index-pack.c:1155
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "gói bị sai hỏng (SHA1 không khớp)"
 
-#: builtin/fetch.c:96 builtin/pull.c:172
-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/index-pack.c:1160
+msgid "cannot fstat packfile"
+msgstr "không thể lấy thông tin thống kê packfile"
 
-#: builtin/fetch.c:97 builtin/pull.c:174
-msgid "force overwrite of local branch"
-msgstr "ép buộc ghi đè lên nhánh nội bộ"
+#: builtin/index-pack.c:1163
+msgid "pack has junk at the end"
+msgstr "pack có phần thừa ở cuối"
 
-#: builtin/fetch.c:99
-msgid "fetch from multiple remotes"
-msgstr "lấy từ nhiá»\81u máy chủ cùng lúc"
+#: builtin/index-pack.c:1174
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr "lá»\99n xá»\99n hÆ¡n cả Ä\91iên rá»\93 khi chạy hàm parse_pack_objects()"
 
-#: builtin/fetch.c:101 builtin/pull.c:176
-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/index-pack.c:1197
+msgid "Resolving deltas"
+msgstr "Đang phân giải các delta"
 
-#: builtin/fetch.c:103
-msgid "do not fetch all tags (--no-tags)"
-msgstr "không lấy tất cả các thẻ (--no-tags)"
+#: builtin/index-pack.c:1208
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "không thể tạo tuyến: %s"
 
-#: builtin/fetch.c:105
-msgid "number of submodules fetched in parallel"
-msgstr "số lượng mô-đun-con được lấy đồng thời"
+#: builtin/index-pack.c:1250
+msgid "confusion beyond insanity"
+msgstr "lộn xộn hơn cả điên rồ"
 
-#: builtin/fetch.c:107 builtin/pull.c:179
-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/index-pack.c:1256
+#, 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/fetch.c:108 builtin/pull.c:182
-msgid "on-demand"
-msgstr "khi-cần"
+#: builtin/index-pack.c:1268
+#, 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/fetch.c:109 builtin/pull.c:183
-msgid "control recursive fetching of submodules"
-msgstr "điều khiển việc lấy về đệ quy trong các mô-đun-con"
+#: builtin/index-pack.c:1272
+#, 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/fetch.c:113 builtin/pull.c:191
-msgid "keep downloaded pack"
-msgstr "giữ lại gói đã tải về"
+#: builtin/index-pack.c:1296
+#, 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/fetch.c:115
-msgid "allow updating of HEAD ref"
-msgstr "cho phép cập nhật th.chiếu HEAD"
+#: builtin/index-pack.c:1372
+#, c-format
+msgid "local object %s is corrupt"
+msgstr "đối tượng nội bộ %s bị hỏng"
 
-#: builtin/fetch.c:118 builtin/pull.c:194
-msgid "deepen history of shallow clone"
-msgstr "làm sâu hơn lịch sử của bản sao"
+#: builtin/index-pack.c:1396
+msgid "error while closing pack file"
+msgstr "gặp lỗi trong khi đóng tập tin gói"
 
-#: builtin/fetch.c:120 builtin/pull.c:197
-msgid "convert to a complete repository"
-msgstr "chuyển đổi hoàn toàn sang kho git"
+#: builtin/index-pack.c:1409
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr "không thể ghi tập tin giữ lại “%s”"
 
-#: builtin/fetch.c:122 builtin/log.c:1236
-msgid "dir"
-msgstr "tmục"
+#: builtin/index-pack.c:1417
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr "không thể đóng tập tin giữ lại đã được ghi “%s”"
 
-#: builtin/fetch.c:123
-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/index-pack.c:1430
+msgid "cannot store pack file"
+msgstr "không thể lưu tập tin gói"
 
-#: builtin/fetch.c:126
-msgid "default mode for recursion"
-msgstr "chế độ mặc định cho đệ qui"
+#: 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/fetch.c:128 builtin/pull.c:200
-msgid "accept refs that update .git/shallow"
-msgstr "chấp nhận tham chiếu cập nhật .git/shallow"
+#: builtin/index-pack.c:1474
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "sai pack.indexversion=%<PRIu32>"
 
-#: builtin/fetch.c:129 builtin/pull.c:202
-msgid "refmap"
-msgstr "refmap"
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "không hỗ trợ đa tuyến, bỏ qua %s"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
-msgid "specify fetch refmap"
-msgstr "chỉ ra refmap cần lấy về"
+#: builtin/index-pack.c:1542
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "Không thể mở tập tin gói đã sẵn có “%s”"
 
-#: builtin/fetch.c:386
-msgid "Couldn't find remote ref HEAD"
-msgstr "Không thể tìm thấy máy chủ cho tham chiếu HEAD"
+#: builtin/index-pack.c:1544
+#, 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/fetch.c:466
+#: builtin/index-pack.c:1591
 #, c-format
-msgid "object %s not found"
-msgstr "Không tìm thấy đối tượng %s"
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] "không delta: %d đối tượng"
 
-#: builtin/fetch.c:471
-msgid "[up to date]"
-msgstr "[đã cập nhật]"
+#: builtin/index-pack.c:1598
+#, 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/fetch.c:485
+#: builtin/index-pack.c:1611
 #, c-format
-msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (không thể fetch (lấy) về nhánh hiện hành)"
+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/fetch.c:486 builtin/fetch.c:574
-msgid "[rejected]"
-msgstr "[Bị từ chối]"
+#: 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 sai"
 
-#: builtin/fetch.c:497
-msgid "[tag update]"
-msgstr "[cập nhật thẻ]"
+#: builtin/index-pack.c:1732
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "--fix-thin không thể được dùng mà không có --stdin"
 
-#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552
-msgid "  (unable to update local ref)"
-msgstr "  (không thể cập nhật tham chiếu nội bộ)"
+#: builtin/index-pack.c:1740
+msgid "--verify with no packfile name given"
+msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile"
 
-#: builtin/fetch.c:517
-msgid "[new tag]"
-msgstr "[thẻ mới]"
+#: 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/fetch.c:520
-msgid "[new branch]"
-msgstr "[nhánh mới]"
+#: 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/fetch.c:523
-msgid "[new ref]"
-msgstr "[ref (tham chiếu) mới]"
+#: builtin/init-db.c:65
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr "không thể opendir() “%s”"
 
-#: builtin/fetch.c:569
-msgid "unable to update local ref"
-msgstr "không thể cập nhật tham chiếu nội bộ"
+#: builtin/init-db.c:76
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr "không thể readlink “%s”"
 
-#: builtin/fetch.c:569
-msgid "forced update"
-msgstr "cưỡng bức cập nhật"
+#: 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/fetch.c:576
-msgid "(non-fast-forward)"
-msgstr "(không-chuyển-tiếp-nhanh)"
+#: builtin/init-db.c:84
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr "không thể sao chép “%s” sang “%s”"
 
-#: builtin/fetch.c:610 builtin/fetch.c:851
+#: builtin/init-db.c:88
 #, c-format
-msgid "cannot open %s: %s\n"
-msgstr "không thể mở %s: %s\n"
+msgid "ignoring template %s"
+msgstr "đang lờ đi mẫu “%s”"
 
-#: builtin/fetch.c:619
+#: builtin/init-db.c:119
 #, 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"
+msgid "templates not found %s"
+msgstr "các mẫu không được tìm thấy %s"
 
-#: builtin/fetch.c:637
+#: builtin/init-db.c:134
 #, 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"
+msgid "not copying templates from '%s': %s"
+msgstr "không sao chép các mẫu từ “%s”: %s"
 
-#: builtin/fetch.c:724 builtin/fetch.c:816
+#: builtin/init-db.c:327
 #, c-format
-msgid "From %.*s\n"
-msgstr "Từ %.*s\n"
+msgid "unable to handle file type %d"
+msgstr "không thể xử lý (handle) tập tin kiểu %d"
 
-#: builtin/fetch.c:735
+#: builtin/init-db.c:330
 #, c-format
-msgid ""
-"some local refs could not be updated; try running\n"
-" 'git remote prune %s' to remove any old, conflicting branches"
-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"
+msgid "unable to move %s to %s"
+msgstr "không di chuyển được %s vào %s"
 
-#: builtin/fetch.c:787
+#: builtin/init-db.c:347 builtin/init-db.c:350
 #, c-format
-msgid "   (%s will become dangling)"
-msgstr "   (%s sẽ trở thành không đầu (không được quản lý))"
+msgid "%s already exists"
+msgstr "%s đã có từ trước rồi"
 
-#: builtin/fetch.c:788
+#: builtin/init-db.c:403
 #, c-format
-msgid "   (%s has become dangling)"
-msgstr "   (%s đã trở thành không đầu (không được quản lý))"
+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/fetch.c:820
-msgid "[deleted]"
-msgstr "[đã xóa]"
+#: 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/fetch.c:821 builtin/remote.c:1025
-msgid "(none)"
-msgstr "(không)"
+#: 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/fetch.c:841
+#: builtin/init-db.c:409
 #, c-format
-msgid "Refusing to fetch into current branch %s of non-bare repository"
+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:457
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
 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)"
+"git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
+"quyền>]] [thư-mục]"
 
-#: builtin/fetch.c:860
-#, 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/init-db.c:480
+msgid "permissions"
+msgstr "các quyền"
+
+#: 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/fetch.c:863
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
-msgid "Option \"%s\" is ignored for %s\n"
-msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n"
+msgid "cannot mkdir %s"
+msgstr "không thể mkdir (tạo thư mục): %s"
 
-#: builtin/fetch.c:920
+#: builtin/init-db.c:524
 #, 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"
+msgid "cannot chdir to %s"
+msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
 
-#: builtin/fetch.c:1080
+#: builtin/init-db.c:545
 #, c-format
-msgid "Fetching %s\n"
-msgstr "Đang lấy “%s” về\n"
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+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/fetch.c:1082 builtin/remote.c:96
+#: builtin/init-db.c:573
 #, c-format
-msgid "Could not fetch %s"
-msgstr "không thể “%s” về"
+msgid "Cannot access work tree '%s'"
+msgstr "không thể truy cập cây (tree) làm việc “%s”"
 
-#: builtin/fetch.c:1100
+#: builtin/interpret-trailers.c:15
 msgid ""
-"No remote repository specified.  Please, specify either a URL or a\n"
-"remote name from which new revisions should be fetched."
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<token>[(=|:)<value>])...] [<file>...]"
 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ề)."
+"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
+"<thẻ>[(=|:)<giá-trị>])…] [<tập-tin>…]"
 
-#: builtin/fetch.c:1123
-msgid "You need to specify a tag name."
-msgstr "Bạn phải định rõ tên thẻ."
+#: builtin/interpret-trailers.c:26
+msgid "edit files in place"
+msgstr "sửa các tập tin tại chỗ"
 
-#: builtin/fetch.c:1165
-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/interpret-trailers.c:27
+msgid "trim empty trailers"
+msgstr "bộ dò vết cắt bỏ phần trống rỗng"
 
-#: builtin/fetch.c:1167
-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/interpret-trailers.c:28
+msgid "trailer"
+msgstr "bộ dò vết"
 
-#: builtin/fetch.c:1187
-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/interpret-trailers.c:29
+msgid "trailer(s) to add"
+msgstr "bộ dò vết cần thêm"
 
-#: builtin/fetch.c:1189
-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/interpret-trailers.c:42
+msgid "no input file given for in-place editing"
+msgstr "không đưa ra tập tin đầu vào để sửa tại-chỗ"
 
-#: builtin/fetch.c:1200
+#: builtin/log.c:44
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+msgstr "git log [<các-tùy-chọn>] [<vùng-xem-xét>] [[--] <đường-dẫn>…]"
+
+#: builtin/log.c:45
+msgid "git show [<options>] <object>..."
+msgstr "git show [<các-tùy-chọn>] <đối-tượng>…"
+
+#: builtin/log.c:84
 #, 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"
+msgid "invalid --decorate option: %s"
+msgstr "tùy chọn--decorate không hợp lệ: %s"
 
-#: builtin/fetch.c:1208
-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ý"
+#: builtin/log.c:139
+msgid "suppress diff output"
+msgstr "chặn mọi kết xuất từ diff"
 
-#: 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 <chú_thích>] [--log[=<n>] | --no-log] [--file <tập-"
-"tin>]"
+#: builtin/log.c:140
+msgid "show source"
+msgstr "hiển thị mã nguồn"
 
-#: builtin/fmt-merge-msg.c:667
-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/log.c:141
+msgid "Use mail map file"
+msgstr "Sử dụng tập tin ánh xạ thư"
 
-#: builtin/fmt-merge-msg.c:670
-msgid "alias for --log (deprecated)"
-msgstr "bí danh cho --log (không được dùng)"
+#: builtin/log.c:142
+msgid "decorate options"
+msgstr "các tùy chọn trang trí"
 
-#: builtin/fmt-merge-msg.c:673
-msgid "text"
-msgstr "văn bản"
+#: builtin/log.c:145
+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/fmt-merge-msg.c:674
-msgid "use <text> as start of message"
-msgstr "dùng <văn bản thường> để bắt đầu ghi chú"
+#: builtin/log.c:241
+#, c-format
+msgid "Final output: %d %s\n"
+msgstr "Kết xuất cuối cùng: %d %s\n"
 
-#: builtin/fmt-merge-msg.c:675
-msgid "file to read from"
-msgstr "tập tin để đọc dữ liệu từ đó"
+#: builtin/log.c:486
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: sai tập tin"
 
-#: builtin/for-each-ref.c:9
-msgid "git for-each-ref [<options>] [<pattern>]"
-msgstr "git for-each-ref [<các-tùy-chọn>] [<mẫu>]"
+#: builtin/log.c:500 builtin/log.c:594
+#, c-format
+msgid "Could not read object %s"
+msgstr "Không thể đọc đối tượng %s"
 
-#: builtin/for-each-ref.c:10
-msgid "git for-each-ref [--points-at <object>]"
-msgstr "git for-each-ref [--points-at <đối tượng>]"
+#: builtin/log.c:618
+#, c-format
+msgid "Unknown type: %d"
+msgstr "Không nhận ra kiểu: %d"
 
-#: builtin/for-each-ref.c:11
-msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
-msgstr "git branch ([--merged | --no-merged) [<đối_tượng>]"
+#: builtin/log.c:739
+msgid "format.headers without value"
+msgstr "format.headers không có giá trị cụ thể"
 
-#: builtin/for-each-ref.c:12
-msgid "git for-each-ref [--contains [<object>]]"
-msgstr "git for-each-ref [--contains [<đối_tượng>]]"
+#: builtin/log.c:839
+msgid "name of output directory is too long"
+msgstr "tên của thư mục kết xuất quá dài"
 
-#: builtin/for-each-ref.c:27
-msgid "quote placeholders suitably for shells"
-msgstr "trích dẫn để phù hợp cho hệ vỏ (shell)"
+#: builtin/log.c:854
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr "Không thể mở tập tin miếng vá: %s"
 
-#: builtin/for-each-ref.c:29
-msgid "quote placeholders suitably for perl"
-msgstr "trích dẫn để phù hợp cho perl"
+#: builtin/log.c:868
+msgid "Need exactly one range."
+msgstr "Cần chính xác một vùng."
 
-#: builtin/for-each-ref.c:31
-msgid "quote placeholders suitably for python"
-msgstr "trích dẫn để phù hợp cho python"
+#: builtin/log.c:878
+msgid "Not a range."
+msgstr "Không phải là một vùng."
 
-#: builtin/for-each-ref.c:33
-msgid "quote placeholders suitably for Tcl"
-msgstr "trích dẫn để phù hợp cho Tcl"
+#: builtin/log.c:984
+msgid "Cover letter needs email format"
+msgstr "“Cover letter” cần cho định dạng thư"
 
-#: builtin/for-each-ref.c:36
-msgid "show only <n> matched refs"
-msgstr "hiển thị chỉ <n> tham chiếu khớp"
+#: builtin/log.c:1063
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "in-reply-to điên rồ: %s"
 
-#: 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/log.c:1091
+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/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"
+#: builtin/log.c:1141
+msgid "Two output directories?"
+msgstr "Hai thư mục kết xuất?"
 
-#: builtin/for-each-ref.c:43
-msgid "print only refs that are merged"
-msgstr "chỉ hiển thị những tham chiếu mà nó được hòa trộn"
+#: builtin/log.c:1248 builtin/log.c:1891 builtin/log.c:1893 builtin/log.c:1905
+#, c-format
+msgid "Unknown commit %s"
+msgstr "Không hiểu lần chuyển giao %s"
 
-#: builtin/for-each-ref.c:44
-msgid "print only refs that are not merged"
-msgstr "chỉ hiển thị những tham chiếu mà nó không được hòa trộn"
+#: builtin/log.c:1258 builtin/notes.c:884 builtin/tag.c:455
+#, 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/for-each-ref.c:45
-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/log.c:1263
+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/fsck.c:156 builtin/prune.c:140
-msgid "Checking connectivity"
-msgstr "Đang kiểm tra kết nối"
+#: 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 ""
+"Gặp lỗi khi lấy thượng nguồn, nếu bạn muốn ghi lại lần chuyển giao nền một\n"
+"cách tự động, vui lòng dùng \"git branch --set-upstream-to\" để theo dõi\n"
+"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:1287
+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:1298
+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:1302
+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/fsck.c:486
-msgid "Checking object directories"
-msgstr "Đang kiểm tra các thư mục đối tượng"
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "không thể lấy mã miếng vá"
 
-#: builtin/fsck.c:553
-msgid "git fsck [<options>] [<object>...]"
-msgstr "git fsck [<các-tùy-chọn>] [<đối-tượng>…]"
+#: builtin/log.c:1408
+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/fsck.c:559
-msgid "show unreachable objects"
-msgstr "hiển thị các đối tượng không thể đọc được"
+#: builtin/log.c:1411
+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/fsck.c:560
-msgid "show dangling objects"
-msgstr "hiển thị các đối tượng không được quản lý"
+#: builtin/log.c:1415
+msgid "print patches to standard out"
+msgstr "hiển thị miếng vá ra đầu ra chuẩn"
 
-#: builtin/fsck.c:561
-msgid "report tags"
-msgstr "báo cáo các thẻ"
+#: builtin/log.c:1417
+msgid "generate a cover letter"
+msgstr "tạo bì thư"
 
-#: builtin/fsck.c:562
-msgid "report root nodes"
-msgstr "báo cáo node gốc"
+#: builtin/log.c:1419
+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/fsck.c:563
-msgid "make index objects head nodes"
-msgstr "tạo “index objects head nodes”"
+#: builtin/log.c:1420
+msgid "sfx"
+msgstr "sfx"
 
-#: builtin/fsck.c:564
-msgid "make reflogs head nodes (default)"
-msgstr "tạo “reflogs head nodes” (mặc định)"
+#: builtin/log.c:1421
+msgid "use <sfx> instead of '.patch'"
+msgstr "sử dụng <sfx> thay cho “.patch”"
 
-#: builtin/fsck.c:565
-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/log.c:1423
+msgid "start numbering patches at <n> instead of 1"
+msgstr "bắt đầu đánh số miếng vá từ <n> thay vì 1"
 
-#: builtin/fsck.c:566
-msgid "check only connectivity"
-msgstr "chỉ kiểm tra kết nối"
+#: builtin/log.c:1425
+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/fsck.c:567
-msgid "enable more strict checking"
-msgstr "cho phép kiểm tra hạn chế hơn"
+#: builtin/log.c:1427
+msgid "Use [RFC PATCH] instead of [PATCH]"
+msgstr "Dùng [RFC VÁ] thay cho [VÁ]"
 
-#: builtin/fsck.c:569
-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/log.c:1430
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "Dùng [<tiền-tố>] thay cho [VÁ]"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
-msgid "show progress"
-msgstr "hiển thị quá trình"
+#: builtin/log.c:1433
+msgid "store resulting files in <dir>"
+msgstr "lưu các tập tin kết quả trong <t.mục>"
 
-#: builtin/fsck.c:631
-msgid "Checking objects"
-msgstr "Đang kiểm tra các đối tượng"
+#: builtin/log.c:1436
+msgid "don't strip/add [PATCH]"
+msgstr "không strip/add [VÁ]"
 
-#: builtin/gc.c:25
-msgid "git gc [<options>]"
-msgstr "git gc [<các-tùy-chọn>]"
+#: builtin/log.c:1439
+msgid "don't output binary diffs"
+msgstr "không kết xuất diff (những khác biệt) nhị phân"
 
-#: builtin/gc.c:72
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr "%s không hợp lệ: “%s”"
+#: builtin/log.c:1441
+msgid "output all-zero hash in From header"
+msgstr "xuất mọi mã băm all-zero trong phần đầu From"
 
-#: builtin/gc.c:139
-#, 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"
+#: builtin/log.c:1443
+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/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"
-msgstr ""
-"Lần chạy gc cuối đã báo cáo các vấn đề sau đây. Vui lòng sửa nguyên nhân\n"
-"tận gốc và xóa bỏ %s.\n"
-"Việc tự động dọn dẹp sẽ không thực thi cho đến khi tập tin được xóa bỏ.\n"
-"\n"
-"%s"
+#: builtin/log.c:1445
+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/gc.c:327
-msgid "prune unreferenced objects"
-msgstr "xóa bỏ các đối tượng không được tham chiếu"
+#: builtin/log.c:1447
+msgid "Messaging"
+msgstr "Lời nhắn"
 
-#: builtin/gc.c:329
-msgid "be more thorough (increased runtime)"
-msgstr "cẩn thận hơn nữa (tăng thời gian chạy)"
+#: builtin/log.c:1448
+msgid "header"
+msgstr "đầu đề thư"
 
-#: builtin/gc.c:330
-msgid "enable auto-gc mode"
-msgstr "bật chế độ auto-gc"
+#: builtin/log.c:1449
+msgid "add email header"
+msgstr "thêm đầu đề thư"
 
-#: builtin/gc.c:331
-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/log.c:1450 builtin/log.c:1452
+msgid "email"
+msgstr "thư điện tử"
 
-#: builtin/gc.c:373
-#, 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/log.c:1450
+msgid "add To: header"
+msgstr "thêm To: đầu đề thư"
 
-#: builtin/gc.c:375
-#, 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/log.c:1452
+msgid "add Cc: header"
+msgstr "thêm Cc: đầu đề thư"
 
-#: builtin/gc.c:376
-#, 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/log.c:1454
+msgid "ident"
+msgstr "thụt lề"
 
-#: builtin/gc.c:397
-#, c-format
-msgid ""
-"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+#: builtin/log.c:1455
+msgid "set From address to <ident> (or committer ident if absent)"
 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ế)"
+"đặt “Địa chỉ gửi” thành <thụ lề> (hoặc thụt lề người commit nếu bỏ quên)"
 
-#: builtin/gc.c:441
-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/log.c:1457
+msgid "message-id"
+msgstr "message-id"
 
-#: builtin/grep.c:23
-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/log.c:1458
+msgid "make first mail a reply to <message-id>"
+msgstr "dùng thư đầu tiên để trả lời <message-id>"
 
-#: builtin/grep.c:219
-#, c-format
-msgid "grep: failed to create thread: %s"
-msgstr "grep: gặp lỗi tạo tuyến (thread): %s"
+#: builtin/log.c:1459 builtin/log.c:1462
+msgid "boundary"
+msgstr "ranh giới"
 
-#: builtin/grep.c:277
-#, 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/log.c:1460
+msgid "attach the patch"
+msgstr "đính kèm miếng vá"
 
-#: builtin/grep.c:452 builtin/grep.c:487
-#, c-format
-msgid "unable to read tree (%s)"
-msgstr "không thể đọc cây (%s)"
+#: builtin/log.c:1463
+msgid "inline the patch"
+msgstr "dùng miếng vá làm nội dung"
 
-#: builtin/grep.c:502
-#, 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/log.c:1467
+msgid "enable message threading, styles: shallow, deep"
+msgstr "cho phép luồng lời nhắn, kiểu: “shallow”, “deep”"
 
-#: builtin/grep.c:558
-#, c-format
-msgid "switch `%c' expects a numerical value"
-msgstr "chuyển đến “%c” cần một giá trị bằng số"
+#: builtin/log.c:1469
+msgid "signature"
+msgstr "chữ ký"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "không mở được “%s”"
+#: builtin/log.c:1470
+msgid "add a signature"
+msgstr "thêm chữ ký"
 
-#: builtin/grep.c:644
-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/log.c:1471
+msgid "base-commit"
+msgstr "lần_chuyển_giao_nền"
 
-#: builtin/grep.c:646
-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/log.c:1472
+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/grep.c:648
-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/log.c:1474
+msgid "add a signature from a file"
+msgstr "thêm chữ ký từ một tập tin"
 
-#: builtin/grep.c:650
-msgid "ignore files specified via '.gitignore'"
-msgstr "các tập tin bị bỏ qua được chỉ định thông qua “.gitignore”"
+#: builtin/log.c:1475
+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/grep.c:653
-msgid "show non-matching lines"
-msgstr "hiển thị những dòng không khớp với mẫu"
+#: builtin/log.c:1565
+msgid "-n and -k are mutually exclusive."
+msgstr "-n và  -k loại từ lẫn nhau."
 
-#: builtin/grep.c:655
-msgid "case insensitive matching"
-msgstr "phân biệt HOA/thường"
+#: builtin/log.c:1567
+msgid "--subject-prefix/--rfc and -k are mutually exclusive."
+msgstr "--subject-prefix/--rfc và -k xung khắc nhau."
 
-#: builtin/grep.c:657
-msgid "match patterns only at word boundaries"
-msgstr "chỉ khớp mẫu tại đường ranh giới từ"
+#: builtin/log.c:1575
+msgid "--name-only does not make sense"
+msgstr "--name-only không hợp lý"
 
-#: builtin/grep.c:659
-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/log.c:1577
+msgid "--name-status does not make sense"
+msgstr "--name-status không hợp lý"
 
-#: builtin/grep.c:661
-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/log.c:1579
+msgid "--check does not make sense"
+msgstr "--check không hợp lý"
 
-#: builtin/grep.c:664
-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/log.c:1609
+msgid "standard output, or directory, which one?"
+msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?"
 
-#: builtin/grep.c:666
-msgid "descend at most <depth> levels"
-msgstr "hạ xuống ít nhất là mức <sâu>"
+#: builtin/log.c:1611
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "Không thể tạo thư mục “%s”"
 
-#: builtin/grep.c:670
-msgid "use extended POSIX regular expressions"
-msgstr "dùng biểu thức chính qui POSIX có mở rộng"
+#: builtin/log.c:1705
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "không thể đọc tập tin chữ ký “%s”"
 
-#: builtin/grep.c:673
-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/log.c:1777
+msgid "Failed to create output files"
+msgstr "Gặp lỗi khi tạo các tập tin kết xuất"
 
-#: builtin/grep.c:676
-msgid "interpret patterns as fixed strings"
-msgstr "diễn dịch các mẫu như là chuỗi cố định"
+#: builtin/log.c:1826
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<thượng-nguồn> [<đầu> [<giới-hạn>]]]"
 
-#: builtin/grep.c:679
-msgid "use Perl-compatible regular expressions"
-msgstr "sử dụng biểu thức chính quy tương thích Perl"
+#: builtin/log.c:1880
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+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/grep.c:682
-msgid "show line numbers"
-msgstr "hiển thị số của dòng"
+#: builtin/ls-files.c:458
+msgid "git ls-files [<options>] [<file>...]"
+msgstr "git ls-files [<các-tùy-chọn>] [<tập-tin>…]"
 
-#: builtin/grep.c:683
-msgid "don't show filenames"
-msgstr "không hiển thị tên tập tin"
+#: builtin/ls-files.c:507
+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/grep.c:684
-msgid "show filenames"
-msgstr "hiển thị các tên tập tin"
+#: builtin/ls-files.c:509
+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/grep.c:686
-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/ls-files.c:511
+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/grep.c:688
-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/ls-files.c:513
+msgid "show deleted files in the output"
+msgstr "hiển thị các tập tin đã xóa trong kết xuất"
 
-#: builtin/grep.c:690
-msgid "synonym for --files-with-matches"
-msgstr "đồng nghĩa với --files-with-matches"
+#: builtin/ls-files.c:515
+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/grep.c:693
-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/ls-files.c:517
+msgid "show other files in the output"
+msgstr "hiển thị các tập tin khác trong kết xuất"
 
-#: builtin/grep.c:695
-msgid "print NUL after filenames"
-msgstr "thêm NUL vào sau tên tập tin"
+#: builtin/ls-files.c:519
+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/grep.c:697
-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/ls-files.c:522
+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/grep.c:698
-msgid "highlight matches"
-msgstr "tô sáng phần khớp mẫu"
+#: builtin/ls-files.c:524
+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/grep.c:700
-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/ls-files.c:526
+msgid "show 'other' directories' names only"
+msgstr "chỉ hiển thị tên của các thư mục “khác”"
 
-#: builtin/grep.c:702
-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/ls-files.c:528
+msgid "show line endings of files"
+msgstr "hiển thị kết thúc dòng của các tập tin"
 
-#: builtin/grep.c:705
-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/ls-files.c:530
+msgid "don't show empty directories"
+msgstr "không hiển thị thư mục rỗng"
 
-#: builtin/grep.c:708
-msgid "show <n> context lines before matches"
-msgstr "hiển thị <n> dòng nội dung trước khớp"
+#: builtin/ls-files.c:533
+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/grep.c:710
-msgid "show <n> context lines after matches"
-msgstr "hiển thị <n> dòng nội dung sau khớp"
+#: builtin/ls-files.c:535
+msgid "show resolve-undo information"
+msgstr "hiển thị thông tin resolve-undo"
 
-#: builtin/grep.c:712
-msgid "use <n> worker threads"
-msgstr "dùng <n> tuyến trình làm việc"
+#: builtin/ls-files.c:537
+msgid "skip files matching pattern"
+msgstr "bỏ qua những tập tin khớp với một mẫu"
 
-#: builtin/grep.c:713
-msgid "shortcut for -C NUM"
-msgstr "dạng viết tắt của -C SỐ"
+#: builtin/ls-files.c:540
+msgid "exclude patterns are read from <file>"
+msgstr "mẫu loại trừ được đọc từ <tập tin>"
 
-#: builtin/grep.c:716
-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/ls-files.c:543
+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/grep.c:718
-msgid "show the surrounding function"
-msgstr "hiển thị hàm bao quanh"
+#: builtin/ls-files.c:545
+msgid "add the standard git exclusions"
+msgstr "thêm loại trừ tiêu chuẩn kiểu git"
 
-#: builtin/grep.c:721
-msgid "read patterns from file"
-msgstr "đọc mẫu từ tập-tin"
+#: builtin/ls-files.c:548
+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/grep.c:723
-msgid "match <pattern>"
-msgstr "match <mẫu>"
+#: builtin/ls-files.c:551
+msgid "recurse through submodules"
+msgstr "đệ quy xuyên qua mô-đun con"
 
-#: builtin/grep.c:725
-msgid "combine patterns specified with -e"
-msgstr "tổ hợp mẫu được chỉ ra với tùy chọn -e"
+#: builtin/ls-files.c:553
+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/grep.c:737
-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/ls-files.c:554
+msgid "tree-ish"
+msgstr "tree-ish"
 
-#: builtin/grep.c:739
-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/ls-files.c:555
+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/grep.c:741
-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/ls-files.c:557
+msgid "show debugging data"
+msgstr "hiển thị dữ liệu gỡ lỗi"
 
-#: builtin/grep.c:745
-msgid "pager"
-msgstr "dàn trang"
+#: 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=<exec>]\n"
+"                     [-q | --quiet] [--exit-code] [--get-url]\n"
+"                     [--symref] [<kho> [<các tham chiếu>…]]"
 
-#: builtin/grep.c:745
-msgid "show matching files in the pager"
-msgstr "hiển thị các tập tin khớp trong trang giấy"
+#: builtin/ls-remote.c:50
+msgid "do not print remote URL"
+msgstr "không hiển thị URL máy chủ"
 
-#: builtin/grep.c:748
-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/ls-remote.c:51 builtin/ls-remote.c:53
+msgid "exec"
+msgstr "thực thi"
 
-#: builtin/grep.c:811
-msgid "no pattern given."
-msgstr "chưa chỉ ra mẫu."
+#: builtin/ls-remote.c:52 builtin/ls-remote.c:54
+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/grep.c:843 builtin/index-pack.c:1475
-#, c-format
-msgid "invalid number of threads specified (%d)"
-msgstr "số tuyến chỉ ra không hợp lệ (%d)"
+#: builtin/ls-remote.c:56
+msgid "limit to tags"
+msgstr "giới hạn tới các thẻ"
 
-#: builtin/grep.c:873
-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/ls-remote.c:57
+msgid "limit to heads"
+msgstr "giới hạn cho các đầu"
 
-#: builtin/grep.c:899
-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/ls-remote.c:58
+msgid "do not show peeled tags"
+msgstr "không hiển thị thẻ bị peel (gọt bỏ)"
 
-#: builtin/grep.c:904
-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/ls-remote.c:60
+msgid "take url.<base>.insteadOf into account"
+msgstr "lấy url.<base>.insteadOf vào trong tài khoản"
 
-#: builtin/grep.c:907
-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/ls-remote.c:62
+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/grep.c:915
-msgid "both --cached and trees are given."
-msgstr "cả hai --cached và các cây phải được chỉ ra."
+#: builtin/ls-remote.c:64
+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ó"
 
-#: builtin/hash-object.c:81
-msgid ""
-"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
-"[--] <file>..."
-msgstr ""
-"git hash-object [-t <kiểu>] [-w] [--path=<tập-tin> | --no-filters] [--stdin] "
-"[--] <tập-tin>…"
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
 
-#: builtin/hash-object.c:82
-msgid "git hash-object  --stdin-paths"
-msgstr "git hash-object  --stdin-paths"
+#: builtin/ls-tree.c:128
+msgid "only show trees"
+msgstr "chỉ hiển thị các tree"
 
-#: builtin/hash-object.c:93
-msgid "type"
-msgstr "kiểu"
+#: builtin/ls-tree.c:130
+msgid "recurse into subtrees"
+msgstr "đệ quy vào các thư mục con"
 
-#: builtin/hash-object.c:93
-msgid "object type"
-msgstr "kiểu đối tượng"
+#: builtin/ls-tree.c:132
+msgid "show trees when recursing"
+msgstr "hiển thị cây khi đệ quy"
 
-#: builtin/hash-object.c:94
-msgid "write the object into the object database"
-msgstr "ghi đối tượng vào dữ liệu đối tượng"
+#: builtin/ls-tree.c:135
+msgid "terminate entries with NUL byte"
+msgstr "chấm dứt mục tin với byte NUL"
 
-#: builtin/hash-object.c:96
-msgid "read the object from stdin"
-msgstr "đọc đối tượng từ đầu vào tiêu chuẩn stdin"
+#: builtin/ls-tree.c:136
+msgid "include object size"
+msgstr "gồm cả kích thước đối tượng"
 
-#: builtin/hash-object.c:98
-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/ls-tree.c:138 builtin/ls-tree.c:140
+msgid "list only filenames"
+msgstr "chỉ liệt kê tên tập tin"
 
-#: builtin/hash-object.c:99
-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/ls-tree.c:143
+msgid "use full path names"
+msgstr "dùng tên đường dẫn đầy đủ"
 
-#: builtin/hash-object.c:100
-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/ls-tree.c:145
+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)"
 
-#: builtin/help.c:41
-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/merge.c:46
+msgid "git merge [<options>] [<commit>...]"
+msgstr "git merge [<các-tùy-chọn>] [<commit>…]"
 
-#: builtin/help.c:42
-msgid "print list of useful guides"
-msgstr "hiển thị danh sách các hướng dẫn hữu dụng"
+#: 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/help.c:43
-msgid "show man page"
-msgstr "hiển thị trang man"
+#: builtin/merge.c:48
+msgid "git merge --abort"
+msgstr "git merge --abort"
 
-#: builtin/help.c:44
-msgid "show manual in web browser"
-msgstr "hiển thị hướng dẫn sử dụng trong trình duyệt web"
+#: builtin/merge.c:102
+msgid "switch `m' requires a value"
+msgstr "switch “m” yêu cầu một giá trị"
 
-#: builtin/help.c:46
-msgid "show info page"
-msgstr "hiện trang info"
+#: builtin/merge.c:139
+#, 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/help.c:52
-msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
-msgstr "git help [--all] [--guides] [--man | --web | --info] [<lệnh>]"
+#: builtin/merge.c:140
+#, c-format
+msgid "Available strategies are:"
+msgstr "Các chiến lược sẵn sàng là:"
 
-#: builtin/help.c:64
+#: builtin/merge.c:145
 #, c-format
-msgid "unrecognized help format '%s'"
-msgstr "không nhận ra định dạng trợ giúp “%s”"
+msgid "Available custom strategies are:"
+msgstr "Các chiến lược tùy chỉnh sẵn sàng là:"
 
-#: builtin/help.c:91
-msgid "Failed to start emacsclient."
-msgstr "Gặp lỗi khi khởi chạy emacsclient."
+#: builtin/merge.c:195 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: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/help.c:104
-msgid "Failed to parse emacsclient version."
-msgstr "Gặp lỗi khi phân tích phiên bản emacsclient."
+#: builtin/merge.c:199 builtin/pull.c:133
+msgid "(synonym to --stat)"
+msgstr "(đồng nghĩa với --stat)"
 
-#: builtin/help.c:112
-#, c-format
-msgid "emacsclient version '%d' too old (< 22)."
-msgstr "phiên bản của emacsclient “%d” quá cũ (< 22)."
+#: builtin/merge.c:201 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/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
-#, c-format
-msgid "failed to exec '%s': %s"
-msgstr "gặp lỗi khi thực thi “%s”: %s"
+#: builtin/merge.c:204 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/help.c:205
-#, c-format
-msgid ""
-"'%s': path for unsupported man viewer.\n"
-"Please consider using 'man.<tool>.cmd' instead."
-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/merge.c:206 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/help.c:217
-#, c-format
-msgid ""
-"'%s': cmd for supported man viewer.\n"
-"Please consider using 'man.<tool>.path' instead."
-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/merge.c:208 builtin/pull.c:145
+msgid "edit message before committing"
+msgstr "sửa chú thích trước khi chuyển giao"
 
-#: builtin/help.c:334
-#, c-format
-msgid "'%s': unknown man viewer."
-msgstr "“%s”: không rõ chương trình xem man."
+#: builtin/merge.c:209
+msgid "allow fast-forward (default)"
+msgstr "cho phép chuyển-tiếp-nhanh (mặc định)"
 
-#: builtin/help.c:351
-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/merge.c:211 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/help.c:359
-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/merge.c:215 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/help.c:408
-msgid "Defining attributes per path"
-msgstr "Định nghĩa các thuộc tính cho mỗi đường dẫn"
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
+#: builtin/revert.c:89
+msgid "strategy"
+msgstr "chiến lược"
 
-#: builtin/help.c:409
-msgid "Everyday Git With 20 Commands Or So"
-msgstr "Mỗi ngày học 20 lệnh Git hay hơn"
+#: builtin/merge.c:217 builtin/pull.c:159
+msgid "merge strategy to use"
+msgstr "chiến lược hòa trộn sẽ dùng"
 
-#: builtin/help.c:410
-msgid "A Git glossary"
-msgstr "Thuật ngữ chuyên môn Git"
+#: builtin/merge.c:218 builtin/pull.c:162
+msgid "option=value"
+msgstr "tùy_chọn=giá_trị"
 
-#: builtin/help.c:411
-msgid "Specifies intentionally untracked files to ignore"
-msgstr "Chỉ định các tập tin không cần theo dõi"
+#: builtin/merge.c:219 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/help.c:412
-msgid "Defining submodule properties"
-msgstr "Định nghĩa thuộc tính mô-đun-con"
+#: builtin/merge.c:221
+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/help.c:413
-msgid "Specifying revisions and ranges for Git"
-msgstr "Chỉ định điểm xét duyệt và vùng cho Git"
+#: builtin/merge.c:225
+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/help.c:414
-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/merge.c:227 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/help.c:415
-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/merge.c:255
+msgid "could not run stash."
+msgstr "không thể chạy stash."
 
-#: builtin/help.c:427
-msgid "The common Git guides are:\n"
-msgstr "Các chỉ dẫn chung về cách dùng Git là:\n"
+#: builtin/merge.c:260
+msgid "stash failed"
+msgstr "lệnh tạm cất gặp lỗi"
 
-#: builtin/help.c:448 builtin/help.c:465
+#: builtin/merge.c:265
 #, c-format
-msgid "usage: %s%s"
-msgstr "cách dùng: %s%s"
+msgid "not a valid object: %s"
+msgstr "không phải là một đối tượng hợp lệ: %s"
 
-#: builtin/help.c:481
-#, c-format
-msgid "`git %s' is aliased to `%s'"
-msgstr "“git %s” được đặt bí danh thành “%s”"
+#: builtin/merge.c:284 builtin/merge.c:301
+msgid "read-tree failed"
+msgstr "read-tree gặp lỗi"
 
-#: builtin/index-pack.c:152
-#, c-format
-msgid "unable to open %s"
-msgstr "không thể mở %s"
+#: builtin/merge.c:331
+msgid " (nothing to squash)"
+msgstr " (không có gì để squash)"
 
-#: builtin/index-pack.c:202
+#: builtin/merge.c:342
 #, c-format
-msgid "object type mismatch at %s"
-msgstr "kiểu đối tượng không khớp tại %s"
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "Squash commit -- không cập nhật HEAD\n"
 
-#: builtin/index-pack.c:222
+#: builtin/merge.c:392
 #, c-format
-msgid "did not receive expected object %s"
-msgstr "Không thể lấy về đối tượng cần %s"
+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/index-pack.c:225
+#: builtin/merge.c:443
 #, 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"
+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/index-pack.c:267
+#: builtin/merge.c:533
 #, 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:277
-msgid "early EOF"
-msgstr "gặp kết thúc tập tin EOF quá sớm"
-
-#: builtin/index-pack.c:278
-msgid "read error on input"
-msgstr "lỗi đọc ở đầu vào"
-
-#: builtin/index-pack.c:290
-msgid "used more bytes than were available"
-msgstr "sử dụng nhiều hơn số lượng byte mà nó sẵn có"
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "Chuỗi branch.%s.mergeoptions sai: %s"
 
-#: builtin/index-pack.c:297
-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/merge.c:652
+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/index-pack.c:313
+#: builtin/merge.c:666
 #, c-format
-msgid "unable to create '%s'"
-msgstr "không thể tạo “%s”"
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "Không hiểu tùy chọn cho merge-recursive: -X%s"
 
-#: builtin/index-pack.c:318
+#: builtin/merge.c:681
 #, c-format
-msgid "cannot open packfile '%s'"
-msgstr "không thể mở packfile “%s”"
-
-#: builtin/index-pack.c:332
-msgid "pack signature mismatch"
-msgstr "chữ ký cho gói không khớp"
+msgid "unable to write %s"
+msgstr "không thể ghi %s"
 
-#: builtin/index-pack.c:334
+#: builtin/merge.c:733
 #, c-format
-msgid "pack version %<PRIu32> unsupported"
-msgstr "không hỗ trợ phiên bản gói %<PRIu32>"
+msgid "Could not read from '%s'"
+msgstr "Không thể đọc từ “%s”"
 
-#: builtin/index-pack.c:352
+#: builtin/merge.c:742
 #, c-format
-msgid "pack has bad object at offset %lu: %s"
-msgstr "gói có đối tượng sai khoảng bù (offset) %lu: %s"
+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/index-pack.c:473
+#: builtin/merge.c:748
 #, c-format
-msgid "inflate returned %d"
-msgstr "xả nén trả về %d"
-
-#: builtin/index-pack.c:522
-msgid "offset value overflow for delta base object"
-msgstr "tràn giá trị khoảng bù cho đối tượng delta cơ sở"
+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 ""
+"Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần "
+"thiết,\n"
+"đặc biệt là khi nó hòa trộn thượng nguồn đã cập nhật vào trong một nhánh "
+"topic.\n"
+"\n"
+"Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua, và phần chú thích này nếu "
+"rỗng\n"
+"sẽ hủy bỏ lần chuyển giao.\n"
 
-#: builtin/index-pack.c:530
-msgid "delta base offset is out of bound"
-msgstr "khoảng bù cơ sở cho delta nằm ngoài phạm vi"
+#: builtin/merge.c:772
+msgid "Empty commit message."
+msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
 
-#: builtin/index-pack.c:538
+#: builtin/merge.c:792
 #, c-format
-msgid "unknown object type %d"
-msgstr "không hiểu kiểu đối tượng %d"
+msgid "Wonderful.\n"
+msgstr "Tuyệt vời.\n"
 
-#: builtin/index-pack.c:569
-msgid "cannot pread pack file"
-msgstr "không thể chạy hàm pread cho tập tin gói"
+#: builtin/merge.c:847
+#, 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/index-pack.c:571
+#: builtin/merge.c:863
 #, c-format
-msgid "premature end of pack file, %lu byte missing"
-msgid_plural "premature end of pack file, %lu bytes missing"
-msgstr[0] "tập tin gói bị kết thúc sớm, thiếu %lu byte"
+msgid "'%s' is not a commit"
+msgstr "%s không phải là một lần commit (chuyển giao)"
 
-#: builtin/index-pack.c:597
-msgid "serious inflate inconsistency"
-msgstr "sự mâu thuẫn xả nén nghiêm trọng"
+#: builtin/merge.c:904
+msgid "No current branch."
+msgstr "không phải nhánh hiện hành"
 
-#: 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
-#, c-format
-msgid "SHA1 COLLISION FOUND WITH %s !"
-msgstr "SỰ VA CHẠM SHA1 ĐàXẢY RA VỚI %s!"
+#: builtin/merge.c:906
+msgid "No remote for the current branch."
+msgstr "Không có máy chủ cho nhánh hiện hành."
 
-#: builtin/index-pack.c:746 builtin/pack-objects.c:162
-#: builtin/pack-objects.c:254
-#, c-format
-msgid "unable to read %s"
-msgstr "không thể đọc %s"
+#: builtin/merge.c:908
+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/index-pack.c:812
+#: builtin/merge.c:913
 #, c-format
-msgid "cannot read existing object %s"
-msgstr "không thể đọc đối tượng đã tồn tại %s"
+msgid "No remote-tracking branch for %s from %s"
+msgstr "Không nhánh mạng theo dõi cho %s từ %s"
 
-#: builtin/index-pack.c:826
+#: builtin/merge.c:960
 #, c-format
-msgid "invalid blob object %s"
-msgstr "đối tượng blob không hợp lệ %s"
+msgid "Bad value '%s' in environment '%s'"
+msgstr "Giá trị sai “%s” trong biến môi trường “%s”"
 
-#: builtin/index-pack.c:840
+#: builtin/merge.c:1034
 #, c-format
-msgid "invalid %s"
-msgstr "%s không hợp lệ"
-
-#: builtin/index-pack.c:843
-msgid "Error in object"
-msgstr "Lỗi trong đối tượng"
+msgid "could not close '%s'"
+msgstr "không thể đóng “%s”"
 
-#: builtin/index-pack.c:845
+#: builtin/merge.c:1061
 #, 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"
+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"
 
-#: builtin/index-pack.c:917 builtin/index-pack.c:948
-msgid "failed to apply delta"
-msgstr "gặp lỗi khi áp dụng delta"
+#: builtin/merge.c:1095
+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"
 
-#: builtin/index-pack.c:1118
-msgid "Receiving objects"
-msgstr "Đang nhận về các đối tượng"
+#: builtin/merge.c:1162
+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/index-pack.c:1118
-msgid "Indexing objects"
-msgstr "Các đối tượng bảng mục lục"
+#: builtin/merge.c:1178
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
+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/index-pack.c:1150
-msgid "pack is corrupted (SHA1 mismatch)"
-msgstr "gói bị sai hỏng (SHA1 không khớp)"
+#: 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 ""
+"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/index-pack.c:1155
-msgid "cannot fstat packfile"
-msgstr "không thể lấy thông tin thống kê packfile"
+#: builtin/merge.c:1188
+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/index-pack.c:1158
-msgid "pack has junk at the end"
-msgstr "pack có phần thừa ở cuối"
+#: builtin/merge.c:1197
+msgid "You cannot combine --squash with --no-ff."
+msgstr "Bạn không thể kết hợp --squash với --no-ff."
 
-#: builtin/index-pack.c:1169
-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/merge.c:1205
+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/index-pack.c:1194
-msgid "Resolving deltas"
-msgstr "Đang phân giải các delta"
+#: builtin/merge.c:1222
+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
+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/index-pack.c:1205
+#: builtin/merge.c:1229
 #, c-format
-msgid "unable to create thread: %s"
-msgstr "không thể tạo tuyến: %s"
+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"
 
-#: builtin/index-pack.c:1247
-msgid "confusion beyond insanity"
-msgstr "lộn xộn hơn cả điên rồ"
+#: builtin/merge.c:1231
+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/index-pack.c:1253
+#: builtin/merge.c:1287
 #, c-format
-msgid "completed with %d local objects"
-msgstr "đầy đủ với %d đối tượng nội bộ"
+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/index-pack.c:1263
+#: builtin/merge.c:1290
 #, c-format
-msgid "Unexpected tail checksum for %s (disk corruption?)"
-msgstr "Tổng kiểm tra tail không như mong đợi cho %s (đĩa hỏng?)"
+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/index-pack.c:1267
+#: builtin/merge.c:1293
 #, 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"
+msgid "Commit %s does not have a GPG signature."
+msgstr "Lần chuyển giao %s không có chữ ký GPG."
 
-#: builtin/index-pack.c:1291
+#: builtin/merge.c:1296
 #, c-format
-msgid "unable to deflate appended object (%d)"
-msgstr "không thể xả nén đối tượng nối thêm (%d)"
+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/index-pack.c:1367
-#, c-format
-msgid "local object %s is corrupt"
-msgstr "đối tượng nội bộ %s bị hỏng"
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "từ chối hòa trộn lịch sử không liên quan"
 
-#: builtin/index-pack.c:1391
-msgid "error while closing pack file"
-msgstr "gặp lỗi trong khi đóng tập tin gói"
+#: builtin/merge.c:1367
+msgid "Already up-to-date."
+msgstr "Đã cập nhật rồi."
 
-#: builtin/index-pack.c:1404
+#: builtin/merge.c:1377
 #, c-format
-msgid "cannot write keep file '%s'"
-msgstr "không thể ghi tập tin giữ lại “%s”"
+msgid "Updating %s..%s\n"
+msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/index-pack.c:1412
+#: builtin/merge.c:1418
 #, c-format
-msgid "cannot close written keep file '%s'"
-msgstr "không thể đóng tập tin giữ lại đã được ghi “%s”"
+msgid "Trying really trivial in-index merge...\n"
+msgstr "Đang thử hòa trộn kiểu “trivial in-index”…\n"
 
-#: builtin/index-pack.c:1425
-msgid "cannot store pack file"
-msgstr "không thể lưu tập tin gói"
+#: builtin/merge.c:1425
+#, c-format
+msgid "Nope.\n"
+msgstr "Không.\n"
 
-#: builtin/index-pack.c:1436
-msgid "cannot store index file"
-msgstr "không thể lưu trữ tập tin ghi mục lục"
+#: builtin/merge.c:1450
+msgid "Already up-to-date. Yeeah!"
+msgstr "Đã cập nhật rồi. Yeeah!"
+
+#: builtin/merge.c:1456
+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/index-pack.c:1469
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
-msgid "bad pack.indexversion=%<PRIu32>"
-msgstr "sai pack.indexversion=%<PRIu32>"
+msgid "Rewinding the tree to pristine...\n"
+msgstr "Đang tua lại cây thành thời xa xưa…\n"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/merge.c:1483
 #, c-format
-msgid "no threads support, ignoring %s"
-msgstr "không hỗ trợ đa tuyến, bỏ qua %s"
+msgid "Trying merge strategy %s...\n"
+msgstr "Đang thử chiến lược hòa trộn %s…\n"
 
-#: builtin/index-pack.c:1538
+#: builtin/merge.c:1549
 #, c-format
-msgid "Cannot open existing pack file '%s'"
-msgstr "Không thể mở tập tin gói đã sẵn có “%s”"
+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/index-pack.c:1540
+#: builtin/merge.c:1551
 #, 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”"
+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/index-pack.c:1587
+#: builtin/merge.c:1560
 #, c-format
-msgid "non delta: %d object"
-msgid_plural "non delta: %d objects"
-msgstr[0] "không delta: %d đối tượng"
+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/index-pack.c:1594
+#: builtin/merge.c:1572
 #, 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"
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr ""
+"Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu "
+"cầu\n"
 
-#: builtin/index-pack.c:1624
-msgid "Cannot come back to cwd"
-msgstr "Không thể quay lại cwd"
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgstr "git merge-base [-a | --all] <lần_chuyển_giao> <lần_chuyển_giao>…"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
-#, c-format
-msgid "bad %s"
-msgstr "%s sai"
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
+msgstr "git merge-base [-a | --all] --octopus <lần_chuyển_giao>…"
 
-#: builtin/index-pack.c:1709
-msgid "--fix-thin cannot be used without --stdin"
-msgstr "--fix-thin không thể được dùng mà không có --stdin"
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <lần_chuyển_giao>…"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, 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/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <commit> <lần_chuyển_giao>"
 
-#: builtin/index-pack.c:1730
-msgid "--verify with no packfile name given"
-msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile"
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point <tham-chiếu> [<lần_chuyển_giao>]"
 
-#: builtin/init-db.c:55
-#, c-format
-msgid "cannot stat '%s'"
-msgstr "không thể lấy thông tin thống kê về “%s”"
+#: 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/init-db.c:61
-#, c-format
-msgid "cannot stat template '%s'"
-msgstr "không thể lấy thông tin thống kê về mẫu “%s”"
+#: 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/init-db.c:66
-#, c-format
-msgid "cannot opendir '%s'"
-msgstr "không thể opendir() “%s”"
+#: 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/init-db.c:77
-#, c-format
-msgid "cannot readlink '%s'"
-msgstr "không thể readlink “%s”"
+#: 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/init-db.c:79
-#, c-format
-msgid "cannot symlink '%s' '%s'"
-msgstr "không thể tạo liên kết mềm (symlink) “%s” “%s”"
+#: 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>"
 
-#: builtin/init-db.c:85
-#, c-format
-msgid "cannot copy '%s' to '%s'"
-msgstr "không thể sao chép “%s” sang “%s”"
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
+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/init-db.c:89
-#, c-format
-msgid "ignoring template %s"
-msgstr "đang lờ đi mẫu “%s”"
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "gửi kết quả vào đầu ra tiêu chuẩn"
 
-#: builtin/init-db.c:118
-#, c-format
-msgid "templates not found %s"
-msgstr "các mẫu không được tìm thấy %s"
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr "dùng kiểu hòa dựa trên diff3"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "không sao chép các mẫu của phiên bản sai định dạng %d từ “%s”"
+#: builtin/merge-file.c:35
+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
+msgid "for conflicts, use their version"
+msgstr "để tránh xung đột, sử dụng phiên bản của họ"
 
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/merge-file.c:39
+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
+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
+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
+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 "%s already exists"
-msgstr "%s đã có từ trước rồi"
+msgid "unknown option %s"
+msgstr "không hiểu tùy chọn %s"
 
-#: builtin/init-db.c:340
+#: builtin/merge-recursive.c:51
 #, c-format
-msgid "unable to handle file type %d"
-msgstr "không thể xử lý (handle) tập tin kiểu %d"
+msgid "could not parse object '%s'"
+msgstr "không thể phân tích đối tượng “%s”"
 
-#: builtin/init-db.c:343
+#: builtin/merge-recursive.c:55
 #, c-format
-msgid "unable to move %s to %s"
-msgstr "không di chuyển được %s vào %s"
+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"
 
-#. 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:399
+#: 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 "%s%s Git repository in %s%s\n"
-msgstr "%s%s kho Git trong %s%s\n"
+msgid "could not resolve ref '%s'"
+msgstr "không thể phân giải tham chiếu %s"
 
-#: builtin/init-db.c:400
-msgid "Reinitialized existing"
-msgstr "Khởi tạo lại đã sẵn có rồi"
+#: 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/init-db.c:400
-msgid "Initialized empty"
-msgstr "Khởi tạo trống rỗng"
+#: builtin/mktree.c:65
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr "git mktree [-z] [--missing] [--batch]"
 
-#: builtin/init-db.c:401
-msgid " shared"
-msgstr " đã chia sẻ"
+#: builtin/mktree.c:152
+msgid "input is NUL terminated"
+msgstr "đầu vào được chấm dứt bởi NUL"
 
-#: builtin/init-db.c:448
-msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [<directory>]"
-msgstr ""
-"git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
-"quyền>]] [thư-mục]"
+#: builtin/mktree.c:153 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "cho phép thiếu đối tượng"
 
-#: builtin/init-db.c:471
-msgid "permissions"
-msgstr "các quyền"
+#: builtin/mktree.c:154
+msgid "allow creation of more than one tree"
+msgstr "cho phép tạo nhiều hơn một cây"
 
-#: builtin/init-db.c:472
-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/mv.c:15
+msgid "git mv [<options>] <source>... <destination>"
+msgstr "git mv [<các-tùy-chọn>] <nguồn>… <đích>"
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/mv.c:70
 #, c-format
-msgid "cannot mkdir %s"
-msgstr "không thể mkdir (tạo thư mục): %s"
+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
+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/init-db.c:515
+#: builtin/mv.c:90
 #, c-format
-msgid "cannot chdir to %s"
-msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
+msgid "%.*s is in index"
+msgstr "%.*s trong bảng mục lục"
+
+#: builtin/mv.c:112
+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
+msgid "skip move/rename errors"
+msgstr "bỏ qua các lỗi liên quan đến di chuyển, đổi tên"
 
-#: builtin/init-db.c:536
+#: builtin/mv.c:155
 #, c-format
-msgid ""
-"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
-"dir=<directory>)"
-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>)"
+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/init-db.c:564
+#: builtin/mv.c:166
 #, c-format
-msgid "Cannot access work tree '%s'"
-msgstr "không thể truy cập cây (tree) làm việc “%s”"
+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
+msgid "bad source"
+msgstr "nguồn sai"
+
+#: builtin/mv.c:173
+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
+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
+msgid "source directory is empty"
+msgstr "thư mục nguồn là trống rỗng"
 
-#: builtin/interpret-trailers.c:15
-msgid ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<token>[(=|:)<value>])...] [<file>...]"
-msgstr ""
-"git interpret-trailers [--in-place] [--trim-empty] [(--trailer "
-"<thẻ>[(=|:)<giá-trị>])…] [<tập-tin>…]"
+#: builtin/mv.c:210
+msgid "not under version control"
+msgstr "không nằm dưới sự quản lý mã nguồn"
 
-#: builtin/interpret-trailers.c:26
-msgid "edit files in place"
-msgstr "sửa các tập tin tại chỗ"
+#: builtin/mv.c:213
+msgid "destination exists"
+msgstr "đích đã tồn tại sẵn rồi"
 
-#: builtin/interpret-trailers.c:27
-msgid "trim empty trailers"
-msgstr "bộ dò vết cắt bỏ phần trống rỗng"
+#: builtin/mv.c:221
+#, c-format
+msgid "overwriting '%s'"
+msgstr "đang ghi đè lên “%s”"
 
-#: builtin/interpret-trailers.c:28
-msgid "trailer"
-msgstr "bộ dò vết"
+#: builtin/mv.c:224
+msgid "Cannot overwrite"
+msgstr "Không thể ghi đè"
 
-#: builtin/interpret-trailers.c:29
-msgid "trailer(s) to add"
-msgstr "bộ dò vết cần thêm"
+#: builtin/mv.c:227
+msgid "multiple sources for the same target"
+msgstr "Nhiều nguồn cho cùng một đích"
 
-#: builtin/interpret-trailers.c:42
-msgid "no input file given for in-place editing"
-msgstr "không đưa ra tập tin đầu vào để sửa tại-chỗ"
+#: builtin/mv.c:229
+msgid "destination directory does not exist"
+msgstr "thư mục đích không tồn tại"
 
-#: builtin/log.c:43
-msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
-msgstr "git log [<các-tùy-chọn>] [<vùng-xem-xét>] [[--] <đường-dẫn>…]"
+#: builtin/mv.c:236
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, nguồn=%s, đích=%s"
 
-#: builtin/log.c:44
-msgid "git show [<options>] <object>..."
-msgstr "git show [<các-tùy-chọn>] <đối-tượng>…"
+#: builtin/mv.c:257
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/log.c:83
+#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375
 #, c-format
-msgid "invalid --decorate option: %s"
-msgstr "tùy chọn--decorate không hợp lệ: %s"
+msgid "renaming '%s' failed"
+msgstr "gặp lỗi khi đổi tên “%s”"
 
-#: builtin/log.c:131
-msgid "suppress diff output"
-msgstr "chặn mọi kết xuất từ diff"
+#: builtin/name-rev.c:257
+msgid "git name-rev [<options>] <commit>..."
+msgstr "git name-rev [<các-tùy-chọn>] <commit>…"
 
-#: builtin/log.c:132
-msgid "show source"
-msgstr "hiển thị mã nguồn"
+#: builtin/name-rev.c:258
+msgid "git name-rev [<options>] --all"
+msgstr "git name-rev [<các-tùy-chọn>] --all"
 
-#: builtin/log.c:133
-msgid "Use mail map file"
-msgstr "Sử dụng tập tin ánh xạ thư"
+#: builtin/name-rev.c:259
+msgid "git name-rev [<options>] --stdin"
+msgstr "git name-rev [<các-tùy-chọn>] --stdin"
 
-#: builtin/log.c:134
-msgid "decorate options"
-msgstr "các tùy chọn trang trí"
+#: builtin/name-rev.c:311
+msgid "print only names (no SHA-1)"
+msgstr "chỉ hiển thị tên (không SHA-1)"
 
-#: builtin/log.c:137
-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/name-rev.c:312
+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/log.c:233
-#, c-format
-msgid "Final output: %d %s\n"
-msgstr "Kết xuất cuối cùng: %d %s\n"
+#: builtin/name-rev.c:314
+msgid "only use refs matching <pattern>"
+msgstr "chỉ sử dụng các tham chiếu khớp với <mẫu>"
 
-#: builtin/log.c:465
-#, c-format
-msgid "git show %s: bad file"
-msgstr "git show %s: sai tập tin"
+#: builtin/name-rev.c:316
+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/log.c:479 builtin/log.c:572
-#, c-format
-msgid "Could not read object %s"
-msgstr "Không thể đọc đối tượng %s"
+#: builtin/name-rev.c:317
+msgid "read from stdin"
+msgstr "đọc từ đầu vào tiêu chuẩn"
 
-#: builtin/log.c:596
-#, c-format
-msgid "Unknown type: %d"
-msgstr "Không nhận ra kiểu: %d"
+#: builtin/name-rev.c:318
+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/log.c:715
-msgid "format.headers without value"
-msgstr "format.headers không có giá trị cụ thể"
+#: builtin/name-rev.c:324
+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ộ)"
 
-#: builtin/log.c:801
-msgid "name of output directory is too long"
-msgstr "tên của thư mục kết xuất quá dài"
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+msgstr "git notes [--ref <notes-ref>] [list [<đối-tượng>]]"
 
-#: builtin/log.c:816
-#, c-format
-msgid "Cannot open patch file %s"
-msgstr "Không thể mở tập tin miếng vá: %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 <notes-ref>] add [-f] [--allow-empty] [-m <lời-nhắn> | -F "
+"<tập-tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
 
-#: builtin/log.c:830
-msgid "Need exactly one range."
-msgstr "Cần chính xác một vùng."
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+msgstr "git notes [--ref <notes-ref>] copy [-f] <từ-đối-tượng> <đến-đối-tượng>"
 
-#: builtin/log.c:840
-msgid "Not a range."
-msgstr "Không phải là một vùng."
+#: 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 <notes-ref>] append [--allow-empty] [-m <lời-nhắn> | -F "
+"<tập-tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
 
-#: builtin/log.c:946
-msgid "Cover letter needs email format"
-msgstr "“Cover letter” cần cho định dạng thư"
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+msgstr "git notes [--ref <notes-ref>] edit [--allow-empty] [<đối-tượng>]"
 
-#: builtin/log.c:1025
-#, c-format
-msgid "insane in-reply-to: %s"
-msgstr "in-reply-to điên rồ: %s"
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
+msgstr "git notes [--ref <notes-ref>] show [<đối-tượng>]"
 
-#: builtin/log.c:1053
-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/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+msgstr ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <chiến-lược> ] <notes-ref>"
 
-#: builtin/log.c:1098
-msgid "Two output directories?"
-msgstr "Hai thư mục kết xuất?"
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
 
-#: builtin/log.c:1214
-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/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
 
-#: builtin/log.c:1217
-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/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+msgstr "git notes [--ref <notes-ref>] remove [<đối-tượng>…]"
 
-#: builtin/log.c:1221
-msgid "print patches to standard out"
-msgstr "hiển thị miếng vá ra đầu ra chuẩn"
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+msgstr "git notes [--ref <notes-ref>] prune [-n | -v]"
 
-#: builtin/log.c:1223
-msgid "generate a cover letter"
-msgstr "tạo bì thư"
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
+msgstr "git notes [--ref <notes-ref>] get-ref"
 
-#: builtin/log.c:1225
-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/notes.c:41
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [<đối tượng>]]"
 
-#: builtin/log.c:1226
-msgid "sfx"
-msgstr "sfx"
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<các-tùy-chọn>] [<đối-tượng>]"
 
-#: builtin/log.c:1227
-msgid "use <sfx> instead of '.patch'"
-msgstr "sử dụng <sfx> thay cho “.patch”"
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<các-tùy-chọn>] <từ-đối-tượng> <đến-đối-tượng>"
 
-#: builtin/log.c:1229
-msgid "start numbering patches at <n> instead of 1"
-msgstr "bắt đầu đánh số miếng vá từ <n> thay vì 1"
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<từ-đối-tượng> <đến-đối-tượng>]…"
 
-#: builtin/log.c:1231
-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/notes.c:57
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<các-tùy-chọn>] [<đối-tượng>]"
 
-#: builtin/log.c:1233
-msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "Dùng [<tiền-tố>] thay cho [VÁ]"
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<đối tượng>]"
 
-#: builtin/log.c:1236
-msgid "store resulting files in <dir>"
-msgstr "lưu các tập tin kết quả trong <t.mục>"
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
+msgstr "git notes show [<đối tượng>]"
 
-#: builtin/log.c:1239
-msgid "don't strip/add [PATCH]"
-msgstr "không strip/add [VÁ]"
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
+msgstr "git notes merge [<các-tùy-chọn>] <notes-ref>"
 
-#: builtin/log.c:1242
-msgid "don't output binary diffs"
-msgstr "không kết xuất diff (những khác biệt) nhị phân"
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<các-tùy-chọn>]"
 
-#: builtin/log.c:1244
-msgid "output all-zero hash in From header"
-msgstr "xuất mọi mã băm all-zero trong phần đầu From"
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<các-tùy-chọn>]"
 
-#: builtin/log.c:1246
-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/notes.c:79
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<đối tượng>]"
 
-#: builtin/log.c:1248
-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/notes.c:84
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<các-tùy-chọn>]"
 
-#: builtin/log.c:1250
-msgid "Messaging"
-msgstr "Lời nhắn"
+#: builtin/notes.c:89
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
 
-#: builtin/log.c:1251
-msgid "header"
-msgstr "đầu đề thư"
+#: builtin/notes.c:94
+msgid "Write/edit the notes for the following object:"
+msgstr "Ghi hay sửa ghi chú cho đối tượng sau đây:"
 
-#: builtin/log.c:1252
-msgid "add email header"
-msgstr "thêm đầu đề thư"
+#: builtin/notes.c:147
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "không thể khởi chạy “show” cho đối tượng “%s”"
 
-#: builtin/log.c:1253 builtin/log.c:1255
-msgid "email"
-msgstr "thư điện tử"
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
+msgstr "không thể đọc kết xuất “show”"
+
+#: builtin/notes.c:159
+#, c-format
+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/log.c:1253
-msgid "add To: header"
-msgstr "thêm To: đầu đề thư"
+#: builtin/notes.c:194
+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"
 
-#: builtin/log.c:1255
-msgid "add Cc: header"
-msgstr "thêm Cc: đầu đề thư"
+#: builtin/notes.c:203
+msgid "unable to write note object"
+msgstr "không thể ghi đối tượng ghi chú (note)"
 
-#: builtin/log.c:1257
-msgid "ident"
-msgstr "thụt lề"
+#: 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"
 
-#: builtin/log.c:1258
-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/notes.c:233 builtin/tag.c:439
+#, c-format
+msgid "cannot read '%s'"
+msgstr "không thể đọc “%s”"
 
-#: builtin/log.c:1260
-msgid "message-id"
-msgstr "message-id"
+#: builtin/notes.c:235 builtin/tag.c:442
+#, c-format
+msgid "could not open or read '%s'"
+msgstr "không thể mở hay đọc “%s”"
 
-#: builtin/log.c:1261
-msgid "make first mail a reply to <message-id>"
-msgstr "dùng thư đầu tiên để trả lời <message-id>"
+#: 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 "gặp lỗi khi phân giải “%s” như là một tham chiếu hợp lệ."
 
-#: builtin/log.c:1262 builtin/log.c:1265
-msgid "boundary"
-msgstr "ranh giới"
+#: builtin/notes.c:257
+#, c-format
+msgid "failed to read object '%s'."
+msgstr "gặp lỗi khi đọc đối tượng “%s”."
 
-#: builtin/log.c:1263
-msgid "attach the patch"
-msgstr "đính kèm miếng vá"
+#: builtin/notes.c:261
+#, c-format
+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/log.c:1266
-msgid "inline the patch"
-msgstr "dùng miếng vá làm nội dung"
+#: builtin/notes.c:301
+#, c-format
+msgid "malformed input line: '%s'."
+msgstr "dòng đầu vào dị hình: “%s”."
 
-#: builtin/log.c:1270
-msgid "enable message threading, styles: shallow, deep"
-msgstr "cho phép luồng lời nhắn, kiểu: “shallow”, “deep”"
+#: 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”"
 
-#: builtin/log.c:1272
-msgid "signature"
-msgstr "chữ ký"
+#. 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/log.c:1273
-msgid "add a signature"
-msgstr "thêm chữ ký"
+#: 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 "quá nhiều đối số"
 
-#: builtin/log.c:1275
-msgid "add a signature from a file"
-msgstr "thêm chữ ký từ một tập tin"
+#: builtin/notes.c:378 builtin/notes.c:665
+#, c-format
+msgid "no note found for object %s."
+msgstr "không tìm thấy ghi chú cho đối tượng %s."
 
-#: builtin/log.c:1276
-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/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/log.c:1365
-msgid "-n and -k are mutually exclusive."
-msgstr "-n và  -k loại từ lẫn nhau."
+#: 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/log.c:1367
-msgid "--subject-prefix and -k are mutually exclusive."
-msgstr "--subject-prefix và -k xung khắc nhau."
+#: 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/log.c:1375
-msgid "--name-only does not make sense"
-msgstr "--name-only không hợp lý"
+#: 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/log.c:1377
-msgid "--name-status does not make sense"
-msgstr "--name-status không hợp lý"
+#: 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/log.c:1379
-msgid "--check does not make sense"
-msgstr "--check không hợp lý"
+#: builtin/notes.c:412 builtin/notes.c:483
+msgid "replace existing notes"
+msgstr "thay thế ghi chú trước"
 
-#: builtin/log.c:1407
-msgid "standard output, or directory, which one?"
-msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?"
+#: builtin/notes.c:437
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+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/log.c:1409
+#: builtin/notes.c:452 builtin/notes.c:531
 #, c-format
-msgid "Could not create directory '%s'"
-msgstr "Không thể tạo thư mục “%s”"
+msgid "Overwriting existing notes for object %s\n"
+msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n"
 
-#: builtin/log.c:1506
+#: builtin/notes.c:463 builtin/notes.c:624 builtin/notes.c:889
 #, c-format
-msgid "unable to read signature file '%s'"
-msgstr "không thể đọc tập tin chữ ký “%s”"
+msgid "Removing note for object %s\n"
+msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
 
-#: builtin/log.c:1569
-msgid "Failed to create output files"
-msgstr "Gặp lỗi khi tạo các tập tin kết xuất"
+#: 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/log.c:1617
-msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr "git cherry [-v] [<thượng-nguồn> [<đầu> [<giới-hạn>]]]"
+#: 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:504
+msgid "too few parameters"
+msgstr "quá ít đối số"
 
-#: builtin/log.c:1671
+#: builtin/notes.c:525
 #, c-format
 msgid ""
-"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
 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"
+"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/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
+#: builtin/notes.c:537
 #, c-format
-msgid "Unknown commit %s"
-msgstr "Không hiểu lần chuyển giao %s"
-
-#: builtin/ls-files.c:378
-msgid "git ls-files [<options>] [<file>...]"
-msgstr "git ls-files [<các-tùy-chọn>] [<tập-tin>…]"
+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/ls-files.c:427
-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:429
-msgid "use lowercase letters for 'assume unchanged' files"
+#: 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 ""
-"dùng chữ cái viết thường cho các tập tin “assume unchanged” (giả định không "
-"thay đổi)"
+"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/ls-files.c:431
-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/notes.c:685
+msgid "failed to delete ref NOTES_MERGE_PARTIAL"
+msgstr "gặp lỗi khi xóa tham chiếu NOTES_MERGE_PARTIAL"
 
-#: builtin/ls-files.c:433
-msgid "show deleted files in the output"
-msgstr "hiển thị các tập tin đã xóa trong kết xuất"
+#: builtin/notes.c:687
+msgid "failed to delete ref NOTES_MERGE_REF"
+msgstr "gặp lỗi khi xóa tham chiếu NOTES_MERGE_REF"
 
-#: builtin/ls-files.c:435
-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/notes.c:689
+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/ls-files.c:437
-msgid "show other files in the output"
-msgstr "hiển thị các tập tin khác trong kết xuất"
+#: builtin/notes.c:709
+msgid "failed to read ref NOTES_MERGE_PARTIAL"
+msgstr "gặp lỗi khi đọc tham chiếu NOTES_MERGE_PARTIAL"
 
-#: builtin/ls-files.c:439
-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/notes.c:711
+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/ls-files.c:442
-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/notes.c:713
+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/ls-files.c:444
-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/notes.c:726
+msgid "failed to resolve NOTES_MERGE_REF"
+msgstr "gặp lỗi khi phân giải NOTES_MERGE_REF"
 
-#: builtin/ls-files.c:446
-msgid "show 'other' directories' names only"
-msgstr "chỉ hiển thị tên của các thư mục “khác”"
+#: builtin/notes.c:729
+msgid "failed to finalize notes merge"
+msgstr "gặp lỗi khi hoàn thành hòa trộn ghi chú"
 
-#: builtin/ls-files.c:448
-msgid "show line endings of files"
-msgstr "hiển thị kết thúc dòng của các tập tin"
+#: builtin/notes.c:755
+#, 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/ls-files.c:450
-msgid "don't show empty directories"
-msgstr "không hiển thị thư mục rỗng"
+#: builtin/notes.c:771
+msgid "General options"
+msgstr "Tùy chọn chung"
 
-#: builtin/ls-files.c:453
-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/notes.c:773
+msgid "Merge options"
+msgstr "Tùy chọn về hòa trộn"
 
-#: builtin/ls-files.c:455
-msgid "show resolve-undo information"
-msgstr "hiển thị thông tin resolve-undo"
+#: builtin/notes.c:775
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+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/ls-files.c:457
-msgid "skip files matching pattern"
-msgstr "bỏ qua những tập tin khớp với một mẫu"
+#: builtin/notes.c:777
+msgid "Committing unmerged notes"
+msgstr "Chuyển giao các note chưa được hòa trộn"
 
-#: builtin/ls-files.c:460
-msgid "exclude patterns are read from <file>"
-msgstr "mẫu loại trừ được đọc từ <tập tin>"
+#: builtin/notes.c:779
+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/ls-files.c:463
-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/notes.c:781
+msgid "Aborting notes merge resolution"
+msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn"
 
-#: builtin/ls-files.c:465
-msgid "add the standard git exclusions"
-msgstr "thêm loại trừ tiêu chuẩn kiểu git"
+#: builtin/notes.c:783
+msgid "abort notes merge"
+msgstr "bỏ qua hòa trộn các ghi chú (note)"
 
-#: builtin/ls-files.c:468
-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/notes.c:794
+msgid "cannot mix --commit, --abort or -s/--strategy"
+msgstr "không thể trộn lẫn --commit, --abort hay -s/--strategy"
 
-#: builtin/ls-files.c:471
-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/notes.c:799
+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/ls-files.c:472
-msgid "tree-ish"
-msgstr "tree-ish"
+#: builtin/notes.c:823
+#, c-format
+msgid "unknown -s/--strategy: %s"
+msgstr "không hiểu -s/--strategy: %s"
 
-#: builtin/ls-files.c:473
-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/notes.c:860
+#, c-format
+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/ls-files.c:475
-msgid "show debugging data"
-msgstr "hiển thị dữ liệu gỡ lỗi"
+#: builtin/notes.c:863
+#, 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)"
 
-#: builtin/ls-remote.c:7
+#: builtin/notes.c:865
+#, c-format
 msgid ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [<repository> [<refs>...]]"
+"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 ""
-"git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n"
-"                     [-q | --quiet] [--exit-code] [--get-url]\n"
-"                     [--symref] [<kho> [<các tham chiếu>…]]"
+"Gặp lỗi khi hòa trộn các ghi chú tự động. Sửa các xung đột này trong %s và "
+"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/ls-remote.c:50
-msgid "do not print remote URL"
-msgstr "không hiển thị URL máy chủ"
+#: builtin/notes.c:887
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "Đối tượng %s không có ghi chú (note)\n"
 
-#: builtin/ls-remote.c:51 builtin/ls-remote.c:53
-msgid "exec"
-msgstr "thực thi"
+#: builtin/notes.c:899
+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/ls-remote.c:52 builtin/ls-remote.c:54
-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/notes.c:902
+msgid "read object names from the standard input"
+msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn"
 
-#: builtin/ls-remote.c:56
-msgid "limit to tags"
-msgstr "giới hạn tới các thẻ"
+#: builtin/notes.c:940 builtin/prune.c:105 builtin/worktree.c:127
+msgid "do not remove, show only"
+msgstr "không gỡ bỏ, chỉ hiển thị"
 
-#: builtin/ls-remote.c:57
-msgid "limit to heads"
-msgstr "giới hạn cho các đầu"
+#: builtin/notes.c:941
+msgid "report pruned notes"
+msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/ls-remote.c:58
-msgid "do not show peeled tags"
-msgstr "không hiển thị thẻ bị peel (gọt bỏ)"
+#: builtin/notes.c:983
+msgid "notes-ref"
+msgstr "notes-ref"
+
+#: builtin/notes.c:984
+msgid "use notes from <notes-ref>"
+msgstr "dùng “notes” từ <notes-ref>"
+
+#: builtin/notes.c:1019
+#, c-format
+msgid "unknown subcommand: %s"
+msgstr "không hiểu câu lệnh con: %s"
+
+#: 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:30
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects [các-tùy-chọn…] <base-name> [< <danh-sách-ref> | < <danh-"
+"sách-đối-tượng>]"
 
-#: builtin/ls-remote.c:60
-msgid "take url.<base>.insteadOf into account"
-msgstr "lấy url.<base>.insteadOf vào trong tài khoản"
+#: builtin/pack-objects.c:179 builtin/pack-objects.c:182
+#, c-format
+msgid "deflate error (%d)"
+msgstr "lỗi giải nén (%d)"
 
-#: builtin/ls-remote.c:62
-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/pack-objects.c:768
+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/ls-remote.c:64
-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ó"
+#: builtin/pack-objects.c:781
+msgid "Writing objects"
+msgstr "Đang ghi lại các đối tượng"
 
-#: builtin/ls-tree.c:28
-msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
-msgstr "git ls-tree [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>…]"
+#: builtin/pack-objects.c:1070
+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/ls-tree.c:128
-msgid "only show trees"
-msgstr "chỉ hiển thị các tree"
+#: builtin/pack-objects.c:2346
+msgid "Compressing objects"
+msgstr "Đang nén các đối tượng"
 
-#: builtin/ls-tree.c:130
-msgid "recurse into subtrees"
-msgstr "đệ quy vào các thư mục con"
+#: builtin/pack-objects.c:2759
+#, c-format
+msgid "unsupported index version %s"
+msgstr "phiên bản mục lục không được hỗ trợ %s"
 
-#: builtin/ls-tree.c:132
-msgid "show trees when recursing"
-msgstr "hiển thị cây khi đệ quy"
+#: builtin/pack-objects.c:2763
+#, c-format
+msgid "bad index version '%s'"
+msgstr "phiên bản mục lục sai “%s”"
 
-#: builtin/ls-tree.c:135
-msgid "terminate entries with NUL byte"
-msgstr "chấm dứt mục tin với byte NUL"
+#: builtin/pack-objects.c:2793
+msgid "do not show progress meter"
+msgstr "không hiển thị bộ đo tiến trình"
 
-#: builtin/ls-tree.c:136
-msgid "include object size"
-msgstr "gồm cả kích thước đối tượng"
+#: builtin/pack-objects.c:2795
+msgid "show progress meter"
+msgstr "hiển thị bộ đo tiến trình"
 
-#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
-msgid "list only filenames"
-msgstr "chỉ liệt kê tên tập tin"
+#: builtin/pack-objects.c:2797
+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/ls-tree.c:143
-msgid "use full path names"
-msgstr "dùng tên đường dẫn đầy đủ"
+#: builtin/pack-objects.c:2800
+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/ls-tree.c:145
-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)"
+#: builtin/pack-objects.c:2801
+msgid "version[,offset]"
+msgstr "phiên bản[,offset]"
 
-#: builtin/merge.c:45
-msgid "git merge [<options>] [<commit>...]"
-msgstr "git merge [<các-tùy-chọn>] [<commit>…]"
+#: builtin/pack-objects.c:2802
+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/merge.c:46
-msgid "git merge [<options>] <msg> HEAD <commit>"
-msgstr "git merge [<các-tùy-chọn>] <tin-nhắn> HEAD <commit>"
+#: builtin/pack-objects.c:2805
+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/merge.c:47
-msgid "git merge --abort"
-msgstr "git merge --abort"
+#: builtin/pack-objects.c:2807
+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/merge.c:100
-msgid "switch `m' requires a value"
-msgstr "switch “m” yêu cầu một giá trị"
+#: builtin/pack-objects.c:2809
+msgid "ignore packed objects"
+msgstr "bỏ qua các đối tượng đóng gói"
 
-#: builtin/merge.c:137
-#, 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/pack-objects.c:2811
+msgid "limit pack window by objects"
+msgstr "giới hạn cửa sổ đóng gói theo đối tượng"
 
-#: builtin/merge.c:138
-#, c-format
-msgid "Available strategies are:"
-msgstr "Các chiến lược sẵn sàng là:"
+#: builtin/pack-objects.c:2813
+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/merge.c:143
-#, c-format
-msgid "Available custom strategies are:"
-msgstr "Các chiến lược tùy chỉnh sẵn sàng là:"
+#: builtin/pack-objects.c:2815
+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/merge.c:193 builtin/pull.c:123
-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/pack-objects.c:2817
+msgid "reuse existing deltas"
+msgstr "dùng lại các delta sẵn có"
 
-#: builtin/merge.c:196 builtin/pull.c:126
-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/pack-objects.c:2819
+msgid "reuse existing objects"
+msgstr "dùng lại các đối tượng sẵn có"
 
-#: builtin/merge.c:197 builtin/pull.c:129
-msgid "(synonym to --stat)"
-msgstr "(đồng nghĩa với --stat)"
+#: builtin/pack-objects.c:2821
+msgid "use OFS_DELTA objects"
+msgstr "dùng các đối tượng OFS_DELTA"
 
-#: builtin/merge.c:199 builtin/pull.c:132
-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/pack-objects.c:2823
+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/merge.c:202 builtin/pull.c:135
-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/pack-objects.c:2825
+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/merge.c:204 builtin/pull.c:138
-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/pack-objects.c:2827
+msgid "read revision arguments from standard input"
+msgstr " đọc tham số “revision” từ thiết bị nhập chuẩn"
 
-#: builtin/merge.c:206 builtin/pull.c:141
-msgid "edit message before committing"
-msgstr "sửa chú thích trước khi chuyển giao"
+#: builtin/pack-objects.c:2829
+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/merge.c:207
-msgid "allow fast-forward (default)"
-msgstr "cho phép chuyển-tiếp-nhanh (mặc định)"
+#: builtin/pack-objects.c:2832
+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/merge.c:209 builtin/pull.c:147
-msgid "abort if fast-forward is not possible"
-msgstr "bỏ qua nếu chuyển-tiếp-nhanh không thể được"
+#: builtin/pack-objects.c:2835
+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/merge.c:213
-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/pack-objects.c:2838
+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/merge.c:214 builtin/notes.c:770 builtin/pull.c:152
-#: builtin/revert.c:89
-msgid "strategy"
-msgstr "chiến lược"
+#: builtin/pack-objects.c:2841
+msgid "output pack to stdout"
+msgstr "xuất gói ra đầu ra tiêu chuẩn"
 
-#: builtin/merge.c:215 builtin/pull.c:153
-msgid "merge strategy to use"
-msgstr "chiến lược hòa trộn sẽ dùng"
+#: builtin/pack-objects.c:2843
+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/merge.c:216 builtin/pull.c:156
-msgid "option=value"
-msgstr "tùy_chọn=giá_trị"
+#: builtin/pack-objects.c:2845
+msgid "keep unreachable objects"
+msgstr "giữ lại các đối tượng không thể đọc được"
 
-#: builtin/merge.c:217 builtin/pull.c:157
-msgid "option for selected merge strategy"
-msgstr "tùy chọn cho chiến lược hòa trộn đã chọn"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "pack mất các đối tượng không thể đọc được"
 
-#: builtin/merge.c:219
-msgid "merge commit message (for a non-fast-forward merge)"
+#: builtin/pack-objects.c:2849
+msgid "unpack unreachable objects newer than <time>"
 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:223
-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"
+"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/merge.c:251
-msgid "could not run stash."
-msgstr "không thể chạy stash."
+#: builtin/pack-objects.c:2852
+msgid "create thin packs"
+msgstr "tạo gói nhẹ"
 
-#: builtin/merge.c:256
-msgid "stash failed"
-msgstr "lệnh tạm cất gặp lỗi"
+#: builtin/pack-objects.c:2854
+msgid "create packs suitable for shallow fetches"
+msgstr "tạo gói để phù hợp cho lấy về nông (shallow)"
 
-#: builtin/merge.c:261
-#, c-format
-msgid "not a valid object: %s"
-msgstr "không phải là một đối tượng hợp lệ: %s"
+#: builtin/pack-objects.c:2856
+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/merge.c:280 builtin/merge.c:297
-msgid "read-tree failed"
-msgstr "read-tree gặp lỗi"
+#: builtin/pack-objects.c:2858
+msgid "pack compression level"
+msgstr "mức nén gói"
 
-#: builtin/merge.c:327
-msgid " (nothing to squash)"
-msgstr " (không có gì để squash)"
+#: builtin/pack-objects.c:2860
+msgid "do not hide commits by grafts"
+msgstr "không ẩn các lần chuyển giao bởi “grafts”"
 
-#: builtin/merge.c:340
-#, c-format
-msgid "Squash commit -- not updating HEAD\n"
-msgstr "Squash commit -- không cập nhật HEAD\n"
+#: builtin/pack-objects.c:2862
+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/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "Không thể ghi vào “%s”"
+#: builtin/pack-objects.c:2864
+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/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "Đang ghi SQUASH_MSG"
+#: builtin/pack-objects.c:2993
+msgid "Counting objects"
+msgstr "Đang đếm các đối tượng"
 
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "Hoàn thành SQUASH_MSG"
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
+msgstr "git pack-refs [<các-tùy-chọn>]"
 
-#: builtin/merge.c:397
-#, 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/pack-refs.c:14
+msgid "pack everything"
+msgstr "đóng gói mọi thứ"
 
-#: builtin/merge.c:448
-#, 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/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "prune (cắt cụt) những tham chiếu bị mất (mặc định)"
 
-#: builtin/merge.c:538
-#, c-format
-msgid "Bad branch.%s.mergeoptions string: %s"
-msgstr "Chuỗi branch.%s.mergeoptions sai: %s"
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
 
-#: builtin/merge.c:657
-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/prune-packed.c:40
+msgid "Removing duplicate objects"
+msgstr "Đang gỡ các đối tượng trùng lặp"
 
-#: builtin/merge.c:671
-#, 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/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>…]"
 
-#: builtin/merge.c:684
-#, c-format
-msgid "unable to write %s"
-msgstr "không thể ghi %s"
+#: builtin/prune.c:106 builtin/worktree.c:128
+msgid "report pruned objects"
+msgstr "báo cáo các đối tượng đã prune"
 
-#: builtin/merge.c:773
-#, c-format
-msgid "Could not read from '%s'"
-msgstr "Không thể đọc từ “%s”"
+#: builtin/prune.c:109 builtin/worktree.c:130
+msgid "expire objects older than <time>"
+msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
 
-#: builtin/merge.c:782
-#, 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/prune.c:123
+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/merge.c:788
+#: builtin/pull.c:51 builtin/pull.c:53
 #, 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 ""
-"Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần "
-"thiết,\n"
-"đặc biệt là khi nó hòa trộn thượng nguồn đã cập nhật vào trong một nhánh "
-"topic.\n"
-"\n"
-"Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua, và phần chú thích này nếu "
-"rỗng\n"
-"sẽ hủy bỏ lần chuyển giao.\n"
+msgid "Invalid value for %s: %s"
+msgstr "Giá trị không hợp lệ %s: %s"
 
-#: builtin/merge.c:812
-msgid "Empty commit message."
-msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
+#: builtin/pull.c:73
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
 
-#: builtin/merge.c:824
-#, c-format
-msgid "Wonderful.\n"
-msgstr "Tuyệt vời.\n"
+#: 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/merge.c:879
-#, 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/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/merge.c:895
-#, c-format
-msgid "'%s' is not a commit"
-msgstr "%s không phải là một lần commit (chuyển giao)"
+#: builtin/pull.c:148 builtin/revert.c:101
+msgid "allow fast-forward"
+msgstr "cho phép chuyển-tiếp-nhanh"
 
-#: builtin/merge.c:936
-msgid "No current branch."
-msgstr "không phải nhánh hiện hành"
+#: 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/merge.c:938
-msgid "No remote for the current branch."
-msgstr "Không có máy chủ cho nhánh hiện hành."
+#: 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/merge.c:940
-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/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/merge.c:945
+#: builtin/pull.c:284
 #, 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"
+msgid "Invalid value for pull.ff: %s"
+msgstr "Giá trị không hợp lệ cho pull.ff: %s"
 
-#: builtin/merge.c:1080
-#, c-format
-msgid "could not close '%s'"
-msgstr "không thể đóng “%s”"
+#: builtin/pull.c:397
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+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/merge.c:1207
-msgid "There is no merge to abort (MERGE_HEAD missing)."
+#: builtin/pull.c:399
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
 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)."
+"Ở đâ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/merge.c:1223
+#: builtin/pull.c:400
 msgid ""
-"You have not concluded your merge (MERGE_HEAD exists).\n"
-"Please, commit your changes before you merge."
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
 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."
+"Đại thể điều này có nghĩa là bạn đã cung cấp đặc tả đường dẫn dạng dùng ký "
+"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/merge.c:1230
+#: builtin/pull.c:403
+#, c-format
 msgid ""
-"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
-"Please, commit your changes before you merge."
+"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 ""
-"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."
+"Bạn yêu cầu pull từ máy dịch vụ “%s”, nhưng lại chưa chỉ định\n"
+"nhánh nào. Bởi vì đây không phải là máy dịch vụ được cấu hình\n"
+"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/merge.c:1233
-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/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/merge.c:1242
-msgid "You cannot combine --squash with --no-ff."
-msgstr "Bạn không thể kết hợp --squash với --no-ff."
+#: 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/merge.c:1250
-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/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/merge.c:1267
-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/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/merge.c:1269
-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/pull.c:415 builtin/pull.c:421 builtin/pull.c:430
+#: git-parse-remote.sh:64
+msgid "<remote>"
+msgstr "<máy chủ>"
 
-#: builtin/merge.c:1275
-#, 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"
+#: builtin/pull.c:415 builtin/pull.c:430 builtin/pull.c:435 git-rebase.sh:451
+#: git-parse-remote.sh:65
+msgid "<branch>"
+msgstr "<nhánh>"
 
-#: builtin/merge.c:1277
-msgid "Can merge only exactly one commit into empty head"
+#: 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:432 git-parse-remote.sh:95
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:"
 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"
+"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/merge.c:1332
+#: builtin/pull.c:437
 #, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
 msgstr ""
-"Lần chuyển giao %s có một chữ ký GPG không đáng tin, được cho là bởi %s."
+"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/merge.c:1335
-#, 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/pull.c:754
+msgid "ignoring --verify-signatures for rebase"
+msgstr "bỏ qua --verify-signatures khi rebase"
 
-#: builtin/merge.c:1338
-#, 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/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/merge.c:1341
-#, 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/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/merge.c:1424
-#, c-format
-msgid "Updating %s..%s\n"
-msgstr "Đang cập nhật %s..%s\n"
+#: 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/merge.c:1461
+#: builtin/pull.c:838
 #, c-format
-msgid "Trying really trivial in-index merge...\n"
-msgstr "Đang thử hòa trộn kiểu “trivial in-index”…\n"
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"fetch đã cập nhật head nhánh hiện tại.\n"
+"đ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/merge.c:1468
+#: builtin/pull.c:843
 #, c-format
-msgid "Nope.\n"
-msgstr "Không.\n"
+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 ""
+"Không thể chuyển tiếp nhanh cây làm việc của bạn.\n"
+"Sau khi chắc chắn rằng mình đã ghi lại mọi thứ\n"
+"quý báu từ kết xuất của lệnh\n"
+"$ git diff %s\n"
+"chạy\n"
+"$ git reset --hard\n"
+"để khôi phục lại."
 
-#: builtin/merge.c:1500
-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/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/merge.c:1523 builtin/merge.c:1602
-#, 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/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."
 
-#: builtin/merge.c:1527
-#, c-format
-msgid "Trying merge strategy %s...\n"
-msgstr "Đang thử chiến lược hòa trộn %s…\n"
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
 
-#: builtin/merge.c:1593
-#, 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/push.c:89
+msgid "tag shorthand without <tag>"
+msgstr "dùng tốc ký thẻ không có <thẻ>"
 
-#: builtin/merge.c:1595
-#, 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/push.c:99
+msgid "--delete only accepts plain target ref names"
+msgstr "--delete chỉ chấp nhận các tên tham chiếu dạng thường"
 
-#: builtin/merge.c:1604
-#, 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/push.c:143
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr ""
+"\n"
+"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong “git help "
+"config”."
 
-#: builtin/merge.c:1616
+#: builtin/push.c:146
 #, c-format
-msgid "Automatic merge went well; stopped before committing as requested\n"
+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 ""
-"Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu "
-"cầu\n"
-
-#: builtin/merge-base.c:29
-msgid "git merge-base [-a | --all] <commit> <commit>..."
-msgstr "git merge-base [-a | --all] <lần_chuyển_giao> <lần_chuyển_giao>…"
-
-#: builtin/merge-base.c:30
-msgid "git merge-base [-a | --all] --octopus <commit>..."
-msgstr "git merge-base [-a | --all] --octopus <lần_chuyển_giao>…"
-
-#: builtin/merge-base.c:31
-msgid "git merge-base --independent <commit>..."
-msgstr "git merge-base --independent <lần_chuyển_giao>…"
-
-#: builtin/merge-base.c:32
-msgid "git merge-base --is-ancestor <commit> <commit>"
-msgstr "git merge-base --is-ancestor <commit> <lần_chuyển_giao>"
+"Nhánh thượng nguồn của nhánh hiện tại của bạn không khớp\n"
+"với tên của nhánh hiện tại của bạn.  Để đẩy lên đến nhánh thượng nguồn\n"
+"trên máy chủ, sử dụng\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"Để push tới nhánh cùng tên trên máy chủ, sử dụng\n"
+"\n"
+"    git push %s %s\n"
+"%s"
 
-#: builtin/merge-base.c:33
-msgid "git merge-base --fork-point <ref> [<commit>]"
-msgstr "git merge-base --fork-point <tham-chiếu> [<lần_chuyển_giao>]"
+#: 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 ""
+"Bạn hiện nay không ở một nhánh.\n"
+"Để đẩy lịch sử lên trên trạng thái hiện hành (HEAD đã bị tách rời)\n"
+"ngay bây giờ, sử dụng\n"
+"\n"
+"    git push %s HEAD:<tên-của-nhánh-máy-chủ>\n"
 
-#: builtin/merge-base.c:214
-msgid "output all common ancestors"
-msgstr "xuất ra tất cả các ông bà, tổ tiên chung"
+#: 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 ""
+"Nhánh hiện tại %s không có nhánh thượng nguồn nào.\n"
+"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ này làm thượng nguồn "
+"(upstream), sử dụng\n"
+"\n"
+"    git push --set-upstream %s %s\n"
 
-#: builtin/merge-base.c:216
-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/push.c:183
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr "Nhánh hiện tại %s có nhiều nhánh thượng nguồn, từ chối push."
 
-#: builtin/merge-base.c:218
-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/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 ""
+"Bạn đang push (đẩy lên) máy chủ “%s”, mà nó không phải là thượng nguồn "
+"(upstream) của\n"
+"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/merge-base.c:220
-msgid "is the first one ancestor of the other?"
-msgstr "là cha mẹ đầu tiên của cái khác?"
+#: builtin/push.c:242
+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/merge-base.c:222
-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>"
+#: 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 ""
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh hiện tại của bạn nằm đằng\n"
+"sau bộ phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ\n"
+"(v.d. \"git pull …\") trước khi đẩy lên lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
+"tiết."
 
-#: builtin/merge-file.c:8
+#: builtin/push.c:255
 msgid ""
-"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
-"<orig-file> <file2>"
+"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 ""
-"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>"
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh đã đẩy lên nằm đằng sau "
+"bộ\n"
+"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi\n"
+"từ máy chủ (v.d. “git pull …”) trước khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
+"tiết."
 
-#: builtin/merge-file.c:33
-msgid "send results to standard output"
-msgstr "gửi kết quả vào đầu ra tiêu chuẩn"
+#: 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."
+msgstr ""
+"Việc cập nhật bị từ chối bởi vì máy chủ có chứa công việc mà bạn không\n"
+"có ở máy nội bộ của mình. Lỗi này thường có nguyên nhân bởi kho khác đẩy\n"
+"dữ liệu lên cùng một tham chiếu. Bạn có lẽ muốn hòa trộn với các thay đổi\n"
+"từ máy chủ (v.d. “git pull…”) trước khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
+"tiết."
 
-#: builtin/merge-file.c:34
-msgid "use a diff3 based merge"
-msgstr "dùng kiểu hòa dựa trên diff3"
+#: builtin/push.c:268
+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/merge-file.c:35
-msgid "for conflicts, use our version"
-msgstr "để tránh xung đột, sử dụng phiên bản của chúng ta"
+#: 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"
+msgstr ""
+"Không thể cập nhật một tham chiếu trên máy chủ mà nó chỉ đến đối tượng "
+"không\n"
+"phải là lần chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến "
+"đối tượng\n"
+"không phải chuyển giao, mà không sử dụng tùy chọn “--force”.\n"
 
-#: builtin/merge-file.c:37
-msgid "for conflicts, use their version"
-msgstr "để tránh xung đột, sử dụng phiên bản của họ"
+#: builtin/push.c:331
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "Đang đẩy lên %s\n"
 
-#: builtin/merge-file.c:39
-msgid "for conflicts, use a union version"
-msgstr "để tránh xung đột, sử dụng phiên bản kết hợp"
+#: builtin/push.c:335
+#, 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/merge-file.c:42
-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/push.c:366
+#, c-format
+msgid "bad repository '%s'"
+msgstr "repository (kho) sai “%s”"
 
-#: builtin/merge-file.c:43
-msgid "do not warn about conflicts"
-msgstr "không cảnh báo về các xung đột xảy ra"
+#: 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"
+msgstr ""
+"Chưa cấu hình đích để đẩy lên.\n"
+"Hoặc là chỉ ra URL từ dòng lệnh hoặc là cấu hình một kho máy chủ sử dụng\n"
+"\n"
+"    git remote add <tên> <url>\n"
+"\n"
+"và sau đó đẩy lên sử dụng tên máy chủ\n"
+"\n"
+"    git push <tên>\n"
 
-#: builtin/merge-file.c:45
-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/push.c:385
+msgid "--all and --tags are incompatible"
+msgstr "--all và --tags xung khắc nhau"
 
-#: builtin/mktree.c:65
-msgid "git mktree [-z] [--missing] [--batch]"
-msgstr "git mktree [-z] [--missing] [--batch]"
+#: builtin/push.c:386
+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/mktree.c:152
-msgid "input is NUL terminated"
-msgstr "đầu vào được chấm dứt bởi NUL"
+#: builtin/push.c:391
+msgid "--mirror and --tags are incompatible"
+msgstr "--mirror và --tags xung khắc nhau"
 
-#: builtin/mktree.c:153 builtin/write-tree.c:24
-msgid "allow missing objects"
-msgstr "cho phép thiếu đối tượng"
+#: builtin/push.c:392
+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/mktree.c:154
-msgid "allow creation of more than one tree"
-msgstr "cho phép tạo nhiều hơn một cây"
+#: builtin/push.c:397
+msgid "--all and --mirror are incompatible"
+msgstr "--all và --mirror xung khắc nhau"
 
-#: builtin/mv.c:15
-msgid "git mv [<options>] <source>... <destination>"
-msgstr "git mv [<các-tùy-chọn>] <nguồn>… <đích>"
+#: builtin/push.c:515
+msgid "repository"
+msgstr "kho"
 
-#: builtin/mv.c:70
-#, 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/push.c:516 builtin/send-pack.c:161
+msgid "push all refs"
+msgstr "đẩy tất cả các tham chiếu"
 
-#: builtin/mv.c:72
-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/push.c:517 builtin/send-pack.c:163
+msgid "mirror all refs"
+msgstr "mirror tất cả các tham chiếu"
 
-#: builtin/mv.c:90
-#, c-format
-msgid "%.*s is in index"
-msgstr "%.*s trong bảng mục lục"
+#: builtin/push.c:519
+msgid "delete refs"
+msgstr "xóa các tham chiếu"
 
-#: builtin/mv.c:112
-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/push.c:520
+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/mv.c:113
-msgid "skip move/rename errors"
-msgstr "bỏ qua các lỗi liên quan đến di chuyển, đổi tên"
+#: builtin/push.c:523 builtin/send-pack.c:164
+msgid "force updates"
+msgstr "ép buộc cập nhật"
 
-#: builtin/mv.c:152
-#, 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/push.c:525 builtin/send-pack.c:175
+msgid "refname>:<expect"
+msgstr "tên-tham-chiếu>:<cần"
 
-#: builtin/mv.c:163
-#, 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/push.c:526 builtin/send-pack.c:176
+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/mv.c:167
-msgid "bad source"
-msgstr "nguồn sai"
+#: builtin/push.c:529
+msgid "control recursive pushing of submodules"
+msgstr "điều khiển việc đẩy lên (push) đệ qui của mô-đun-con"
 
-#: builtin/mv.c:170
-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/push.c:531 builtin/send-pack.c:169
+msgid "use thin pack"
+msgstr "tạo gói nhẹ"
 
-#: builtin/mv.c:173
-msgid "cannot move directory over file"
-msgstr "không di chuyển được thư mục thông qua tập tin"
+#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158
+#: builtin/send-pack.c:159
+msgid "receive pack program"
+msgstr "chương trình nhận gói"
 
-#: builtin/mv.c:182
-msgid "source directory is empty"
-msgstr "thư mục nguồn là trống rỗng"
+#: builtin/push.c:534
+msgid "set upstream for git pull/status"
+msgstr "đặt thượng nguồn cho git pull/status"
 
-#: builtin/mv.c:207
-msgid "not under version control"
-msgstr "không nằm dưới sự quản lý mã nguồn"
+#: builtin/push.c:537
+msgid "prune locally removed refs"
+msgstr "xén tỉa những tham chiếu bị gỡ bỏ"
 
-#: builtin/mv.c:210
-msgid "destination exists"
-msgstr "đích đã tồn tại sẵn rồi"
+#: builtin/push.c:539
+msgid "bypass pre-push hook"
+msgstr "vòng qua móc tiền-đẩy (pre-push)"
 
-#: builtin/mv.c:218
-#, c-format
-msgid "overwriting '%s'"
-msgstr "đang ghi đè lên “%s”"
+#: builtin/push.c:540
+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/mv.c:221
-msgid "Cannot overwrite"
-msgstr "Không thể ghi đè"
+#: builtin/push.c:543 builtin/send-pack.c:166
+msgid "GPG sign the push"
+msgstr "ký lần đẩy dùng GPG"
 
-#: builtin/mv.c:224
-msgid "multiple sources for the same target"
-msgstr "Nhiều nguồn cho cùng một đích"
+#: builtin/push.c:545 builtin/send-pack.c:170
+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/mv.c:226
-msgid "destination directory does not exist"
-msgstr "thư mục đích không tồn tại"
+#: builtin/push.c:546
+msgid "server-specific"
+msgstr "đặc-tả-máy-phục-vụ"
 
-#: builtin/mv.c:233
-#, c-format
-msgid "%s, source=%s, destination=%s"
-msgstr "%s, nguồn=%s, đích=%s"
+#: builtin/push.c:546
+msgid "option to transmit"
+msgstr "tùy chọn để chuyển giao"
 
-#: builtin/mv.c:254
-#, c-format
-msgid "Renaming %s to %s\n"
-msgstr "Đổi tên %s thành %s\n"
+#: builtin/push.c:560
+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/mv.c:257 builtin/remote.c:714 builtin/repack.c:365
-#, c-format
-msgid "renaming '%s' failed"
-msgstr "gặp lỗi khi đổi tên “%s”"
+#: builtin/push.c:562
+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/name-rev.c:251
-msgid "git name-rev [<options>] <commit>..."
-msgstr "git name-rev [<các-tùy-chọn>] <commit>…"
+#: builtin/push.c:579
+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/name-rev.c:252
-msgid "git name-rev [<options>] --all"
-msgstr "git name-rev [<các-tùy-chọn>] --all"
+#: 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>]])"
+msgstr ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<tiền-"
+"tố>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] "
+"[--index-output=<tập-tin>] (--empty | <tree-ish1> [<tree-ish2> [<tree-"
+"ish3>]])"
 
-#: builtin/name-rev.c:253
-msgid "git name-rev [<options>] --stdin"
-msgstr "git name-rev [<các-tùy-chọn>] --stdin"
+#: builtin/read-tree.c:110
+msgid "write resulting index to <file>"
+msgstr "ghi mục lục kết quả vào <tập-tin>"
 
-#: builtin/name-rev.c:305
-msgid "print only names (no SHA-1)"
-msgstr "chỉ hiển thị tên (không SHA-1)"
+#: builtin/read-tree.c:113
+msgid "only empty the index"
+msgstr "chỉ với bảng mục lục trống rỗng"
 
-#: builtin/name-rev.c:306
-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/read-tree.c:115
+msgid "Merging"
+msgstr "Hòa trộn"
 
-#: builtin/name-rev.c:308
-msgid "only use refs matching <pattern>"
-msgstr "chỉ sử dụng các tham chiếu khớp với <mẫu>"
+#: builtin/read-tree.c:117
+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/name-rev.c:310
-msgid "list all commits reachable from all refs"
+#: builtin/read-tree.c:119
+msgid "3-way merge if no file level merging required"
 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"
+"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/name-rev.c:311
-msgid "read from stdin"
-msgstr "đọc từ đầu vào tiêu chuẩn"
+#: builtin/read-tree.c:121
+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/name-rev.c:312
-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/read-tree.c:123
+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/name-rev.c:318
-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ộ)"
+#: builtin/read-tree.c:124
+msgid "<subdirectory>/"
+msgstr "<thư-mục-con>/"
 
-#: builtin/notes.c:25
-msgid "git notes [--ref <notes-ref>] [list [<object>]]"
-msgstr "git notes [--ref <notes-ref>] [list [<đối-tượng>]]"
+#: builtin/read-tree.c:125
+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/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 <notes-ref>] add [-f] [--allow-empty] [-m <lời-nhắn> | -F "
-"<tập-tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
+#: builtin/read-tree.c:128
+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/notes.c:27
-msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
-msgstr "git notes [--ref <notes-ref>] copy [-f] <từ-đối-tượng> <đến-đối-tượng>"
+#: builtin/read-tree.c:130
+msgid "gitignore"
+msgstr "gitignore"
 
-#: 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 <notes-ref>] append [--allow-empty] [-m <lời-nhắn> | -F "
-"<tập-tin> | (-c | -C) <đối-tượng>] [<đối-tượng>]"
+#: builtin/read-tree.c:131
+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/notes.c:29
-msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
-msgstr "git notes [--ref <notes-ref>] edit [--allow-empty] [<đối-tượng>]"
+#: builtin/read-tree.c:134
+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/notes.c:30
-msgid "git notes [--ref <notes-ref>] show [<object>]"
-msgstr "git notes [--ref <notes-ref>] show [<đối-tượng>]"
+#: builtin/read-tree.c:135
+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/notes.c:31
+#: builtin/read-tree.c:137
+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
+msgid "debug unpack-trees"
+msgstr "gỡ lỗi “unpack-trees”"
+
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <thư-mục-git>"
+
+#: builtin/receive-pack.c:793
 msgid ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+"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 ""
-"git notes [--ref <notes-ref>] merge [-v | -q] [-s <chiến-lược> ] <notes-ref>"
-
-#: builtin/notes.c:32
-msgid "git notes merge --commit [-v | -q]"
-msgstr "git notes merge --commit [-v | -q]"
+"Theo mặc định, việc cập nhật nhánh hiện tại không 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/notes.c:33
-msgid "git notes merge --abort [-v | -q]"
-msgstr "git notes merge --abort [-v | -q]"
+#: 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 ""
+"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/notes.c:34
-msgid "git notes [--ref <notes-ref>] remove [<object>...]"
-msgstr "git notes [--ref <notes-ref>] remove [<đối-tượng>…]"
+#: builtin/receive-pack.c:1883
+msgid "quiet"
+msgstr "im lặng"
 
-#: builtin/notes.c:35
-msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
-msgstr "git notes [--ref <notes-ref>] prune [-n | -v]"
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "Bạn phải chỉ định thư mục."
 
-#: builtin/notes.c:36
-msgid "git notes [--ref <notes-ref>] get-ref"
-msgstr "git notes [--ref <notes-ref>] get-ref"
+#: builtin/reflog.c:423
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
+msgstr "“%s” dành cho “%s” không phải là dấu vết thời gian hợp lệ"
 
-#: builtin/notes.c:41
-msgid "git notes [list [<object>]]"
-msgstr "git notes [list [<đối tượng>]]"
+#: builtin/reflog.c:540 builtin/reflog.c:545
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "“%s” không phải là dấu thời gian hợp lệ"
 
-#: builtin/notes.c:46
-msgid "git notes add [<options>] [<object>]"
-msgstr "git notes add [<các-tùy-chọn>] [<đối-tượng>]"
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
 
-#: builtin/notes.c:51
-msgid "git notes copy [<options>] <from-object> <to-object>"
-msgstr "git notes copy [<các-tùy-chọn>] <từ-đối-tượng> <đến-đối-tượng>"
+#: 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 <nhánh>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <tên> <url>"
 
-#: builtin/notes.c:52
-msgid "git notes copy --stdin [<from-object> <to-object>]..."
-msgstr "git notes copy --stdin [<từ-đối-tượng> <đến-đối-tượng>]…"
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <tên-cũ> <tên-mới>"
 
-#: builtin/notes.c:57
-msgid "git notes append [<options>] [<object>]"
-msgstr "git notes append [<các-tùy-chọn>] [<đối-tượng>]"
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr "git remote remove <tên>"
 
-#: builtin/notes.c:62
-msgid "git notes edit [<object>]"
-msgstr "git notes edit [<đối tượng>]"
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <tên> (-a | --auto | -d | --delete | <nhánh>)"
 
-#: builtin/notes.c:67
-msgid "git notes show [<object>]"
-msgstr "git notes show [<đối tượng>]"
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <tên>"
 
-#: builtin/notes.c:72
-msgid "git notes merge [<options>] <notes-ref>"
-msgstr "git notes merge [<các-tùy-chọn>] <notes-ref>"
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <tên>"
 
-#: builtin/notes.c:73
-msgid "git notes merge --commit [<options>]"
-msgstr "git notes merge --commit [<các-tùy-chọn>]"
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<nhóm> | <máy-chủ>)…]"
 
-#: builtin/notes.c:74
-msgid "git notes merge --abort [<options>]"
-msgstr "git notes merge --abort [<các-tùy-chọn>]"
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <tên> <nhánh>…"
 
-#: builtin/notes.c:79
-msgid "git notes remove [<object>]"
-msgstr "git notes remove [<đối tượng>]"
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote set-url [--push] [--all] <tên>"
 
-#: builtin/notes.c:84
-msgid "git notes prune [<options>]"
-msgstr "git notes prune [<các-tùy-chọn>]"
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <tên> <url-mới> [<url-cũ>]"
 
-#: builtin/notes.c:89
-msgid "git notes get-ref"
-msgstr "git notes get-ref"
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <tên> <url-mới>"
 
-#: builtin/notes.c:147
-#, c-format
-msgid "unable to start 'show' for object '%s'"
-msgstr "không thể khởi chạy “show” cho đối tượng “%s”"
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <tên> <url>"
 
-#: builtin/notes.c:151
-msgid "could not read 'show' output"
-msgstr "không thể đọc kết xuất “show”"
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<các-tùy-chọn>] <tên> <url>"
 
-#: builtin/notes.c:159
-#, c-format
-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/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <tên> <nhánh>…"
 
-#: builtin/notes.c:174 builtin/tag.c:248
-#, c-format
-msgid "could not create file '%s'"
-msgstr "không thể tạo tập tin “%s”"
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <tên> <nhánh>…"
 
-#: builtin/notes.c:193
-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"
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<các-tùy-chọn>] <tên>"
 
-#: builtin/notes.c:202
-msgid "unable to write note object"
-msgstr "không thể ghi đối tượng ghi chú (note)"
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<các-tùy-chọn>] <tên>"
 
-#: builtin/notes.c:204
-#, c-format
-msgid "The note contents have been left in %s"
-msgstr "Nội dung ghi chú còn lại %s"
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<các-tùy-chọn>] [<nhóm> | <máy-chủ>]…"
 
-#: builtin/notes.c:232 builtin/tag.c:440
+#: builtin/remote.c:94
 #, c-format
-msgid "cannot read '%s'"
-msgstr "không thể đọc “%s”"
+msgid "Updating %s"
+msgstr "Đang cập nhật %s"
 
-#: builtin/notes.c:234 builtin/tag.c:443
-#, c-format
-msgid "could not open or read '%s'"
-msgstr "không thể mở hay đọc “%s”"
+#: builtin/remote.c:126
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"--mirror nguy hiểm và không dùng nữa; xin hãy\n"
+"\t sử dụng tùy chọn --mirror=fetch hoặc --mirror=push để thay thế"
 
-#: 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:880 builtin/tag.c:456
+#: builtin/remote.c:143
 #, 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ệ."
+msgid "unknown mirror argument: %s"
+msgstr "không hiểu tham số máy bản sao (mirror): %s"
 
-#: builtin/notes.c:256
-#, c-format
-msgid "Failed to read object '%s'."
-msgstr "Gặp lỗi khi đọc đối tượng “%s”."
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
+msgstr "lấy về các nhánh từ máy chủ"
 
-#: builtin/notes.c:260
-#, c-format
-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/remote.c:161
+msgid "import all tags and associated objects when fetching"
+msgstr "nhập vào tất cả các đối tượng thẻ và thành phần liên quan khi lấy về"
 
-#: 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:945
-msgid "too many parameters"
-msgstr "quá nhiều đối số"
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "hoặc không lấy về bất kỳ thẻ nào (--no-tags)"
 
-#: builtin/notes.c:375 builtin/notes.c:662
-#, c-format
-msgid "No note found for object %s."
-msgstr "không tìm thấy ghi chú cho đối tượng %s."
+#: builtin/remote.c:166
+msgid "branch(es) to track"
+msgstr "các nhánh để theo dõi"
 
-#: builtin/notes.c:396 builtin/notes.c:559
-msgid "note contents as a string"
-msgstr "nội dung ghi chú (note) nằm trong một chuỗi"
+#: builtin/remote.c:167
+msgid "master branch"
+msgstr "nhánh master"
 
-#: builtin/notes.c:399 builtin/notes.c:562
-msgid "note contents in a file"
-msgstr "nội dung ghi chú (note) nằm trong một tập tin"
+#: builtin/remote.c:168
+msgid "push|fetch"
+msgstr "push|fetch"
 
-#: builtin/notes.c:402 builtin/notes.c:565
-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/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "đặt máy chủ (remote) như là một máy bản sao để push hay fetch từ đó"
 
-#: builtin/notes.c:405 builtin/notes.c:568
-msgid "reuse specified note object"
-msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr "đang chỉ định một nhánh master không hợp lý với tùy chọn --mirror"
 
-#: builtin/notes.c:408 builtin/notes.c:571
-msgid "allow storing empty note"
-msgstr "cho lưu trữ ghi chú trống rỗng"
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr "chỉ định những nhánh để theo dõi chỉ hợp lý với các “fetch mirror”"
 
-#: builtin/notes.c:409 builtin/notes.c:480
-msgid "replace existing notes"
-msgstr "thay thế ghi chú trước"
+#: builtin/remote.c:190 builtin/remote.c:629
+#, c-format
+msgid "remote %s already exists."
+msgstr "máy chủ %s đã tồn tại rồi."
 
-#: builtin/notes.c:434
+#: builtin/remote.c:194 builtin/remote.c:633
 #, c-format
-msgid ""
-"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
-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ũ"
+msgid "'%s' is not a valid remote name"
+msgstr "“%s” không phải tên máy chủ hợp lệ"
 
-#: builtin/notes.c:449 builtin/notes.c:528
+#: builtin/remote.c:234
 #, c-format
-msgid "Overwriting existing notes for object %s\n"
-msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n"
+msgid "Could not setup master '%s'"
+msgstr "Không thể cài đặt nhánh master “%s”"
 
-#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:885
+#: builtin/remote.c:336
 #, c-format
-msgid "Removing note for object %s\n"
-msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
+msgid "Could not get fetch map for refspec %s"
+msgstr "Không thể lấy ánh xạ (map) fetch cho đặc tả tham chiếu %s"
 
-#: builtin/notes.c:481
-msgid "read objects from stdin"
-msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn"
+#: builtin/remote.c:437 builtin/remote.c:445
+msgid "(matching)"
+msgstr "(khớp)"
 
-#: builtin/notes.c:483
-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/remote.c:449
+msgid "(delete)"
+msgstr "(xóa)"
 
-#: builtin/notes.c:501
-msgid "too few parameters"
-msgstr "quá ít đối số"
+#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854
+#, c-format
+msgid "No such remote: %s"
+msgstr "Không có máy chủ nào như thế: %s"
 
-#: builtin/notes.c:522
+#: builtin/remote.c:639
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "Không thể đổi tên phần của cấu hình từ “%s” thành “%s”"
+
+#: builtin/remote.c:659
 #, c-format
 msgid ""
-"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
-"existing notes"
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
 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ũ"
+"Không cập nhật “non-default fetch respec”\n"
+"\t%s\n"
+"\tXin hãy cập nhật phần cấu hình một cách thủ công nếu thấy cần thiết."
 
-#: builtin/notes.c:534
+#: builtin/remote.c:695
 #, 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 "deleting '%s' failed"
+msgstr "gặp lỗi khi xóa “%s”"
 
-#: builtin/notes.c:586
+#: builtin/remote.c:729
 #, c-format
+msgid "creating '%s' failed"
+msgstr "gặp lỗi khi tạo “%s”"
+
+#: builtin/remote.c:792
 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 ""
-"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"
+"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] ""
+"Chú ý: Một số nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ "
+"đi;\n"
+"để xóa đi, sử dụng:"
 
-#: builtin/notes.c:767
-msgid "General options"
-msgstr "Tùy chọn chung"
+#: builtin/remote.c:806
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "Không thể gỡ bỏ phần cấu hình “%s”"
 
-#: builtin/notes.c:769
-msgid "Merge options"
-msgstr "Tùy chọn về hòa trộn"
+#: builtin/remote.c:907
+#, 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/notes.c:771
-msgid ""
-"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
-"cat_sort_uniq)"
-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/remote.c:910
+msgid " tracked"
+msgstr " được theo dõi"
 
-#: builtin/notes.c:773
-msgid "Committing unmerged notes"
-msgstr "Chuyển giao các note chưa được hòa trộn"
+#: builtin/remote.c:912
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " cũ rích (dùng “git remote prune” để gỡ bỏ)"
 
-#: builtin/notes.c:775
-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/remote.c:914
+msgid " ???"
+msgstr " ???"
 
-#: builtin/notes.c:777
-msgid "Aborting notes merge resolution"
-msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn"
+#: builtin/remote.c:955
+#, 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/notes.c:779
-msgid "abort notes merge"
-msgstr "bỏ qua hòa trộn các ghi chú (note)"
+#: builtin/remote.c:963
+#, 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/notes.c:856
+#: builtin/remote.c:964
 #, 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 "rebases onto remote %s"
+msgstr "thực hiện rebase trên máy chủ %s"
 
-#: builtin/notes.c:883
+#: builtin/remote.c:967
 #, c-format
-msgid "Object %s has no note\n"
-msgstr "Đối tượng %s không có ghi chú (note)\n"
+msgid " merges with remote %s"
+msgstr " hòa trộn với máy chủ %s"
 
-#: builtin/notes.c:895
-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/remote.c:970
+#, c-format
+msgid "merges with remote %s"
+msgstr "hòa trộn với máy chủ %s"
 
-#: builtin/notes.c:898
-msgid "read object names from the standard input"
-msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn"
+#: builtin/remote.c:973
+#, c-format
+msgid "%-*s    and with remote %s\n"
+msgstr "%-*s    và với máy chủ %s\n"
 
-#: builtin/notes.c:979
-msgid "notes-ref"
-msgstr "notes-ref"
+#: builtin/remote.c:1016
+msgid "create"
+msgstr "tạo"
 
-#: builtin/notes.c:980
-msgid "use notes from <notes-ref>"
-msgstr "dùng “notes” từ <notes-ref>"
+#: builtin/remote.c:1019
+msgid "delete"
+msgstr "xóa"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
-#, c-format
-msgid "Unknown subcommand: %s"
-msgstr "Không hiểu câu lệnh con: %s"
+#: builtin/remote.c:1023
+msgid "up to date"
+msgstr "đã cập nhật"
 
-#: builtin/pack-objects.c:28
-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/remote.c:1026
+msgid "fast-forwardable"
+msgstr "có-thể-chuyển-tiếp-nhanh"
 
-#: builtin/pack-objects.c:29
-msgid ""
-"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
-msgstr ""
-"git pack-objects [các-tùy-chọn…] <base-name> [< <danh-sách-ref> | < <danh-"
-"sách-đối-tượng>]"
+#: builtin/remote.c:1029
+msgid "local out of date"
+msgstr "dữ liệu nội bộ đã cũ"
 
-#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#: builtin/remote.c:1036
 #, c-format
-msgid "deflate error (%d)"
-msgstr "lỗi giải nén (%d)"
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s ép buộc thành %-*s (%s)"
 
-#: builtin/pack-objects.c:772
-msgid "Writing objects"
-msgstr "Đang ghi lại các đối tượng"
+#: builtin/remote.c:1039
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s đẩy lên thành %-*s (%s)"
+
+#: builtin/remote.c:1043
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s ép buộc thành %s"
 
-#: builtin/pack-objects.c:1012
-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/remote.c:1046
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s đẩy lên thành %s"
 
-#: builtin/pack-objects.c:2172
-msgid "Compressing objects"
-msgstr "Đang nén các đối tượng"
+#: builtin/remote.c:1114
+msgid "do not query remotes"
+msgstr "không truy vấn các máy chủ"
 
-#: builtin/pack-objects.c:2558
+#: builtin/remote.c:1141
 #, c-format
-msgid "unsupported index version %s"
-msgstr "phiên bản mục lục không được hỗ trợ %s"
+msgid "* remote %s"
+msgstr "* máy chủ %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/remote.c:1142
 #, c-format
-msgid "bad index version '%s'"
-msgstr "phiên bản mục lục sai “%s”"
+msgid "  Fetch URL: %s"
+msgstr "  URL để lấy về: %s"
 
-#: builtin/pack-objects.c:2592
-msgid "do not show progress meter"
-msgstr "không hiển thị bộ đo tiến trình"
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
+msgid "(no URL)"
+msgstr "(không có URL)"
 
-#: builtin/pack-objects.c:2594
-msgid "show progress meter"
-msgstr "hiển thị bộ đo tiến trình"
+#. 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"
+msgstr "  URL để đẩy lên: %s"
 
-#: builtin/pack-objects.c:2596
-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/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  Nhánh HEAD: %s"
 
-#: builtin/pack-objects.c:2599
-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/remote.c:1158
+msgid "(not queried)"
+msgstr "(không yêu cầu)"
 
-#: builtin/pack-objects.c:2600
-msgid "version[,offset]"
-msgstr "phiên bản[,offset]"
+#: builtin/remote.c:1160
+msgid "(unknown)"
+msgstr "(không hiểu)"
 
-#: builtin/pack-objects.c:2601
-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/remote.c:1164
+#, 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/pack-objects.c:2604
-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/remote.c:1176
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] "  Những nhánh trên máy chủ:%s"
 
-#: builtin/pack-objects.c:2606
-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/remote.c:1179 builtin/remote.c:1205
+msgid " (status not queried)"
+msgstr " (trạng thái không được yêu cầu)"
 
-#: builtin/pack-objects.c:2608
-msgid "ignore packed objects"
-msgstr "bỏ qua các đối tượng đóng gói"
+#: builtin/remote.c:1188
+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/pack-objects.c:2610
-msgid "limit pack window by objects"
-msgstr "giới hạn cửa sổ đóng gói theo đối tượng"
+#: builtin/remote.c:1196
+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/pack-objects.c:2612
-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/remote.c:1202
+#, 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/pack-objects.c:2614
-msgid "maximum length of delta chain allowed in the resulting pack"
-msgstr "Ä\91á»\99 dài tá»\91i Ä\91a của chuá»\97i móc xích â\80\9cdeltaâ\80\9d Ä\91ược phép trong gói kết quả"
+#: builtin/remote.c:1223
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "Ä\91ặt refs/remotes/<tên>/HEAD cho phù hợp vá»\9bi máy chủ"
 
-#: builtin/pack-objects.c:2616
-msgid "reuse existing deltas"
-msgstr "dùng lại các delta sẵn có"
+#: builtin/remote.c:1225
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "xóa refs/remotes/<tên>/HEAD"
 
-#: builtin/pack-objects.c:2618
-msgid "reuse existing objects"
-msgstr "dùng lại các đối tượng sẵn có"
+#: builtin/remote.c:1240
+msgid "Cannot determine remote HEAD"
+msgstr "Không thể xác định được HEAD máy chủ"
 
-#: builtin/pack-objects.c:2620
-msgid "use OFS_DELTA objects"
-msgstr "dùng các đối tượng OFS_DELTA"
+#: builtin/remote.c:1242
+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/pack-objects.c:2622
-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/remote.c:1252
+#, c-format
+msgid "Could not delete %s"
+msgstr "Không thể xóa bỏ %s"
 
-#: builtin/pack-objects.c:2624
-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/remote.c:1260
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr "Không phải là tham chiếu hợp lệ: %s"
 
-#: builtin/pack-objects.c:2626
-msgid "read revision arguments from standard input"
-msgstr " đọc tham số “revision” từ thiết bị nhập chuẩn"
+#: builtin/remote.c:1262
+#, c-format
+msgid "Could not setup %s"
+msgstr "Không thể cài đặt %s"
 
-#: builtin/pack-objects.c:2628
-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/remote.c:1280
+#, c-format
+msgid " %s will become dangling!"
+msgstr " %s sẽ trở thành không đầu (không được quản lý)!"
 
-#: builtin/pack-objects.c:2631
-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/remote.c:1281
+#, c-format
+msgid " %s has become dangling!"
+msgstr " %s đã trở thành không đầu (không được quản lý)!"
 
-#: builtin/pack-objects.c:2634
-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/remote.c:1291
+#, c-format
+msgid "Pruning %s"
+msgstr "Đang xén bớt %s"
 
-#: builtin/pack-objects.c:2637
-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/remote.c:1292
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
 
-#: builtin/pack-objects.c:2640
-msgid "output pack to stdout"
-msgstr "xuất gói ra đầu ra tiêu chuẩn"
+#: builtin/remote.c:1308
+#, c-format
+msgid " * [would prune] %s"
+msgstr " * [nên xén bớt] %s"
 
-#: builtin/pack-objects.c:2642
-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/remote.c:1311
+#, c-format
+msgid " * [pruned] %s"
+msgstr " * [đã bị xén] %s"
 
-#: builtin/pack-objects.c:2644
-msgid "keep unreachable objects"
-msgstr "giữ lại các đối tượng không thể đọc được"
+#: builtin/remote.c:1356
+msgid "prune remotes after fetching"
+msgstr "cắt máy chủ sau khi lấy về"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "thời-gian"
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
+#, c-format
+msgid "No such remote '%s'"
+msgstr "Không có máy chủ nào có tên “%s”"
 
-#: builtin/pack-objects.c:2646
-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/remote.c:1435
+msgid "add branch"
+msgstr "thêm nhánh"
 
-#: builtin/pack-objects.c:2649
-msgid "create thin packs"
-msgstr "tạo gói nhẹ"
+#: builtin/remote.c:1442
+msgid "no remote specified"
+msgstr "chưa chỉ ra máy chủ nào"
 
-#: builtin/pack-objects.c:2651
-msgid "create packs suitable for shallow fetches"
-msgstr "tạo gói để phù hợp cho lấy về nông (shallow)"
+#: builtin/remote.c:1459
+msgid "query push URLs rather than fetch URLs"
+msgstr "truy vấn đẩy URL thay vì lấy"
 
-#: builtin/pack-objects.c:2653
-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/remote.c:1461
+msgid "return all URLs"
+msgstr "trả về mọi URL"
 
-#: builtin/pack-objects.c:2655
-msgid "pack compression level"
-msgstr "mức nén gói"
+#: builtin/remote.c:1489
+#, 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/pack-objects.c:2657
-msgid "do not hide commits by grafts"
-msgstr "không ẩn các lần chuyển giao bởi “grafts”"
+#: builtin/remote.c:1515
+msgid "manipulate push URLs"
+msgstr "đẩy các “URL” bằng tay"
 
-#: builtin/pack-objects.c:2659
-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/remote.c:1517
+msgid "add URL"
+msgstr "thêm URL"
 
-#: builtin/pack-objects.c:2661
-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/remote.c:1519
+msgid "delete URLs"
+msgstr "xóa URLs"
 
-#: builtin/pack-objects.c:2752
-msgid "Counting objects"
-msgstr "Đang đếm các đối tượng"
+#: builtin/remote.c:1526
+msgid "--add --delete doesn't make sense"
+msgstr "--add --delete không hợp lý"
 
-#: builtin/pack-refs.c:6
-msgid "git pack-refs [<options>]"
-msgstr "git pack-refs [<các-tùy-chọn>]"
+#: builtin/remote.c:1567
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "Kiểu mẫu URL cũ không hợp lệ: %s"
 
-#: builtin/pack-refs.c:14
-msgid "pack everything"
-msgstr "đóng gói mọi thứ"
+#: builtin/remote.c:1575
+#, c-format
+msgid "No such URL found: %s"
+msgstr "Không tìm thấy URL như vậy: %s"
 
-#: builtin/pack-refs.c:15
-msgid "prune loose refs (default)"
-msgstr "prune (cắt cụt) những tham chiếu bị mất (mặc định)"
+#: builtin/remote.c:1577
+msgid "Will not delete all non-push URLs"
+msgstr "Sẽ không xóa những địa chỉ URL không-push"
 
-#: builtin/prune-packed.c:7
-msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
-msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+#: builtin/remote.c:1591
+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/prune-packed.c:40
-msgid "Removing duplicate objects"
-msgstr "Đang gỡ các đối tượng trùng lặp"
+#: builtin/remote.c:1622
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Không hiểu câu lệnh con: %s"
 
-#: builtin/prune.c:11
-msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>…]"
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
+msgstr "git repack [<các-tùy-chọn>]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "không gỡ bỏ, chỉ hiển thị"
+#: builtin/repack.c:160
+msgid "pack everything in a single pack"
+msgstr "đóng gói mọi thứ trong một gói đơn"
 
-#: builtin/prune.c:106 builtin/worktree.c:125
-msgid "report pruned objects"
-msgstr "báo cáo các đối tượng đã prune"
+#: builtin/repack.c:162
+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/prune.c:109 builtin/worktree.c:127
-msgid "expire objects older than <time>"
-msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>"
+#: builtin/repack.c:165
+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/prune.c:123
-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/repack.c:167
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "chuyển --no-reuse-delta cho git-pack-objects"
 
-#: builtin/pull.c:72
-msgid "git pull [<options>] [<repository> [<refspec>...]]"
-msgstr "git pull [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
+#: builtin/repack.c:169
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr "chuyển --no-reuse-object cho git-pack-objects"
 
-#: builtin/pull.c:117
-msgid "Options related to merging"
-msgstr "Các tùy chọn liên quan đến hòa trộn"
+#: builtin/repack.c:171
+msgid "do not run git-update-server-info"
+msgstr "không chạy git-update-server-info"
 
-#: builtin/pull.c:120
-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/repack.c:174
+msgid "pass --local to git-pack-objects"
+msgstr "chuyển --local cho git-pack-objects"
 
-#: builtin/pull.c:144 builtin/revert.c:105
-msgid "allow fast-forward"
-msgstr "cho phép chuyển-tiếp-nhanh"
+#: builtin/repack.c:176
+msgid "write bitmap index"
+msgstr "ghi mục lục ánh xạ"
 
-#: builtin/pull.c:150
-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/repack.c:177
+msgid "approxidate"
+msgstr "ngày ước tính"
 
-#: builtin/pull.c:164
-msgid "Options related to fetching"
-msgstr "Các tùy chọn liên quan đến lệnh lấy về"
+#: builtin/repack.c:178
+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/pull.c:186
-msgid "number of submodules pulled in parallel"
-msgstr "số lượng mô-đun-con được đẩy lên đồng thời"
+#: builtin/repack.c:180
+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/pull.c:275
-#, c-format
-msgid "Invalid value for pull.ff: %s"
-msgstr "Giá trị không hợp lệ cho pull.ff: %s"
+#: builtin/repack.c:182
+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/pull.c:359
-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/repack.c:183 builtin/repack.c:187
+msgid "bytes"
+msgstr "byte"
 
-#: builtin/pull.c:365
-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/repack.c:184
+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/pull.c:367
-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/repack.c:186
+msgid "limits the maximum delta depth"
+msgstr "giới hạn độ sâu tối đa của “delta”"
 
-#: builtin/pull.c:443
-msgid ""
-"There is no candidate for rebasing against among the refs that you just "
-"fetched."
-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/repack.c:188
+msgid "maximum size of each packfile"
+msgstr "kích thước tối đa cho từng tập tin gói"
 
-#: builtin/pull.c:445
-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/repack.c:190
+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/pull.c:446
-msgid ""
-"Generally this means that you provided a wildcard refspec which had no\n"
-"matches on the remote end."
-msgstr ""
-"Đại thể điều này có nghĩa là bạn đã cung cấp đặc tả đường dẫn dạng dùng ký "
-"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/repack.c:200
+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
+msgid "--keep-unreachable and -A are incompatible"
+msgstr "--keep-unreachable và -A xung khắc nhau"
 
-#: builtin/pull.c:449
+#: builtin/repack.c:391 builtin/worktree.c:115
 #, 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 ""
-"Bạn yêu cầu pull từ máy dịch vụ “%s”, nhưng lại chưa chỉ định\n"
-"nhánh nào. Bởi vì đây không phải là máy dịch vụ được cấu hình\n"
-"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."
+msgid "failed to remove '%s'"
+msgstr "gặp lỗi khi gỡ bỏ “%s”"
 
-#: builtin/pull.c:454
-msgid "You are not currently on a branch."
-msgstr "Hiện tại bạn chẳng ở nhánh nào cả."
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <đối-tượng> <thay-thế>"
 
-#: builtin/pull.c:456 builtin/pull.c:471
-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/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <đối tượng>"
 
-#: builtin/pull.c:458 builtin/pull.c:473
-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/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <lần_chuyển_giao> [<cha_mẹ>…]"
 
-#: builtin/pull.c:459 builtin/pull.c:474
-msgid "See git-pull(1) for details."
-msgstr "Xem git-pull(1) để biết thêm chi tiết."
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d <đối tượng>…"
 
-#: builtin/pull.c:469
-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/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr "git replace [--format=<định_dạng>] [-l [<mẫu>]]"
 
-#: builtin/pull.c:478
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
 #, c-format
-msgid ""
-"If you wish to set tracking information for this branch you can do so with:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<nhánh> %s\n"
-"\n"
+msgid "Not a valid object name: '%s'"
+msgstr "Không phải là tên đối tượng hợp lệ: “%s”"
 
-#: builtin/pull.c:483
+#: builtin/replace.c:355
 #, c-format
-msgid ""
-"Your configuration specifies to merge with the ref '%s'\n"
-"from the remote, but no such ref was fetched."
-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:841
-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."
+msgid "bad mergetag in commit '%s'"
+msgstr "thẻ hòa trộn sai trong lần chuyển giao “%s”"
 
-#: builtin/pull.c:870
+#: builtin/replace.c:357
 #, c-format
-msgid ""
-"fetch updated the current branch head.\n"
-"fast-forwarding your working tree from\n"
-"commit %s."
-msgstr ""
-"fetch đã cập nhật head nhánh hiện tại.\n"
-"đang chuyển-tiếp-nhanh cây làm việc của bạn từ\n"
-"lần chuyển giaot %s."
+msgid "malformed mergetag in commit '%s'"
+msgstr "thẻ hòa trộn không đúng dạng ở lần chuyển giao “%s”"
 
-#: builtin/pull.c:875
+#: builtin/replace.c:368
 #, 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."
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
 msgstr ""
-"Không thể chuyển tiếp nhanh cây làm việc của bạn.\n"
-"Sau khi chắc chắn rằng mình đã ghi lại mọi thứ\n"
-"quý báu từ kết xuất của lệnh\n"
-"$ git diff %s\n"
-"chạy\n"
-"$ git reset --hard\n"
-"để khôi phục lại."
-
-#: builtin/pull.c:890
-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:894
-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."
+"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/push.c:16
-msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr "git push [<các-tùy-chọn>] [<kho-chứa> [<refspec>…]]"
+#: builtin/replace.c:401
+#, 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/push.c:89
-msgid "tag shorthand without <tag>"
-msgstr "dùng tốc ký thẻ không có <thẻ>"
+#: builtin/replace.c:402
+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/push.c:99
-msgid "--delete only accepts plain target ref names"
-msgstr "--delete chỉ chấp nhận các tên tham chiếu dạng thường"
+#: builtin/replace.c:408
+#, 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/push.c:143
-msgid ""
-"\n"
-"To choose either option permanently, see push.default in 'git help config'."
-msgstr ""
-"\n"
-"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong “git help "
-"config”."
+#: builtin/replace.c:432
+msgid "list replace refs"
+msgstr "liệt kê các refs thay thế"
 
-#: 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 ""
-"Nhánh thượng nguồn của nhánh hiện tại của bạn không khớp\n"
-"với tên của nhánh hiện tại của bạn.  Để đẩy lên đến nhánh thượng nguồn\n"
-"trên máy chủ, sử dụng\n"
-"\n"
-"    git push %s HEAD:%s\n"
-"\n"
-"Để push tới nhánh cùng tên trên máy chủ, sử dụng\n"
-"\n"
-"    git push %s %s\n"
-"%s"
+#: builtin/replace.c:433
+msgid "delete replace refs"
+msgstr "xóa tham chiếu thay thế"
 
-#: 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 ""
-"Bạn hiện nay không ở một nhánh.\n"
-"Để đẩy lịch sử lên trên trạng thái hiện hành (HEAD đã bị tách rời)\n"
-"ngay bây giờ, sử dụng\n"
-"\n"
-"    git push %s HEAD:<tên-của-nhánh-máy-chủ>\n"
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "sửa đối tượng sẵn có"
 
-#: 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 ""
-"Nhánh hiện tại %s không có nhánh thượng nguồn nào.\n"
-"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ này làm thượng nguồn "
-"(upstream), sử dụng\n"
-"\n"
-"    git push --set-upstream %s %s\n"
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "thay đổi cha mẹ của lần chuyển giao"
 
-#: builtin/push.c:183
-#, c-format
-msgid "The current branch %s has multiple upstream branches, refusing to push."
-msgstr "Nhánh hiện tại %s có nhiều nhánh thượng nguồn, từ chối push."
+#: builtin/replace.c:436
+msgid "replace the ref if it exists"
+msgstr "thay thế tham chiếu nếu nó đã sẵn có"
 
-#: 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 ""
-"Bạn đang push (đẩy lên) máy chủ “%s”, mà nó không phải là thượng nguồn "
-"(upstream) của\n"
-"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/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "đừng in đẹp các nội dung cho --edit"
 
-#: builtin/push.c:242
-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/replace.c:438
+msgid "use this format"
+msgstr "dùng định dạng này"
 
-#: 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/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
 msgstr ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh hiện tại của bạn nằm đằng\n"
-"sau bộ phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ\n"
-"(v.d. \"git pull …\") trước khi đẩy lên lần nữa.\n"
-"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
-"tiết."
+"git rerere [clear | forget <đường dẫn>… | status | remaining | diff | gc]"
 
-#: 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 ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh đã đẩy lên nằm đằng sau "
-"bộ\n"
-"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi\n"
-"từ máy chủ (v.d. “git pull …”) trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
-"tiết."
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr "sổ ghi dọn sạch các phân giải trong bản mục lục"
 
-#: builtin/push.c:261
+#: builtin/reset.c:26
 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."
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 msgstr ""
-"Việc cập nhật bị từ chối bởi vì máy chủ có chứa công việc mà bạn không\n"
-"có ở máy nội bộ của mình. Lỗi này thường có nguyên nhân bởi kho khác đẩy\n"
-"dữ liệu lên cùng một tham chiếu. Bạn có lẽ muốn hòa trộn với các thay đổi\n"
-"từ máy chủ (v.d. “git pull…”) trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards” trong “git push --help” để có thông tin chi "
-"tiết."
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
-#: builtin/push.c:268
-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/reset.c:27
+msgid "git reset [-q] [<tree-ish>] [--] <paths>..."
+msgstr "git reset [-q] [<tree-ish>] [--] <đường-dẫn>…"
 
-#: 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"
-msgstr ""
-"Không thể cập nhật một tham chiếu trên máy chủ mà nó chỉ đến đối tượng "
-"không\n"
-"phải là lần chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến "
-"đối tượng\n"
-"không phải chuyển giao, mà không sử dụng tùy chọn “--force”.\n"
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [<tree-ish>] [--] [<các-đường-dẫn>…]"
 
-#: builtin/push.c:331
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr "pha trộn"
+
+#: builtin/reset.c:34
+msgid "soft"
+msgstr "mềm"
+
+#: builtin/reset.c:34
+msgid "hard"
+msgstr "cứng"
+
+#: builtin/reset.c:34
+msgid "merge"
+msgstr "hòa trộn"
+
+#: builtin/reset.c:34
+msgid "keep"
+msgstr "giữ lại"
+
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr "Bạn không có HEAD nào hợp lệ."
+
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr "Gặp lỗi khi tìm cây của HEAD."
+
+#: builtin/reset.c:82
 #, c-format
-msgid "Pushing to %s\n"
-msgstr "Đang đẩy lên %s\n"
+msgid "Failed to find tree of %s."
+msgstr "Gặp lỗi khi tìm cây của %s."
 
-#: builtin/push.c:335
+#: builtin/reset.c:100
 #, 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”"
+msgid "HEAD is now at %s"
+msgstr "HEAD hiện giờ tại %s"
 
-#: builtin/push.c:365
+#: builtin/reset.c:183
 #, c-format
-msgid "bad repository '%s'"
-msgstr "repository (kho) sai “%s”"
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn."
 
-#: builtin/push.c:366
-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 ""
-"Chưa cấu hình đích để đẩy lên.\n"
-"Hoặc là chỉ ra URL từ dòng lệnh hoặc là cấu hình một kho máy chủ sử dụng\n"
-"\n"
-"    git remote add <tên> <url>\n"
-"\n"
-"và sau đó đẩy lên sử dụng tên máy chủ\n"
-"\n"
-"    git push <tên>\n"
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr "làm việc ở chế độ im lặng, chỉ hiển thị khi có lỗi"
 
-#: builtin/push.c:381
-msgid "--all and --tags are incompatible"
-msgstr "--all và --tags xung khắc nhau"
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr "đặt lại (reset) HEAD và bảng mục lục"
 
-#: builtin/push.c:382
-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/reset.c:279
+msgid "reset only HEAD"
+msgstr "chỉ đặt lại (reset) HEAD"
 
-#: builtin/push.c:387
-msgid "--mirror and --tags are incompatible"
-msgstr "--mirror và --tags xung khắc nhau"
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr "đặt lại HEAD, bảng mục lục và cây làm việc"
 
-#: builtin/push.c:388
-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/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr "đặt lại HEAD nhưng giữ lại các thay đổi nội bộ"
 
-#: builtin/push.c:393
-msgid "--all and --mirror are incompatible"
-msgstr "--all và --mirror xung khắc nhau"
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr "chỉ ghi lại những đường dẫn thực sự sẽ được thêm vào sau này"
 
-#: builtin/push.c:505
-msgid "repository"
-msgstr "kho"
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "Gặp lỗi khi phân giải “%s” như là điểm xét duyệt hợp lệ."
 
-#: builtin/push.c:506 builtin/send-pack.c:161
-msgid "push all refs"
-msgstr "đẩy tất cả các tham chiếu"
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "Gặp lỗi khi phân giải “%s” như là một cây (tree) hợp lệ."
 
-#: builtin/push.c:507 builtin/send-pack.c:163
-msgid "mirror all refs"
-msgstr "mirror tất cả các tham chiếu"
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr "--patch xung khắc với --{hard,mixed,soft}"
 
-#: builtin/push.c:509
-msgid "delete refs"
-msgstr "xóa các tham chiếu"
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr ""
+"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh “git "
+"reset -- <đường_dẫn>”."
 
-#: builtin/push.c:510
-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/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "Không thể thực hiện lệnh %s reset với các đường dẫn."
 
-#: builtin/push.c:513 builtin/send-pack.c:164
-msgid "force updates"
-msgstr "ép buộc cập nhật"
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "%s reset không được phép trên kho thuần"
 
-#: builtin/push.c:515 builtin/send-pack.c:175
-msgid "refname>:<expect"
-msgstr "tên-tham-chiếu>:<cần"
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr "-N chỉ được dùng khi có --mixed"
 
-#: builtin/push.c:516 builtin/send-pack.c:176
-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/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr "Những thay đổi được đưa ra khỏi bệ phóng sau khi reset:"
 
-#: builtin/push.c:519
-msgid "control recursive pushing of submodules"
-msgstr "điều khiển việc đẩy lên (push) đệ qui của mô-đun-con"
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét duyệt “%s”."
 
-#: builtin/push.c:521 builtin/send-pack.c:169
-msgid "use thin pack"
-msgstr "tạo gói nhẹ"
+#: builtin/reset.c:374
+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/push.c:522 builtin/push.c:523 builtin/send-pack.c:158
-#: builtin/send-pack.c:159
-msgid "receive pack program"
-msgstr "chương trình nhận gói"
+#: 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/push.c:524
-msgid "set upstream for git pull/status"
-msgstr "đặt thượng nguồn cho git pull/status"
+#: builtin/rev-parse.c:386
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr "git rev-parse --parseopt [<các-tùy-chọn>] -- [<các tham số>…]"
 
-#: builtin/push.c:527
-msgid "prune locally removed refs"
-msgstr "xén tỉa những tham chiếu bị gỡ bỏ"
+#: builtin/rev-parse.c:391
+msgid "keep the `--` passed as an arg"
+msgstr "giữ lại “--” chuyển sang làm tham số"
 
-#: builtin/push.c:529
-msgid "bypass pre-push hook"
-msgstr "vòng qua móc tiền-đẩy (pre-push)"
+#: builtin/rev-parse.c:393
+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/push.c:530
-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/rev-parse.c:396
+msgid "output in stuck long form"
+msgstr "kết xuất trong định dạng gậy dài"
+
+#: builtin/rev-parse.c:527
+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 ""
+"git rev-parse --parseopt [<các-tùy-chọn>] -- [<các đối số>…]\n"
+"   hoặc: git rev-parse --sq-quote [<đ.số>…]\n"
+"   hoặc: git rev-parse [<các-tùy-chọn>] [<đ.số>…]\n"
+"\n"
+"Chạy lệnh \"git rev-parse --parseopt -h\" để có thêm thông tin về cách dùng."
+
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr "git revert [<các-tùy-chọn>] <commit-ish>…"
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <lệnh-con>"
 
-#: builtin/push.c:533 builtin/send-pack.c:166
-msgid "GPG sign the push"
-msgstr "ký lần đẩy dùng GPG"
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr "git cherry-pick [<các-tùy-chọn>] <commit-ish>…"
 
-#: builtin/push.c:535 builtin/send-pack.c:170
-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/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <lệnh-con>"
 
-#: builtin/push.c:549
-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/revert.c:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: %s không thể được sử dụng với %s"
 
-#: builtin/push.c:551
-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/revert.c:80
+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/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>]])"
-msgstr ""
-"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<tiền-"
-"tố>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] "
-"[--index-output=<tập-tin>] (--empty | <tree-ish1> [<tree-ish2> [<tree-"
-"ish3>]])"
+#: builtin/revert.c:81
+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/read-tree.c:110
-msgid "write resulting index to <file>"
-msgstr "ghi mục lục kết quả vào <tập-tin>"
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr "không cherry-pick hay hoàn nguyên liên tiếp nhau"
 
-#: builtin/read-tree.c:113
-msgid "only empty the index"
-msgstr "chỉ với bảng mục lục trống rỗng"
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr "không chuyển giao một cách tự động."
 
-#: builtin/read-tree.c:115
-msgid "Merging"
-msgstr "Hòa trộn"
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr "sửa lại chú thích cho lần chuyển giao"
 
-#: builtin/read-tree.c:117
-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/revert.c:87
+msgid "parent number"
+msgstr "số của cha mẹ"
 
-#: builtin/read-tree.c:119
-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/revert.c:89
+msgid "merge strategy"
+msgstr "chiến lược hòa trộn"
 
-#: builtin/read-tree.c:121
-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/revert.c:90
+msgid "option"
+msgstr "tùy chọn"
 
-#: builtin/read-tree.c:123
-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/revert.c:91
+msgid "option for merge strategy"
+msgstr "tùy chọn cho chiến lược hòa trộn"
 
-#: builtin/read-tree.c:124
-msgid "<subdirectory>/"
-msgstr "<thư-mục-con>/"
+#: builtin/revert.c:100
+msgid "append commit name"
+msgstr "nối thêm tên lần chuyển giao"
 
-#: builtin/read-tree.c:125
-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/revert.c:102
+msgid "preserve initially empty commits"
+msgstr "cấm khởi tạo lần chuyển giao trống rỗng"
 
-#: builtin/read-tree.c:128
-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/revert.c:103
+msgid "allow commits with empty messages"
+msgstr "chấp nhận chuyển giao mà không ghi chú gì"
 
-#: builtin/read-tree.c:130
-msgid "gitignore"
-msgstr "gitignore"
+#: builtin/revert.c:104
+msgid "keep redundant, empty commits"
+msgstr "giữ lại các lần chuyển giao dư thừa, rỗng"
 
-#: builtin/read-tree.c:131
-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/revert.c:192
+msgid "revert failed"
+msgstr "hoàn nguyên gặp lỗi"
 
-#: builtin/read-tree.c:134
-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/revert.c:205
+msgid "cherry-pick failed"
+msgstr "cherry-pick gặp lỗi"
 
-#: builtin/read-tree.c:135
-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/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr "git rm [<các-tùy-chọn>] [--] <tập-tin>…"
 
-#: builtin/read-tree.c:137
-msgid "skip applying sparse checkout filter"
-msgstr "bỏ qua áp dụng bộ lọc lấy ra (checkout) thưa thớt"
+#: 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/read-tree.c:139
-msgid "debug unpack-trees"
-msgstr "gỡ lỗi “unpack-trees”"
+#: 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/reflog.c:423
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr "“%s” dành cho “%s” không phải là dấu vết thời gian hợp lệ"
+#: 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] ""
+"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/reflog.c:540 builtin/reflog.c:545
-#, c-format
-msgid "'%s' is not a valid timestamp"
-msgstr "“%s” không phải là dấu thời gian hợp lệ"
+#: builtin/rm.c:235
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(dùng -f để buộc gỡ bỏ)"
 
-#: builtin/remote.c:12
-msgid "git remote [-v | --verbose]"
-msgstr "git remote [-v | --verbose]"
+#: 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] "các tập tin sau đây có thay đổi trạng thái trong bảng mục lục:"
 
-#: builtin/remote.c:13
+#: builtin/rm.c:243 builtin/rm.c:254
 msgid ""
-"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
-"mirror=<fetch|push>] <name> <url>"
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
 msgstr ""
-"git remote add [-t <nhánh>] [-m <master>] [-f] [--tags|--no-tags] [--"
-"mirror=<fetch|push>] <tên> <url>"
+"\n"
+"(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
 
-#: builtin/remote.c:14 builtin/remote.c:34
-msgid "git remote rename <old> <new>"
-msgstr "git remote rename <tên-cũ> <tên-mới>"
+#: builtin/rm.c:251
+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/remote.c:15 builtin/remote.c:39
-msgid "git remote remove <name>"
-msgstr "git remote remove <tên>"
+#: builtin/rm.c:269
+msgid "do not list removed files"
+msgstr "không liệt kê các tập tin đã gỡ bỏ"
 
-#: builtin/remote.c:16 builtin/remote.c:44
-msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr "git remote set-head <tên> (-a | --auto | -d | --delete | <nhánh>)"
+#: builtin/rm.c:270
+msgid "only remove from the index"
+msgstr "chỉ gỡ bỏ từ mục lục"
 
-#: builtin/remote.c:17
-msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr "git remote [-v | --verbose] show [-n] <tên>"
+#: builtin/rm.c:271
+msgid "override the up-to-date check"
+msgstr "ghi đè lên kiểm tra cập nhật"
 
-#: builtin/remote.c:18
-msgid "git remote prune [-n | --dry-run] <name>"
-msgstr "git remote prune [-n | --dry-run] <tên>"
+#: builtin/rm.c:272
+msgid "allow recursive removal"
+msgstr "cho phép gỡ bỏ đệ qui"
 
-#: builtin/remote.c:19
-msgid ""
-"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
-"git remote [-v | --verbose] update [-p | --prune] [(<nhóm> | <máy-chủ>)…]"
+#: builtin/rm.c:274
+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/remote.c:20
-msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr "git remote set-branches [--add] <tên> <nhánh>…"
+#: builtin/rm.c:335
+#, 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/remote.c:21 builtin/remote.c:70
-msgid "git remote get-url [--push] [--all] <name>"
-msgstr "git remote set-url [--push] [--all] <tên>"
+#: builtin/rm.c:374
+#, c-format
+msgid "git rm: unable to remove %s"
+msgstr "git rm: không thể gỡ bỏ %s"
 
-#: builtin/remote.c:22 builtin/remote.c:75
-msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr "git remote set-url [--push] <tên> <url-mới> [<url-cũ>]"
+#: 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=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<máy>:]<thư/mục> [<các-tham-"
+"chiếu>…]\n"
+"  --all và đặc tả <ref> rõ ràng là loại trừ lẫn nhau."
 
-#: builtin/remote.c:23 builtin/remote.c:76
-msgid "git remote set-url --add <name> <newurl>"
-msgstr "git remote set-url --add <tên> <url-mới>"
+#: builtin/send-pack.c:160
+msgid "remote name"
+msgstr "tên máy dịch vụ"
+
+#: builtin/send-pack.c:171
+msgid "use stateless RPC protocol"
+msgstr "dùng giao thức RPC không ổn định"
 
-#: builtin/remote.c:24 builtin/remote.c:77
-msgid "git remote set-url --delete <name> <url>"
-msgstr "git remote set-url --delete <tên> <url>"
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr "đọc tham chiếu từ đầu vào tiêu chuẩn"
 
-#: builtin/remote.c:29
-msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [<các-tùy-chọn>] <tên> <url>"
+#: builtin/send-pack.c:173
+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ụ"
 
-#: builtin/remote.c:49
-msgid "git remote set-branches <name> <branch>..."
-msgstr "git remote set-branches <tên> <nhánh>…"
+#: builtin/shortlog.c:13
+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/remote.c:50
-msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add <tên> <nhánh>…"
+#: builtin/shortlog.c:242
+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/remote.c:55
-msgid "git remote show [<options>] <name>"
-msgstr "git remote show [<các-tùy-chọn>] <tên>"
+#: builtin/shortlog.c:244
+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/remote.c:60
-msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [<các-tùy-chọn>] <tên>"
+#: builtin/shortlog.c:246
+msgid "Show the email address of each author"
+msgstr "Hiển thị thư điện tử cho từng tác giả"
 
-#: builtin/remote.c:65
-msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [<các-tùy-chọn>] [<nhóm> | <máy-chủ>]…"
+#: builtin/shortlog.c:247
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
 
-#: builtin/remote.c:94
-#, c-format
-msgid "Updating %s"
-msgstr "Đang cập nhật %s"
+#: builtin/shortlog.c:248
+msgid "Linewrap output"
+msgstr "Ngắt dòng khi quá dài"
 
-#: builtin/remote.c:126
+#: builtin/show-branch.c:10
 msgid ""
-"--mirror is dangerous and deprecated; please\n"
-"\t use --mirror=fetch or --mirror=push instead"
+"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 ""
-"--mirror nguy hiểm và không dùng nữa; xin hãy\n"
-"\t sử dụng tùy chọn --mirror=fetch hoặc --mirror=push để thay thế"
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<khi>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)…]"
 
-#: builtin/remote.c:143
+#: builtin/show-branch.c:14
+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:375
 #, c-format
-msgid "unknown mirror argument: %s"
-msgstr "không hiểu tham số máy bản sao (mirror): %s"
+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/remote.c:159
-msgid "fetch the remote branches"
-msgstr "lấy về các nhánh từ máy chủ"
+#: builtin/show-branch.c:541
+#, c-format
+msgid "no matching refs with %s"
+msgstr "không tham chiếu nào khớp với %s"
 
-#: builtin/remote.c:161
-msgid "import all tags and associated objects when fetching"
-msgstr "nhập vào tất cả các đối tượng thẻ và thành phần liên quan khi lấy về"
+#: builtin/show-branch.c:639
+msgid "show remote-tracking and local branches"
+msgstr "hiển thị các nhánh remote-tracking và nội bộ"
 
-#: builtin/remote.c:164
-msgid "or do not fetch any tag at all (--no-tags)"
-msgstr "hoặc không lấy về bất kỳ thẻ nào (--no-tags)"
+#: builtin/show-branch.c:641
+msgid "show remote-tracking branches"
+msgstr "hiển thị các nhánh remote-tracking"
 
-#: builtin/remote.c:166
-msgid "branch(es) to track"
-msgstr "các nhánh để theo dõi"
+#: builtin/show-branch.c:643
+msgid "color '*!+-' corresponding to the branch"
+msgstr "màu “*!+-” tương ứng với nhánh"
 
-#: builtin/remote.c:167
-msgid "master branch"
-msgstr "nhánh master"
+#: builtin/show-branch.c:645
+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/remote.c:168
-msgid "push|fetch"
-msgstr "push|fetch"
+#: builtin/show-branch.c:647
+msgid "synonym to more=-1"
+msgstr "đồng nghĩa với more=-1"
 
-#: builtin/remote.c:169
-msgid "set up remote as a mirror to push to or fetch from"
-msgstr "đặt máy chủ (remote) như là một máy bản sao để push hay fetch từ đó"
+#: builtin/show-branch.c:648
+msgid "suppress naming strings"
+msgstr "chặn các chuỗi đặt tên"
 
-#: builtin/remote.c:181
-msgid "specifying a master branch makes no sense with --mirror"
-msgstr "đang chỉ định một nhánh master không hợp lý với tùy chọn --mirror"
+#: builtin/show-branch.c:650
+msgid "include the current branch"
+msgstr "bao gồm nhánh hiện hành"
 
-#: builtin/remote.c:183
-msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr "chỉ định những nhánh để theo dõi chỉ hợp lý với các “fetch mirror”"
+#: builtin/show-branch.c:652
+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/remote.c:190 builtin/remote.c:633
-#, c-format
-msgid "remote %s already exists."
-msgstr "máy chủ %s đã tồn tại rồi."
+#: builtin/show-branch.c:654
+msgid "show possible merge bases"
+msgstr "hiển thị mọi cơ sở có thể dùng để hòa trộn"
 
-#: builtin/remote.c:194 builtin/remote.c:637
-#, c-format
-msgid "'%s' is not a valid remote name"
-msgstr "“%s” không phải tên máy chủ hợp lệ"
+#: builtin/show-branch.c:656
+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/remote.c:234
-#, c-format
-msgid "Could not setup master '%s'"
-msgstr "Không thể cài đặt nhánh master “%s”"
+#: builtin/show-branch.c:658
+msgid "show commits in topological order"
+msgstr "hiển thị các lần chuyển giao theo thứ tự tôpô"
 
-#: builtin/remote.c:336
-#, c-format
-msgid "Could not get fetch map for refspec %s"
-msgstr "Không thể lấy ánh xạ (map) fetch cho đặc tả tham chiếu %s"
+#: builtin/show-branch.c:661
+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/remote.c:437 builtin/remote.c:445
-msgid "(matching)"
-msgstr "(khớp)"
+#: builtin/show-branch.c:663
+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/remote.c:449
-msgid "(delete)"
-msgstr "(xóa)"
+#: builtin/show-branch.c:665
+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/remote.c:626 builtin/remote.c:761 builtin/remote.c:858
-#, c-format
-msgid "No such remote: %s"
-msgstr "Không có máy chủ nào như thế: %s"
+#: builtin/show-branch.c:668
+msgid "<n>[,<base>]"
+msgstr "<n>[,<cơ_sở>]"
 
-#: builtin/remote.c:643
-#, c-format
-msgid "Could not rename config section '%s' to '%s'"
-msgstr "Không thể đổi tên phần của cấu hình từ “%s” thành “%s”"
+#: builtin/show-branch.c:669
+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/remote.c:663
-#, c-format
+#: builtin/show-branch.c:703
 msgid ""
-"Not updating non-default fetch refspec\n"
-"\t%s\n"
-"\tPlease update the configuration manually if necessary."
+"--reflog is incompatible with --all, --remotes, --independent or --merge-base"
 msgstr ""
-"Không cập nhật “non-default fetch respec”\n"
-"\t%s\n"
-"\tXin hãy cập nhật phần cấu hình một cách thủ công nếu thấy cần thiết."
+"--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:727
+msgid "no branches given, and HEAD is not valid"
+msgstr "chưa đưa ra nhánh, và HEAD không hợp lệ"
 
-#: builtin/remote.c:699
+#: builtin/show-branch.c:730
+msgid "--reflog option needs one branch name"
+msgstr "--reflog cần tên một nhánh"
+
+#: builtin/show-branch.c:733
 #, c-format
-msgid "deleting '%s' failed"
-msgstr "gặp lỗi khi xóa “%s”"
+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/remote.c:733
+#: builtin/show-branch.c:737
 #, c-format
-msgid "creating '%s' failed"
-msgstr "gặp lỗi khi tạo “%s”"
+msgid "no such ref %s"
+msgstr "không có tham chiếu nào như thế %s"
 
-#: builtin/remote.c:796
-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] ""
-"Chú ý: Một số nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ "
-"đi;\n"
-"để xóa đi, sử dụng:"
+#: builtin/show-branch.c:829
+#, 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/remote.c:810
+#: builtin/show-branch.c:833
 #, c-format
-msgid "Could not remove config section '%s'"
-msgstr "Không thể gỡ bỏ phần cấu hình “%s”"
+msgid "'%s' is not a valid ref."
+msgstr "“%s” không phải tham chiếu hợp lệ."
 
-#: builtin/remote.c:911
+#: builtin/show-branch.c:836
 #, 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)"
+msgid "cannot find commit %s (%s)"
+msgstr "không thể tìm thấy lần chuyển giao %s (%s)"
 
-#: builtin/remote.c:914
-msgid " tracked"
-msgstr " được theo dõi"
+#: 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[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mẫu>…] "
 
-#: builtin/remote.c:916
-msgid " stale (use 'git remote prune' to remove)"
-msgstr " cũ rích (dùng “git remote prune” để gỡ bỏ)"
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<mẫu>]"
 
-#: builtin/remote.c:918
-msgid " ???"
-msgstr " ???"
+#: builtin/show-ref.c:165
+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/remote.c:959
-#, 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/show-ref.c:166
+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/remote.c:967
-#, 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/show-ref.c:167
+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/remote.c:971
-#, c-format
-msgid " merges with remote %s"
-msgstr " hòa trộn với máy chủ %s"
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
+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/remote.c:972
-msgid "    and with remote"
-msgstr "    và với máy chủ"
+#: builtin/show-ref.c:174
+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/remote.c:974
-#, c-format
-msgid "merges with remote %s"
-msgstr "hòa trộn với máy chủ %s"
+#: builtin/show-ref.c:176
+msgid "only show SHA1 hash using <n> digits"
+msgstr "chỉ hiển thị mã băm SHA1 sử dụng <n> chữ số"
 
-#: builtin/remote.c:975
-msgid "   and with remote"
-msgstr "   và với máy chủ"
+#: builtin/show-ref.c:180
+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/remote.c:1021
-msgid "create"
-msgstr "tạo"
+#: builtin/show-ref.c:182
+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 "
+"bộ"
 
-#: builtin/remote.c:1024
-msgid "delete"
-msgstr "xóa"
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
 
-#: builtin/remote.c:1028
-msgid "up to date"
-msgstr "đã cập nhật"
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
 
-#: builtin/remote.c:1031
-msgid "fast-forwardable"
-msgstr "có-thể-chuyển-tiếp-nhanh"
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "giữ và xóa bỏ mọi dòng bắt đầu bằng ký tự ghi chú"
 
-#: builtin/remote.c:1034
-msgid "local out of date"
-msgstr "dữ liệu nội bộ đã cũ"
+#: builtin/stripspace.c:38
+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/remote.c:1041
+#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:1046
 #, c-format
-msgid "    %-*s forces to %-*s (%s)"
-msgstr "    %-*s ép buộc thành %-*s (%s)"
+msgid "No such ref: %s"
+msgstr "Không có tham chiếu nào như thế: %s"
 
-#: builtin/remote.c:1044
+#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:1055
 #, c-format
-msgid "    %-*s pushes to %-*s (%s)"
-msgstr "    %-*s đẩy lên thành %-*s (%s)"
+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"
 
-#: builtin/remote.c:1048
+#: builtin/submodule--helper.c:71
 #, c-format
-msgid "    %-*s forces to %s"
-msgstr "    %-*s ép buộc thành %s"
+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/remote.c:1051
-#, c-format
-msgid "    %-*s pushes to %s"
-msgstr "    %-*s đẩy lên thành %s"
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
+msgid "alternative anchor for relative paths"
+msgstr "điểm neo thay thế cho các đường dẫn tương đối"
 
-#: builtin/remote.c:1119
-msgid "do not query remotes"
-msgstr "không truy vấn các máy chủ"
+#: builtin/submodule--helper.c:287
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=</đường/dẫn>] [</đường/dẫn>…]"
 
-#: builtin/remote.c:1146
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
 #, c-format
-msgid "* remote %s"
-msgstr "* máy chủ %s"
+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/remote.c:1147
+#: builtin/submodule--helper.c:369
 #, c-format
-msgid "  Fetch URL: %s"
-msgstr "  URL để lấy về: %s"
-
-#: builtin/remote.c:1148 builtin/remote.c:1299
-msgid "(no URL)"
-msgstr "(không có URL)"
+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/remote.c:1157 builtin/remote.c:1159
+#: builtin/submodule--helper.c:373
 #, c-format
-msgid "  Push  URL: %s"
-msgstr "  URL để đẩy lên: %s"
+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/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/submodule--helper.c:383
 #, c-format
-msgid "  HEAD branch: %s"
-msgstr "  Nhánh HEAD: %s"
+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/remote.c:1167
+#: builtin/submodule--helper.c:390
 #, 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"
+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/remote.c:1179
-#, c-format
-msgid "  Remote branch:%s"
-msgid_plural "  Remote branches:%s"
-msgstr[0] "  Những nhánh trên máy chủ:%s"
+#: builtin/submodule--helper.c:409
+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/remote.c:1182 builtin/remote.c:1209
-msgid " (status not queried)"
-msgstr " (trạng thái không được yêu cầu)"
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [</đường/dẫn>]"
 
-#: builtin/remote.c:1191
-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/submodule--helper.c:435
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name </đường/dẫn>"
 
-#: builtin/remote.c:1199
-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/submodule--helper.c:441
+#, 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/remote.c:1206
+#: builtin/submodule--helper.c:524 builtin/submodule--helper.c:527
 #, 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:"
+msgid "submodule '%s' cannot add alternate: %s"
+msgstr "mô-đun-con “%s” không thể thêm thay thế: %s"
 
-#: builtin/remote.c:1227
-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/submodule--helper.c:563
+#, 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/remote.c:1229
-msgid "delete refs/remotes/<name>/HEAD"
-msgstr "xóa refs/remotes/<tên>/HEAD"
+#: builtin/submodule--helper.c:570
+#, 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/remote.c:1244
-msgid "Cannot determine remote HEAD"
-msgstr "Không thể xác định được HEAD máy chủ"
+#: builtin/submodule--helper.c:593
+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/remote.c:1246
-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/submodule--helper.c:596
+msgid "name of the new submodule"
+msgstr "tên của mô-đun-con mới"
 
-#: builtin/remote.c:1256
-#, c-format
-msgid "Could not delete %s"
-msgstr "Không thể xóa bỏ %s"
+#: builtin/submodule--helper.c:599
+msgid "url where to clone the submodule from"
+msgstr "url nơi mà nhân bản mô-đun-con từ đó"
 
-#: builtin/remote.c:1264
-#, c-format
-msgid "Not a valid ref: %s"
-msgstr "Không phải là tham chiếu hợp lệ: %s"
+#: builtin/submodule--helper.c:605
+msgid "depth for shallow clones"
+msgstr "chiều sâu lịch sử khi tạo bản sao"
 
-#: builtin/remote.c:1266
-#, c-format
-msgid "Could not setup %s"
-msgstr "Không thể cài đặt %s"
+#: builtin/submodule--helper.c:608 builtin/submodule--helper.c:964
+msgid "force cloning progress"
+msgstr "ép buộc tiến trình nhân bản"
 
-#: builtin/remote.c:1284
-#, c-format
-msgid " %s will become dangling!"
-msgstr " %s sẽ trở thành không đầu (không được quản lý)!"
+#: 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=</đường/dẫn>] [--quiet] [--reference "
+"<kho>] [--name <tên>] [--depth <sâu>] [--url <url>] [</đường/dẫn>…]"
 
-#: builtin/remote.c:1285
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
-msgid " %s has become dangling!"
-msgstr " %s đã trở thành không đầu (không được quản lý)!"
+msgid "could not create directory '%s'"
+msgstr "không thể tạo thư mục “%s”"
 
-#: builtin/remote.c:1295
+#: builtin/submodule--helper.c:644
 #, c-format
-msgid "Pruning %s"
-msgstr "Đang xén bớt %s"
+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/remote.c:1296
+#: builtin/submodule--helper.c:660
 #, c-format
-msgid "URL: %s"
-msgstr "URL: %s"
+msgid "cannot open file '%s'"
+msgstr "không thể mở tập tin “%s”"
 
-#: builtin/remote.c:1312
+#: builtin/submodule--helper.c:665
 #, c-format
-msgid " * [would prune] %s"
-msgstr " * [nên xén bớt] %s"
+msgid "could not close file %s"
+msgstr "không thể đóng tập tin %s"
 
-#: builtin/remote.c:1315
+#: builtin/submodule--helper.c:672
 #, c-format
-msgid " * [pruned] %s"
-msgstr " * [đã bị xén] %s"
-
-#: builtin/remote.c:1360
-msgid "prune remotes after fetching"
-msgstr "cắt máy chủ sau khi lấy về"
+msgid "could not get submodule directory for '%s'"
+msgstr "không thể lấy thư mục mô-đun-con cho “%s”"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/submodule--helper.c:726
 #, c-format
-msgid "No such remote '%s'"
-msgstr "Không có máy chủ nào có tên “%s”"
-
-#: builtin/remote.c:1439
-msgid "add branch"
-msgstr "thêm nhánh"
-
-#: builtin/remote.c:1446
-msgid "no remote specified"
-msgstr "chưa chỉ ra máy chủ nào"
+msgid "Submodule path '%s' not initialized"
+msgstr "Đường dẫn mô-đun-con “%s” chưa được khởi tạo"
 
-#: builtin/remote.c:1463
-msgid "query push URLs rather than fetch URLs"
-msgstr "truy vấn đẩy URL thay vì lấy"
-
-#: builtin/remote.c:1465
-msgid "return all URLs"
-msgstr "trả về mọi URL"
+#: builtin/submodule--helper.c:730
+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/remote.c:1493
+#: builtin/submodule--helper.c:756
 #, 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:1519
-msgid "manipulate push URLs"
-msgstr "đẩy các “URL” bằng tay"
-
-#: builtin/remote.c:1521
-msgid "add URL"
-msgstr "thêm URL"
-
-#: builtin/remote.c:1523
-msgid "delete URLs"
-msgstr "xóa URLs"
-
-#: builtin/remote.c:1530
-msgid "--add --delete doesn't make sense"
-msgstr "--add --delete không hợp lý"
+msgid "Skipping unmerged submodule %s"
+msgstr "Bỏ qua các mô-đun-con chưa được hòa trộn %s"
 
-#: builtin/remote.c:1571
+#: builtin/submodule--helper.c:777
 #, c-format
-msgid "Invalid old URL pattern: %s"
-msgstr "Kiểu mẫu URL cũ không hợp lệ: %s"
+msgid "Skipping submodule '%s'"
+msgstr "Bỏ qua mô-đun-con “%s”"
 
-#: builtin/remote.c:1579
+#: builtin/submodule--helper.c:913
 #, c-format
-msgid "No such URL found: %s"
-msgstr "Không tìm thấy URL như vậy: %s"
-
-#: builtin/remote.c:1581
-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:1595
-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/repack.c:17
-msgid "git repack [<options>]"
-msgstr "git repack [<các-tùy-chọn>]"
+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/repack.c:159
-msgid "pack everything in a single pack"
-msgstr "đóng gói mọi thứ trong một gói đơn"
+#: builtin/submodule--helper.c:924
+#, 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/repack.c:161
-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/submodule--helper.c:945
+msgid "path into the working tree"
+msgstr "đường dẫn đến cây làm việc"
 
-#: builtin/repack.c:164
-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/submodule--helper.c:948
+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/repack.c:166
-msgid "pass --no-reuse-delta to git-pack-objects"
-msgstr "chuyển --no-reuse-delta cho git-pack-objects"
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase, merge, checkout hoặc không làm gì cả"
 
-#: builtin/repack.c:168
-msgid "pass --no-reuse-object to git-pack-objects"
-msgstr "chuyển --no-reuse-object cho git-pack-objects"
+#: builtin/submodule--helper.c:956
+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/repack.c:170
-msgid "do not run git-update-server-info"
-msgstr "không chạy git-update-server-info"
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr "công việc đồng thời"
 
-#: builtin/repack.c:173
-msgid "pass --local to git-pack-objects"
-msgstr "chuyển --local cho git-pack-objects"
+#: builtin/submodule--helper.c:961
+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/repack.c:175
-msgid "write bitmap index"
-msgstr "ghi mục lục ánh xạ"
+#: builtin/submodule--helper.c:962
+msgid "don't print cloning progress"
+msgstr "đừng in tiến trình nhân bản"
 
-#: builtin/repack.c:176
-msgid "approxidate"
-msgstr "ngày ước tính"
+#: builtin/submodule--helper.c:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr ""
+"git submodule--helper update_clone [--prefix=</đường/dẫn>] [</đường/dẫn>…]"
 
-#: builtin/repack.c:177
-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/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "giá trị cho  tham số cập nhật bị sai"
 
-#: builtin/repack.c:179
-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/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 ""
+"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/repack.c:180 builtin/repack.c:184
-msgid "bytes"
-msgstr "byte"
+#: builtin/submodule--helper.c:1100
+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/repack.c:181
-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/submodule--helper.c:1107
+#, 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ệ"
 
-#: builtin/repack.c:183
-msgid "limits the maximum delta depth"
-msgstr "giới hạn độ sâu tối đa của “delta”"
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr "git symbolic-ref [<các-tùy-chọn>] <tên> [<t.chiếu>]"
 
-#: builtin/repack.c:185
-msgid "maximum size of each packfile"
-msgstr "kích thước tối đa cho từng tập tin gói"
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr "git symbolic-ref -d [-q] <tên>"
 
-#: builtin/repack.c:187
-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/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr "chặn các thông tin lỗi cho các tham chiếu “không-mềm” (bị tách ra)"
 
-#: builtin/repack.c:197
-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/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "xóa tham chiếu mềm"
 
-#: builtin/repack.c:381
-#, c-format
-msgid "removing '%s' failed"
-msgstr "gặp lỗi khi xóa bỏ “%s”"
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "làm ngắn kết xuất ref (tham chiếu)"
 
-#: builtin/replace.c:19
-msgid "git replace [-f] <object> <replacement>"
-msgstr "git replace [-f] <đối-tượng> <thay-thế>"
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr "lý do"
 
-#: builtin/replace.c:20
-msgid "git replace [-f] --edit <object>"
-msgstr "git replace [-f] --edit <đối tượng>"
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr "lý do cập nhật"
 
-#: builtin/replace.c:21
-msgid "git replace [-f] --graft <commit> [<parent>...]"
-msgstr "git replace [-f] --graft <lần_chuyển_giao> [<cha_mẹ>…]"
+#: 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 <key-id>] [-f] [-m <msg>|-F <tập-tin>] <tên-thẻ> "
+"[<head>]"
 
-#: builtin/replace.c:22
-msgid "git replace -d <object>..."
-msgstr "git replace -d <đối tượng>…"
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <tên-thẻ>…"
 
-#: builtin/replace.c:23
-msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr "git replace [--format=<định_dạng>] [-l [<mẫu>]]"
+#: 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[<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>…]"
 
-#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#: builtin/tag.c:27
+msgid "git tag -v <tagname>..."
+msgstr "git tag -v <tên-thẻ>…"
+
+#: builtin/tag.c:81
 #, c-format
-msgid "Not a valid object name: '%s'"
-msgstr "Không phải là tên đối tượng hợp lệ: “%s”"
+msgid "tag name too long: %.*s..."
+msgstr "tên thẻ quá dài: %.*s…"
 
-#: builtin/replace.c:355
+#: builtin/tag.c:86
 #, c-format
-msgid "bad mergetag in commit '%s'"
-msgstr "thẻ hòa trộn sai trong lần chuyển giao “%s”"
+msgid "tag '%s' not found."
+msgstr "không tìm thấy tìm thấy thẻ “%s”."
 
-#: builtin/replace.c:357
+#: builtin/tag.c:101
 #, 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”"
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "Thẻ đã bị xóa “%s” (từng là %s)\n"
 
-#: builtin/replace.c:368
+#: builtin/tag.c:117
 #, c-format
 msgid ""
-"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
-"instead of --graft"
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
 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"
+"\n"
+"Viết các ghi chú cho thẻ:\n"
+"  %s\n"
+"Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua.\n"
 
-#: builtin/replace.c:401
+#: builtin/tag.c:121
 #, c-format
-msgid "the original commit '%s' has a gpg signature."
-msgstr "lần chuyển giao gốc “%s” có chữ ký GPG."
+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 ""
+"\n"
+"Viết các ghi chú cho thẻ:\n"
+"  %s\n"
+"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/replace.c:402
-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/tag.c:199
+msgid "unable to sign the tag"
+msgstr "không thể ký thẻ"
 
-#: builtin/replace.c:408
+#: builtin/tag.c:201
+msgid "unable to write tag file"
+msgstr "không thể ghi vào tập tin lưu thẻ"
+
+#: builtin/tag.c:226
+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
+msgid "no tag message?"
+msgstr "không có chú thích gì cho cho thẻ à?"
+
+#: builtin/tag.c:281
 #, c-format
-msgid "could not write replacement commit for: '%s'"
-msgstr "không thể ghi lần chuyển giao thay thế cho: “%s”"
+msgid "The tag message has been left in %s\n"
+msgstr "Nội dung ghi chú còn lại %s\n"
 
-#: builtin/replace.c:432
-msgid "list replace refs"
-msgstr "liệt kê các refs thay thế"
+#: builtin/tag.c:339
+msgid "list tag names"
+msgstr "chỉ liệt kê tên các thẻ"
 
-#: builtin/replace.c:433
-msgid "delete replace refs"
-msgstr "xóa tham chiếu thay thế"
+#: builtin/tag.c:341
+msgid "print <n> lines of each tag message"
+msgstr "hiển thị <n> dòng cho mỗi ghi chú"
 
-#: builtin/replace.c:434
-msgid "edit existing object"
-msgstr "sửa đối tượng sẵn có"
+#: builtin/tag.c:343
+msgid "delete tags"
+msgstr "xóa thẻ"
 
-#: builtin/replace.c:435
-msgid "change a commit's parents"
-msgstr "thay đổi cha mẹ của lần chuyển giao"
+#: builtin/tag.c:344
+msgid "verify tags"
+msgstr "thẩm tra thẻ"
 
-#: builtin/replace.c:436
-msgid "replace the ref if it exists"
-msgstr "thay thế tham chiếu nếu nó đã sẵn có"
+#: builtin/tag.c:346
+msgid "Tag creation options"
+msgstr "Tùy chọn tạo thẻ"
 
-#: builtin/replace.c:437
-msgid "do not pretty-print contents for --edit"
-msgstr "Ä\91ừng in Ä\91ẹp các ná»\99i dung cho --edit"
+#: builtin/tag.c:348
+msgid "annotated tag, needs a message"
+msgstr "Ä\91á»\83 chú giải cho thẻ, cần má»\99t lá»\9di ghi chú"
 
-#: builtin/replace.c:438
-msgid "use this format"
-msgstr "dùng định dạng này"
+#: builtin/tag.c:350
+msgid "tag message"
+msgstr "phần chú thích cho thẻ"
 
-#: builtin/rerere.c:12
-msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
-msgstr ""
-"git rerere [clear | forget <đường dẫn>… | status | remaining | diff | gc]"
+#: builtin/tag.c:352
+msgid "annotated and GPG-signed tag"
+msgstr "thẻ chú giải và ký kiểu GPG"
 
-#: builtin/rerere.c:58
-msgid "register clean resolutions in index"
-msgstr "sổ ghi dọn sạch các phân giải trong bản mục lục"
+#: builtin/tag.c:356
+msgid "use another key to sign the tag"
+msgstr "dùng kháo khác để ký thẻ"
 
-#: builtin/reset.c:26
-msgid ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
-"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+#: builtin/tag.c:357
+msgid "replace the tag if exists"
+msgstr "thay thế nếu thẻ đó đã có trước"
 
-#: builtin/reset.c:27
-msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr "git reset [-q] <tree-ish> [--] <đường-dẫn>…"
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "tạo một reflog"
 
-#: builtin/reset.c:28
-msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr "git reset --patch [<tree-ish>] [--] [<các-đường-dẫn>…]"
+#: builtin/tag.c:360
+msgid "Tag listing options"
+msgstr "Các tùy chọn liệt kê thẻ"
 
-#: builtin/reset.c:34
-msgid "mixed"
-msgstr "pha trộn"
+#: builtin/tag.c:361
+msgid "show tag list in columns"
+msgstr "hiển thị danh sách thẻ trong các cột"
 
-#: builtin/reset.c:34
-msgid "soft"
-msgstr "mềm"
+#: builtin/tag.c:362 builtin/tag.c:363
+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/reset.c:34
-msgid "hard"
-msgstr "cứng"
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "chỉ hiển thị những thẻ mà nó được hòa trộn"
 
-#: builtin/reset.c:34
-msgid "merge"
-msgstr "hòa trộn"
+#: builtin/tag.c:365
+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/reset.c:34
-msgid "keep"
-msgstr "giữ lại"
+#: builtin/tag.c:370
+msgid "print only tags of the object"
+msgstr "chỉ hiển thị các thẻ của đối tượng"
 
-#: builtin/reset.c:74
-msgid "You do not have a valid HEAD."
-msgstr "Bạn không có HEAD nào hợp lệ."
+#: builtin/tag.c:399
+msgid "--column and -n are incompatible"
+msgstr "--column và -n xung khắc nhau"
 
-#: builtin/reset.c:76
-msgid "Failed to find tree of HEAD."
-msgstr "Gặp lỗi khi tìm cây của HEAD."
+#: 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/reset.c:82
-#, c-format
-msgid "Failed to find tree of %s."
-msgstr "Gặp lỗi khi tìm cây của %s."
+#: 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/reset.c:100
-#, c-format
-msgid "HEAD is now at %s"
-msgstr "HEAD hiện giờ tại %s"
+#: 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/reset.c:183
-#, c-format
-msgid "Cannot do a %s reset in the middle of a merge."
-msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn."
+#: 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/reset.c:276
-msgid "be quiet, only report errors"
-msgstr "làm việc ở chế độ im lặng, chỉ hiển thị khi có lỗi"
+#: builtin/tag.c:433
+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/reset.c:278
-msgid "reset HEAD and index"
-msgstr "đặt lại (reset) HEAD và bảng mục lục"
+#: builtin/tag.c:452
+msgid "too many params"
+msgstr "quá nhiều đối số"
 
-#: builtin/reset.c:279
-msgid "reset only HEAD"
-msgstr "chỉ đặt lại (reset) HEAD"
+#: builtin/tag.c:458
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "“%s” không phải thẻ hợp lệ."
 
-#: builtin/reset.c:281 builtin/reset.c:283
-msgid "reset HEAD, index and working tree"
-msgstr "đặt lại HEAD, bảng mục lục và cây làm việc"
+#: builtin/tag.c:463
+#, c-format
+msgid "tag '%s' already exists"
+msgstr "Thẻ “%s” đã tồn tại rồi"
 
-#: builtin/reset.c:285
-msgid "reset HEAD but keep local changes"
-msgstr "đặt lại HEAD nhưng giữ lại các thay đổi nội bộ"
+#: builtin/tag.c:491
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
 
-#: builtin/reset.c:288
-msgid "record only the fact that removed paths will be added later"
-msgstr "chỉ ghi lại những đường dẫn thực sự sẽ được thêm vào sau này"
+#: builtin/unpack-objects.c:493
+msgid "Unpacking objects"
+msgstr "Đang giải nén các đối tượng"
 
-#: builtin/reset.c:305
+#: builtin/update-index.c:79
 #, c-format
-msgid "Failed to resolve '%s' as a valid revision."
-msgstr "Gặp lỗi khi phân giải “%s” như là điểm xét duyệt hợp lệ."
+msgid "failed to create directory %s"
+msgstr "tạo thư mục \"%s\" gặp lỗi"
+
+#: builtin/update-index.c:85
+#, c-format
+msgid "failed to stat %s"
+msgstr "gặp lỗi khi lấy thông tin thống kê về %s"
 
-#: builtin/reset.c:313
+#: builtin/update-index.c:95
 #, c-format
-msgid "Failed to resolve '%s' as a valid tree."
-msgstr "Gặp lỗi khi phân giải “%s” như là một cây (tree) hợp lệ."
-
-#: builtin/reset.c:322
-msgid "--patch is incompatible with --{hard,mixed,soft}"
-msgstr "--patch xung khắc với --{hard,mixed,soft}"
+msgid "failed to create file %s"
+msgstr "gặp lỗi khi tạo tập tin %s"
 
-#: builtin/reset.c:331
-msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
-"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh “git "
-"reset -- <đường_dẫn>”."
+#: builtin/update-index.c:103
+#, c-format
+msgid "failed to delete file %s"
+msgstr "gặp lỗi khi xóa tập tin %s"
 
-#: builtin/reset.c:333
+#: builtin/update-index.c:110 builtin/update-index.c:212
 #, c-format
-msgid "Cannot do %s reset with paths."
-msgstr "Không thể thực hiện lệnh %s reset với các đường dẫn."
+msgid "failed to delete directory %s"
+msgstr "gặp lỗi khi xóa thư mục %s"
 
-#: builtin/reset.c:343
+#: builtin/update-index.c:133
 #, c-format
-msgid "%s reset is not allowed in a bare repository"
-msgstr "%s reset không được phép trên kho thuần"
+msgid "Testing mtime in '%s' "
+msgstr "Đang kiểm thử mtime trong “%s”"
 
-#: builtin/reset.c:347
-msgid "-N can only be used with --mixed"
-msgstr "-N chỉ được dùng khi có --mixed"
+#: builtin/update-index.c:145
+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/reset.c:364
-msgid "Unstaged changes after reset:"
-msgstr "Những thay đổi được đưa ra khỏi bệ phóng sau khi reset:"
+#: builtin/update-index.c:158
+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/reset.c:370
-#, c-format
-msgid "Could not reset index file to revision '%s'."
-msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét duyệt “%s”."
+#: builtin/update-index.c:171
+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/reset.c:374
-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/update-index.c:182
+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/rev-list.c:350
-msgid "rev-list does not support display of notes"
-msgstr "rev-list không hỗ trợ hiển thị các ghi chú"
+#: builtin/update-index.c:193
+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/rev-parse.c:358
-msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr "git rev-parse --parseopt [<các-tùy-chọn>] -- [<các tham số>…]"
+#: builtin/update-index.c:206
+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/rev-parse.c:363
-msgid "keep the `--` passed as an arg"
-msgstr "giữ lại “--” chuyển sang làm tham số"
+#: builtin/update-index.c:213
+msgid " OK"
+msgstr " Đồng ý"
 
-#: builtin/rev-parse.c:365
-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/update-index.c:564
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr "git update-index [<các-tùy-chọn>] [--] [<tập-tin>…]"
 
-#: builtin/rev-parse.c:368
-msgid "output in stuck long form"
-msgstr "kết xuất trong định dạng gậy dài"
+#: builtin/update-index.c:919
+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/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."
-msgstr ""
-"git rev-parse --parseopt [<các-tùy-chọn>] -- [<các đối số>…]\n"
-"   hoặc: git rev-parse --sq-quote [<đ.số>…]\n"
-"   hoặc: git rev-parse [<các-tùy-chọn>] [<đ.số>…]\n"
-"\n"
-"Chạy lệnh \"git rev-parse --parseopt -h\" để có thêm thông tin về cách dùng."
+#: builtin/update-index.c:922
+msgid "refresh: ignore submodules"
+msgstr "refresh: lờ đi mô-đun-con"
 
-#: builtin/revert.c:22
-msgid "git revert [<options>] <commit-ish>..."
-msgstr "git revert [<các-tùy-chọn>] <commit-ish>…"
+#: builtin/update-index.c:925
+msgid "do not ignore new files"
+msgstr "không bỏ qua các tập tin mới tạo"
 
-#: builtin/revert.c:23
-msgid "git revert <subcommand>"
-msgstr "git revert <lệnh-con>"
+#: builtin/update-index.c:927
+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/revert.c:28
-msgid "git cherry-pick [<options>] <commit-ish>..."
-msgstr "git cherry-pick [<các-tùy-chọn>] <commit-ish>…"
+#: builtin/update-index.c:929
+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/revert.c:29
-msgid "git cherry-pick <subcommand>"
-msgstr "git cherry-pick <lệnh-con>"
+#: builtin/update-index.c:931
+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/revert.c:71
-#, c-format
-msgid "%s: %s cannot be used with %s"
-msgstr "%s: %s không thể được sử dụng với %s"
+#: builtin/update-index.c:934
+msgid "refresh stat information"
+msgstr "lấy lại thông tin thống kê"
 
-#: builtin/revert.c:80
-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/update-index.c:938
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "giống --refresh, nhưng bỏ qua các cài đặt “assume-unchanged”"
 
-#: builtin/revert.c:81
-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/update-index.c:942
+msgid "<mode>,<object>,<path>"
+msgstr "<chế_độ>,<đối_tượng>,<đường_dẫn>"
 
-#: builtin/revert.c:82
-msgid "cancel revert or cherry-pick sequence"
-msgstr "không cherry-pick hay hoàn nguyên liên tiếp nhau"
+#: builtin/update-index.c:943
+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/revert.c:83
-msgid "don't automatically commit"
-msgstr "không chuyển giao một cách tự động."
+#: builtin/update-index.c:952
+msgid "mark files as \"not changing\""
+msgstr "Đánh dấu các tập tin là \"không thay đổi\""
 
-#: builtin/revert.c:84
-msgid "edit the commit message"
-msgstr "sửa lại chú thích cho lần chuyển giao"
+#: builtin/update-index.c:955
+msgid "clear assumed-unchanged bit"
+msgstr "xóa bít assumed-unchanged (giả định là không thay đổi)"
 
-#: builtin/revert.c:87
-msgid "parent number"
-msgstr "số của cha mẹ"
+#: builtin/update-index.c:958
+msgid "mark files as \"index-only\""
+msgstr "đánh dấu các tập tin là “chỉ-đọc”"
 
-#: builtin/revert.c:89
-msgid "merge strategy"
-msgstr "chiến lược hòa trộn"
+#: builtin/update-index.c:961
+msgid "clear skip-worktree bit"
+msgstr "xóa bít skip-worktree"
 
-#: builtin/revert.c:90
-msgid "option"
-msgstr "tùy chọn"
+#: builtin/update-index.c:964
+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/revert.c:91
-msgid "option for merge strategy"
-msgstr "tùy chọn cho chiến lược hòa trộn"
+#: builtin/update-index.c:966
+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/revert.c:104
-msgid "append commit name"
-msgstr "nối thêm tên lần chuyển giao"
+#: builtin/update-index.c:968
+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/revert.c:106
-msgid "preserve initially empty commits"
-msgstr "cấm khởi tạo lần chuyển giao trống rỗng"
+#: builtin/update-index.c:970
+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/revert.c:107
-msgid "allow commits with empty messages"
-msgstr "chấp nhận chuyển giao mà không ghi chú gì"
+#: builtin/update-index.c:974
+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/revert.c:108
-msgid "keep redundant, empty commits"
-msgstr "giữ lại các lần chuyển giao dư thừa, rỗng"
+#: builtin/update-index.c:978
+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:982
+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/revert.c:112
-msgid "program error"
-msgstr "lỗi chương trình"
+#: builtin/update-index.c:986
+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/revert.c:197
-msgid "revert failed"
-msgstr "hoàn nguyên gặp lỗi"
+#: builtin/update-index.c:989
+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/revert.c:212
-msgid "cherry-pick failed"
-msgstr "cherry-pick gặp lỗi"
+#: builtin/update-index.c:991
+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/rm.c:17
-msgid "git rm [<options>] [--] <file>..."
-msgstr "git rm [<các-tùy-chọn>] [--] <tập-tin>…"
+#: builtin/update-index.c:995
+msgid "write index in this format"
+msgstr "ghi mục lục ở định dạng này"
 
-#: 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/update-index.c:997
+msgid "enable or disable split index"
+msgstr "bật/tắt chia cắt bảng mục lục"
 
-#: 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/update-index.c:999
+msgid "enable/disable untracked cache"
+msgstr "bật/tắt bộ đệm không theo vết"
 
-#: 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] ""
-"các tập tin sau đây có trạng thái khác biệt nội dung từ cả tập tin\n"
-"và cả HEAD:"
+#: builtin/update-index.c:1001
+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/rm.c:235
-msgid ""
-"\n"
-"(use -f to force removal)"
-msgstr ""
-"\n"
-"(dùng -f để buộc gỡ bỏ)"
+#: builtin/update-index.c:1003
+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/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] "các tập tin sau đây có thay đổi trạng thái trong bảng mục lục:"
+#: 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 đượ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/rm.c:243 builtin/rm.c:254
+#: builtin/update-index.c:1123
+msgid "Untracked cache disabled"
+msgstr "Nhớ đệm không theo vết bị tắt"
+
+#: builtin/update-index.c:1131
 msgid ""
-"\n"
-"(use --cached to keep the file, or -f to force removal)"
+"core.untrackedCache is set to false; remove or change it, if you really want "
+"to enable the untracked cache"
 msgstr ""
-"\n"
-"(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
+"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/rm.c:251
-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/update-index.c:1135
+#, c-format
+msgid "Untracked cache enabled for '%s'"
+msgstr "Nhớ đệm không theo vết được bật cho “%s”"
 
-#: builtin/rm.c:269
-msgid "do not list removed files"
-msgstr "không liệt kê các tập tin đã gỡ bỏ"
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr "git update-ref [<các-tùy-chọn>] -d <refname> [<biến-cũ>]"
 
-#: builtin/rm.c:270
-msgid "only remove from the index"
-msgstr "chỉ gỡ bỏ từ mục lục"
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr "git update-ref [<các-tùy-chọn>]    <refname> <biến-mới> [<biến-cũ>]"
 
-#: builtin/rm.c:271
-msgid "override the up-to-date check"
-msgstr "ghi đè lên kiểm tra cập nhật"
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr "git update-ref [<các-tùy-chọn>] --stdin [-z]"
 
-#: builtin/rm.c:272
-msgid "allow recursive removal"
-msgstr "cho phép gỡ bỏ đệ qui"
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr "xóa tham chiếu"
 
-#: builtin/rm.c:274
-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/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr "cập nhật <tên-tham-chiếu> không phải cái nó chỉ tới"
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr ""
-"Vui lòng đưa các thay đổi của bạn vào “.gitmodules” hay tạm cất chúng đi để "
-"xử lý"
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr "đầu vào tiêu chuẩn có các đối số được chấm dứt bởi NUL"
 
-#: builtin/rm.c:335
-#, 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/update-ref.c:367
+msgid "read updates from stdin"
+msgstr "đọc cập nhật từ đầu vào tiêu chuẩn"
 
-#: builtin/rm.c:374
-#, c-format
-msgid "git rm: unable to remove %s"
-msgstr "git rm: không thể gỡ bỏ %s"
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
 
-#: 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=<git-"
-"receive-pack>] [--verbose] [--thin] [--atomic] [<máy>:]<thư/mục> [<các-tham-"
-"chiếu>…]\n"
-"  --all và đặc tả <ref> rõ ràng là loại trừ lẫn nhau."
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "cập nhật các tập tin thông tin từ điểm xuất phát"
 
-#: builtin/send-pack.c:160
-msgid "remote name"
-msgstr "tên máy dịch vụ"
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr "git verify-commit [-v | --verbose] <lần_chuyển_giao>…"
 
-#: builtin/send-pack.c:171
-msgid "use stateless RPC protocol"
-msgstr "dùng giao thức RPC không ổn định"
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr "hiển thị nội dung của lần chuyển giao"
 
-#: builtin/send-pack.c:172
-msgid "read refs from stdin"
-msgstr "đọc tham chiếu từ đầu vào tiêu chuẩn"
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
+msgid "print raw gpg status output"
+msgstr "in kết xuất trạng thái gpg dạng thô"
 
-#: builtin/send-pack.c:173
-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ụ"
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <gói>…"
 
-#: builtin/shortlog.c:13
-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/verify-pack.c:64
+msgid "verbose"
+msgstr "chi tiết"
 
-#: builtin/shortlog.c:242
-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/verify-pack.c:66
+msgid "show statistics only"
+msgstr "chỉ hiển thị thống kê"
 
-#: builtin/shortlog.c:244
-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/verify-tag.c:17
+msgid "git verify-tag [-v | --verbose] <tag>..."
+msgstr "git verify-tag [-v | --verbose] <thẻ>…"
 
-#: builtin/shortlog.c:246
-msgid "Show the email address of each author"
-msgstr "Hiển thị thư điện tử cho từng tác giả"
+#: builtin/verify-tag.c:34
+msgid "print tag contents"
+msgstr "hiển thị nội dung của thẻ"
 
-#: builtin/shortlog.c:247
-msgid "w[,i1[,i2]]"
-msgstr "w[,i1[,i2]]"
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<các-tùy-chọn>] <đường-dẫn> [<nhánh>]"
 
-#: builtin/shortlog.c:248
-msgid "Linewrap output"
-msgstr "Ngắt dòng khi quá dài"
+#: builtin/worktree.c:16
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<các-tùy-chọn>]"
 
-#: 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"
-"\t\t[--current] [--color[=<khi>] | --no-color] [--sparse]\n"
-"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
-"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)…]"
+#: builtin/worktree.c:17
+msgid "git worktree lock [<options>] <path>"
+msgstr "git worktree lock [<các-tùy-chọn>] </đường/dẫn>"
 
-#: builtin/show-branch.c:14
-msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr "git show-branch (-g | --reflog)[=<n>[,<nền>]] [--list] [<ref>]"
+#: builtin/worktree.c:18
+msgid "git worktree prune [<options>]"
+msgstr "git worktree prune [<các-tùy-chọn>]"
 
-#: builtin/show-branch.c:640
-msgid "show remote-tracking and local branches"
-msgstr "hiển thị các nhánh remote-tracking và nội bộ"
+#: builtin/worktree.c:19
+msgid "git worktree unlock <path>"
+msgstr "git worktree unlock </đường/dẫn>"
 
-#: builtin/show-branch.c:642
-msgid "show remote-tracking branches"
-msgstr "hiển thị các nhánh remote-tracking"
+#: builtin/worktree.c:42
+#, 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/show-branch.c:644
-msgid "color '*!+-' corresponding to the branch"
-msgstr "màu “*!+-” tương ứng với nhánh"
+#: builtin/worktree.c:48
+#, 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/show-branch.c:646
-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/worktree.c:53
+#, 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/show-branch.c:648
-msgid "synonym to more=-1"
-msgstr "đồng nghĩa với more=-1"
+#: builtin/worktree.c:64
+#, 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/show-branch.c:649
-msgid "suppress naming strings"
-msgstr "chặn các chuỗi đặt tên"
+#: builtin/worktree.c:80
+#, 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/show-branch.c:651
-msgid "include the current branch"
-msgstr "bao gồm nhánh hiện hành"
+#: builtin/worktree.c:204
+#, c-format
+msgid "'%s' already exists"
+msgstr "“%s” đã có từ trước rồi"
 
-#: builtin/show-branch.c:653
-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/worktree.c:236
+#, c-format
+msgid "could not create directory of '%s'"
+msgstr "không thể tạo thư mục của “%s”"
 
-#: builtin/show-branch.c:655
-msgid "show possible merge bases"
-msgstr "hiển thị mọi cơ sở có thể dùng để hòa trộn"
+#: builtin/worktree.c:272
+#, c-format
+msgid "Preparing %s (identifier %s)"
+msgstr "Đang chuẩn bị %s (định danh %s)"
 
-#: builtin/show-branch.c:657
-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/worktree.c:323
+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/show-branch.c:659
-msgid "show commits in topological order"
-msgstr "hiển thị các lần chuyển giao theo thứ tự tôpô"
+#: builtin/worktree.c:325
+msgid "create a new branch"
+msgstr "tạo nhánh mới"
 
-#: builtin/show-branch.c:662
-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/worktree.c:327
+msgid "create or reset a branch"
+msgstr "tạo hay đặt lại một nhánh"
 
-#: builtin/show-branch.c:664
-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/worktree.c:329
+msgid "populate the new working tree"
+msgstr "di chuyển cây làm việc mới"
 
-#: builtin/show-branch.c:666
-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/worktree.c:337
+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/show-branch.c:669
-msgid "<n>[,<base>]"
-msgstr "<n>[,<cơ_sở>]"
+#: builtin/worktree.c:470
+msgid "reason for locking"
+msgstr "lý do khóa"
 
-#: builtin/show-branch.c:670
-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/worktree.c:482 builtin/worktree.c:515
+#, c-format
+msgid "'%s' is not a working tree"
+msgstr "%s không phải là cây làm việc"
 
-#: 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[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<mẫu>…] "
+#: builtin/worktree.c:484 builtin/worktree.c:517
+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/show-ref.c:11
-msgid "git show-ref --exclude-existing[=<pattern>]"
-msgstr "git show-ref --exclude-existing[=<mẫu>]"
+#: builtin/worktree.c:489
+#, c-format
+msgid "'%s' is already locked, reason: %s"
+msgstr "“%s” đã được khóa rồi, lý do: %s"
 
-#: builtin/show-ref.c:165
-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/worktree.c:491
+#, c-format
+msgid "'%s' is already locked"
+msgstr "“%s” đã được khóa rồi"
 
-#: builtin/show-ref.c:166
-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/worktree.c:519
+#, c-format
+msgid "'%s' is not locked"
+msgstr "“%s” chưa bị khóa"
 
-#: builtin/show-ref.c:167
-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/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<tiền-tố>/]"
 
-#: builtin/show-ref.c:170 builtin/show-ref.c:172
-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/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<tiền tố>/"
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "ghi đối tượng cây (tree) cho <tiền tố> thư mục con"
 
-#: builtin/show-ref.c:174
-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/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "chỉ hữu ích khi cần gỡ lỗi"
 
-#: builtin/show-ref.c:176
-msgid "only show SHA1 hash using <n> digits"
-msgstr "chỉ hiển thị mã băm SHA1 sử dụng <n> chữ số"
+#: upload-pack.c:22
+msgid "git upload-pack [<options>] <dir>"
+msgstr "git upload-pack [<các-tùy-chọn>] </đường/dẫn>"
 
-#: builtin/show-ref.c:180
-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)"
+#: upload-pack.c:1028
+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"
 
-#: builtin/show-ref.c:182
-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 "
-"bộ"
+#: upload-pack.c:1030
+msgid "exit immediately after initial ref advertisement"
+msgstr "thoát ngay sau khi khởi tạo quảng cáo tham chiếu"
 
-#: builtin/stripspace.c:17
-msgid "git stripspace [-s | --strip-comments]"
-msgstr "git stripspace [-s | --strip-comments]"
+#: upload-pack.c:1032
+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"
 
-#: builtin/stripspace.c:18
-msgid "git stripspace [-c | --comment-lines]"
-msgstr "git stripspace [-c | --comment-lines]"
+#: upload-pack.c:1034
+msgid "interrupt transfer after <n> seconds of inactivity"
+msgstr "ngắt truyền thông sau <n> giây không hoạt động"
 
-#: builtin/stripspace.c:35
-msgid "skip and remove all lines starting with comment character"
-msgstr "giữ và xóa bỏ mọi dòng bắt đầu bằng ký tự ghi chú"
+#: 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"
 
-#: builtin/stripspace.c:38
-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"
+#: 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"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
-msgid "alternative anchor for relative paths"
-msgstr "điểm neo thay thế cho các đường dẫn tương đối"
+#: 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” và “git help -g” liệt kê các câu lệnh con sẵn có và một số\n"
+"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ể."
 
-#: builtin/submodule--helper.c:78
-msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
-msgstr "git submodule--helper list [--prefix=<đường/dẫn>] [<đường/dẫn>…]"
+#: http.c:342
+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"
 
-#: builtin/submodule--helper.c:108
-msgid "git submodule--helper name <path>"
-msgstr "git submodule--helper name <đường/dẫn>"
+#: http.c:351
+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"
 
-#: builtin/submodule--helper.c:114
-#, 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”"
+#: 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)"
 
-#: builtin/submodule--helper.c:164
-msgid "where the new submodule will be cloned to"
-msgstr "nhân bản mô-đun-con mới vào chỗ nào"
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr "làm việc trên thay đổi hiện tại (xem thêm: git help everyday)"
 
-#: builtin/submodule--helper.c:167
-msgid "name of the new submodule"
-msgstr "tên của mô-đun-con mới"
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr "xem xét lịch sử tình trạng (xem thêm: git help revisions)"
 
-#: builtin/submodule--helper.c:170
-msgid "url where to clone the submodule from"
-msgstr "url nơi mà nhân bản mô-đun-con từ đó"
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr "thêm, ghi dấu và chỉnh lịch sử chung của bạn"
 
-#: builtin/submodule--helper.c:176
-msgid "depth for shallow clones"
-msgstr "chiều sâu lịch sử khi tạo bản sao"
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr "làm việc nhóm (xem thêm: git help workflows)"
 
-#: builtin/submodule--helper.c:182
-msgid ""
-"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
-"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
-msgstr ""
-"git submodule--helper clone [--prefix=<đường/dẫn>] [--quiet] [--reference "
-"<kho>] [--name <tên>] [--url <url>][--depth <đường/dẫn>] [--] [<đường/dẫn>…]"
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr "Thêm nội dung tập tin vào bảng mục lục"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
-#, c-format
-msgid "could not create directory '%s'"
-msgstr "không thể tạo thư mục “%s”"
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr "Tìm kiếm dạng nhị phân để tìm ra lần chuyển giao nào đưa ra lỗi"
 
-#: builtin/submodule--helper.c:198
-#, 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"
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr "Liệt kê, tạo hay là xóa các nhánh"
 
-#: builtin/submodule--helper.c:221
-#, c-format
-msgid "cannot open file '%s'"
-msgstr "không thể mở tập tin “%s”"
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr "Chuyển các nhánh hoặc phục hồi lại các tập tin cây làm việc"
 
-#: builtin/submodule--helper.c:226
-#, c-format
-msgid "could not close file %s"
-msgstr "không thể đóng tập tin %s"
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr "Nhân bản một kho chứa đến một thư mục mới"
 
-#: builtin/submodule--helper.c:241
-#, c-format
-msgid "could not get submodule directory for '%s'"
-msgstr "không thể lấy thư mục mô-đun-con cho “%s”"
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr "Ghi các thay đổi vào kho chứa"
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
 msgstr ""
-"lỗi nghiêm trọng: lệnh con submodule--helper phải được gói với một lệnh con"
+"Xem các thay đổi giữa những lần chuyển giao, giữa một lần chuyển giao và cây "
+"làm việc, v.v.."
 
-#: builtin/submodule--helper.c:274
-#, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "lỗi nghiêm trọng: “%s” không phải là lệnh con submodule--helper hợp lệ"
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr "Tải về các đối tượng và tham chiếu từ kho chứa khác"
 
-#: builtin/symbolic-ref.c:7
-msgid "git symbolic-ref [<options>] <name> [<ref>]"
-msgstr "git symbolic-ref [<các-tùy-chọn>] <tên> [<t.chiếu>]"
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr "In ra những dòng khớp với một mẫu"
 
-#: builtin/symbolic-ref.c:8
-msgid "git symbolic-ref -d [-q] <name>"
-msgstr "git symbolic-ref -d [-q] <tên>"
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "Tạo một kho git mới hay khởi tạo lại một kho đã tồn tại từ trước"
 
-#: builtin/symbolic-ref.c:40
-msgid "suppress error message for non-symbolic (detached) refs"
-msgstr "chặn các thông tin lỗi cho các tham chiếu “không-mềm” (bị tách ra)"
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr "Hiển thị nhật ký các lần chuyển giao"
 
-#: builtin/symbolic-ref.c:41
-msgid "delete symbolic ref"
-msgstr "xóa tham chiếu mềm"
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr "Hợp nhất hai hay nhiều hơn lịch sử của các nhà phát triển"
 
-#: builtin/symbolic-ref.c:42
-msgid "shorten ref output"
-msgstr "làm ngắn kết xuất ref (tham chiếu)"
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "Di chuyển hay đổi tên một tập tin, thư mục hoặc liên kết mềm"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason"
-msgstr "lý do"
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "Lấy về và hợp nhất với kho khác hay một nhánh nội bộ"
 
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
-msgid "reason of the update"
-msgstr "lý do cập nhật"
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr "Cập nhật th.chiếu máy chủ cùng với các đối tượng liên quan đến nó"
 
-#: 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 <key-id>] [-f] [-m <msg>|-F <tập-tin>] <tên-thẻ> "
-"[<head>]"
+#: common-cmds.h:32
+msgid "Reapply commits on top of another base tip"
+msgstr "Thu hoạch các lần chuyển giao trên đỉnh của đầu mút cơ sở khác"
 
-#: builtin/tag.c:24
-msgid "git tag -d <tagname>..."
-msgstr "git tag -d <tên-thẻ>…"
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr "Đặt lại HEAD hiện hành thành trạng thái đã cho"
 
-#: 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[<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>…]"
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr "Gỡ bỏ các tập tin từ cây làm việc và từ bảng mục lục"
 
-#: builtin/tag.c:27
-msgid "git tag -v <tagname>..."
-msgstr "git tag -v <tên-thẻ>…"
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr "Hiển thị các kiểu khác nhau của các đối tượng"
 
-#: builtin/tag.c:80
-#, c-format
-msgid "tag name too long: %.*s..."
-msgstr "tên thẻ quá dài: %.*s…"
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr "Hiển thị trạng thái cây làm việc"
 
-#: builtin/tag.c:85
-#, c-format
-msgid "tag '%s' not found."
-msgstr "không tìm thấy tìm thấy thẻ “%s”."
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ được ký bằng GPG"
 
-#: builtin/tag.c:100
-#, c-format
-msgid "Deleted tag '%s' (was %s)\n"
-msgstr "Thẻ đã bị xóa “%s” (từng là %s)\n"
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr "ngày hết hạn"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "không thể thẩm tra thẻ “%s”"
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr "no-op (tương thích ngược)"
 
-#: builtin/tag.c:122
-#, c-format
-msgid ""
-"\n"
-"Write a message for tag:\n"
-"  %s\n"
-"Lines starting with '%c' will be ignored.\n"
-msgstr ""
-"\n"
-"Viết các ghi chú cho thẻ:\n"
-"  %s\n"
-"Những dòng được bắt đầu bằng “%c” sẽ được bỏ qua.\n"
+#: parse-options.h:238
+msgid "be more verbose"
+msgstr "chi tiết hơn nữa"
 
-#: builtin/tag.c:126
-#, 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 ""
-"\n"
-"Viết các ghi chú cho thẻ:\n"
-"  %s\n"
-"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"
+#: parse-options.h:240
+msgid "be more quiet"
+msgstr "im lặng hơn nữa"
+
+#: parse-options.h:246
+msgid "use <n> digits to display SHA-1s"
+msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
+
+#: rerere.h:40
+msgid "update the index with reused conflict resolution if possible"
+msgstr "cập nhật bảng mục lục với phân giải xung đột dùng lại nếu được"
 
-#: builtin/tag.c:199
-msgid "unable to sign the tag"
-msgstr "không thể ký thẻ"
+#: git-bisect.sh:54
+msgid "You need to start by \"git bisect start\""
+msgstr "Bạn cần khởi đầu bằng \"git bisect start\""
 
-#: builtin/tag.c:201
-msgid "unable to write tag file"
-msgstr "không thể ghi vào tập tin lưu thẻ"
+#. 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 "Bạn có muốn tôi thực hiện điều này cho bạn không [Y/n]? "
 
-#: builtin/tag.c:226
-msgid "bad object type."
-msgstr "kiểu đối tượng sai."
+#: git-bisect.sh:121
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "không công nhận tùy chọn: “$arg”"
 
-#: builtin/tag.c:239
-msgid "tag header too big."
-msgstr "phần đầu thẻ quá lớn."
+#: git-bisect.sh:125
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "”$arg” không có vẻ như là một điểm xét duyệt hợp lệ"
 
-#: builtin/tag.c:275
-msgid "no tag message?"
-msgstr "không có chú thích gì cho cho thẻ à?"
+#: git-bisect.sh:154
+msgid "Bad HEAD - I need a HEAD"
+msgstr "HEAD sai - Tôi cần một HEAD"
 
-#: builtin/tag.c:281
-#, c-format
-msgid "The tag message has been left in %s\n"
-msgstr "Nội dung ghi chú còn lại %s\n"
+#: git-bisect.sh:167
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgstr ""
+"Việc lấy “$start_head” ra gặp lỗi. Hãy thử \"git bisect reset <nhánh_hợp_lệ>"
+"\"."
 
-#: builtin/tag.c:339
-msgid "list tag names"
-msgstr "chỉ liệt kê tên các thẻ"
+#: git-bisect.sh:177
+msgid "won't bisect on cg-seek'ed tree"
+msgstr "sẽ không di chuyển nửa bước trên cây được cg-seek"
 
-#: builtin/tag.c:341
-msgid "print <n> lines of each tag message"
-msgstr "hiển thị <n> dòng cho mỗi ghi chú"
+#: git-bisect.sh:181
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "HEAD sai - tham chiếu mềm kỳ lạ"
 
-#: builtin/tag.c:343
-msgid "delete tags"
-msgstr "xóa thẻ"
+#: git-bisect.sh:233
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "Đối số bisect_write sai: $state"
 
-#: builtin/tag.c:344
-msgid "verify tags"
-msgstr "thẩm tra thẻ"
+#: git-bisect.sh:262
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "Đầu vào rev sai: $arg"
 
-#: builtin/tag.c:346
-msgid "Tag creation options"
-msgstr "Tùy chọn tạo thẻ"
+#: git-bisect.sh:281
+#, sh-format
+msgid "Bad rev input: $bisected_head"
+msgstr "Đầu vào rev sai: $bisected_head"
 
-#: builtin/tag.c:348
-msgid "annotated tag, needs a message"
-msgstr "để chú giải cho thẻ, cần một lời ghi chú"
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "Đầu vào rev sai: $rev"
 
-#: builtin/tag.c:350
-msgid "tag message"
-msgstr "phần chú thích cho thẻ"
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "“git bisect $TERM_BAD” có thể lấy chỉ một đối số."
 
-#: builtin/tag.c:352
-msgid "annotated and GPG-signed tag"
-msgstr "thẻ chú giải và ký kiểu GPG"
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao $TERM_BAD."
 
-#: builtin/tag.c:356
-msgid "use another key to sign the tag"
-msgstr "dùng kháo khác để ký thẻ"
+#. 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 "Bạn có chắc chắn chưa [Y/n]? "
 
-#: builtin/tag.c:357
-msgid "replace the tag if exists"
-msgstr "thay thế nếu thẻ đó đã có trước"
+#: 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 ""
+"Bạn phải chỉ cho tôi ít nhất một điểm $bad_syn và một $good_syn.\n"
+"(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
+"cái đó.)"
 
-#: builtin/tag.c:358 builtin/update-ref.c:368
-msgid "create a reflog"
-msgstr "tạo một reflog"
+#: 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 ""
+"Bạn cần bắt đầu bằng lệnh \"git bisect start\".\n"
+"Bạn sau đó cần phải chỉ cho tôi ít nhất một điểm xét duyệt $good_syn và một "
+"$bad_syn.\n"
+"(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
+"chúng.)"
 
-#: builtin/tag.c:360
-msgid "Tag listing options"
-msgstr "Các tùy chọn liệt kê thẻ"
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr "Chúng tôi không bisect."
 
-#: builtin/tag.c:361
-msgid "show tag list in columns"
-msgstr "hiển thị danh sách thẻ trong các cột"
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "”$invalid” không phải là lần chuyển giao hợp lệ"
 
-#: builtin/tag.c:362 builtin/tag.c:363
-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"
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+"Không thể check-out HEAD nguyên thủy của “$branch”.\n"
+"Hãy thử “git bisect reset <lần-chuyển-giao>”."
 
-#: builtin/tag.c:364
-msgid "print only tags that are merged"
-msgstr "chỉ hiển thị những thẻ mà nó được hòa trộn"
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr "Chưa chỉ ra tập tin ghi nhật ký"
 
-#: builtin/tag.c:365
-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"
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr "không thể đọc $file để thao diễn lại"
 
-#: builtin/tag.c:370
-msgid "print only tags of the object"
-msgstr "chỉ hiển thị các thẻ của đối tượng"
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr "?? bạn đang nói gì thế?"
 
-#: builtin/tag.c:399
-msgid "--column and -n are incompatible"
-msgstr "--column và -n xung khắc nhau"
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr "đang chạy lệnh $command"
 
-#: 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."
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+"chạy bisect gặp lỗi:\n"
+"mã trả về $res từ lệnh “$command” là < 0 hoặc >= 128"
 
-#: 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."
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr "bisect không thể tiếp tục thêm được nữa"
 
-#: 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."
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
+msgstr ""
+"chạy bisect gặp lỗi:\n"
+"”bisect_state $state” đã thoát ra với mã lỗi $res"
 
-#: 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."
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr "bisect chạy thành công"
 
-#: builtin/tag.c:433
-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."
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "vui lòng dùng hai thời kỳ khác nhau"
 
-#: builtin/tag.c:453
-msgid "too many params"
-msgstr "quá nhiều đối số"
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "“$term” không phải là thời kỳ hợp lệ"
 
-#: builtin/tag.c:459
-#, c-format
-msgid "'%s' is not a valid tag name."
-msgstr "“%s” không phải thẻ hợp lệ."
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "không thể dùng lệnh tích hợp “$term” như là một thời kỳ"
 
-#: builtin/tag.c:464
-#, c-format
-msgid "tag '%s' already exists"
-msgstr "Thẻ “%s” đã tồn tại rồi"
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "không thể thay đổi nghĩa của thời kỳ “$term”"
 
-#: builtin/tag.c:489
-#, c-format
-msgid "Updated tag '%s' (was %s)\n"
-msgstr "Đã cập nhật thẻ “%s” (trước là %s)\n"
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr "Lệnh không hợp lệ: bạn hiện đang ở bisect $TERM_BAD/$TERM_GOOD."
 
-#: builtin/unpack-objects.c:490
-msgid "Unpacking objects"
-msgstr "Đang giải nén các đối tượng"
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "chưa định nghĩa thời kỳ nào"
 
-#: builtin/update-index.c:79
-#, c-format
-msgid "failed to create directory %s"
-msgstr "tạo thư mục \"%s\" gặp lỗi"
+#: 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 ""
+"tham số không hợp lệ $arg cho “git bisect terms”.\n"
+"Các tùy chọn hỗ trợ là: --term-good|--term-old và --term-bad|--term-new."
 
-#: builtin/update-index.c:85
-#, c-format
-msgid "failed to stat %s"
-msgstr "gặp lỗi khi lấy thông tin thống kê về %s"
+#: git-merge-octopus.sh:46
+msgid ""
+"Error: Your local changes to the following files would be overwritten by "
+"merge"
+msgstr ""
+"Lỗi: 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"
 
-#: builtin/update-index.c:95
-#, c-format
-msgid "failed to create file %s"
-msgstr "gặp lỗi khi tạo tập tin %s"
+#: git-merge-octopus.sh:61
+msgid "Automated merge did not work."
+msgstr "Hòa trộn một cách tự động không làm việc."
 
-#: builtin/update-index.c:103
-#, c-format
-msgid "failed to delete file %s"
-msgstr "gặp lỗi khi xóa tập tin %s"
+#: git-merge-octopus.sh:62
+msgid "Should not be doing an octopus."
+msgstr "Không thể thực hiện một octopus."
 
-#: builtin/update-index.c:110 builtin/update-index.c:212
-#, c-format
-msgid "failed to delete directory %s"
-msgstr "gặp lỗi khi xóa thư mục %s"
+#: git-merge-octopus.sh:73
+#, sh-format
+msgid "Unable to find common commit with $pretty_name"
+msgstr "Không thể tìm thấy lần chuyển giao chung với $pretty_name"
 
-#: builtin/update-index.c:133
-#, c-format
-msgid "Testing mtime in '%s' "
-msgstr "Đang kiểm thử mtime trong “%s”"
+#: git-merge-octopus.sh:77
+#, sh-format
+msgid "Already up-to-date with $pretty_name"
+msgstr "Đã cập nhật với $pretty_name rồi"
 
-#: builtin/update-index.c:145
-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"
+#: git-merge-octopus.sh:89
+#, sh-format
+msgid "Fast-forwarding to: $pretty_name"
+msgstr "Chuyển-tiếp-nhanh đến: $pretty_name"
 
-#: builtin/update-index.c:158
-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"
+#: git-merge-octopus.sh:97
+#, sh-format
+msgid "Trying simple merge with $pretty_name"
+msgstr "Đang thử hòa trộn đơn giản với $pretty_name"
 
-#: builtin/update-index.c:171
-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"
+#: git-merge-octopus.sh:102
+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."
 
-#: builtin/update-index.c:182
-msgid "directory stat info changes after adding a file inside subdirectory"
+#: 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 ""
-"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
-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
-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"
+"Khi bạn cần giải quyết vấn đề này hãy chạy lệnh \"git rebase --continue\".\n"
+"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"git rebase --skip"
+"\".\n"
+"Để 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\"."
 
-#: builtin/update-index.c:213
-msgid " OK"
-msgstr " Đồng ý"
+#: git-rebase.sh:156 git-rebase.sh:395
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "Không thể quay trở lại $head_name"
 
-#: builtin/update-index.c:575
-msgid "git update-index [<options>] [--] [<file>...]"
-msgstr "git update-index [<các-tùy-chọn>] [--] [<tập-tin>…]"
+#: git-rebase.sh:167
+msgid "Applied autostash."
+msgstr "Đã áp dụng autostash."
 
-#: builtin/update-index.c:930
-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"
+#: git-rebase.sh:170
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "Không thể lưu $stash_sha1"
 
-#: builtin/update-index.c:933
-msgid "refresh: ignore submodules"
-msgstr "refresh: lờ đi mô-đun-con"
+#: 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"
 
-#: builtin/update-index.c:936
-msgid "do not ignore new files"
-msgstr "không bỏ qua các tập tin mới tạo"
+#: git-rebase.sh:210
+msgid "The pre-rebase hook refused to rebase."
+msgstr "Móc (hook) pre-rebase từ chối rebase."
 
-#: builtin/update-index.c:938
-msgid "let files replace directories and vice-versa"
-msgstr "để các tập tin thay thế các thư mục và “vice-versa”"
+#: git-rebase.sh:215
+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."
 
-#: builtin/update-index.c:940
-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"
+#: git-rebase.sh:356
+msgid "No rebase in progress?"
+msgstr "Không có tiến trình rebase nào phải không?"
 
-#: builtin/update-index.c:942
-msgid "refresh even if index contains unmerged entries"
+#: git-rebase.sh:367
+msgid "The --edit-todo action can only be used during interactive rebase."
 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"
+"Hành động “--edit-todo” chỉ có thể dùng trong quá trình “rebase” (sửa lịch "
+"sử) tương tác."
 
-#: builtin/update-index.c:945
-msgid "refresh stat information"
-msgstr "lấy lại thông tin thống kê"
+#: git-rebase.sh:374
+msgid "Cannot read HEAD"
+msgstr "Không thể đọc HEAD"
 
-#: builtin/update-index.c:949
-msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr "giống --refresh, nhưng bỏ qua các cài đặt “assume-unchanged”"
+#: git-rebase.sh:377
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+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"
 
-#: builtin/update-index.c:953
-msgid "<mode>,<object>,<path>"
-msgstr "<chế_độ>,<đối_tượng>,<đường_dẫn>"
+#: git-rebase.sh:414
+#, 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 ""
+"Hình như là ở đây sẵn có một thư mục $state_dir_base, và\n"
+"Tôi tự hỏi có phải bạn đang ở giữa một lệnh rebase khác. Nếu đúng là\n"
+"như vậy, xin hãy thử\n"
+"\t$cmd_live_rebase\n"
+"Nếu không phải thế, hãy thử\n"
+"\t$cmd_clear_stale_rebase\n"
+"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."
 
-#: builtin/update-index.c:954
-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"
+#: git-rebase.sh:465
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "thượng nguồn không hợp lệ $upstream_name"
 
-#: builtin/update-index.c:958
-msgid "(+/-)x"
-msgstr "(+/-)x"
+#: git-rebase.sh:489
+#, 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"
 
-#: 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ê"
+#: git-rebase.sh:492 git-rebase.sh:496
+#, 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"
 
-#: builtin/update-index.c:963
-msgid "mark files as \"not changing\""
-msgstr "Đánh dấu các tập tin là \"không thay đổi\""
+#: git-rebase.sh:501
+#, 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"
 
-#: builtin/update-index.c:966
-msgid "clear assumed-unchanged bit"
-msgstr "xóa bít assumed-unchanged (giả định là không thay đổi)"
+#: git-rebase.sh:524
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "nghiêm trọng: không có nhánh như thế: $branch_name"
 
-#: builtin/update-index.c:969
-msgid "mark files as \"index-only\""
-msgstr "đánh dấu các tập tin là “chỉ-đọc”"
+#: git-rebase.sh:557
+msgid "Cannot autostash"
+msgstr "Không thể autostash"
 
-#: builtin/update-index.c:972
-msgid "clear skip-worktree bit"
-msgstr "xóa bít skip-worktree"
+#: git-rebase.sh:562
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "Đã tạo autostash: $stash_abbrev"
 
-#: builtin/update-index.c:975
-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"
+#: git-rebase.sh:566
+msgid "Please commit or stash them."
+msgstr "Xin hãy chuyển giao hoặc tạm cất (stash) chúng."
 
-#: builtin/update-index.c:977
-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"
+#: git-rebase.sh:586
+#, 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."
 
-#: builtin/update-index.c:979
-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"
+#: git-rebase.sh:590
+#, 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."
 
-#: builtin/update-index.c:981
-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"
+#: git-rebase.sh:601
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "Thay đổi từ $mb thành $onto:"
 
-#: builtin/update-index.c:985
-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"
+#: git-rebase.sh:610
+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ó…"
 
-#: builtin/update-index.c:989
-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ê"
+#: git-rebase.sh:620
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "Chuyển-tiếp-nhanh $branch_name thành $onto_name."
 
-#: builtin/update-index.c:993
-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"
+#: git-stash.sh:50
+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ố)"
 
-#: builtin/update-index.c:997
-msgid "ignore files missing from worktree"
-msgstr "bỏ qua các tập-tin thiếu trong thư-mục làm việc"
+#: git-stash.sh:73
+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"
 
-#: builtin/update-index.c:1000
-msgid "report actions to standard output"
-msgstr "báo cáo các thao tác ra thiết bị xuất chuẩn"
+#: git-stash.sh:88
+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"
 
-#: builtin/update-index.c:1002
-msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr "(cho “porcelains”) quên các xung đột chưa được giải quyết đã ghi"
+#: git-stash.sh:103
+msgid "Cannot save the untracked files"
+msgstr "Không thể ghi lại các tập tin chưa theo dõi"
 
-#: builtin/update-index.c:1006
-msgid "write index in this format"
-msgstr "ghi mục lục ở định dạng này"
+#: git-stash.sh:123 git-stash.sh:136
+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"
 
-#: builtin/update-index.c:1008
-msgid "enable or disable split index"
-msgstr "bật/tắt chia cắt bảng mục lục"
+#: git-stash.sh:140
+msgid "No changes selected"
+msgstr "Chưa có thay đổi nào được chọn"
 
-#: builtin/update-index.c:1010
-msgid "enable/disable untracked cache"
-msgstr "bật/tắt bộ đệm không theo vết"
+#: git-stash.sh:143
+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)"
 
-#: builtin/update-index.c:1012
-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"
+#: git-stash.sh:156
+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"
 
-#: builtin/update-index.c:1014
-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"
+#: git-stash.sh:188
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr "Không thể cập nhật $ref_stash với $w_commit"
 
-#: builtin/update-index.c:1134
-msgid "Untracked cache disabled"
-msgstr "Nhớ đệm không theo vết bị tắt"
+#. 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'"
+msgstr ""
+"lỗi: không hiểu tùy chọn cho “stash save”: $option\n"
+"     Để có thể dùng lời chú thích có chứa -- ở đầu,\n"
+"     dùng git stash save -- \"$option\""
 
-#: builtin/update-index.c:1146
-#, c-format
-msgid "Untracked cache enabled for '%s'"
-msgstr "Nhớ đệm không theo vết được bật cho “%s”"
+#: git-stash.sh:251
+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."
 
-#: builtin/update-ref.c:9
-msgid "git update-ref [<options>] -d <refname> [<old-val>]"
-msgstr "git update-ref [<các-tùy-chọn>] -d <refname> [<biến-cũ>]"
+#: git-stash.sh:259
+msgid "No local changes to save"
+msgstr "Không có thay đổi nội bộ nào được ghi lại"
 
-#: builtin/update-ref.c:10
-msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
-msgstr "git update-ref [<các-tùy-chọn>]    <refname> <biến-mới> [<biến-cũ>]"
+#: git-stash.sh:263
+msgid "Cannot initialize stash"
+msgstr "Không thể khởi tạo stash"
 
-#: builtin/update-ref.c:11
-msgid "git update-ref [<options>] --stdin [-z]"
-msgstr "git update-ref [<các-tùy-chọn>] --stdin [-z]"
+#: git-stash.sh:267
+msgid "Cannot save the current status"
+msgstr "Không thể ghi lại trạng thái hiện hành"
 
-#: builtin/update-ref.c:363
-msgid "delete the reference"
-msgstr "xóa tham chiếu"
+#: git-stash.sh:268
+#, 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"
 
-#: builtin/update-ref.c:365
-msgid "update <refname> not the one it points to"
-msgstr "cập nhật <tên-tham-chiếu> không phải cái nó chỉ tới"
+#: git-stash.sh:285
+msgid "Cannot remove worktree changes"
+msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc"
 
-#: builtin/update-ref.c:366
-msgid "stdin has NUL-terminated arguments"
-msgstr "đầu vào tiêu chuẩn có các đối số được chấm dứt bởi NUL"
+#: git-stash.sh:403
+#, sh-format
+msgid "unknown option: $opt"
+msgstr "không hiểu tùy chọn: $opt"
 
-#: builtin/update-ref.c:367
-msgid "read updates from stdin"
-msgstr "đọc cập nhật từ đầu vào tiêu chuẩn"
+#: git-stash.sh:416
+msgid "No stash found."
+msgstr "Không tìm thấy lần chuyển giao cất đi (stash) nào."
 
-#: builtin/update-server-info.c:6
-msgid "git update-server-info [--force]"
-msgstr "git update-server-info [--force]"
+#: git-stash.sh:423
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "Chỉ ra quá nhiều điểm xét duyệt: $REV"
 
-#: builtin/update-server-info.c:14
-msgid "update the info files from scratch"
-msgstr "cập nhật các tập tin thông tin từ điểm xuất phát"
+#: git-stash.sh:438
+#, sh-format
+msgid "$reference is not a valid reference"
+msgstr "$reference không phải là tham chiếu hợp lệ"
 
-#: builtin/verify-commit.c:17
-msgid "git verify-commit [-v | --verbose] <commit>..."
-msgstr "git verify-commit [-v | --verbose] <lần_chuyển_giao>…"
+#: git-stash.sh:466
+#, 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)"
 
-#: builtin/verify-commit.c:72
-msgid "print commit contents"
-msgstr "hiển thị nội dung của lần chuyển giao"
+#: git-stash.sh:477
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "”$args” không phải tham chiếu đến stash"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
-msgid "print raw gpg status output"
-msgstr "in kết xuất trạng thái gpg dạng thô"
+#: git-stash.sh:485
+msgid "unable to refresh index"
+msgstr "không thể làm tươi mới bảng mục lục"
 
-#: builtin/verify-pack.c:54
-msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
-msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <gói>…"
+#: git-stash.sh:489
+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"
 
-#: builtin/verify-pack.c:64
-msgid "verbose"
-msgstr "chi tiết"
+#: git-stash.sh:497
+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."
 
-#: builtin/verify-pack.c:66
-msgid "show statistics only"
-msgstr "chỉ hiển thị thống kê"
+#: git-stash.sh:499
+msgid "Could not save index tree"
+msgstr "Không thể ghi lại cây chỉ mục"
 
-#: builtin/verify-tag.c:17
-msgid "git verify-tag [-v | --verbose] <tag>..."
-msgstr "git verify-tag [-v | --verbose] <thẻ>…"
+#: git-stash.sh:508
+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"
 
-#: builtin/verify-tag.c:83
-msgid "print tag contents"
-msgstr "hiển thị nội dung của thẻ"
+#: git-stash.sh:533
+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"
 
-#: builtin/worktree.c:15
-msgid "git worktree add [<options>] <path> [<branch>]"
-msgstr "git worktree add [<các-tùy-chọn>] <đường-dẫn> [<nhánh>]"
+#: git-stash.sh:548
+msgid "Index was not unstashed."
+msgstr "Bảng mục lục đã không được bỏ stash."
 
-#: builtin/worktree.c:16
-msgid "git worktree prune [<options>]"
-msgstr "git worktree prune [<các-tùy-chọn>]"
+#: git-stash.sh:562
+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ó."
 
-#: builtin/worktree.c:17
-msgid "git worktree list [<options>]"
-msgstr "git worktree list [<các-tùy-chọn>]"
+#: git-stash.sh:571
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "Đã xóa ${REV} ($s)"
 
-#: builtin/worktree.c:39
-#, 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ệ"
+#: git-stash.sh:572
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "${REV}: Không thể xóa bỏ mục stash"
 
-#: builtin/worktree.c:45
-#, 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"
+#: git-stash.sh:580
+msgid "No branch name specified"
+msgstr "Chưa chỉ ra tên của nhánh"
 
-#: builtin/worktree.c:50
-#, 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)"
+#: git-stash.sh:652
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
 
-#: builtin/worktree.c:61
-#, 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ệ"
+#: git-submodule.sh:184
+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"
 
-#: builtin/worktree.c:77
-#, 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"
+#: git-submodule.sh:194
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr ""
+"repo URL: “$repo” phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "gặp lỗi khi gỡ bỏ: %s"
+#: git-submodule.sh:211
+#, sh-format
+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"
 
-#: builtin/worktree.c:201
-#, c-format
-msgid "'%s' already exists"
-msgstr "“%s” đã có từ trước rồi"
+#: git-submodule.sh:215
+#, 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 ""
+"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"
+"$sm_path\n"
+"Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
 
-#: builtin/worktree.c:233
-#, c-format
-msgid "could not create directory of '%s'"
-msgstr "không thể tạo thư mục của “%s”"
+#: git-submodule.sh:233
+#, 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"
 
-#: builtin/worktree.c:269
-#, c-format
-msgid "Preparing %s (identifier %s)"
-msgstr "Đang chuẩn bị %s (định danh %s)"
+#: git-submodule.sh:235
+#, 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ệ"
 
-#: builtin/worktree.c:317
-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"
+#: git-submodule.sh:243
+#, 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ủ:"
 
-#: builtin/worktree.c:319
-msgid "create a new branch"
-msgstr "tạo nhánh mới"
+#: git-submodule.sh:245
+#, 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 ""
+"Nếu bạn muốn sử dụng lại thư mục nội bộ này thay vì nhân bản lại lần nữa từ\n"
+"  $realrepo\n"
+"dùng tùy chọn “--force”. Nếu thư mục git nội bộ không phải là một kho đúng\n"
+"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”."
 
-#: builtin/worktree.c:321
-msgid "create or reset a branch"
-msgstr "tạo hay đặt lại một nhánh"
+#: git-submodule.sh:251
+#, 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”."
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "rời bỏ HEAD tại lần chuyển giao theo tên"
+#: git-submodule.sh:263
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
 
-#: builtin/worktree.c:329
-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"
+#: git-submodule.sh:268
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "Gặp lỗi khi thêm mô-đun-con “$sm_path”"
 
-#: builtin/write-tree.c:13
-msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr "git write-tree [--missing-ok] [--prefix=<tiền-tố>/]"
+#: git-submodule.sh:277
+#, 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”"
 
-#: builtin/write-tree.c:26
-msgid "<prefix>/"
-msgstr "<tiền tố>/"
+#: git-submodule.sh:324
+#, sh-format
+msgid "Entering '$displaypath'"
+msgstr "Đang vào “$displaypath”"
 
-#: builtin/write-tree.c:27
-msgid "write tree object for a subdirectory <prefix>"
-msgstr "ghi đối tượng cây (tree) cho <tiền tố> thư mục con"
+#: git-submodule.sh:344
+#, 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."
 
-#: builtin/write-tree.c:30
-msgid "only useful for debugging"
-msgstr "chỉ hữu ích khi cần gỡ lỗi"
+#: git-submodule.sh:415
+#, sh-format
+msgid "pathspec and --all are incompatible"
+msgstr "đặc tả đường dẫn và --all xung khắc nhau"
 
-#: credential-cache--daemon.c:262
-msgid "print debugging messages to stderr"
-msgstr "in thông tin gỡ lỗi ra đầu ra lỗi tiêu chuẩn"
+#: git-submodule.sh:420
+#, 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.c:14
+#: git-submodule.sh:440
+#, 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."
+"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 help -a” và “git help -g” liệt kê các câu lệnh con sẵn có và một số\n"
-"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:321
-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"
-
-#: 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)"
-
-#: common-cmds.h:10
-msgid "work on the current change (see also: git help everyday)"
-msgstr "làm việc trên thay đổi hiện tại (xem thêm: git help everyday)"
+"Cây làm việc mô-đun-con “$displaypath” có chứa thư mục .git\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)"
 
-#: common-cmds.h:11
-msgid "examine the history and state (see also: git help revisions)"
-msgstr "xem xét lịch sử tình trạng (xem thêm: git help revisions)"
+#: git-submodule.sh:448
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+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"
 
-#: common-cmds.h:12
-msgid "grow, mark and tweak your common history"
-msgstr "thêm, ghi dấu và chỉnh lịch sử chung của bạn"
+#: git-submodule.sh:451
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "Đã tạo thư mục “$displaypath”"
 
-#: common-cmds.h:13
-msgid "collaborate (see also: git help workflows)"
-msgstr "làm việc nhóm (xem thêm: git help workflows)"
+#: git-submodule.sh:452
+#, 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”"
 
-#: common-cmds.h:17
-msgid "Add file contents to the index"
-msgstr "Thêm nội dung tập tin vào bảng mục lục"
+#: git-submodule.sh:455
+#, 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”"
 
-#: common-cmds.h:18
-msgid "Use binary search to find the commit that introduced a bug"
-msgstr "Tìm kiếm dạng nhị phân để tìm ra lần chuyển giao nào đưa ra lỗi"
+#: git-submodule.sh:464
+#, 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”"
 
-#: common-cmds.h:19
-msgid "List, create, or delete branches"
-msgstr "Liệt kê, tạo hay là xóa các nhánh"
+#: git-submodule.sh:617
+#, 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”"
 
-#: common-cmds.h:20
-msgid "Switch branches or restore working tree files"
-msgstr "Chuyển các nhánh hoặc phục hồi lại các tập tin cây làm việc"
+#: git-submodule.sh:627
+#, 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”"
 
-#: common-cmds.h:21
-msgid "Clone a repository into a new directory"
-msgstr "Nhân bản một kho chứa đến một thư mục mới"
+#: git-submodule.sh:632
+#, sh-format
+msgid ""
+"Unable to find current ${remote_name}/${branch} revision in submodule path "
+"'$sm_path'"
+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”"
 
-#: common-cmds.h:22
-msgid "Record changes to the repository"
-msgstr "Ghi các thay đổi vào kho chứa"
+#: git-submodule.sh:650
+#, 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”"
 
-#: common-cmds.h:23
-msgid "Show changes between commits, commit and working tree, etc"
+#: 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 ""
-"Xem các thay đổi giữa những lần chuyển giao, giữa một lần chuyển giao và cây "
-"làm việc, v.v.."
-
-#: common-cmds.h:24
-msgid "Download objects and refs from another repository"
-msgstr "Tải về các đối tượng và tham chiếu từ kho chứa khác"
+"Đã 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."
 
-#: common-cmds.h:25
-msgid "Print lines matching a pattern"
-msgstr "In ra những dòng khớp với một mẫu"
+#: git-submodule.sh:663
+#, 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”"
 
-#: common-cmds.h:26
-msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr "Tạo một kho git mới hay khởi tạo lại một kho đã tồn tại từ trước"
+#: git-submodule.sh:664
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
 
-#: common-cmds.h:27
-msgid "Show commit logs"
-msgstr "Hiển thị nhật ký các lần chuyển giao"
+#: git-submodule.sh:668
+#, 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”"
 
-#: common-cmds.h:28
-msgid "Join two or more development histories together"
-msgstr "Hợp nhất hai hay nhiều hơn lịch sử của các nhà phát triển"
+#: git-submodule.sh:669
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "Đường dẫn mô-đun-con “$displaypath”: được rebase vào trong “$sha1”"
 
-#: common-cmds.h:29
-msgid "Move or rename a file, a directory, or a symlink"
-msgstr "Di chuyển hay đổi tên một tập tin, thư mục hoặc liên kết mềm"
+#: git-submodule.sh:674
+#, 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”"
 
-#: common-cmds.h:30
-msgid "Fetch from and integrate with another repository or a local branch"
-msgstr "Lấy về và hợp nhất với kho khác hay một nhánh nội bộ"
+#: git-submodule.sh:675
+#, 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”"
 
-#: common-cmds.h:31
-msgid "Update remote refs along with associated objects"
-msgstr "Cập nhật th.chiếu máy chủ cùng với các đối tượng liên quan đến nó"
+#: git-submodule.sh:680
+#, 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”"
 
-#: common-cmds.h:32
-msgid "Reapply commits on top of another base tip"
-msgstr "Thu hoạch các lần chuyển giao trên đỉnh của đầu mút cơ sở khác"
+#: git-submodule.sh:681
+#, sh-format
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "Đường dẫn mô-đun-con “$displaypath”: “$command $sha1”"
 
-#: common-cmds.h:33
-msgid "Reset current HEAD to the specified state"
-msgstr "Đặt lại HEAD hiện hành thành trạng thái đã cho"
+#: git-submodule.sh:712
+#, 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”"
 
-#: common-cmds.h:34
-msgid "Remove files from the working tree and from the index"
-msgstr "Gỡ bỏ các tập tin từ cây làm việc và từ bảng mục lục"
+#: git-submodule.sh:820
+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"
 
-#: common-cmds.h:35
-msgid "Show various types of objects"
-msgstr "Hiển thị các kiểu khác nhau của các đối tượng"
+#: git-submodule.sh:872
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "chế độ không như mong chờ $mod_dst"
 
-#: common-cmds.h:36
-msgid "Show the working tree status"
-msgstr "Hiển thị trạng thái cây làm việc"
+#: git-submodule.sh:892
+#, 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"
 
-#: common-cmds.h:37
-msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ được ký bằng GPG"
+#: git-submodule.sh:895
+#, 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"
 
-#: parse-options.h:145
-msgid "expiry-date"
-msgstr "ngày hết hạn"
+#: git-submodule.sh:898
+#, 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"
 
-#: parse-options.h:160
-msgid "no-op (backward compatibility)"
-msgstr "no-op (tương thích ngược)"
+#: git-submodule.sh:1045
+#, 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”"
 
-#: parse-options.h:237
-msgid "be more verbose"
-msgstr "chi tiết hơn nữa"
+#: git-submodule.sh:1112
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 
-#: parse-options.h:239
-msgid "be more quiet"
-msgstr "im lặng hơn nữa"
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "Xem git-${cmd}(1) để biết thêm chi tiết."
 
-#: parse-options.h:245
-msgid "use <n> digits to display SHA-1s"
-msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
+#: git-rebase--interactive.sh:131
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "Đang rebase ($new_count/$total)"
 
-#: rerere.h:38
-msgid "update the index with reused conflict resolution if possible"
-msgstr "cập nhật bảng mục lục với phân giải xung đột dùng lại nếu được"
+#: 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"
+msgstr ""
+"\n"
+"Các lệnh:\n"
+" p, pick = dùng lần chuyển giao\n"
+" r, reword = dùng lần chuyển giao, nhưng sửa lại phần chú thích\n"
+" e, edit = dùng lần chuyển giao, nhưng dừng lại để tu bổ (amend)\n"
+" s, squash = dùng lần chuyển giao, nhưng meld vào lần chuyển giao kế trước\n"
+" f, fixup = giống như \"squash\", nhưng loại bỏ chú thích của lần chuyển "
+"giao này\n"
+" x, exec = chạy lệnh (phần còn lại của dòng) dùng hệ vỏ\n"
+" d, drop = xóa lần chuyển giao\n"
+"\n"
+"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-bisect.sh:55
-msgid "You need to start by \"git bisect start\""
-msgstr "Bạn cần khởi đầu bằng \"git bisect start\""
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"Đừ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"
 
-#. 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 "Bạn có muốn tôi thực hiện điều này cho bạn không [Y/n]? "
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+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-bisect.sh:122
+#: git-rebase--interactive.sh:202
 #, sh-format
-msgid "unrecognised option: '$arg'"
-msgstr "không công nhận tùy chọn: “$arg”"
+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 ""
+"Bạn có thể tu bổ lần chuyển giao ngay bây giờ bằng:\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Một khi đã hài lòng với những thay đổi của mình, thì chạy:\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-bisect.sh:126
+#: git-rebase--interactive.sh:227
 #, sh-format
-msgid "'$arg' does not appear to be a valid revision"
-msgstr "”$arg” không có vẻ như là một điểm xét duyệt hợp lệ"
-
-#: git-bisect.sh:155
-msgid "Bad HEAD - I need a HEAD"
-msgstr "HEAD sai - Tôi cần một HEAD"
+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-bisect.sh:168
+#: git-rebase--interactive.sh:266
 #, sh-format
-msgid ""
-"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
-msgstr ""
-"Việc lấy “$start_head” ra gặp lỗi. Hãy thử \"git bisect reset <nhánh_hợp_lệ>"
-"\"."
+msgid "Invalid commit name: $sha1"
+msgstr "Tên lần chuyển giao không hợp lệ: $sha1"
 
-#: git-bisect.sh:178
-msgid "won't bisect on cg-seek'ed tree"
-msgstr "sẽ không di chuyển nửa bước trên cây được cg-seek"
+#: git-rebase--interactive.sh:308
+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-bisect.sh:182
-msgid "Bad HEAD - strange symbolic ref"
-msgstr "HEAD sai - tham chiếu mềm kỳ lạ"
+#: git-rebase--interactive.sh:360
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "Chuyển-tiếp-nhanh đến $sha1"
 
-#: git-bisect.sh:234
+#: git-rebase--interactive.sh:362
 #, sh-format
-msgid "Bad bisect_write argument: $state"
-msgstr "Đối số bisect_write sai: $state"
+msgid "Cannot fast-forward to $sha1"
+msgstr "Không thể chuyển-tiếp-nhanh đến $sha1"
 
-#: git-bisect.sh:263
+#: git-rebase--interactive.sh:371
 #, sh-format
-msgid "Bad rev input: $arg"
-msgstr "Đầu vào rev sai: $arg"
+msgid "Cannot move HEAD to $first_parent"
+msgstr "Không thể di chuyển HEAD đến $first_parent"
 
-#: git-bisect.sh:278
-msgid "Please call 'bisect_state' with at least one argument."
-msgstr "Hãy gọi lệnhl “bisect_state” với ít nhất một đối số."
+#: git-rebase--interactive.sh:376
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "Từ chối squash lần hòa trộn: $sha1"
 
-#: git-bisect.sh:290
+#: git-rebase--interactive.sh:390
 #, sh-format
-msgid "Bad rev input: $rev"
-msgstr "Đầu vào rev sai: $rev"
+msgid "Error redoing merge $sha1"
+msgstr "Gặp lỗi khi hoàn lại bước hòa trộn $sha1"
 
-#: git-bisect.sh:299
+#: git-rebase--interactive.sh:398
 #, sh-format
-msgid "'git bisect $TERM_BAD' can take only one argument."
-msgstr "“git bisect $TERM_BAD” có thể lấy chỉ một đối số."
+msgid "Could not pick $sha1"
+msgstr "Không thể lấy ra $sha1"
 
-#: git-bisect.sh:322
+#: git-rebase--interactive.sh:407
 #, sh-format
-msgid "Warning: bisecting only with a $TERM_BAD commit."
-msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao $TERM_BAD."
+msgid "This is the commit message #${n}:"
+msgstr "Đây là chú thích cho lần chuyển giao thứ #${n}:"
 
-#. 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 "Bạn có chắc chắn chưa [Y/n]? "
+#: git-rebase--interactive.sh:412
+#, 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-bisect.sh:340
+#: git-rebase--interactive.sh:423
 #, 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 ""
-"Bạn phải chỉ cho tôi ít nhất một điểm $bad_syn và một $good_syn.\n"
-"(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
-"cái đó.)"
+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-bisect.sh:343
+#: git-rebase--interactive.sh:431
 #, 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 ""
-"Bạn cần bắt đầu bằng lệnh \"git bisect start\".\n"
-"Bạn sau đó cần phải chỉ cho tôi ít nhất một điểm xét duyệt $good_syn và một "
-"$bad_syn.\n"
-"(Bạn có thể sử dụng \"git bisect $bad_syn\" và \"git bisect $good_syn\" cho "
-"chúng.)"
+msgid "Cannot write $fixup_msg"
+msgstr "Không thể $fixup_msg"
 
-#: git-bisect.sh:414 git-bisect.sh:546
-msgid "We are not bisecting."
-msgstr "Chúng tôi không bisect."
+#: git-rebase--interactive.sh:434
+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-bisect.sh:421
+#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
+#: git-rebase--interactive.sh:521
 #, sh-format
-msgid "'$invalid' is not a valid commit"
-msgstr "”$invalid” không phải là lần chuyển giao hợp lệ"
+msgid "Could not apply $sha1... $rest"
+msgstr "Không thể áp dụng $sha1… $rest"
 
-#: git-bisect.sh:430
+#: git-rebase--interactive.sh:549
 #, sh-format
 msgid ""
-"Could not check out original HEAD '$branch'.\n"
-"Try 'git bisect reset <commit>'."
+"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 ""
-"Không thể check-out HEAD nguyên thủy của “$branch”.\n"
-"Hãy thử “git bisect reset <lần-chuyển-giao>”."
-
-#: git-bisect.sh:458
-msgid "No logfile given"
-msgstr "Chưa chỉ ra tập tin ghi nhật ký"
+"Không thể tu bổ lần chuyển giao sau khi lấy ra $sha1… $rest thành công\n"
+"Việc này có thể là do một ghi chú cho lần chuyển giao là trống rỗng, hoặc "
+"móc pre-commit\n"
+"gặp lỗi. Nếu là móc pre-commit bị lỗi, Bạn có lẽ cần giải quyết trục trặc "
+"này\n"
+"trước khi bạn có thể làm việc lại với lần chuyển giao."
 
-#: git-bisect.sh:459
+#: git-rebase--interactive.sh:564
 #, sh-format
-msgid "cannot read $file for replaying"
-msgstr "không thể đọc $file để thao diễn lại"
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "Bị dừng tại $sha1_abbrev… $rest"
 
-#: git-bisect.sh:480
-msgid "?? what are you talking about?"
-msgstr "?? bạn đang nói gì thế?"
+#: git-rebase--interactive.sh:579
+#, 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-bisect.sh:492
+#: git-rebase--interactive.sh:621
 #, sh-format
-msgid "running $command"
-msgstr "đang chạy lệnh $command"
+msgid "Executing: $rest"
+msgstr "Thực thi: $rest"
 
-#: git-bisect.sh:499
+#: git-rebase--interactive.sh:629
 #, sh-format
+msgid "Execution failed: $rest"
+msgstr "Thực thi gặp lỗi: $rest"
+
+#: git-rebase--interactive.sh:631
+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
 msgid ""
-"bisect run failed:\n"
-"exit code $res from '$command' is < 0 or >= 128"
+"You can fix the problem, and then run\n"
+"\n"
+"\tgit rebase --continue"
 msgstr ""
-"chạy bisect gặp lỗi:\n"
-"mã trả về $res từ lệnh “$command” là < 0 hoặc >= 128"
-
-#: git-bisect.sh:525
-msgid "bisect run cannot continue any more"
-msgstr "bisect không thể tiếp tục thêm được nữa"
+"Bạn có thể sửa các trục trặc, và sau đó chạy lệnh “cải tổ”:\n"
+"\n"
+"\tgit rebase --continue"
 
-#: git-bisect.sh:531
+#. TRANSLATORS: after these lines is a command to be issued by the user
+#: git-rebase--interactive.sh:646
 #, sh-format
 msgid ""
-"bisect run failed:\n"
-"'bisect_state $state' exited with error code $res"
+"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 ""
-"chạy bisect gặp lỗi:\n"
-"”bisect_state $state” đã thoát ra với mã lỗi $res"
+"Thực thi thành công: $rest\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"
+"\tgit rebase --continue"
 
-#: git-bisect.sh:538
-msgid "bisect run success"
-msgstr "bisect chạy thành công"
+#: git-rebase--interactive.sh:657
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "Lệnh chưa biết: $command $sha1 $rest"
 
-#: git-bisect.sh:565
-msgid "please use two different terms"
-msgstr "vui lòng dùng hai thời kỳ khác nhau"
+#: git-rebase--interactive.sh:658
+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-bisect.sh:575
+#: git-rebase--interactive.sh:693
 #, sh-format
-msgid "'$term' is not a valid term"
-msgstr "“$term” không phải là thời kỳ hợp lệ"
+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-bisect.sh:578
-#, sh-format
-msgid "can't use the builtin command '$term' as a term"
-msgstr "không thể dùng lệnh tích hợp “$term” như là một thời kỳ"
+#: git-rebase--interactive.sh:740
+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-bisect.sh:587 git-bisect.sh:593
+#: git-rebase--interactive.sh:898
 #, sh-format
-msgid "can't change the meaning of term '$term'"
-msgstr "không thể thay đổi nghĩa của thời kỳ “$term”"
+msgid ""
+"Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
+" - $line"
+msgstr ""
+"Cảnh báo: SHA-1 bị thiếu hoặc không phải là một lần chuyển giao trong dòng "
+"sau đây:\n"
+" - $line"
 
-#: git-bisect.sh:606
+#: git-rebase--interactive.sh:931
 #, sh-format
-msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
-msgstr "Lệnh không hợp lệ: bạn hiện đang ở bisect $TERM_BAD/$TERM_GOOD."
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"Cảnh báo: lệnh không nhận ra trong dòng sau đây:\n"
+" - $line"
 
-#: git-bisect.sh:636
-msgid "no terms defined"
-msgstr "chưa định nghĩa thời kỳ nào"
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "không thể tách rời HEAD"
 
-#: git-bisect.sh:653
-#, sh-format
+#: git-rebase--interactive.sh:1008
 msgid ""
-"invalid argument $arg for 'git bisect terms'.\n"
-"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
 msgstr ""
-"tham sá»\91 không hợp lá»\87 $arg cho â\80\9cgit bisect termsâ\80\9d.\n"
-"Các tùy chọn hỗ trợ là: --term-good|--term-old và --term-bad|--term-new."
+"Cảnh báo: má»\99t sá»\91 lần chuyá»\83n giao có lẽ Ä\91ã bá»\8b xóa má»\99t cách tình cá»\9d.\n"
+"Các lần chuyển giao bị xóa (từ mới đến cũ):"
 
-#: git-rebase.sh:57
+#: git-rebase--interactive.sh:1016
 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"
-"\"."
+"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 ""
-"Khi bạn cần giải quyết vấn đề này hãy chạy lệnh \"git rebase --continue\".\n"
-"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"git rebase --skip"
-"\".\n"
-"Để 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:165
-msgid "Applied autostash."
-msgstr "Đã áp dụng autostash."
+"Để tránh thông báo này, dùng \"drop\" một cách rõ ràng để xóa bỏ một lần "
+"chuyển giao.\n"
+"\n"
+"Dùng “git config rebase.missingCommitsCheck” để thay đổi mức độ của cảnh "
+"báo.\n"
+"Cánh ứng xử có thể là: ignore, warn, error."
 
-#: git-rebase.sh:168
+#: git-rebase--interactive.sh:1027
 #, sh-format
-msgid "Cannot store $stash_sha1"
-msgstr "Không thể lưu $stash_sha1"
-
-#: git-rebase.sh:169
 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"
+"Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
+"Ignoring."
 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:208
-msgid "The pre-rebase hook refused to rebase."
-msgstr "Móc (hook) pre-rebase từ chối rebase."
+"Không thừa nhận cài đặt $check_level for option rebase.missingCommitsCheck. "
+"Nên bỏ qua."
 
-#: git-rebase.sh:213
-msgid "It looks like git-am is in progress. Cannot rebase."
+#: git-rebase--interactive.sh:1044
+msgid ""
+"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
+"continue'."
 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."
+"Bạn có thể sửa nó bằng “git rebase --edit-todo” và sau đó chạy “git rebase --"
+"continue”."
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "Tùy chọn --exec phải được sử dụng cùng với tùy chọn --interactive"
+#: git-rebase--interactive.sh:1045
+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.sh:359
-msgid "No rebase in progress?"
-msgstr "Không có tiến trình rebase nào phải không?"
+#: git-rebase--interactive.sh:1069
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "Không thể xóa bỏ CHERRY_PICK_HEAD"
 
-#: git-rebase.sh:370
-msgid "The --edit-todo action can only be used during interactive rebase."
+#: git-rebase--interactive.sh:1074
+#, 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 ""
-"Hành động “--edit-todo” chỉ có thể dùng trong quá trình “rebase” (sửa lịch "
-"sử) tương tác."
+"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"
+"\n"
+"Nếu chúng có ý là đi đến lần chuyển giao mới, thì chạy:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\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"
 
-#: git-rebase.sh:377
-msgid "Cannot read HEAD"
-msgstr "Không thể đọc HEAD"
+#: git-rebase--interactive.sh:1091
+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.sh:380
+#: git-rebase--interactive.sh:1096
 msgid ""
-"You must edit all merge conflicts and then\n"
-"mark them as resolved using git add"
+"You have uncommitted changes in your working tree. Please commit them\n"
+"first and then run 'git rebase --continue' again."
 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"
+"Bạn có các thay đổi chưa chuyển giao trong thư mục làm việc.\n"
+"Vui lòng chuyển giao chúng và sau đó chạy lệnh “git rebase --continue” lần "
+"nữa."
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "Không thể quay trở lại $head_name"
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+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.sh:417
-#, sh-format
+#: git-rebase--interactive.sh:1129
 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 ""
-"Hình như là ở đây sẵn có một thư mục $state_dir_base, và\n"
-"Tôi tự hỏi có phải bạn đang ở giữa một lệnh rebase khác. Nếu đúng là\n"
-"như vậy, xin hãy thử\n"
-"\t$cmd_live_rebase\n"
-"Nếu không phải thế, hãy thử\n"
-"\t$cmd_clear_stale_rebase\n"
-"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."
+"\n"
+"Bạn đang sửa tập tin todo của một lần cải tổ tương tác đang thực hiện.\n"
+"Để tiếp tục cải tổ sau khi sửa, chạy:\n"
+"    git rebase --continue\n"
+"\n"
 
-#: git-rebase.sh:468
-#, sh-format
-msgid "invalid upstream $upstream_name"
-msgstr "thượng nguồn không hợp lệ $upstream_name"
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "Không thể thực thi trình biên soạn"
 
-#: git-rebase.sh:492
+#: git-rebase--interactive.sh:1150
 #, 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"
+msgid "Could not checkout $switch_to"
+msgstr "Không thể checkout $switch_to"
 
-#: git-rebase.sh:495 git-rebase.sh:499
-#, 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--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "Không HEAD?"
 
-#: git-rebase.sh:504
+#: git-rebase--interactive.sh:1156
 #, 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"
+msgid "Could not create temporary $state_dir"
+msgstr "Không thể tạo thư mục tạm thời $state_dir"
 
-#: git-rebase.sh:527
-#, 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--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "Không thể đánh dấu là tương tác"
 
-#: git-rebase.sh:560
-msgid "Cannot autostash"
-msgstr "Không thể autostash"
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+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.sh:565
+#: git-rebase--interactive.sh:1273
 #, sh-format
-msgid "Created autostash: $stash_abbrev"
-msgstr "Đã tạo autostash: $stash_abbrev"
+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.sh:569
-msgid "Please commit or stash them."
-msgstr "Xin hãy chuyển giao hoặc tạm cất (stash) chúng."
+#: git-rebase--interactive.sh:1278
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+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.sh:589
+#: git-rebase--interactive.sh:1285
+msgid "Note that empty commits are commented out"
+msgstr "Chú ý rằng lần chuyển giao trống rỗng là ghi chú"
+
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, 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."
+msgid "usage: $dashless $USAGE"
+msgstr "cách dùng: $dashless $USAGE"
 
-#: git-rebase.sh:593
+#: git-sh-setup.sh:190
 #, 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."
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr ""
+"Không thể chuyển thư mục (chdir) sang $cdup, thư mục ở mức cao nhất của cây "
+"làm việc"
 
-#: git-rebase.sh:604
+#: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
-msgid "Changes from $mb to $onto:"
-msgstr "Thay đổi từ $mb thành $onto:"
+msgid "fatal: $program_name cannot be used without a working tree."
+msgstr ""
+"lỗi nghiêm trọng: $program_name không thể được dùng ngoaoif thư mục làm việc."
 
-#: git-rebase.sh:613
-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-sh-setup.sh:220
+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."
 
-#: git-rebase.sh:623
+#: git-sh-setup.sh:223
+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 "Fast-forwarded $branch_name to $onto_name."
-msgstr "Chuyển-tiếp-nhanh $branch_name thành $onto_name."
+msgid "Cannot $action: You have unstaged changes."
+msgstr "Không thể $action: Bạn có các thay đổi chưa được đưa lên bệ phóng."
 
-#: git-stash.sh:51
-msgid "git stash clear with parameters is unimplemented"
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
 msgstr ""
-"git stash clear với các tham số là chưa được thực hiện (không nhận đối số)"
+"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-stash.sh:74
-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-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-stash.sh:89
-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-sh-setup.sh:248
+#, sh-format
+msgid "Cannot $action: Your index contains uncommitted changes."
+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-stash.sh:124 git-stash.sh:137
-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-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-stash.sh:141
-msgid "No changes selected"
-msgstr "Chưa có thay đổi nào được chọn"
+#: 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."
 
-#: git-stash.sh:144
-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-sh-setup.sh:377
+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"
 
-#: git-stash.sh:157
-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"
+#~ msgid "Could not write to %s"
+#~ msgstr "Không thể ghi vào %s"
 
-#: git-stash.sh:189
-#, sh-format
-msgid "Cannot update $ref_stash with $w_commit"
-msgstr "Không thể cập nhật $ref_stash với $w_commit"
+#~ msgid "Error wrapping up %s."
+#~ msgstr "Lỗi bao bọc %s."
 
-#. 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
-msgid ""
-"error: unknown option for 'stash save': $option\n"
-"       To provide a message, use git stash save -- '$option'"
-msgstr ""
-"lỗi: không hiểu tùy chọn cho “stash save”: $option\n"
-"     Để có thể dùng lời chú thích có chứa -- ở đầu,\n"
-"     dùng git stash save -- \"$option\""
+#~ 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"
+
+#~ msgid "bad numeric config value '%s' for '%s' in blob %s: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong blob %s: đơn vị sai"
 
-#: git-stash.sh:260
-msgid "No local changes to save"
-msgstr "Không có thay đổi nội bộ nào được ghi lại"
+#~ msgid "bad numeric config value '%s' for '%s' in file %s: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong tập tin %s: đơn vị "
+#~ "sai"
 
-#: git-stash.sh:264
-msgid "Cannot initialize stash"
-msgstr "Không thể khởi tạo stash"
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in standard input: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong đầu vào tiêu chuẩn: "
+#~ "đơn vị không hợp lệ"
 
-#: git-stash.sh:268
-msgid "Cannot save the current status"
-msgstr "Không thể ghi lại trạng thái hiện hành"
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in submodule-blob %s: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong submodule-blob %s: "
+#~ "đơn vị không hợp lệ"
 
-#: git-stash.sh:286
-msgid "Cannot remove worktree changes"
-msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc"
+#~ msgid ""
+#~ "bad numeric config value '%s' for '%s' in command line %s: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong dòng lệnh %s: đơn vị "
+#~ "không hợp lệ"
 
-#: git-stash.sh:405
-#, sh-format
-msgid "unknown option: $opt"
-msgstr "không hiểu tùy chọn: $opt"
+#~ msgid "bad numeric config value '%s' for '%s' in %s: invalid unit"
+#~ msgstr ""
+#~ "sai giá trị bằng số của cấu hình “%s” cho “%s” trong %s: đơn vị không hợp "
+#~ "lệ"
 
-#: git-stash.sh:415
-msgid "No stash found."
-msgstr "Không tìm thấy lần chuyển giao cất đi (stash) nào."
+#~ msgid "This is the 2nd commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 2:"
 
-#: git-stash.sh:422
-#, sh-format
-msgid "Too many revisions specified: $REV"
-msgstr "Chỉ ra quá nhiều điểm xét duyệt: $REV"
+#~ msgid "This is the 3rd commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 3:"
 
-#: git-stash.sh:428
-#, sh-format
-msgid "$reference is not a valid reference"
-msgstr "$reference không phải là tham chiếu hợp lệ"
+#~ msgid "This is the 4th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 4:"
 
-#: git-stash.sh:456
-#, 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)"
+#~ msgid "This is the 5th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 5:"
 
-#: git-stash.sh:467
-#, sh-format
-msgid "'$args' is not a stash reference"
-msgstr "”$args” không phải tham chiếu đến stash"
+#~ msgid "This is the 6th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 6:"
 
-#: git-stash.sh:475
-msgid "unable to refresh index"
-msgstr "không thể làm tươi mới bảng mục lục"
+#~ msgid "This is the 7th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 7:"
 
-#: git-stash.sh:479
-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"
+#~ msgid "This is the 8th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 8:"
 
-#: git-stash.sh:487
-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."
+#~ msgid "This is the 9th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 9:"
 
-#: git-stash.sh:489
-msgid "Could not save index tree"
-msgstr "Không thể ghi lại cây chỉ mục"
+#~ msgid "This is the 10th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ 10:"
 
-#: git-stash.sh:523
-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"
+#~ msgid "This is the ${n}th commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ ${n}:"
 
-#: git-stash.sh:538
-msgid "Index was not unstashed."
-msgstr "Bảng mục lục đã không được bỏ stash."
+#~ msgid "This is the ${n}st commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ ${n}:"
 
-#: git-stash.sh:561
-#, sh-format
-msgid "Dropped ${REV} ($s)"
-msgstr "Đã xóa ${REV} ($s)"
+#~ msgid "This is the ${n}nd commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ ${n}:"
 
-#: git-stash.sh:562
-#, sh-format
-msgid "${REV}: Could not drop stash entry"
-msgstr "${REV}: Không thể xóa bỏ mục stash"
+#~ msgid "This is the ${n}rd commit message:"
+#~ msgstr "Đây là chú thích cho lần chuyển giao thứ ${n}:"
 
-#: git-stash.sh:570
-msgid "No branch name specified"
-msgstr "Chưa chỉ ra tên của nhánh"
+#~ msgid "The 1st commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ nhất sẽ bị bỏ qua:"
 
-#: git-stash.sh:642
-msgid "(To restore them type \"git stash apply\")"
-msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")"
+#~ msgid "The 2nd commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 2 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "không thể tháo bỏ một thành phần ra khỏi “$remoteurl” url"
+#~ msgid "The 3rd commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 3 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:281
-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"
+#~ msgid "The 4th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 4 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:291
-#, sh-format
-msgid "repo URL: '$repo' must be absolute or begin with ./|../"
-msgstr ""
-"repo URL: “$repo” phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
+#~ msgid "The 5th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 5 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:308
-#, sh-format
-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"
+#~ msgid "The 6th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 6 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:312
-#, 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 ""
-"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"
-"$sm_path\n"
-"Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
+#~ msgid "The 7th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 7 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:330
-#, 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"
+#~ msgid "The 8th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 8 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:332
-#, 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ệ"
+#~ msgid "The 9th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 9 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:340
-#, 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ủ:"
+#~ msgid "The 10th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ 10 sẽ bị bỏ qua:"
 
-#: git-submodule.sh:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr "Nếu bạn muốn dùng lại thư mục git nội bộ này thay vì nhân bản từ nó"
+#~ msgid "The ${n}th commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ ${n} sẽ bị bỏ qua:"
 
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
-"dùng tùy chọn “--force”. Nếu thư mục git nội bộ không phải là repo (kho) đúng"
+#~ msgid "The ${n}st commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ ${n} sẽ bị bỏ qua:"
 
-#: git-submodule.sh:345
-#, sh-format
-msgid ""
-"or you are unsure what this means choose another name with the '--name' "
-"option."
-msgstr ""
-"hay bạn không chắc chắn điều đó có nghĩa gì chọn tên khác với tùy chọn “--"
-"name”."
+#~ msgid "The ${n}nd commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ ${n} sẽ bị bỏ qua:"
 
-#: git-submodule.sh:347
-#, 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”."
+#~ msgid "The ${n}rd commit message will be skipped:"
+#~ msgstr "Chú thích cho lần chuyển giao thứ ${n} sẽ bị bỏ qua:"
 
-#: git-submodule.sh:359
-#, sh-format
-msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Không thể lấy ra mô-đun-con “$sm_path”"
+#~ msgid "could not run gpg."
+#~ msgstr "không thể chạy gpg."
 
-#: git-submodule.sh:364
-#, sh-format
-msgid "Failed to add submodule '$sm_path'"
-msgstr "Gặp lỗi khi thêm mô-đun-con “$sm_path”"
+#~ msgid "gpg did not accept the data"
+#~ msgstr "gpg đã không chấp nhận dữ liệu"
 
-#: git-submodule.sh:373
-#, 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”"
+#~ msgid "unsupported object type in the tree"
+#~ msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "Đang vào “$prefix$displaypath”"
+#~ msgid "Fatal merge failure, shouldn't happen."
+#~ msgstr "Việc hòa trộn hỏng nghiêm trọng, không nên để xảy ra."
 
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr ""
-"Dừng lại tại “$prefix$displaypath”; script trả về trạng thái khác không."
+#~ msgid "Unprocessed path??? %s"
+#~ msgstr "Đường dẫn chưa được xử lý??? %s"
 
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr ""
-"Không tìm thấy url cho đường dẫn mô-đun-con “$displaypath” trong .gitmodules"
+#~ msgid "Error wrapping up %s"
+#~ msgstr "Lỗi bao bọc %s"
 
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "Gặp lỗi khi đăng ký url cho đường dẫn mô-đun-con “$displaypath”"
+#~ msgid "Cannot %s during a %s"
+#~ msgstr "Không thể %s trong khi %s"
 
-#: git-submodule.sh:494
-#, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "Mô-đun-con “$name” ($url) được đăng ký cho đường dẫn “$displaypath”"
+#~ msgid "Can't cherry-pick into empty head"
+#~ msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
 
-#: git-submodule.sh:511
-#, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr ""
-"Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con “$displaypath”"
+#~ msgid "could not open %s for writing"
+#~ msgstr "không thể mở %s để ghi"
 
-#: git-submodule.sh:549
-#, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "Dùng “.” nếu bạn thực sự muốn gỡ bỏ mọi mô-đun-con"
+#~ msgid "bug: unhandled unmerged status %x"
+#~ msgstr "lỗi: không thể tiếp nhận trạng thái chưa hòa trộn %x"
 
-#: git-submodule.sh:566
-#, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "Cây làm việc mô-đun-con “$displaypath” có chứa thư mục .git"
+#~ msgid "bug: unhandled diff status %c"
+#~ msgstr "lỗi: không thể tiếp nhận trạng thái lệnh diff %c"
 
-#: git-submodule.sh:567
-#, sh-format
-msgid ""
-"(use 'rm -rf' if you really want to remove it including all of its history)"
-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)"
+#~ msgid "read of %s failed"
+#~ msgstr "đọc %s gặp lỗi"
 
-#: git-submodule.sh:573
-#, sh-format
-msgid ""
-"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
-"discard them"
-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"
+#~ msgid "could not write branch description template"
+#~ msgstr "không thể ghi mẫu mô tả nhánh"
 
-#: git-submodule.sh:576
-#, sh-format
-msgid "Cleared directory '$displaypath'"
-msgstr "Đã tạo thư mục “$displaypath”"
+#~ msgid "corrupt index file"
+#~ msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: git-submodule.sh:577
-#, 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”"
+#~ msgid "detach the HEAD at named commit"
+#~ msgstr "rời bỏ HEAD tại lần chuyển giao danh nghĩa"
 
-#: git-submodule.sh:580
-#, 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”"
+#~ msgid "Checking connectivity... "
+#~ msgstr "Đang kiểm tra kết nối… "
 
-#: git-submodule.sh:589
-#, 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”"
+#~ msgid "  (unable to update local ref)"
+#~ msgstr "  (không thể cập nhật tham chiếu nội bộ)"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"Đường dẫn mô-đun-con “$displaypath” chưa được khởi tạo.\n"
-"Có lẽ bạn muốn sử dụng lệnh “update --init”?"
+#~ msgid "Reinitialized existing"
+#~ msgstr "Khởi tạo lại đã sẵn có rồi"
 
-#: git-submodule.sh:736
-#, 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”"
+#~ msgid "Initialized empty"
+#~ msgstr "Khởi tạo trống rỗng"
 
-#: git-submodule.sh:745
-#, 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”"
+#~ msgid " shared"
+#~ msgstr " đã chia sẻ"
 
-#: git-submodule.sh:768
-#, 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”"
+#~ 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"
 
-#: git-submodule.sh:788
-#, 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”"
+#~ msgid "Writing SQUASH_MSG"
+#~ msgstr "Đang ghi SQUASH_MSG"
 
-#: git-submodule.sh:789
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Đường dẫn mô-đun-con “$displaypath”: đã checkout “$sha1”"
+#~ msgid "Finishing SQUASH_MSG"
+#~ msgstr "Hoàn thành SQUASH_MSG"
 
-#: git-submodule.sh:793
-#, 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”"
+#~ msgid "   and with remote"
+#~ msgstr "   và với máy chủ"
 
-#: git-submodule.sh:794
-#, sh-format
-msgid "Submodule path '$displaypath': rebased into '$sha1'"
-msgstr "Đường dẫn mô-đun-con “$displaypath”: được rebase vào trong “$sha1”"
+#~ msgid "removing '%s' failed"
+#~ msgstr "gặp lỗi khi xóa bỏ “%s”"
 
-#: git-submodule.sh:799
-#, 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”"
+#~ msgid "program error"
+#~ msgstr "lỗi chương trình"
 
-#: git-submodule.sh:800
-#, 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”"
+#~ msgid "Please call 'bisect_state' with at least one argument."
+#~ msgstr "Hãy gọi lệnhl “bisect_state” với ít nhất một đối số."
 
-#: git-submodule.sh:805
-#, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr ""
-"Thực hiện không thành công lệnh “$command $sha1” trong đường dẫn mô-đun-con "
-"“$prefix$sm_path”"
+#~ msgid ""
+#~ "If you want to reuse this local git directory instead of cloning again "
+#~ "from"
+#~ msgstr "Nếu bạn muốn dùng lại thư mục git nội bộ này thay vì nhân bản từ nó"
 
-#: git-submodule.sh:806
-#, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "Đường dẫn mô-đun-con “$prefix$sm_path”: “$command $sha1”"
+#~ msgid ""
+#~ "use the '--force' option. If the local git directory is not the correct "
+#~ "repo"
+#~ msgstr ""
+#~ "dùng tùy chọn “--force”. Nếu thư mục git nội bộ không phải là repo (kho) "
+#~ "đúng"
 
-#: git-submodule.sh:836
-#, 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”"
+#~ msgid ""
+#~ "or you are unsure what this means choose another name with the '--name' "
+#~ "option."
+#~ msgstr ""
+#~ "hay bạn không chắc chắn điều đó có nghĩa gì chọn tên khác với tùy chọn “--"
+#~ "name”."
 
-#: git-submodule.sh:944
-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"
+#~ msgid "Submodule work tree '$displaypath' contains a .git directory"
+#~ msgstr "Cây làm việc mô-đun-con “$displaypath” có chứa thư mục .git"
 
-#: git-submodule.sh:996
-#, sh-format
-msgid "unexpected mode $mod_dst"
-msgstr "chế độ không như mong chờ $mod_dst"
+#~ msgid ""
+#~ "(use 'rm -rf' if you really want to remove it including all of its "
+#~ "history)"
+#~ 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:1016
-#, 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"
+#~ msgid "'%s': %s"
+#~ msgstr "“%s”: %s"
 
-#: git-submodule.sh:1019
-#, 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"
+#~ msgid "unable to access '%s': %s"
+#~ msgstr "không thể truy cập “%s”: %s"
 
-#: git-submodule.sh:1022
-#, 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"
+#~ msgid "could not open '%s' for reading: %s"
+#~ msgstr "không thể mở “%s” để đọc: %s"
 
-#: git-submodule.sh:1047
-msgid "blob"
-msgstr "blob"
+#~ msgid "could not open '%s' for writing: %s"
+#~ msgstr "Không thể mở “%s” để ghi: %s"
 
-#: git-submodule.sh:1165
-#, 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”"
+#~ msgid "    git branch -d %s\n"
+#~ msgstr "    git branch -d %s\n"
 
-#: git-submodule.sh:1229
-#, sh-format
-msgid "Synchronizing submodule url for '$displaypath'"
-msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
+#~ msgid "    git branch --set-upstream-to %s\n"
+#~ msgstr "    git branch --set-upstream-to %s\n"
+
+#~ msgid "cannot open %s: %s\n"
+#~ msgstr "không thể mở %s: %s\n"
+
+#~ msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+#~ msgstr ""
+#~ "Vui lòng đưa các thay đổi của bạn vào “.gitmodules” hay tạm cất chúng đi "
+#~ "để xử lý"
+
+#~ msgid "could not verify the tag '%s'"
+#~ msgstr "không thể thẩm tra thẻ “%s”"
+
+#~ msgid "failed to remove: %s"
+#~ msgstr "gặp lỗi khi gỡ bỏ: %s"
+
+#~ msgid "The --exec option must be used with the --interactive option"
+#~ msgstr "Tùy chọn --exec phải được sử dụng cùng với tùy chọn --interactive"
+
+#~ msgid ""
+#~ "Submodule path '$displaypath' not initialized\n"
+#~ "Maybe you want to use 'update --init'?"
+#~ msgstr ""
+#~ "Đường dẫn mô-đun-con “$displaypath” chưa được khởi tạo.\n"
+#~ "Có lẽ bạn muốn sử dụng lệnh “update --init”?"
 
 #~ msgid "Forward-port local commits to the updated upstream head"
 #~ msgstr ""
@@ -12339,9 +15002,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "Could not append '%s'"
 #~ msgstr "Không thể nối thêm “%s”"
 
-#~ msgid "Could not set '%s'"
-#~ msgstr "Không thể đặt “%s”"
-
 #~ msgid "unable to look up current user in the passwd file: %s"
 #~ msgstr "không tìm thấy người dùng hiện tại trong tập tin passwd: %s"
 
@@ -12421,9 +15081,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "-b and -B are mutually exclusive"
 #~ msgstr "-b và -B loại từ lẫn nhau."
 
-#~ 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 ""
 #~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
 #~ "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
@@ -12473,11 +15130,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ "để phê chuẩn việc đánh dấu đây cần được giải quyết và tạo một lần chuyển "
 #~ "giao."
 
-#~ msgid "Pull is not possible because you have unmerged files."
-#~ msgstr ""
-#~ "Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa "
-#~ "trộn."
-
 #~ msgid "no branch specified"
 #~ msgstr "chưa chỉ ra tên của nhánh"
 
@@ -12529,9 +15181,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "Failed to write ref"
 #~ msgstr "Gặp lỗi khi ghi tham chiếu"
 
-#~ msgid "invalid commit: %s"
-#~ msgstr "lần chuyển giao không hợp lệ: %s"
-
 #~ msgid "commit has empty message"
 #~ msgstr "lần chuyển giao có ghi chú trống rỗng"
 
@@ -12688,13 +15337,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "input paths are terminated by a null character"
 #~ msgstr "các đường dẫn được  ngăn cách bởi ký tự null"
 
-#~ msgid ""
-#~ "The following untracked files would NOT be saved but need to be removed "
-#~ "by stash save:"
-#~ msgstr ""
-#~ "Các tập tin chưa được theo dõi sau đây KHÔNG được ghi lại nhưng cần được "
-#~ "gỡ bỏ bởi việc ghi lại stash:"
-
 #~ msgid ""
 #~ "Aborting. Consider using either the --force or --include-untracked option."
 #~ msgstr ""
@@ -12713,15 +15355,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "You cannot combine --no-ff with --ff-only."
 #~ msgstr "Bạn không thể kết hợp --no-ff với --ff-only."
 
-#~ msgid ""
-#~ "submodule '%s' (or one of its nested submodules) uses a .git directory\n"
-#~ "(use 'rm -rf' if you really want to remove it including all of its "
-#~ "history)"
-#~ msgstr ""
-#~ "mô-đun-con “%s” (hoặc cái nằm trong các mô-đun-con) dùng thư mục .git\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 ""
 #~ "'%s' has changes staged in the index\n"
 #~ "(use --cached to keep the file, or -f to force removal)"
@@ -12788,9 +15421,6 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ msgid "Not removing %s\n"
 #~ msgstr "Không xóa %s\n"
 
-#~ msgid "Could not read index"
-#~ msgstr "Không thể đọc bảng mục lục"
-
 #~ msgid "git remote set-head <name> (-a | -d | <branch>])"
 #~ msgstr "git remote set-head <tên> (-a | -d | <nhánh>])"
 
@@ -12857,6 +15487,3 @@ msgstr "Url Mô-đun-con đồng bộ hóa cho “$displaypath”"
 #~ 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 a6b06f9d3999706d648b78f9bdb40696de2670d6..c38326c6f106f65b6abd9ab7ff47f12c6dd0b432 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-03-16 00:16+0800\n"
-"PO-Revision-Date: 2016-03-16 00:18+0800\n"
+"POT-Creation-Date: 2016-11-25 22:50+0800\n"
+"PO-Revision-Date: 2016-11-25 22: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"
@@ -150,7 +150,32 @@ 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."
@@ -158,3313 +183,4398 @@ msgstr ""
 "请在工作区改正文件,然后酌情使用 'git add/rm <文件>' 命令标记\n"
 "解决方案并提交。"
 
-#: advice.c:101 builtin/merge.c:1226
+#: 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>...]"
+"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"
+"您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以通过另"
+"外\n"
+"的检出分支操作丢弃在这个状态下所做的任何提交。\n"
+"\n"
+"如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在检出命令添加\n"
+"参数 -b 来实现(现在或稍后)。例如:\n"
+"\n"
+"  git checkout -b <new-branch-name>\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:1232
-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 和 --3say 不能同时使用。"
 
-#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2547
-#: builtin/blame.c:2548 builtin/config.c:60 builtin/fast-export.c:987
-#: builtin/fast-export.c:989 builtin/grep.c:720 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 "在标准错误上报告归档文件"
+#: 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,但在第 %2$d 行得到 %1$s"
 
-#: archive.c:451 builtin/archive.c:90 builtin/clone.c:78
-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 - 第 %d 行处应为 /dev/null"
 
-#: 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 attributes 中被忽略\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"
-"\"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] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
+msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 
-#: branch.c:67
+#: apply.c:1589
 #, c-format
-msgid "Not setting branch %s as its own upstream."
-msgstr "未设置分支 %s 作为它自己的上游。"
+msgid "git diff header lacks filename information (line %d)"
+msgstr "git diff 的头信息中缺乏文件名信息(第 %d 行)"
 
-#: 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。"
+#: 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 "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$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 "分支 %s 设置为使用变基来跟踪本地分支 %s。"
+msgid "corrupt patch at line %d"
+msgstr "补丁在第 %d 行损坏"
 
-#: branch.c:99
+#: apply.c:1832
 #, c-format
-msgid "Branch %s set up to track local branch %s."
-msgstr "分支 %s 设置为跟踪本地分支 %s。"
+msgid "new file %s depends on old contents"
+msgstr "新文件 %s 依赖旧内容"
 
-#: branch.c:104
+#: apply.c:1834
 #, c-format
-msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr "å\88\86æ\94¯ %s è®¾ç½®ä¸ºä½¿ç\94¨å\8f\98å\9fºæ\9d¥è·\9f踪è¿\9cç¨\8bå¼\95ç\94¨ %sã\80\82"
+msgid "deleted file %s still has contents"
+msgstr "å\88 é\99¤ç\9a\84æ\96\87件 %s ä»\8dæ\9c\89å\86\85容"
 
-#: 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 "分支 %s 设置为使用变基来跟踪本地引用 %s。"
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "二进制补丁在第 %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 "未跟踪:引用 %s 有歧义"
+msgid "patch with only garbage at line %d"
+msgstr "补丁文件的第 %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 "ä¸\80个å\88\86æ\94¯å\90\8d '%s' å·²ç»\8få­\98å\9c¨ã\80\82"
+msgid "unable to open or read %s"
+msgstr "ä¸\8dè\83½æ\89\93å¼\80æ\88\96读å\8f\96 %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 行)"
 
-#: branch.c:220
+#: apply.c:3062
 #, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr "请求的上游分支 '%s' 不存在"
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
 
-#: 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."
+"while searching for:\n"
+"%.*s"
 msgstr ""
-"\n"
-"如果您正计划基于远程一个现存的上游分支开始你的工作,\n"
-"您可能需要执行 \"git fetch\" 来获取分支。\n"
-"\n"
-"如果您正计划推送一个能与对应远程分支建立跟踪的新的本地分支,\n"
-"您可能需要使用 \"git push -u\" 推送分支并配置和上游的关联。"
+"当查询:\n"
+"%.*s"
 
-#: branch.c:266
+#: apply.c:3090
 #, c-format
-msgid "Not a valid object name: '%s'."
-msgstr "不是一个有效的对象名:'%s'。"
+msgid "missing binary patch data for '%s'"
+msgstr "缺失 '%s' 的二进制补丁数据"
 
-#: branch.c:286
+#: apply.c:3098
 #, c-format
-msgid "Ambiguous object name: '%s'."
-msgstr "歧义的对象名:'%s'。"
+msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
+msgstr "不能反向应用一个没有至 '%s' 的反向数据块的二进制补丁"
 
-#: branch.c:291
+#: apply.c:3144
 #, c-format
-msgid "Not a valid branch point: '%s'."
-msgstr "无效的分支点:'%s'。"
+msgid "cannot apply binary patch to '%s' without full index line"
+msgstr "不能在 '%s' 上应用没有完整索引行的二进制补丁"
 
-#: branch.c:344
+#: 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),但是和当前内容不匹配。"
 
-#: bundle.c:34
+#: apply.c:3162
 #, c-format
-msgid "'%s' does not look like a v2 bundle file"
-msgstr "'%s' 不像是一个 v2 版本的包文件"
+msgid "the patch applies to an empty '%s' but it is not empty"
+msgstr "补丁应用到空文件 '%s',但是它并不空"
 
-#: bundle.c:61
+#: apply.c:3180
 #, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84å\8c\85头ï¼\9a%s%s (%d)"
+msgid "the necessary postimage %s for '%s' cannot be read"
+msgstr "æ\97 æ³\95读å\8f\96 '%2$s' å¿\85é¡»ç\9a\84ç\9b®æ \87æ\96\87件 %1$s"
 
-#: bundle.c:87 builtin/commit.c:766
+#: apply.c:3193
 #, 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:1074
-#: builtin/blame.c:2754 builtin/commit.c:1045 builtin/log.c:334
-#: builtin/log.c:852 builtin/log.c:1467 builtin/log.c:1700 builtin/merge.c:358
-#: builtin/shortlog.c:170
-msgid "revision walk setup failed"
-msgstr "版本遍历设置失败"
+msgid "binary patch does not apply to '%s'"
+msgstr "二进制补丁未应用到 '%s'"
 
-#: bundle.c:185
+#: apply.c:3199
 #, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "这个包中含有这个引用:"
-msgstr[1] "这个包中含有 %d 个引用:"
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
 
-#: bundle.c:192
-msgid "The bundle records a complete history."
-msgstr "这个包记录一个完整历史。"
+#: apply.c:3220
+#, c-format
+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] "这个包需要这个引用:"
-msgstr[1] "这个包需要 %d 个引用:"
+msgid "cannot checkout %s"
+msgstr "不能检出 %s"
 
-#: bundle.c:253
-msgid "Could not spawn pack-objects"
-msgstr "不能生成 pack-objects 进程"
+#: 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:157 builtin/log.c:1372 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:449
-msgid "Refusing to create empty bundle."
-msgstr "ä¸\8dè\83½å\88\9b建空å\8c\85。"
+#: apply.c:3554
+msgid "repository lacks the necessary blob to fall back on 3-way merge."
+msgstr "ä»\93åº\93缺ä¹\8få¿\85è¦\81ç\9a\84æ\95°æ\8d®å¯¹è±¡ä»¥è¿\9bè¡\8cä¸\89æ\96¹å\90\88并。"
 
-#: bundle.c:459
+#: apply.c:3557
 #, c-format
-msgid "cannot create '%s'"
-msgstr "不能创建 '%s'"
+msgid "Falling back to three-way merge...\n"
+msgstr "回落到三方合并...\n"
 
-#: bundle.c:480
-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 "æ\97 æ\95\88ç\9a\84é¢\9cè\89²å\80¼ï¼\9a%.*s"
+msgid "Failed to fall back on three-way merge...\n"
+msgstr "æ\97 æ³\95å\9b\9eè\90½å\88°ä¸\89æ\96¹å\90\88并...\n"
 
-#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1505
-#: builtin/am.c:2135
+#: apply.c:3603
 #, c-format
-msgid "could not parse %s"
-msgstr "不能解析 %s"
+msgid "Applied patch to '%s' with conflicts.\n"
+msgstr "应用补丁到 '%s' 存在冲突。\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 "%2$s %3$s 出错于第 %1$d 行"
+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 "%3$s %4$s 中配置变量 '%2$s' 的数字取值 '%1$s' 设置错误: %5$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 "配置变量 '%2$s' 的数字取值 '%1$s' 设置错误: %3$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:758 config.c:769
+#: 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:891
+#: apply.c:3940
 #, c-format
-msgid "invalid mode for object creation: %s"
-msgstr "无效的对象创建模式:%s"
-
-#: config.c:1220
-msgid "unable to parse command-line config"
-msgstr "无法解析命令行中的配置"
-
-#: config.c:1281
-msgid "unknown error occured while reading the configuration files"
-msgstr "在读取配置文件时遇到未知错误"
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
 
-#: config.c:1629
+#: apply.c:3945
 #, c-format
-msgid "unable to parse '%s' from command-line config"
-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)不匹配"
 
-#: config.c:1631
+#: apply.c:3965
 #, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr "å\9c¨æ\96\87件 '%2$s' ç\9a\84第 %3$d è¡\8cå\8f\91ç\8e°é\94\99误ç\9a\84é\85\8dç½®å\8f\98é\87\8f '%1$s'"
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "å\8f\97å½±å\93\8dç\9a\84æ\96\87件 '%s' ä½\8däº\8e符å\8f·é\93¾æ\8e¥ä¸­"
 
-#: 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:2226
+#: apply.c:3984
 #, c-format
-msgid "Could not set '%s' to '%s'"
-msgstr "不能设置 '%s' 为 '%s'"
-
-#: connected.c:69
-msgid "Could not run 'git rev-list'"
-msgstr "不能执行 'git rev-list'"
+msgid "Checking patch %s..."
+msgstr "检查补丁 %s..."
 
-#: connected.c:89
+#: apply.c:4075
 #, c-format
-msgid "failed write to rev-list: %s"
-msgstr "无法写入 rev-list:%s"
+msgid "sha1 information is lacking or useless for submodule %s"
+msgstr "子模组 %s 的 sha1 信息缺失或无效"
 
-#: connected.c:97
+#: apply.c:4082
 #, c-format
-msgid "failed to close rev-list's stdin: %s"
-msgstr "无法关闭 rev-list 的标准输入:%s"
-
-#: date.c:95
-msgid "in the future"
-msgstr "在将来"
+msgid "mode change for %s, which is not in current HEAD"
+msgstr "%s 的属性改变,但它不再当前 HEAD 中"
 
-#: date.c:101
+#: apply.c:4085
 #, c-format
-msgid "%lu second ago"
-msgid_plural "%lu seconds ago"
-msgstr[0] "%lu 秒钟前"
-msgstr[1] "%lu 秒钟前"
+msgid "sha1 information is lacking or useless (%s)."
+msgstr "sha1 信息缺失或无效(%s)。"
 
-#: date.c:108
+#: apply.c:4090 builtin/checkout.c:233 builtin/reset.c:135
 #, c-format
-msgid "%lu minute ago"
-msgid_plural "%lu minutes ago"
-msgstr[0] "%lu 分钟前"
-msgstr[1] "%lu 分钟前"
+msgid "make_cache_entry failed for path '%s'"
+msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
 
-#: date.c:115
+#: apply.c:4094
 #, c-format
-msgid "%lu hour ago"
-msgid_plural "%lu hours ago"
-msgstr[0] "%lu 小时前"
-msgstr[1] "%lu 小时前"
+msgid "could not add %s to temporary index"
+msgstr "不能在临时索引中添加 %s"
 
-#: date.c:122
+#: apply.c:4104
 #, c-format
-msgid "%lu day ago"
-msgid_plural "%lu days ago"
-msgstr[0] "%lu 天前"
-msgstr[1] "%lu 天前"
+msgid "could not write temporary index to %s"
+msgstr "不能把临时索引写入到 %s"
 
-#: date.c:128
+#: apply.c:4242
 #, c-format
-msgid "%lu week ago"
-msgid_plural "%lu weeks ago"
-msgstr[0] "%lu 周前"
-msgstr[1] "%lu 周前"
+msgid "unable to remove %s from index"
+msgstr "不能从索引中移除 %s"
 
-#: date.c:135
+#: apply.c:4277
 #, c-format
-msgid "%lu month ago"
-msgid_plural "%lu months ago"
-msgstr[0] "%lu 个月前"
-msgstr[1] "%lu 个月前"
+msgid "corrupt patch for submodule %s"
+msgstr "子模组 %s 损坏的补丁"
 
-#: date.c:146
+#: apply.c:4283
 #, c-format
-msgid "%lu year"
-msgid_plural "%lu years"
-msgstr[0] "%lu 年"
-msgstr[1] "%lu 年"
+msgid "unable to stat newly created file '%s'"
+msgstr "不能枚举新建文件 '%s' 的状态"
 
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:149
+#: apply.c:4291
 #, c-format
-msgid "%s, %lu month ago"
-msgid_plural "%s, %lu months ago"
-msgstr[0] "%s %lu 个月前"
-msgstr[1] "%s %lu 个月前"
+msgid "unable to create backing store for newly created file %s"
+msgstr "不能为新建文件 %s 创建后端存储"
 
-#: date.c:154 date.c:159
+#: apply.c:4297 apply.c:4441
 #, c-format
-msgid "%lu year ago"
-msgid_plural "%lu years ago"
-msgstr[0] "%lu 年前"
-msgstr[1] "%lu 年前"
+msgid "unable to add cache entry for %s"
+msgstr "无法为 %s 添加缓存条目"
 
-#: diffcore-order.c:24
+#: apply.c:4338
 #, c-format
-msgid "failed to read orderfile '%s'"
-msgstr "无法读取排序文件 '%s'"
-
-#: diffcore-rename.c:536
-msgid "Performing inexact rename detection"
-msgstr "正在进行非精确的重命名检测"
+msgid "failed to write to '%s'"
+msgstr "无法写入 '%s'"
 
-#  译者:注意保持前导空格
-#: diff.c:115
+#: apply.c:4342
 #, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr "  无法解析 dirstat 截止(cut-off)百分比 '%s'\n"
+msgid "closing file '%s'"
+msgstr "关闭文件 '%s'"
 
-#  译者:注意保持前导空格
-#: diff.c:120
+#: apply.c:4412
 #, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr "  未知的 dirstat 参数 '%s'\n"
+msgid "unable to write file '%s' mode %o"
+msgstr "不能写文件 '%s' 权限 %o"
 
-#: diff.c:215
+#: apply.c:4510
 #, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr "配置变量 'diff.submodule' 未知的取值:'%s'"
+msgid "Applied patch %s cleanly."
+msgstr "成功应用补丁 %s。"
 
-#: diff.c:267
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-"发现配置变量 'diff.dirstat' 中的错误:\n"
-"%s"
+#: apply.c:4518
+msgid "internal error"
+msgstr "内部错误"
 
-#: diff.c:2997
+#: apply.c:4521
 #, c-format
-msgid "external diff died, stopping at %s"
-msgstr "外部 diff 退出,停止在 %s"
-
-#: diff.c:3393
-msgid "--follow requires exactly one pathspec"
-msgstr "--follow 参数后只跟一个 pathspec"
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "应用 %%s 个补丁,其中 %d 个被拒绝..."
+msgstr[1] "应用 %%s 个补丁,其中 %d 个被拒绝..."
 
-#: diff.c:3556
+#: apply.c:4532
 #, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-"无法解析 --dirstat/-X 选项的参数:\n"
-"%s"
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "截短 .rej 文件名为 %.*s.rej"
 
-#: diff.c:3570
+#: apply.c:4540 builtin/fetch.c:740 builtin/fetch.c:989
 #, c-format
-msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr "无法解析 --submodule 选项的参数:'%s'"
+msgid "cannot open %s"
+msgstr "不能打开 %s"
 
-#: dir.c:2004
-msgid "failed to get kernel name and information"
-msgstr "无法获得内核名称和信息"
+#: apply.c:4554
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "第 #%d 个片段成功应用。"
 
-#: dir.c:2123
-msgid "Untracked cache is disabled on this system or location."
-msgstr "缓存未跟踪文件在本系统或位置中被禁用。"
+#: apply.c:4558
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "拒绝第 #%d 个片段。"
 
-#: gpg-interface.c:166 gpg-interface.c:237
-msgid "could not run gpg."
-msgstr "不能执行 gpg。"
+#: apply.c:4668
+#, c-format
+msgid "Skipped patch '%s'."
+msgstr "略过补丁 '%s'。"
 
-#: gpg-interface.c:178
-msgid "gpg did not accept the data"
-msgstr "gpg 没有接受数据"
+#: apply.c:4676
+msgid "unrecognized input"
+msgstr "未能识别的输入"
 
-#: gpg-interface.c:189
-msgid "gpg failed to sign the data"
-msgstr "gpg 无法为数据签名"
+#: apply.c:4695
+msgid "unable to read index file"
+msgstr "无法读取索引文件"
 
-#: gpg-interface.c:222
+#: apply.c:4833
 #, c-format
-msgid "could not create temporary file '%s': %s"
-msgstr "不能创建临时文件 '%s':%s"
+msgid "can't open patch '%s': %s"
+msgstr "不能打开补丁 '%s':%s"
 
-#: gpg-interface.c:225
+#: apply.c:4858
 #, c-format
-msgid "failed writing detached signature to '%s': %s"
-msgstr "无法将分离式签名写入 '%s':%s"
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "抑制下仍有 %d 个空白字符误用"
+msgstr[1] "抑制下仍有 %d 个空白字符误用"
 
-#: grep.c:1718
+#: apply.c:4864 apply.c:4879
 #, c-format
-msgid "'%s': unable to read %s"
-msgstr "'%s':无法读取 %s"
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d 行有空白字符误用。"
+msgstr[1] "%d 行有空白字符误用。"
 
-#: grep.c:1735
+#: apply.c:4872
 #, c-format
-msgid "'%s': %s"
-msgstr "'%s':%s"
+msgid "%d line applied after fixing whitespace errors."
+msgid_plural "%d lines applied after fixing whitespace errors."
+msgstr[0] "修复空白错误后,应用了 %d 行。"
+msgstr[1] "修复空白错误后,应用了 %d 行。"
 
-#: grep.c:1746
-#, c-format
-msgid "'%s': short read %s"
-msgstr "'%s':读取不完整 %s"
+#: apply.c:4888 builtin/add.c:463 builtin/mv.c:286 builtin/rm.c:431
+msgid "Unable to write new index file"
+msgstr "无法写入新索引文件"
 
-#: help.c:205
-#, c-format
-msgid "available git commands in '%s'"
-msgstr "在 '%s' 下可用的 git 命令"
+#: 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 "路径"
 
-#: help.c:212
-msgid "git commands available from elsewhere on your $PATH"
-msgstr "在 $PATH 路径中的其他地方可用的 git 命令"
+#: apply.c:4920
+msgid "don't apply changes matching the given path"
+msgstr "不要应用与给出路径向匹配的变更"
 
-#: help.c:244
-msgid "These are common Git commands used in various situations:"
-msgstr "这些是各种场合常见的 Git 命令:"
+#: apply.c:4923
+msgid "apply changes matching the given path"
+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' 像是一个 git 命令,但却无法运行。\n"
-"可能是 git-%s 受损?"
+#: apply.c:4925 builtin/am.c:2286
+msgid "num"
+msgstr "数字"
 
-#: help.c:366
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr "唉呀,您的系统中未发现 Git 命令。"
+#: apply.c:4926
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
 
-#: 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 ""
-"警告:您运行一个不存在的 Git 命令 '%s'。继续执行假定您要要运行的\n"
-"是 '%s'"
+#: apply.c:4929
+msgid "ignore additions made by the patch"
+msgstr "忽略补丁中的添加的文件"
 
-#: help.c:393
-#, c-format
-msgid "in %0.1f seconds automatically..."
-msgstr "在 %0.1f 秒钟后自动运行..."
+#: apply.c:4931
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
 
-#: help.c:400
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。"
+#: apply.c:4935
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "以十进制数显示添加和删除的行数"
 
-#: help.c:404 help.c:464
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-"\n"
-"您指的是这个么?"
-msgstr[1] ""
-"\n"
-"您指的是这其中的某一个么?"
+#: apply.c:4937
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "不应用补丁,而是显示输入的概要"
 
-#: help.c:460
-#, c-format
-msgid "%s: %s - %s"
-msgstr "%s:%s - %s"
+#: apply.c:4939
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "不应用补丁,而是查看补丁是否可应用"
 
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr "无法读取缓存"
+#: apply.c:4941
+msgid "make sure the patch is applicable to the current index"
+msgstr "确认补丁可以应用到当前索引"
 
-#: merge.c:94 builtin/am.c:2008 builtin/am.c:2043 builtin/checkout.c:376
-#: builtin/checkout.c:587 builtin/clone.c:730
-msgid "unable to write new index file"
-msgstr "无法写新的索引文件"
+#: apply.c:4943
+msgid "apply a patch without touching the working tree"
+msgstr "应用补丁而不修改工作区"
 
-#: merge-recursive.c:189
-#, c-format
-msgid "(bad commit)\n"
-msgstr "(坏提交)\n"
+#: apply.c:4945
+msgid "accept a patch that touches outside the working area"
+msgstr "接受修改工作区之外文件的补丁"
 
-#: merge-recursive.c:209
-#, c-format
-msgid "addinfo_cache failed for path '%s'"
-msgstr "为路径 '%s' addinfo_cache 失败"
+#: apply.c:4947
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
 
-#: merge-recursive.c:270
-msgid "error building trees"
-msgstr "无法创建树"
+#: apply.c:4949
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "如果一个补丁不能应用则尝试三方合并"
 
-#: merge-recursive.c:689
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr "无法创建路径 '%s'%s"
+#: apply.c:4951
+msgid "build a temporary index based on embedded index information"
+msgstr "创建一个临时索引基于嵌入的索引信息"
 
-#: merge-recursive.c:700
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr "删除 %s 以便为子目录留出空间\n"
+#: apply.c:4954 builtin/checkout-index.c:169 builtin/ls-files.c:505
+msgid "paths are separated with NUL character"
+msgstr "路径以 NUL 字符分隔"
 
-#: merge-recursive.c:714 merge-recursive.c:735
-msgid ": perhaps a D/F conflict?"
-msgstr ":可能是一个目录/文件冲突?"
+#: apply.c:4956
+msgid "ensure at least <n> lines of context match"
+msgstr "确保至少匹配 <n> 行上下文"
 
-#: merge-recursive.c:725
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
+#: apply.c:4957 builtin/am.c:2265
+msgid "action"
+msgstr "动作"
 
-#: merge-recursive.c:765
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr "不能读取对象 %s '%s'"
+#: apply.c:4958
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "检查新增和修改的行中间的空白字符滥用"
 
-#: merge-recursive.c:767
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr "%s '%s' 应为数据对象"
+#: apply.c:4961 apply.c:4964
+msgid "ignore changes in whitespace when finding context"
+msgstr "查找上下文时忽略空白字符的变更"
 
-#: merge-recursive.c:790 builtin/clone.c:374
-#, c-format
-msgid "failed to open '%s'"
-msgstr "无法打开 '%s'"
+#: apply.c:4967
+msgid "apply the patch in reverse"
+msgstr "反向应用补丁"
 
-#: merge-recursive.c:798
-#, c-format
-msgid "failed to symlink '%s'"
-msgstr "无法创建符号链接 '%s'"
+#: apply.c:4969
+msgid "don't expect at least one line of context"
+msgstr "无需至少一行上下文"
 
-#: merge-recursive.c:801
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr "不知道如何处理 %06o %s '%s'"
+#: apply.c:4971
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
 
-#: merge-recursive.c:939
-msgid "Failed to execute internal merge"
-msgstr "无法执行内部合并"
+#: apply.c:4973
+msgid "allow overlapping hunks"
+msgstr "允许重叠的补丁片段"
 
-#: merge-recursive.c:943
-#, c-format
-msgid "Unable to add %s to database"
-msgstr "不能添加 %s 至对象库"
+#: 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 "冗长输出"
 
-#: merge-recursive.c:959
-msgid "unsupported object type in the tree"
-msgstr "å\9c¨æ \91中æ\9c\89ä¸\8dæ\94¯æ\8c\81ç\9a\84对象类å\9e\8b"
+#: apply.c:4976
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "å\85\81许ä¸\8d正确ç\9a\84æ\96\87件æ\9c«å°¾æ\8d¢è¡\8c符"
 
-#: 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 ""
-"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
-"的版本被保留。"
+#: apply.c:4979
+msgid "do not trust the line counts in the hunk headers"
+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."
-msgstr ""
-"冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
-"的版本保留于 %8$s 中。"
+#: apply.c:4981 builtin/am.c:2274
+msgid "root"
+msgstr "根目录"
 
-#: merge-recursive.c:1094
-msgid "rename"
-msgstr "重命名"
+#: apply.c:4982
+msgid "prepend <root> to all filenames"
+msgstr "为所有文件名前添加 <根目录>"
 
-#: merge-recursive.c:1094
-msgid "renamed"
-msgstr "重命名"
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<选项>] <树或提交> [<路径>...]"
 
-#: merge-recursive.c:1150
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
 
-#: merge-recursive.c:1172
-#, c-format
+#: archive.c:14
 msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
 msgstr ""
-"冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
-"\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
+"git archive --remote <仓库> [--exec <命令>] [<选项>] <树或提交> [<路径>...]"
 
-#: merge-recursive.c:1177
-msgid " (left unresolved)"
-msgstr "(留下未解决)"
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <仓库> [--exec <命令>] --list"
 
-#: merge-recursive.c:1231
+#: archive.c:344 builtin/add.c:152 builtin/add.c:442 builtin/rm.c:327
 #, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-"冲突(重命名/重命名):在 %3$s 中重命名 %1$s->%2$s,在 %6$s 中重命名 %4$s->"
-"%5$s"
+msgid "pathspec '%s' did not match any files"
+msgstr "路径规格 '%s' 未匹配任何文件"
 
-#: merge-recursive.c:1261
-#, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
+#: archive.c:429
+msgid "fmt"
+msgstr "格式"
 
-#: merge-recursive.c:1460
-#, 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"
+#: archive.c:429
+msgid "archive format"
+msgstr "归档格式"
 
-#: merge-recursive.c:1470
-#, c-format
-msgid "Adding merged %s"
-msgstr "添加合并后的 %s"
+#: archive.c:430 builtin/log.c:1429
+msgid "prefix"
+msgstr "前缀"
 
-#: merge-recursive.c:1475 merge-recursive.c:1677
-#, c-format
-msgid "Adding as %s instead"
-msgstr "而是以 %s 为名添加"
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "为归档中每个路径名加上前缀"
 
-#: merge-recursive.c:1526
-#, c-format
-msgid "cannot read object %s"
-msgstr "不能读取对象 %s"
+#: archive.c:432 builtin/archive.c:88 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 "文件"
 
-#: merge-recursive.c:1529
-#, c-format
-msgid "object %s is not a blob"
-msgstr "对象 %s 不是一个数据对象"
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "归档写入此文件"
 
-#: merge-recursive.c:1581
-msgid "modify"
-msgstr "修改"
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "读取工作区中的 .gitattributes"
 
-#: merge-recursive.c:1581
-msgid "modified"
-msgstr "修改"
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "在标准错误上报告归档文件"
 
-#: merge-recursive.c:1591
-msgid "content"
-msgstr "å\86\85容"
+#: archive.c:437
+msgid "store only"
+msgstr "å\8fªå­\98å\82¨"
 
-#: merge-recursive.c:1598
-msgid "add/add"
-msgstr "添加/添加"
+#: archive.c:438
+msgid "compress faster"
+msgstr "压缩速度更快"
 
-#: merge-recursive.c:1632
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr "略过 %s(已经做过相同合并)"
+#: archive.c:446
+msgid "compress better"
+msgstr "压缩效果更好"
 
-#: merge-recursive.c:1646
-#, c-format
-msgid "Auto-merging %s"
-msgstr "自动合并 %s"
-
-#: merge-recursive.c:1650 git-submodule.sh:1048
-msgid "submodule"
-msgstr "子模组"
-
-#: merge-recursive.c:1651
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "冲突(%s):合并冲突于 %s"
-
-#: merge-recursive.c:1737
-#, c-format
-msgid "Removing %s"
-msgstr "删除 %s"
-
-#: merge-recursive.c:1762
-msgid "file/directory"
-msgstr "文件/目录"
-
-#: merge-recursive.c:1768
-msgid "directory/file"
-msgstr "目录/文件"
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "列出支持的归档格式"
 
-#: merge-recursive.c:1773
-#, 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"
+#: 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 "仓库"
 
-#: merge-recursive.c:1783
-#, c-format
-msgid "Adding %s"
-msgstr "添加 %s"
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "从远程仓库(<仓库>)提取归档文件"
 
-#: merge-recursive.c:1800
-msgid "Fatal merge failure, shouldn't happen."
-msgstr "严重的合并错误,不应发生。"
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:485
+msgid "command"
+msgstr "命令"
 
-#: merge-recursive.c:1819
-msgid "Already up-to-date!"
-msgstr "已经是最新的!"
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "远程 git-upload-archive 命令的路径"
 
-#: merge-recursive.c:1828
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr "无法合并树 %s 和 %s"
+#: archive.c:461
+msgid "Unexpected option --remote"
+msgstr "未知参数 --remote"
 
-#: merge-recursive.c:1858
-#, c-format
-msgid "Unprocessed path??? %s"
-msgstr "未处理的路径??? %s"
+#: archive.c:463
+msgid "Option --exec can only be used together with --remote"
+msgstr "选项 --exec 只能和 --remote 同时使用"
 
-#: merge-recursive.c:1906
-msgid "Merging:"
-msgstr "合并:"
+#: archive.c:465
+msgid "Unexpected option --output"
+msgstr "未知参数 --output"
 
-#: merge-recursive.c:1919
+#: archive.c:487
 #, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] "发现 %u 个共同祖先:"
-msgstr[1] "发现 %u 个共同祖先:"
-
-#: merge-recursive.c:1956
-msgid "merge returned no commit"
-msgstr "合并未返回提交"
+msgid "Unknown archive format '%s'"
+msgstr "未知归档格式 '%s'"
 
-#: merge-recursive.c:2013
+#: archive.c:494
 #, c-format
-msgid "Could not parse object '%s'"
-msgstr "不能解析对象 '%s'"
-
-#: merge-recursive.c:2024 builtin/merge.c:646
-msgid "Unable to write index."
-msgstr "不能写入索引。"
-
-#: notes-utils.c:41
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "不能提交未初始化/未引用的注解树"
+msgid "Argument not supported for format '%s': -%d"
+msgstr "参数不支持此格式 '%s':-%d"
 
-#: notes-utils.c:100
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr "坏的 notes.rewriteMode 值:'%s'"
+#: attr.c:263
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"负值模版在 git attributes 中被忽略\n"
+"当字符串确实要以感叹号开始时,使用 '\\!'。"
 
-#: notes-utils.c:110
+#: bisect.c:441
 #, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr "拒绝向 %s(在 refs/notes/ 之外)写入注解"
+msgid "Could not open file '%s'"
+msgstr "不能打开文件 '%s'"
 
-#. TRANSLATORS: The first %s is the name of the
-#. environment variable, the second %s is its value
-#: notes-utils.c:137
+#: bisect.c:446
 #, c-format
-msgid "Bad %s value: '%s'"
-msgstr "坏的 %s 值:'%s'"
+msgid "Badly quoted content in file '%s': %s"
+msgstr "文件 '%s' 包含错误的引用格式:%s"
 
-#: object.c:242
+#: bisect.c:655
 #, c-format
-msgid "unable to parse object: %s"
-msgstr "不能解析对象:%s"
+msgid "We cannot bisect more!\n"
+msgstr "我们无法进行更多的二分查找!\n"
 
-#: parse-options.c:570
-msgid "..."
-msgstr "..."
-
-#: parse-options.c:588
+#: bisect.c:708
 #, c-format
-msgid "usage: %s"
-msgstr "用法:%s"
+msgid "Not a valid commit name %s"
+msgstr "不是一个有效的提交名 %s"
 
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation
-#: parse-options.c:592
+#: bisect.c:732
 #, c-format
-msgid "   or: %s"
-msgstr "  或:%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] 之间的 bug 已经被修复。\n"
 
-#  译者:为保证在输出中对齐,注意调整句中空格!
-#: parse-options.c:595
+#: bisect.c:737
 #, c-format
-msgid "    %s"
-msgstr "    %s"
-
-#: parse-options.c:629
-msgid "-NUM"
-msgstr "-数字"
+msgid ""
+"The merge base %s is new.\n"
+"The property has changed between %s and [%s].\n"
+msgstr ""
+"合并基线 %s 是新的。\n"
+"介于 %s 和 [%s] 之间的属性已经被修改。\n"
 
-#: parse-options-cb.c:108
+#: bisect.c:742
 #, c-format
-msgid "malformed object name '%s'"
-msgstr "非法的对象名 '%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"
 
-#: path.c:752
+#: bisect.c:750
 #, 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"
-msgstr "全局的 'literal' 路径规格设置和其它的全局路径规格设置不兼容"
-
-#: pathspec.c:177
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr "路径规格包含无效的神奇前缀"
+"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"
 
-#: pathspec.c:183
+#: bisect.c:763
 #, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "在路径规格 '%3$s' 中无效的神奇前缀 '%2$.*1$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:187
+#: bisect.c:798
 #, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr "路径规格 '%s' 的神奇前缀结尾少了一个 ')'"
+msgid "Bisecting: a merge base must be tested\n"
+msgstr "二分查找中:合并基线必须是经过测试的\n"
 
-#: pathspec.c:205
+#: bisect.c:849
 #, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr "路径规格 '%2$s' 中包含未实现的神奇前缀 '%1$c'"
+msgid "a %s revision is needed"
+msgstr "需要一个 %s 版本"
 
-#: pathspec.c:230
+#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr "%s:'literal' 和 'glob' 不兼容"
+msgid "could not create file '%s'"
+msgstr "不能创建文件 '%s'"
 
-#: pathspec.c:241
+#: bisect.c:917
 #, c-format
-msgid "%s: '%s' is outside repository"
-msgstr "%s:'%s' 在仓库之外"
+msgid "could not read file '%s'"
+msgstr "不能读取文件 '%s'"
 
-#: pathspec.c:291
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr "路径规格 '%s' 在子模组 '%.*s' 中"
+#: bisect.c:947
+msgid "reading bisect refs failed"
+msgstr "读取二分查找引用失败"
 
-#: pathspec.c:353
+#: bisect.c:967
 #, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr "%s:路径规格神奇前缀不被此命令支持:%s"
+msgid "%s was both %s and %s\n"
+msgstr "%s 同时为 %s 和 %s\n"
 
-#: pathspec.c:433
+#: bisect.c:975
 #, 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 '.' ?"
+"No testable commit found.\n"
+"Maybe you started with bad path parameters?\n"
 msgstr ""
-"没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
-"添加 ':/' 或 '.' ?"
-
-#: pretty.c:969
-msgid "unable to parse --pretty format"
-msgstr "不能解析 --pretty 格式"
+"没有发现可测试的提交。\n"
+"可能您在运行时使用了错误的路径参数?\n"
 
-#: progress.c:235
-msgid "done"
-msgstr "完成"
+#: bisect.c:994
+#, c-format
+msgid "(roughly %d step)"
+msgid_plural "(roughly %d steps)"
+msgstr[0] "(大概 %d 步)"
+msgstr[1] "(大概 %d 步)"
 
-#: read-cache.c:1281
+#. TRANSLATORS: the last %s will be replaced with
+#. "(roughly %d steps)" translation
+#: bisect.c:998
 #, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-"设置了 index.version,但是取值无效。\n"
-"使用版本 %i"
+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:1291
+#: branch.c:53
 #, c-format
 msgid ""
-"GIT_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 ""
-"设置了 GIT_INDEX_VERSION,但是取值无效。\n"
-"使用版本 %i"
+"\n"
+"在修复错误后,您可以尝试修改远程跟踪分支,通过执行命令\n"
+"\"git branch --set-upstream-to=%s%s%s\" 。"
 
-#: refs.c:543 builtin/merge.c:761 builtin/merge.c:872 builtin/merge.c:974
-#: builtin/merge.c:984
+#: branch.c:67
 #, c-format
-msgid "Could not open '%s' for writing"
-msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s' è¿\9bè¡\8cå\86\99å\85¥"
+msgid "Not setting branch %s as its own upstream."
+msgstr "æ\9cªè®¾ç½®å\88\86æ\94¯ %s ä½\9c为å®\83è\87ªå·±ç\9a\84ä¸\8a游ã\80\82"
 
-#: refs/files-backend.c:2374
+#: branch.c:93
 #, c-format
-msgid "could not delete reference %s: %s"
-msgstr "无法删除引用 %s:%s"
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr "分支 %1$s 设置为使用变基来跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: refs/files-backend.c:2377
+#: branch.c:94
 #, c-format
-msgid "could not delete references: %s"
-msgstr "无法删除引用:%s"
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "分支 %1$s 设置为跟踪来自 %3$s 的远程分支 %2$s。"
 
-#: refs/files-backend.c:2386
+#: branch.c:98
 #, c-format
-msgid "could not remove reference %s"
-msgstr "无法删除引用 %s"
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪本地分支 %s。"
 
-#: ref-filter.c:55
+#: branch.c:99
 #, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr "期望的格式:%%(color:<color>)"
+msgid "Branch %s set up to track local branch %s."
+msgstr "分支 %s 设置为跟踪本地分支 %s。"
 
-#: ref-filter.c:57
+#: branch.c:104
 #, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr "未能识别的颜色:%%(color:%s)"
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪远程引用 %s。"
 
-#: ref-filter.c:71
+#: branch.c:105
 #, c-format
-msgid "unrecognized format: %%(%s)"
-msgstr "未能识别的格式:%%(%s)"
+msgid "Branch %s set up to track remote ref %s."
+msgstr "分支 %s 设置为跟踪远程引用 %s。"
 
-#: ref-filter.c:77
+#: branch.c:109
 #, c-format
-msgid "%%(body) does not take arguments"
-msgstr "%%(body) 不带参数"
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr "分支 %s 设置为使用变基来跟踪本地引用 %s。"
 
-#: ref-filter.c:84
+#: branch.c:110
 #, c-format
-msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) 不带参数"
+msgid "Branch %s set up to track local ref %s."
+msgstr "分支 %s 设置为跟踪本地引用 %s。"
 
-#: ref-filter.c:101
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr "要为 contents:lines=%s 提供一个正数"
+#: branch.c:119
+msgid "Unable to write upstream branch configuration"
+msgstr "无法写入上游分支配置"
 
-#: ref-filter.c:103
+#: branch.c:156
 #, c-format
-msgid "unrecognized %%(contents) argument: %s"
-msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84 %%(contents) å\8f\82æ\95°ï¼\9a%s"
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "æ\9cªè·\9f踪ï¼\9aå¼\95ç\94¨ %s æ\9c\89æ­§ä¹\89"
 
-#: ref-filter.c:113
+#: branch.c:185
 #, c-format
-msgid "unrecognized %%(objectname) argument: %s"
-msgstr "未能识别的 %%(objectname) 参数:%s"
+msgid "'%s' is not a valid branch name."
+msgstr "'%s' 不是一个有效的分支名称。"
 
-#: ref-filter.c:135
+#: branch.c:190
 #, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr "期望的格式:%%(align:<width>,<position>)"
+msgid "A branch named '%s' already exists."
+msgstr "一个分支名 '%s' 已经存在。"
 
-#: ref-filter.c:147
-#, c-format
-msgid "unrecognized position:%s"
-msgstr "未能识别的位置:%s"
+#: branch.c:198
+msgid "Cannot force update the current branch."
+msgstr "无法强制更新当前分支。"
 
-#: ref-filter.c:151
+#: branch.c:218
 #, c-format
-msgid "unrecognized width:%s"
-msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84宽度ï¼\9a%s"
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr "æ\97 æ³\95设置è·\9f踪信æ\81¯ï¼\9bèµ·å§\8bç\82¹ '%s' ä¸\8dæ\98¯ä¸\80个å\88\86æ\94¯ã\80\82"
 
-#: ref-filter.c:157
+#: branch.c:220
 #, c-format
-msgid "unrecognized %%(align) argument: %s"
-msgstr "未能识别的 %%(align) 参数:%s"
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "请求的上游分支 '%s' 不存在"
 
-#: ref-filter.c:161
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr "元素 %%(align) 需要一个正数的宽度"
+#: 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:244
+#: branch.c:265
 #, c-format
-msgid "malformed field name: %.*s"
-msgstr "非法的字段名:%.*s"
+msgid "Not a valid object name: '%s'."
+msgstr "不是一个有效的对象名:'%s'。"
 
-#: ref-filter.c:270
+#: branch.c:285
 #, c-format
-msgid "unknown field name: %.*s"
-msgstr "æ\9cªç\9f¥ç\9a\84å­\97段å\90\8dï¼\9a%.*s"
+msgid "Ambiguous object name: '%s'."
+msgstr "æ­§ä¹\89ç\9a\84对象å\90\8dï¼\9a'%s'ã\80\82"
 
-#: ref-filter.c:372
+#: branch.c:290
 #, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr "æ ¼å¼\8fï¼\9a使ç\94¨äº\86 %%(end) å\85\83ç´ å\8d´æ²¡æ\9c\89å®\83ç\9a\84对åº\94å\85\83ç´ "
+msgid "Not a valid branch point: '%s'."
+msgstr "æ\97 æ\95\88ç\9a\84å\88\86æ\94¯ç\82¹ï¼\9a'%s'ã\80\82"
 
-#: ref-filter.c:424
+#: branch.c:344
 #, c-format
-msgid "malformed format string %s"
-msgstr "非法的格式化字符串 %s"
-
-#: ref-filter.c:878
-msgid ":strip= requires a positive integer argument"
-msgstr ":strip= 需要一个正整型参数"
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s' 已经检出到 '%s'"
 
-#: ref-filter.c:883
+#: branch.c:363
 #, c-format
-msgid "ref '%s' does not have %ld components to :strip"
-msgstr "å¼\95ç\94¨ '%s' æ\9cªæ\8f\90ä¾\9bç\94¨äº\8e :strip ç\9a\84 %ld ä¸ªç»\84件"
+msgid "HEAD of working tree %s is not updated"
+msgstr "å·¥ä½\9cå\8cº %s ç\9a\84 HEAD æ\8c\87å\90\91没æ\9c\89被æ\9b´æ\96°"
 
-#: ref-filter.c:1046
+#: bundle.c:34
 #, c-format
-msgid "unknown %.*s format %s"
-msgstr "未知的 %.*s 格式 %s"
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 不像是一个 v2 版本的包文件"
 
-#: ref-filter.c:1066 ref-filter.c:1097
+#: bundle.c:61
 #, c-format
-msgid "missing object %s for %s"
-msgstr "缺失 %2$s 的对象 %1$s"
+msgid "unrecognized header: %s%s (%d)"
+msgstr "未能识别的包头:%s%s (%d)"
 
-#: ref-filter.c:1069 ref-filter.c:1100
+#: bundle.c:87 sequencer.c:963 builtin/commit.c:777
 #, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr "parse_object_buffer 失败于 %2$s 的 %1$s"
+msgid "could not open '%s'"
+msgstr "不能打开 '%s'"
 
-#: ref-filter.c:1311
+#: 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 "版本遍历设置失败"
+
+#: bundle.c:185
 #, c-format
-msgid "malformed object at '%s'"
-msgstr "非法的对象于 '%s'"
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "这个包中含有这个引用:"
+msgstr[1] "这个包中含有 %d 个引用:"
 
-#: ref-filter.c:1373
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "这个包记录一个完整历史。"
+
+#: bundle.c:194
 #, c-format
-msgid "ignoring ref with broken name %s"
-msgstr "忽略带有错误名称 %s 的引用"
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "这个包需要这个引用:"
+msgstr[1] "这个包需要 %d 个引用:"
 
-#: ref-filter.c:1378
+#: 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 "ignoring broken ref %s"
-msgstr "忽ç\95¥æ\8d\9få\9d\8fç\9a\84å¼\95ç\94¨ %s"
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "å¼\95ç\94¨ '%s' è¢« rev-list é\80\89项æ\8e\92é\99¤"
 
-#: ref-filter.c:1651
+#: bundle.c:443 builtin/log.c:165 builtin/log.c:1572 builtin/shortlog.c:273
 #, 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 "index-pack 终止"
 
-#: remote.c:745
+#: color.c:290
 #, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr "不能同时获取 %s 和 %s 至 %s"
+msgid "invalid color value: %.*s"
+msgstr "无效的颜色值:%.*s"
 
-#: remote.c:749
+#: commit.c:40 builtin/am.c:421 builtin/am.c:457 builtin/am.c:1493
+#: builtin/am.c:2127
 #, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr "%s 通常跟踪 %s,而非 %s"
+msgid "could not parse %s"
+msgstr "不能解析 %s"
 
-#: remote.c:753
+#: 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:761
-msgid "Internal error"
-msgstr "内部错误"
+#: commit.c:1514
+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"
 
-#: remote.c:1677 remote.c:1720
-msgid "HEAD does not point to a branch"
-msgstr "HEAD 没有指向一个分支"
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "内存耗尽"
 
-#: remote.c:1686
+#: config.c:516
 #, c-format
-msgid "no such branch: '%s'"
-msgstr "没æ\9c\89æ­¤å\88\86æ\94¯ï¼\9a'%s'"
+msgid "bad config line %d in blob %s"
+msgstr "æ\95°æ\8d®å¯¹è±¡ %2$s ä¸­é\94\99误ç\9a\84é\85\8dç½®è¡\8c %1$d"
 
-#: remote.c:1689
+#: config.c:520
 #, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr "尚未给分支 '%s' 设置上游"
+msgid "bad config line %d in file %s"
+msgstr "文件 %2$s 中错误的配置行 %1$d"
 
-#: remote.c:1695
+#: config.c:524
 #, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
+msgid "bad config line %d in standard input"
+msgstr "标准输入中错误的配置行 %d"
 
-#: remote.c:1710
+#: config.c:528
 #, 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 "子模组数据对象 %2$s 中错误的配置行 %1$d"
 
-#: remote.c:1725
+#: config.c:532
 #, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr "å\88\86æ\94¯ '%s' æ²¡æ\9c\89设置è¦\81æ\8e¨é\80\81ç\9a\84è¿\9cç¨\8bæ\9c\8då\8a¡å\99¨"
+msgid "bad config line %d in command line %s"
+msgstr "å\91½ä»¤è¡\8c %2$s ä¸­é\94\99误ç\9a\84é\85\8dç½®è¡\8c %1$d"
 
-#: remote.c:1736
+#: config.c:536
 #, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr "å\90\91 '%s' æ\8e¨é\80\81å¼\95ç\94¨è§\84æ ¼æ\9cªå\8c\85å\90« '%s'"
+msgid "bad config line %d in %s"
+msgstr "å\9c¨ %2$s ä¸­é\94\99误ç\9a\84é\85\8dç½®è¡\8c %1$d"
 
-#: remote.c:1749
-msgid "push has no destination (push.default is 'nothing')"
-msgstr "推送无目标(push.default 是 'nothing')"
+#: config.c:655
+msgid "out of range"
+msgstr "超出范围"
 
-#: remote.c:1771
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr "æ\97 æ³\95解æ\9e\90 'simple' æ\8e¨é\80\81è\87³ä¸\80个å\8d\95ç\8b¬ç\9a\84ç\9b®æ \87"
+#: config.c:655
+msgid "invalid unit"
+msgstr "æ\97 æ\95\88ç\9a\84å\8d\95ä½\8d"
 
-#: remote.c:2073
+#: config.c:661
 #, c-format
-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"
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "配置变量 '%2$s' 的数字取值 '%1$s' 设置错误:%3$s"
 
-#: remote.c:2080
+#: config.c:666
 #, c-format
-msgid "Your branch is up-to-date with '%s'.\n"
-msgstr "æ\82¨ç\9a\84å\88\86æ\94¯ä¸\8eä¸\8a游å\88\86æ\94¯ '%s' ä¸\80è\87´ã\80\82\n"
+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"
 
-#: remote.c:2084
+#: config.c:669
 #, 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"
+msgid "bad numeric config value '%s' for '%s' in file %s: %s"
+msgstr "文件 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
 
-#: remote.c:2090
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
+#: config.c:672
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in standard input: %s"
+msgstr "标准输入中配置变量 '%2$s' 错误的取值 '%1$s':%3$s"
 
-#: remote.c:2093
+#: config.c:675
 #, 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"
+msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
+msgstr "子模组数据 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
 
-#  译者:注意保持前导空格
-#: remote.c:2101
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
+#: config.c:678
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
+msgstr "命令行 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
 
-#: remote.c:2104
+#: config.c:681
 #, 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 "在 %3$s 中配置变量 '%2$s' 错误的取值 '%1$s':%4$s"
 
-#  译者:注意保持前导空格
-#: remote.c:2114
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
+#: config.c:768
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "无法扩展 '%s' 中的用户目录"
 
-#: revision.c:2131
-msgid "your current branch appears to be broken"
-msgstr "您的当前分支好像被损坏"
+#: config.c:852 config.c:863
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "错误的 zlib 压缩级别 %d"
 
-#: revision.c:2134
+#: config.c:978
 #, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr "æ\82¨ç\9a\84å½\93å\89\8då\88\86æ\94¯ '%s' å°\9aæ\97 ä»»ä½\95æ\8f\90交"
+msgid "invalid mode for object creation: %s"
+msgstr "æ\97 æ\95\88ç\9a\84对象å\88\9b建模å¼\8fï¼\9a%s"
 
-#: revision.c:2328
-msgid "--first-parent is incompatible with --bisect"
-msgstr "--first-parent 与 --bisect 不兼容"
+#: config.c:1312
+msgid "unable to parse command-line config"
+msgstr "无法解析命令行中的配置"
 
-#: run-command.c:92
-msgid "open /dev/null failed"
-msgstr "不能打开 /dev/null"
+#: config.c:1362
+msgid "unknown error occurred while reading the configuration files"
+msgstr "在读取配置文件时遇到未知错误"
 
-#: run-command.c:94
+#: config.c:1716
 #, c-format
-msgid "dup2(%d,%d) failed"
-msgstr "不能调用 dup2(%d,%d)"
+msgid "unable to parse '%s' from command-line config"
+msgstr "无法解析命令行配置中的 '%s'"
 
-#: send-pack.c:295
-msgid "failed to sign the push certificate"
-msgstr "无法为推送证书签名"
+#: config.c:1718
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "在文件 '%2$s' 的第 %3$d 行发现错误的配置变量 '%1$s'"
 
-#: send-pack.c:404
-msgid "the receiving end does not support --signed push"
-msgstr "接收端不支持签名推送"
+#: config.c:1777
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s 有多个取值"
 
-#: send-pack.c:406
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr "未发送推送证书,因为接收端不支持签名推送"
+#: config.c:2311
+#, c-format
+msgid "could not set '%s' to '%s'"
+msgstr "不能设置 '%s' 为 '%s'"
 
-#: send-pack.c:418
-msgid "the receiving end does not support --atomic push"
-msgstr "接收端不支持原子推送"
+#: config.c:2313
+#, c-format
+msgid "could not unset '%s'"
+msgstr "不能取消设置 '%s'"
 
-#: 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"
-"命令标记修正后的文件"
+#: connect.c:49
+msgid "The remote end hung up upon initial contact"
+msgstr "远端在初始连接时即挂断"
 
-#: sequencer.c:177
+#: connect.c:51
 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'"
+"Could not read from remote repository.\n"
+"\n"
+"Please make sure you have the correct access rights\n"
+"and the repository exists."
 msgstr ""
-"冲突解决完毕后,用 'git add <路径>' 或 'git rm <路径>'\n"
-"对修正后的文件做标记,然后用 'git commit' 提交"
-
-#: sequencer.c:190 sequencer.c:833 sequencer.c:913
-#, c-format
-msgid "Could not write to %s"
-msgstr "不能写入 %s"
+"无法读取远程仓库。\n"
+"\n"
+"请确认您有正确的访问权限并且仓库存在。"
 
-#: sequencer.c:193
-#, c-format
-msgid "Error wrapping up %s"
-msgstr "错误收尾 %s"
+#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "检查连接中"
 
-#: sequencer.c:208
-msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "您的本地修改将被拣选操作覆盖。"
+#: connected.c:75
+msgid "Could not run 'git rev-list'"
+msgstr "不能执行 'git rev-list'"
 
-#: sequencer.c:210
-msgid "Your local changes would be overwritten by revert."
-msgstr "æ\82¨ç\9a\84æ\9c¬å\9c°ä¿®æ\94¹å°\86被è¿\98å\8e\9fæ\93\8dä½\9cè¦\86ç\9b\96ã\80\82"
+#: connected.c:95
+msgid "failed write to rev-list"
+msgstr "æ\97 æ³\95å\86\99å\85¥ rev-list"
 
-#: sequencer.c:213
-msgid "Commit your changes or stash them to proceed."
-msgstr "æ\8f\90交æ\82¨ç\9a\84ä¿®æ\94¹æ\88\96ä¿\9då­\98è¿\9b度å\90\8eå\86\8d继续ã\80\82"
+#: connected.c:102
+msgid "failed to close rev-list's stdin"
+msgstr "æ\97 æ³\95å\85³é\97­ rev-list ç\9a\84æ \87å\87\86è¾\93å\85¥"
 
-#. TRANSLATORS: %s will be "revert" or "cherry-pick"
-#: sequencer.c:300
+#: convert.c:201
 #, 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 ""
+"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"
+"在工作区中该文件仍保持原有的换行符。"
 
-#: sequencer.c:390
+#: convert.c:205
 #, c-format
-msgid "Could not parse commit %s\n"
-msgstr "不能解析提交 %s\n"
+msgid "CRLF would be replaced by LF in %s."
+msgstr "文件 %s 中的 CRLF 将被 LF 替换。"
 
-#: sequencer.c:395
+#: convert.c:211
 #, c-format
-msgid "Could not parse parent commit %s\n"
-msgstr "不能解析父提交 %s\n"
-
-#: sequencer.c:460
-msgid "Your index file is unmerged."
-msgstr "您的索引文件未完成合并。"
+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"
+"在工作区中该文件仍保持原有的换行符。"
 
-#: sequencer.c:479
+#: convert.c:215
 #, c-format
-msgid "Commit %s is a merge but no -m option was given."
-msgstr "æ\8f\90交 %s æ\98¯ä¸\80个å\90\88并æ\8f\90交ä½\86æ\9cªæ\8f\90ä¾\9b -m é\80\89项ã\80\82"
+msgid "LF would be replaced by CRLF in %s"
+msgstr "æ\96\87件 %s ä¸­ç\9a\84 LF å°\86被 CRLF æ\9b¿æ\8d¢"
 
-#: sequencer.c:487
-#, c-format
-msgid "Commit %s does not have parent %d"
-msgstr "提交 %s 没有父提交 %d"
+#: 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 "无法 %s 在一个 %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 "没æ\9c\89æ\8f\90交被解æ\9e\90ã\80\82"
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "æ­£å\9c¨è¿\9bè¡\8cé\9d\9e精确ç\9a\84é\87\8då\91½å\90\8dæ£\80æµ\8b"
 
-#: 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 "  无法解析 dirstat 截止(cut-off)百分比 '%s'\n"
 
-#: sequencer.c:752
+#  译者:注意保持前导空格
+#: diff.c:129
 #, c-format
-msgid "Unusable instruction sheet: %s"
-msgstr "无用的指令表单:%s"
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  未知的 dirstat 参数 '%s'\n"
 
-#: sequencer.c:782
+#: diff.c:283
 #, c-format
-msgid "Invalid key: %s"
-msgstr "无效键名:%s"
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "配置变量 'diff.submodule' 未知的取值:'%s'"
 
-#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52
+#: diff.c:346
 #, 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:3087
 #, c-format
-msgid "Malformed options sheet: %s"
-msgstr "非法的选项表单:%s"
+msgid "external diff died, stopping at %s"
+msgstr "外部 diff 退出,停止在 %s"
 
-#: sequencer.c:814
-msgid "a cherry-pick or revert is already in progress"
-msgstr "一个拣选或还原操作已在进行"
+#: diff.c:3412
+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 "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
+#: diff.c:3502
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 明确要求只跟一个路径规格"
 
-#: sequencer.c:819
+#: diff.c:3665
 #, 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:917
+#: diff.c:3679
 #, c-format
-msgid "Error wrapping up %s."
-msgstr "错误收尾 %s。"
-
-#: sequencer.c:854 sequencer.c:987
-msgid "no cherry-pick or revert in progress"
-msgstr "拣选或还原操作并未进行"
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "无法解析 --submodule 选项的参数:'%s'"
 
-#: sequencer.c:856
-msgid "cannot resolve HEAD"
-msgstr "不能解析 HEAD"
+#: diff.c:4700
+msgid "inexact rename detection was skipped due to too many files."
+msgstr "因为文件太多,略过不严格的重命名检查。"
 
-#: sequencer.c:858
-msgid "cannot abort from a branch yet to be born"
-msgstr "不能从尚未建立的分支终止"
+#: diff.c:4703
+msgid "only found copies from modified paths due to too many files."
+msgstr "因为文件太多,只在修改的路径中查找拷贝。"
 
-#: sequencer.c:878 builtin/apply.c:4287
+#: diff.c:4706
 #, c-format
-msgid "cannot open %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
-#, c-format
-msgid "cannot read %s: %s"
-msgstr "不能读取 %s:%s"
+#: dir.c:1866
+msgid "failed to get kernel name and information"
+msgstr "无法获得内核名称和信息"
 
-#: sequencer.c:882
-msgid "unexpected end of file"
-msgstr "意外的文件结束"
+#: dir.c:1985
+msgid "Untracked cache is disabled on this system or location."
+msgstr "缓存未跟踪文件在本系统或位置中被禁用。"
 
-#: sequencer.c:888
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
+#: fetch-pack.c:213
+msgid "git fetch-pack: expected shallow list"
+msgstr "git fetch-pack:应为 shallow 列表"
 
-#: sequencer.c:910
+#: 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 "Could not format %s."
-msgstr "不能格式化 %s。"
+msgid "git fetch-pack: expected ACK/NAK, got '%s'"
+msgstr "git fetch-pack:应为 ACK/NAK,却得到 '%s'"
+
+#: fetch-pack.c:295
+msgid "--stateless-rpc requires multi_ack_detailed"
+msgstr "--stateless-rpc 需要 multi_ack_detailed"
 
-#: sequencer.c:1055
+#: fetch-pack.c:381
 #, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr "%s:不能拣选一个%s"
+msgid "invalid shallow line: %s"
+msgstr "无效的 shallow 信息:%s"
 
-#: sequencer.c:1058
+#: fetch-pack.c:387
 #, c-format
-msgid "%s: bad revision"
-msgstr "%s:错误的版本"
+msgid "invalid unshallow line: %s"
+msgstr "无效的 unshallow 信息:%s"
 
-#: sequencer.c:1092
-msgid "Can't revert as initial commit"
-msgstr "不能作为初始提交还原"
+#: fetch-pack.c:389
+#, c-format
+msgid "object not found: %s"
+msgstr "对象未找到:%s"
 
-#: sequencer.c:1093
-msgid "Can't cherry-pick into empty head"
-msgstr "不能拣选到空分支"
+#: fetch-pack.c:392
+#, c-format
+msgid "error in object: %s"
+msgstr "对象中出错:%s"
 
-#: setup.c:246
+#: fetch-pack.c:394
 #, c-format
-msgid "failed to read %s"
-msgstr "æ\97 æ³\95读å\8f\96 %s"
+msgid "no shallow found: %s"
+msgstr "æ\9cªå\8f\91ç\8e° shallowï¼\9a%s"
 
-#: sha1_file.c:1080
-msgid "offset before end of packfile (broken .idx?)"
-msgstr "偏移量在包文件结束之前(损坏的 .idx?)"
+#: fetch-pack.c:397
+#, c-format
+msgid "expected shallow/unshallow, got %s"
+msgstr "应为 shallow/unshallow,却得到 %s"
 
-#: sha1_file.c:2459
+#: fetch-pack.c:436
 #, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr "å\81\8f移é\87\8få\9c¨ %s ç\9a\84å\8c\85ç´¢å¼\95å¼\80å§\8bä¹\8bå\89\8dï¼\88æ\8d\9få\9d\8fç\9a\84ç´¢å¼\95ï¼\9fï¼\89"
+msgid "got %s %d %s"
+msgstr "å¾\97å\88° %s %d %s"
 
-#: sha1_file.c:2463
+#: fetch-pack.c:450
 #, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr "偏移量越过了 %s 的包索引的结尾(被截断的索引?)"
+msgid "invalid commit %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"
-"命令关闭本消息通知。"
+#: fetch-pack.c:483
+msgid "giving up"
+msgstr "放弃"
 
-#: submodule.c:62 submodule.c:96
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr "无法修改未合并的 .gitmodules,先解决合并冲突"
+#: fetch-pack.c:493 progress.c:235
+msgid "done"
+msgstr "完成"
 
-#: submodule.c:66 submodule.c:100
+#: fetch-pack.c:505
 #, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr "无法在 .gitmodules 中找到 path=%s 的小节"
+msgid "got %s (%d) %s"
+msgstr "得到 %s (%d) %s"
 
-#: submodule.c:74
+#: fetch-pack.c:551
 #, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr "不能更新 .gitmodules 条目 %s"
+msgid "Marking %s as complete"
+msgstr "标记 %s 为完成"
 
-#: submodule.c:107
+#: fetch-pack.c:697
 #, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr "无法移除 %s 的 .gitmodules 条目"
+msgid "already have %s (%s)"
+msgstr "已经有 %s (%s)"
 
-#: submodule.c:118
-msgid "staging updated .gitmodules failed"
-msgstr "将更新后 .gitmodules 添加暂存区失败"
+#: fetch-pack.c:735
+msgid "fetch-pack: unable to fork off sideband demultiplexer"
+msgstr "fetch-pack:无法派生 sideband 多路输出"
 
-#: trailer.c:237
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr "执行 trailer 命令 '%s' 失败"
+#: fetch-pack.c:743
+msgid "protocol error: bad pack header"
+msgstr "协议错误:坏的包头"
 
-#: trailer.c:492 trailer.c:496 trailer.c:500 trailer.c:554 trailer.c:558
-#: trailer.c:562
+#: fetch-pack.c:799
 #, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr "键 '%2$s' 的未知取值 '%1$s'"
+msgid "fetch-pack: unable to fork off %s"
+msgstr "fetch-pack:无法派生进程 %s"
 
-#: trailer.c:544 trailer.c:549 builtin/remote.c:289
+#: fetch-pack.c:815
 #, c-format
-msgid "more than one %s"
-msgstr "多于一个 %s"
+msgid "%s failed"
+msgstr "%s 失败"
 
-#: trailer.c:582
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr "签名 '%.*s' 的键为空"
+#: fetch-pack.c:817
+msgid "error in sideband demultiplexer"
+msgstr "sideband 多路输出出错"
 
-#: trailer.c:702
-#, c-format
-msgid "could not read input file '%s'"
-msgstr "不能读取输入文件 '%s'"
+#: fetch-pack.c:844
+msgid "Server does not support shallow clients"
+msgstr "服务器不支持 shalllow 客户端"
 
-#: trailer.c:705
-msgid "could not read from stdin"
-msgstr "不能自标准输入读取"
+#: fetch-pack.c:848
+msgid "Server supports multi_ack_detailed"
+msgstr "服务器支持 multi_ack_detailed"
 
-#: trailer.c:857 builtin/am.c:42
-#, c-format
-msgid "could not stat %s"
-msgstr "不能获取 %s 的文件状态"
+#: fetch-pack.c:851
+msgid "Server supports no-done"
+msgstr "服务器支持 no-done"
 
-#: trailer.c:859
-#, c-format
-msgid "file %s is not a regular file"
-msgstr "文件 %s 不是一个正规文件"
+#: fetch-pack.c:857
+msgid "Server supports multi_ack"
+msgstr "服务器支持 multi_ack"
 
-#: trailer.c:861
-#, c-format
-msgid "file %s is not writable by user"
-msgstr "文件 %s 用户不可写"
+#: fetch-pack.c:861
+msgid "Server supports side-band-64k"
+msgstr "服务器支持 side-band-64k"
 
-#: trailer.c:873
-msgid "could not open temporary file"
-msgstr "不能打开临时文件"
+#: fetch-pack.c:865
+msgid "Server supports side-band"
+msgstr "服务器支持 side-band"
 
-#: trailer.c:912
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr "不能重命名临时文件为 %s"
+#: fetch-pack.c:869
+msgid "Server supports allow-tip-sha1-in-want"
+msgstr "服务器支持 allow-tip-sha1-in-want"
 
-#: transport-helper.c:1041
-#, c-format
-msgid "Could not read ref %s"
-msgstr "不能读取引用 %s"
+#: fetch-pack.c:873
+msgid "Server supports allow-reachable-sha1-in-want"
+msgstr "服务器支持 allow-reachable-sha1-in-want"
 
-#: unpack-trees.c:203
-msgid "Checking out files"
-msgstr "æ­£å\9c¨æ£\80å\87ºæ\96\87件"
+#: fetch-pack.c:883
+msgid "Server supports ofs-delta"
+msgstr "æ\9c\8då\8a¡å\99¨æ\94¯æ\8c\81 ofs-delta"
 
-#: urlmatch.c:120
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "无效的 URL 方案名称或丢失 '://' 后缀"
-
-#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#: fetch-pack.c:890
 #, c-format
-msgid "invalid %XX escape sequence"
-msgstr "æ\97 æ\95\88ç\9a\84 %XX è½¬ä¹\89åº\8få\88\97"
+msgid "Server version is %.*s"
+msgstr "æ\9c\8då\8a¡å\99¨ç\89\88æ\9c¬ %.*s"
 
-#: urlmatch.c:172
-msgid "missing host and scheme is not 'file:'"
-msgstr "缺失主机名且 URL 方案不是 'file:'"
+#: fetch-pack.c:896
+msgid "Server does not support --shallow-since"
+msgstr "服务器不支持 --shallow-since"
 
-#: urlmatch.c:189
-msgid "a 'file:' URL may not have a port number"
-msgstr "一个 'file:' URL 不应该包含端口号"
+#: fetch-pack.c:900
+msgid "Server does not support --shallow-exclude"
+msgstr "服务器不支持 --shallow-exclude"
 
-#: urlmatch.c:199
-msgid "invalid characters in host name"
-msgstr "主机名中包含无效的字符"
+#: fetch-pack.c:902
+msgid "Server does not support --deepen"
+msgstr "服务器不支持 --deepen"
 
-#: urlmatch.c:244 urlmatch.c:255
-msgid "invalid port number"
-msgstr "æ\97 æ\95\88ç\9a\84端å\8f£å\8f·"
+#: fetch-pack.c:913
+msgid "no common commits"
+msgstr "没æ\9c\89å\85±å\90\8cç\9a\84æ\8f\90交"
 
-#: urlmatch.c:322
-msgid "invalid '..' path segment"
-msgstr "无效的 '..' 路径片段"
+#: fetch-pack.c:925
+msgid "git fetch-pack: fetch failed."
+msgstr "git fetch-pack:获取失败。"
+
+#: fetch-pack.c:1087
+msgid "no matching remote head"
+msgstr "没有匹配的远程分支"
+
+#: gpg-interface.c:185
+msgid "gpg failed to sign the data"
+msgstr "gpg 无法为数据签名"
 
-#: wrapper.c:222 wrapper.c:381
+#: gpg-interface.c:215
+msgid "could not create temporary file"
+msgstr "不能创建临时文件"
+
+#: gpg-interface.c:217
 #, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr "无法打开 '%s' 进行读写"
+msgid "failed writing detached signature to '%s'"
+msgstr "无法将分离式签名写入 '%s'"
 
-#: wrapper.c:224 wrapper.c:383
+#: grep.c:1782
 #, c-format
-msgid "could not open '%s' for writing"
-msgstr "无法打开 '%s' 进行写入"
+msgid "'%s': unable to read %s"
+msgstr "'%s':无法读取 %s"
 
-#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/commit.c:1691
-#: builtin/merge.c:1075 builtin/pull.c:387
+#: grep.c:1799 builtin/clone.c:381 builtin/diff.c:84 builtin/rm.c:155
 #, c-format
-msgid "could not open '%s' for reading"
-msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s' è¿\9bè¡\8c读å\8f\96"
+msgid "failed to stat '%s'"
+msgstr "æ\97 æ³\95æ\9e\9a举 '%s' ç\8a¶æ\80\81"
 
-#: wrapper.c:611
+#: grep.c:1810
 #, c-format
-msgid "unable to access '%s': %s"
-msgstr "不能访问 '%s':%s"
+msgid "'%s': short read"
+msgstr "'%s':读取不完整"
 
-#: wrapper.c:632
+#: help.c:203
 #, c-format
-msgid "unable to access '%s'"
-msgstr "不能访问 '%s'"
+msgid "available git commands in '%s'"
+msgstr "在 '%s' 下可用的 git 命令"
 
-#: wrapper.c:640
-msgid "unable to get current working directory"
-msgstr "不能获取当前工作目录"
+#: help.c:210
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "在 $PATH 路径中的其他地方可用的 git 命令"
 
-#: wrapper.c:667
-#, c-format
-msgid "could not open %s for writing"
-msgstr "不能写入 %s"
+#: help.c:241
+msgid "These are common Git commands used in various situations:"
+msgstr "这些是各种场合常见的 Git 命令:"
 
-#: wrapper.c:678 builtin/am.c:410
+#: help.c:306
 #, c-format
-msgid "could not write to %s"
-msgstr "不能写入 %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' 像是一个 git 命令,但却无法运行。\n"
+"可能是 git-%s 受损?"
+
+#: help.c:361
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "唉呀,您的系统中未发现 Git 命令。"
 
-#: wrapper.c:684
+#: help.c:383
 #, c-format
-msgid "could not close %s"
-msgstr "不能关闭 %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'"
 
-#: wt-status.c:149
-msgid "Unmerged paths:"
-msgstr "未合并的路径:"
+#: help.c:388
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "在 %0.1f 秒钟后自动运行..."
 
-#  译者:注意保持前导空格
-#: wt-status.c:176 wt-status.c:203
+#: help.c:395
 #, c-format
-msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (使用 \"git reset %s <文件>...\" 以取消暂存)"
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。"
 
-#  译者:注意保持前导空格
-#: wt-status.c:178 wt-status.c:205
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (使用 \"git rm --cached <文件>...\" 以取消暂存)"
+#: 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"
+"您指的是这其中的某一个么?"
 
-#  译者:注意保持前导空格
-#: wt-status.c:182
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (使用 \"git add <文件>...\" 标记解决方案)"
+#: help.c:461
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s:%s - %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:184 wt-status.c:188
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (酌情使用 \"git add/rm <文件>...\" 标记解决方案)"
+#: 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 \"Your Name\"\n"
+"\n"
+"来设置您账号的缺省身份标识。\n"
+"如果仅在本仓库设置身份标识,则省略 --global 参数。\n"
 
-#  译者:注意保持前导空格
-#: wt-status.c:186
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (使用 \"git rm <文件>...\" 标记解决方案)"
+#: 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 进程在这个仓库中运行,例如:'git commit' 命令打\n"
+"开了一个编辑器。请确认所有进程都已经关闭然后重试。如果仍然报错,\n"
+"可能之前有一个 git 进程在这个仓库中异常退出:\n"
+"手动删除这个文件再继续。"
 
-#: wt-status.c:197 wt-status.c:880
-msgid "Changes to be committed:"
-msgstr "要提交的变更:"
+#: lockfile.c:160
+#, c-format
+msgid "Unable to create '%s.lock': %s"
+msgstr "不能创建 '%s.lock':%s"
 
-#: wt-status.c:215 wt-status.c:889
-msgid "Changes not staged for commit:"
-msgstr "尚未暂存以备提交的变更:"
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "无法读取缓存"
 
-#  译者:注意保持前导空格
-#: wt-status.c:219
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (使用 \"git add <文件>...\" 更新要提交的内容)"
+#: 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 "无法写新的索引文件"
 
-#  译者:注意保持前导空格
-#: wt-status.c:221
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (使用 \"git add/rm <文件>...\" 更新要提交的内容)"
+#: merge-recursive.c:209
+msgid "(bad commit)\n"
+msgstr "(坏提交)\n"
 
-#  译者:注意保持前导空格
-#: wt-status.c:222
-msgid ""
-"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr "  (使用 \"git checkout -- <文件>...\" 丢弃工作区的改动)"
+#: merge-recursive.c:231
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "为路径 '%s' addinfo_cache 失败"
 
-#  译者:注意保持前导空格
-#: wt-status.c:224
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (提交或丢弃子模组中未跟踪或修改的内容)"
+#: merge-recursive.c:301
+msgid "error building trees"
+msgstr "无法创建树"
 
-#  译者:注意保持前导空格
-#: wt-status.c:236
+#: merge-recursive.c:720
 #, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (使用 \"git %s <文件>...\" 以包含要提交的内容)"
+msgid "failed to create path '%s'%s"
+msgstr "无法创建路径 '%s'%s"
 
-#: wt-status.c:251
-msgid "both deleted:"
-msgstr "双方删除:"
+#: merge-recursive.c:731
+#, c-format
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "删除 %s 以便为子目录留出空间\n"
 
-#: wt-status.c:253
-msgid "added by us:"
-msgstr "由我们添加:"
+#: merge-recursive.c:745 merge-recursive.c:764
+msgid ": perhaps a D/F conflict?"
+msgstr ":可能是一个目录/文件冲突?"
 
-#: wt-status.c:255
-msgid "deleted by them:"
-msgstr "由他们删除:"
+#: merge-recursive.c:754
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
+msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: wt-status.c:257
-msgid "added by them:"
-msgstr "由他们添加:"
+#: merge-recursive.c:796 builtin/cat-file.c:34
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "不能读取对象 %s '%s'"
 
-#: wt-status.c:259
-msgid "deleted by us:"
-msgstr "由我们删除:"
+#: merge-recursive.c:798
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "%s '%s' 应为数据对象"
 
-#: wt-status.c:261
-msgid "both added:"
-msgstr "双方添加:"
+#: merge-recursive.c:822
+#, c-format
+msgid "failed to open '%s': %s"
+msgstr "无法打开 '%s':%s"
 
-#: wt-status.c:263
-msgid "both modified:"
-msgstr "双方修改:"
+#: merge-recursive.c:833
+#, c-format
+msgid "failed to symlink '%s': %s"
+msgstr "无法创建符号链接 '%s':%s"
 
-#: wt-status.c:265
+#: merge-recursive.c:838
 #, c-format
-msgid "bug: unhandled unmerged status %x"
-msgstr "bug:无法处理的未合并状态 %x"
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "不知道如何处理 %06o %s '%s'"
 
-#: wt-status.c:273
-msgid "new file:"
-msgstr "æ\96°æ\96\87件ï¼\9a"
+#: merge-recursive.c:978
+msgid "Failed to execute internal merge"
+msgstr "æ\97 æ³\95æ\89§è¡\8cå\86\85é\83¨å\90\88并"
 
-#: wt-status.c:275
-msgid "copied:"
-msgstr "拷贝:"
+#: merge-recursive.c:982
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "不能添加 %s 至对象库"
 
-#: wt-status.c:277
-msgid "deleted:"
-msgstr "删除:"
+#: merge-recursive.c:1081 merge-recursive.c:1095
+#, 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 中"
+"的版本被保留。"
 
-#: wt-status.c:279
-msgid "modified:"
-msgstr "修改:"
+#: merge-recursive.c:1087 merge-recursive.c:1100
+#, 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 中。"
 
-#: wt-status.c:281
-msgid "renamed:"
-msgstr "重命名"
+#: merge-recursive.c:1143
+msgid "rename"
+msgstr "重命名"
 
-#: wt-status.c:283
-msgid "typechange:"
-msgstr "类型变更:"
+#: merge-recursive.c:1143
+msgid "renamed"
+msgstr "重命名"
 
-#: wt-status.c:285
-msgid "unknown:"
-msgstr "未知:"
+#: merge-recursive.c:1200
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
 
-#: wt-status.c:287
-msgid "unmerged:"
-msgstr "未合并:"
+#: merge-recursive.c:1225
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
+"\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
 
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:369
-msgid "new commits, "
-msgstr "新提交, "
-
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:371
-msgid "modified content, "
-msgstr "修改的内容, "
-
-#  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
-#: wt-status.c:373
-msgid "untracked content, "
-msgstr "未跟踪的内容, "
+#: merge-recursive.c:1230
+msgid " (left unresolved)"
+msgstr "(留下未解决)"
 
-#: wt-status.c:390
+#: merge-recursive.c:1292
 #, c-format
-msgid "bug: unhandled diff status %c"
-msgstr "bug:无法处理的差异状态 %c"
-
-#: wt-status.c:754
-msgid "Submodules changed but not updated:"
-msgstr "子模组已修改但尚未更新:"
-
-#: wt-status.c:756
-msgid "Submodule changes to be committed:"
-msgstr "要提交的子模组变更:"
-
-#: wt-status.c:837
-msgid ""
-"Do not touch the line above.\n"
-"Everything below will be removed."
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
-"不要改动上面的一行。\n"
-"下面的所有内容均将被删除。"
+"冲突(重命名/重命名):在 %3$s 中重命名 %1$s->%2$s,在 %6$s 中重命名 %4$s->"
+"%5$s"
 
-#: wt-status.c:948
-msgid "You have unmerged paths."
-msgstr "您有尚未合并的路径。"
+#: merge-recursive.c:1325
+#, c-format
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "而是重命名 %s 至 %s,以及 %s 至 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:951
-msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (解决冲突并运行 \"git commit\")"
+#: merge-recursive.c:1531
+#, 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"
 
-#: wt-status.c:954
-msgid "All conflicts fixed but you are still merging."
-msgstr "所有冲突已解决但您仍处于合并中。"
+#: merge-recursive.c:1546
+#, c-format
+msgid "Adding merged %s"
+msgstr "添加合并后的 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:957
-msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (使用 \"git commit\" 结束合并)"
+#: merge-recursive.c:1553 merge-recursive.c:1766
+#, c-format
+msgid "Adding as %s instead"
+msgstr "而是以 %s 为名添加"
 
-#: wt-status.c:967
-msgid "You are in the middle of an am session."
-msgstr "您正处于 am 操作过程中。"
+#: merge-recursive.c:1610
+#, c-format
+msgid "cannot read object %s"
+msgstr "不能读取对象 %s"
 
-#: wt-status.c:970
-msgid "The current patch is empty."
-msgstr "当前的补丁为空。"
+#: merge-recursive.c:1613
+#, c-format
+msgid "object %s is not a blob"
+msgstr "对象 %s 不是一个数据对象"
 
-#  译者:注意保持前导空格
-#: wt-status.c:974
-msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (解决冲突,然后运行 \"git am --continue\")"
+#: merge-recursive.c:1666
+msgid "modify"
+msgstr "修改"
 
-#  译者:注意保持前导空格
-#: wt-status.c:976
-msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (使用 \"git am --skip\" 跳过此补丁)"
+#: merge-recursive.c:1666
+msgid "modified"
+msgstr "修改"
 
-#  译者:注意保持前导空格
-#: wt-status.c:978
-msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (使用 \"git am --abort\" 恢复原有分支)"
+#: merge-recursive.c:1676
+msgid "content"
+msgstr "内容"
 
-#: wt-status.c:1105
-msgid "No commands done."
-msgstr "没æ\9c\89å\91½ä»¤è¢«æ\89§è¡\8cã\80\82"
+#: merge-recursive.c:1683
+msgid "add/add"
+msgstr "æ·»å\8a /æ·»å\8a "
 
-#: wt-status.c:1108
+#: merge-recursive.c:1718
 #, c-format
-msgid "Last command done (%d command done):"
-msgid_plural "Last commands done (%d commands done):"
-msgstr[0] "最后一条命令已完成(%d 条命令被执行):"
-msgstr[1] "最后的命令已完成(%d 条命令被执行):"
+msgid "Skipped %s (merged same as existing)"
+msgstr "略过 %s(已经做过相同合并)"
 
-#: wt-status.c:1119
+#: merge-recursive.c:1732
 #, c-format
-msgid "  (see more in file %s)"
-msgstr "  (更多参见文件 %s)"
+msgid "Auto-merging %s"
+msgstr "自动合并 %s"
 
-#: wt-status.c:1124
-msgid "No commands remaining."
-msgstr "未剩下任何命令。"
+#: merge-recursive.c:1736 git-submodule.sh:924
+msgid "submodule"
+msgstr "子模组"
 
-#: wt-status.c:1127
+#: merge-recursive.c:1737
 #, 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 条命令):"
-
-#  译者:注意保持前导空格
-#: wt-status.c:1135
-msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (使用 \"git rebase --edit-todo\" 来查看和编辑)"
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "冲突(%s):合并冲突于 %s"
 
-#: wt-status.c:1148
+#: merge-recursive.c:1831
 #, c-format
-msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作。"
+msgid "Removing %s"
+msgstr "删除 %s"
 
-#: wt-status.c:1153
-msgid "You are currently rebasing."
-msgstr "æ\82¨å\9c¨æ\89§è¡\8cå\8f\98å\9fºæ\93\8dä½\9cã\80\82"
+#: merge-recursive.c:1857
+msgid "file/directory"
+msgstr "æ\96\87件/ç\9b®å½\95"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1167
-msgid "  (fix conflicts and then run \"git rebase --continue\")"
-msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
+#: merge-recursive.c:1863
+msgid "directory/file"
+msgstr "目录/文件"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1169
-msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
+#: merge-recursive.c:1868
+#, 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"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1171
-msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
+#: merge-recursive.c:1877
+#, c-format
+msgid "Adding %s"
+msgstr "添加 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1177
-msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
+#: merge-recursive.c:1914
+msgid "Already up-to-date!"
+msgstr "已经是最新的!"
 
-#: wt-status.c:1181
+#: merge-recursive.c:1923
 #, c-format
-msgid ""
-"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
-
-#: wt-status.c:1186
-msgid "You are currently splitting a commit during a rebase."
-msgstr "您在执行变基操作时拆分提交。"
+msgid "merging of trees %s and %s failed"
+msgstr "无法合并树 %s 和 %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1189
-msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
+#: merge-recursive.c:2006
+msgid "Merging:"
+msgstr "合并:"
 
-#: wt-status.c:1193
+#: merge-recursive.c:2019
 #, c-format
-msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
-msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "发现 %u 个共同祖先:"
+msgstr[1] "发现 %u 个共同祖先:"
 
-#: wt-status.c:1198
-msgid "You are currently editing a commit during a rebase."
-msgstr "您在执行变基操作时编辑提交。"
+#: merge-recursive.c:2058
+msgid "merge returned no commit"
+msgstr "合并未返回提交"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1201
-msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
+#: merge-recursive.c:2121
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "不能解析对象 '%s'"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1203
+#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788
+msgid "Unable to write index."
+msgstr "不能写入索引。"
+
+#: notes-merge.c:273
+#, c-format
 msgid ""
-"  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
+"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' 来提交/终止前一次合并。"
 
-#: wt-status.c:1213
+#: notes-merge.c:280
 #, c-format
-msgid "You are currently cherry-picking commit %s."
-msgstr "æ\82¨å\9c¨æ\89§è¡\8cæ\8b£é\80\89æ\8f\90交 %s ç\9a\84æ\93\8dä½\9c。"
+msgid "You have not concluded your notes merge (%s exists)."
+msgstr "æ\82¨å°\9aæ\9cªç»\93æ\9d\9f注é\87\8aå\90\88并ï¼\88å­\98å\9c¨ %sï¼\89。"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1218
-msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "不能提交未初始化/未引用的注解树"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1221
-msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "坏的 notes.rewriteMode 值:'%s'"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1223
-msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
-msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "拒绝向 %s(在 refs/notes/ 之外)写入注解"
 
-#: wt-status.c:1232
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
 #, c-format
-msgid "You are currently reverting commit %s."
-msgstr "您在执行反转提交 %s 的操作。"
+msgid "Bad %s value: '%s'"
+msgstr "坏的 %s 值:'%s'"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1237
-msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (解决冲突并运行 \"git revert --continue\")"
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "不能解析对象:%s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1240
-msgid "  (all conflicts fixed: run \"git revert --continue\")"
-msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
+#: parse-options.c:572
+msgid "..."
+msgstr "..."
 
-#  译者:注意保持前导空格
-#: wt-status.c:1242
-msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr "  (使用 \"git revert --abort\" 以取消反转提交操作)"
+#: parse-options.c:590
+#, c-format
+msgid "usage: %s"
+msgstr "用法:%s"
 
-#: wt-status.c:1253
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:594
 #, c-format
-msgid "You are currently bisecting, started from branch '%s'."
-msgstr "您在执行从分支 '%s' 开始的二分查找操作。"
+msgid "   or: %s"
+msgstr "  或:%s"
 
-#: wt-status.c:1257
-msgid "You are currently bisecting."
-msgstr "您在执行二分查找操作。"
+#  译者:为保证在输出中对齐,注意调整句中空格!
+#: parse-options.c:597
+#, c-format
+msgid "    %s"
+msgstr "    %s"
 
-#  译者:注意保持前导空格
-#: wt-status.c:1260
-msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
+#: parse-options.c:631
+msgid "-NUM"
+msgstr "-数字"
 
-#: wt-status.c:1438
-msgid "On branch "
-msgstr "位于分支 "
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "非法的对象名 '%s'"
 
-#: wt-status.c:1444
-msgid "interactive rebase in progress; onto "
-msgstr "交互式变基操作正在进行中;至 "
+#: path.c:826
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "不能设置 %s 为组可写"
 
-#: wt-status.c:1446
-msgid "rebase in progress; onto "
-msgstr "å\8f\98å\9fºæ\93\8dä½\9cæ­£å\9c¨è¿\9bè¡\8c中ï¼\9bè\87³ "
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "å\85¨å±\80ç\9a\84 'glob' å\92\8c 'noglob' è·¯å¾\84è§\84格设置ä¸\8då\85¼å®¹"
 
-#: wt-status.c:1451
-msgid "HEAD detached at "
-msgstr "头指针分离于 "
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr "全局的 'literal' 路径规格设置和其它的全局路径规格设置不兼容"
 
-#: wt-status.c:1453
-msgid "HEAD detached from "
-msgstr "头指针分离自 "
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "路径规格包含无效的神奇前缀"
 
-#: wt-status.c:1456
-msgid "Not currently on any branch."
-msgstr "当前不在任何分支上。"
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "在路径规格 '%3$s' 中无效的神奇前缀 '%2$.*1$s'"
 
-#: wt-status.c:1474
-msgid "Initial commit"
-msgstr "初始提交"
+#: pathspec.c:187
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "路径规格 '%s' 的神奇前缀结尾少了一个 ')'"
 
-#: wt-status.c:1488
-msgid "Untracked files"
-msgstr "未跟踪的文件"
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "路径规格 '%2$s' 中包含未实现的神奇前缀 '%1$c'"
 
-#: wt-status.c:1490
-msgid "Ignored files"
-msgstr "忽略的文件"
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s:'literal' 和 'glob' 不兼容"
 
-#: wt-status.c:1494
+#: pathspec.c:241
 #, 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' 也许能提高速度,\n"
-"但您需要小心不要忘了添加新文件(参见 'git help status')。"
+msgid "%s: '%s' is outside repository"
+msgstr "%s:'%s' 在仓库之外"
 
-#: wt-status.c:1500
+#: pathspec.c:291
 #, c-format
-msgid "Untracked files not listed%s"
-msgstr "未跟踪的文件没有列出%s"
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "路径规格 '%s' 在子模组 '%.*s' 中"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1502
-msgid " (use -u option to show untracked files)"
-msgstr "(使用 -u 参数显示未跟踪的文件)"
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s:路径规格神奇前缀不被此命令支持:%s"
 
-#: wt-status.c:1508
-msgid "No changes"
-msgstr "没有修改"
+#: pathspec.c:408
+msgid ""
+"empty strings as pathspecs will be made invalid in upcoming releases. please "
+"use . instead if you meant to match all paths"
+msgstr ""
+"在即将到来的版本,不能再使用空字符串作为路径表达式。如果要匹配所有路径,\n"
+"请代之以 ."
 
-#: wt-status.c:1513
+#: pathspec.c:440
 #, 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 "pathspec '%s' is beyond a symbolic link"
+msgstr "路径规格 '%s' 位于符号链接中"
+
+#: pathspec.c:449
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+"没有为 :(exclude) 模式提供要忽略的内容。也许您忘记了\n"
+"添加 ':/' 或 '.' ?"
+
+#: pretty.c:971
+msgid "unable to parse --pretty format"
+msgstr "不能解析 --pretty 格式"
 
-#: wt-status.c:1516
+#: read-cache.c:1315
 #, c-format
-msgid "no changes added to commit\n"
-msgstr "修改尚未加入提交\n"
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 index.version,但是取值无效。\n"
+"使用版本 %i"
 
-#: wt-status.c:1519
+#: read-cache.c:1325
 #, c-format
 msgid ""
-"nothing added to commit but untracked files present (use \"git add\" to "
-"track)\n"
-msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 GIT_INDEX_VERSION,但是取值无效。\n"
+"使用版本 %i"
 
-#: wt-status.c:1522
+#: refs.c:576 builtin/merge.c:840
 #, c-format
-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"
+msgid "Could not open '%s' for writing"
+msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s' è¿\9bè¡\8cå\86\99å\85¥"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1525
+#: refs/files-backend.c:2481
 #, c-format
-msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "æ\97 æ\96\87件è¦\81æ\8f\90交ï¼\88å\88\9b建/æ\8b·è´\9dæ\96\87件并使ç\94¨ \"git add\" å»ºç«\8bè·\9f踪ï¼\89\n"
+msgid "could not delete reference %s: %s"
+msgstr "æ\97 æ³\95å\88 é\99¤å¼\95ç\94¨ %sï¼\9a%s"
 
-#: wt-status.c:1528 wt-status.c:1533
+#: refs/files-backend.c:2484
 #, c-format
-msgid "nothing to commit\n"
-msgstr "æ\97 æ\96\87件è¦\81æ\8f\90交\n"
+msgid "could not delete references: %s"
+msgstr "æ\97 æ³\95å\88 é\99¤å¼\95ç\94¨ï¼\9a%s"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1531
+#: refs/files-backend.c:2493
 #, c-format
-msgid "nothing to commit (use -u to show untracked files)\n"
-msgstr "æ\97 æ\96\87件è¦\81æ\8f\90交ï¼\88使ç\94¨ -u æ\98¾ç¤ºæ\9cªè·\9f踪ç\9a\84æ\96\87件ï¼\89\n"
+msgid "could not remove reference %s"
+msgstr "æ\97 æ³\95å\88 é\99¤å¼\95ç\94¨ %s"
 
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1535
+#: ref-filter.c:55
 #, c-format
-msgid "nothing to commit, working directory clean\n"
-msgstr "æ\97 æ\96\87件è¦\81æ\8f\90交ï¼\8cå¹²å\87\80ç\9a\84å·¥ä½\9cå\8cº\n"
+msgid "expected format: %%(color:<color>)"
+msgstr "æ\9c\9fæ\9c\9bç\9a\84æ ¼å¼\8fï¼\9a%%(color:<color>)"
 
-#  译者:注意保持句尾空格
-#: wt-status.c:1642
-msgid "Initial commit on "
-msgstr "初始提交于 "
+#: ref-filter.c:57
+#, c-format
+msgid "unrecognized color: %%(color:%s)"
+msgstr "未能识别的颜色:%%(color:%s)"
 
-#: wt-status.c:1646
-msgid "HEAD (no branch)"
-msgstr "HEAD(非分支)"
+#: ref-filter.c:71
+#, c-format
+msgid "unrecognized format: %%(%s)"
+msgstr "未能识别的格式:%%(%s)"
 
-#: wt-status.c:1675
-msgid "gone"
-msgstr "丢失"
+#: ref-filter.c:77
+#, c-format
+msgid "%%(body) does not take arguments"
+msgstr "%%(body) 不带参数"
 
-#  译者:注意保持句尾空格
-#: wt-status.c:1677 wt-status.c:1685
-msgid "behind "
-msgstr "落后 "
+#: ref-filter.c:84
+#, c-format
+msgid "%%(subject) does not take arguments"
+msgstr "%%(subject) 不带参数"
 
-#: wt-status.c:1680 wt-status.c:1683
-msgid "ahead "
-msgstr "领先 "
+#: ref-filter.c:101
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "要为 contents:lines=%s 提供一个正数"
 
-#: compat/precompose_utf8.c:57 builtin/clone.c:413
+#: ref-filter.c:103
 #, c-format
-msgid "failed to unlink '%s'"
-msgstr "æ\97 æ³\95å\88 é\99¤ '%s'"
+msgid "unrecognized %%(contents) argument: %s"
+msgstr "æ\9cªè\83½è¯\86å\88«ç\9a\84 %%(contents) å\8f\82æ\95°ï¼\9a%s"
 
-#: builtin/add.c:22
-msgid "git add [<options>] [--] <pathspec>..."
-msgstr "git add [<选项>] [--] <路径规格>..."
+#: ref-filter.c:113
+#, c-format
+msgid "unrecognized %%(objectname) argument: %s"
+msgstr "未能识别的 %%(objectname) 参数:%s"
 
-#: builtin/add.c:65
+#: ref-filter.c:135
 #, c-format
-msgid "unexpected diff status %c"
-msgstr "æ\84\8få¤\96ç\9a\84å·®å¼\82ç\8a¶æ\80\81 %c"
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "æ\9c\9fæ\9c\9bç\9a\84æ ¼å¼\8fï¼\9a%%(align:<width>,<position>)"
 
-#: builtin/add.c:70 builtin/commit.c:278
-msgid "updating files failed"
-msgstr "更新文件失败"
+#: ref-filter.c:147
+#, c-format
+msgid "unrecognized position:%s"
+msgstr "未能识别的位置:%s"
 
-#: builtin/add.c:80
+#: ref-filter.c:151
 #, c-format
-msgid "remove '%s'\n"
-msgstr "删除 '%s'\n"
+msgid "unrecognized width:%s"
+msgstr "未能识别的宽度:%s"
 
-#: builtin/add.c:134
-msgid "Unstaged changes after refreshing the index:"
-msgstr "刷新索引之后尚未被暂存的变更:"
+#: ref-filter.c:157
+#, c-format
+msgid "unrecognized %%(align) argument: %s"
+msgstr "未能识别的 %%(align) 参数:%s"
 
-#: builtin/add.c:194 builtin/rev-parse.c:797
-msgid "Could not read the index"
-msgstr "不能读取索引"
+#: ref-filter.c:161
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "元素 %%(align) 需要一个正数的宽度"
 
-#: builtin/add.c:205
+#: ref-filter.c:244
 #, c-format
-msgid "Could not open '%s' for writing."
-msgstr "无法打开 '%s' 进行写入。"
+msgid "malformed field name: %.*s"
+msgstr "非法的字段名:%.*s"
 
-#: builtin/add.c:209
-msgid "Could not write patch"
-msgstr "不能生成补丁"
+#: ref-filter.c:270
+#, c-format
+msgid "unknown field name: %.*s"
+msgstr "未知的字段名:%.*s"
 
-#: builtin/add.c:212
-msgid "editing patch failed"
-msgstr "编辑补丁失败"
+#: ref-filter.c:372
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "格式:使用了 %%(end) 元素却没有它的对应元素"
 
-#: builtin/add.c:215
+#: ref-filter.c:424
 #, c-format
-msgid "Could not stat '%s'"
-msgstr "不能查看文件状态 '%s'"
+msgid "malformed format string %s"
+msgstr "非法的格式化字符串 %s"
 
-#: builtin/add.c:217
-msgid "Empty patch. Aborted."
-msgstr "空补丁。异常终止。"
+#: ref-filter.c:878
+msgid ":strip= requires a positive integer argument"
+msgstr ":strip= 需要一个正整型参数"
 
-#: builtin/add.c:222
+#: ref-filter.c:883
 #, c-format
-msgid "Could not apply '%s'"
-msgstr "不能应用 '%s'"
-
-#: builtin/add.c:232
-msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
+msgid "ref '%s' does not have %ld components to :strip"
+msgstr "引用 '%s' 未提供用于 :strip 的 %ld 个组件"
 
-#: builtin/add.c:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111
-#: builtin/prune-packed.c:55 builtin/pull.c:189 builtin/push.c:511
-#: builtin/remote.c:1330 builtin/rm.c:268 builtin/send-pack.c:162
-msgid "dry run"
-msgstr "演习"
+#: ref-filter.c:1046
+#, c-format
+msgid "unknown %.*s format %s"
+msgstr "未知的 %.*s 格式 %s"
 
-#: builtin/add.c:250 builtin/apply.c:4561 builtin/check-ignore.c:19
-#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
-#: builtin/log.c:1651 builtin/mv.c:110 builtin/read-tree.c:114
-msgid "be verbose"
-msgstr "冗长输出"
+#: ref-filter.c:1066 ref-filter.c:1097
+#, c-format
+msgid "missing object %s for %s"
+msgstr "缺失 %2$s 的对象 %1$s"
 
-#: builtin/add.c:252
-msgid "interactive picking"
-msgstr "交互式拣选"
+#: ref-filter.c:1069 ref-filter.c:1100
+#, c-format
+msgid "parse_object_buffer failed on %s for %s"
+msgstr "parse_object_buffer 失败于 %2$s 的 %1$s"
 
-#: builtin/add.c:253 builtin/checkout.c:1155 builtin/reset.c:286
-msgid "select hunks interactively"
-msgstr "交互式挑选数据块"
+#: ref-filter.c:1311
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "非法的对象于 '%s'"
 
-#: builtin/add.c:254
-msgid "edit current diff and apply"
-msgstr "编辑当前差异并应用"
+#: ref-filter.c:1373
+#, c-format
+msgid "ignoring ref with broken name %s"
+msgstr "忽略带有错误名称 %s 的引用"
 
-#: builtin/add.c:255
-msgid "allow adding otherwise ignored files"
-msgstr "允许添加忽略的文件"
+#: ref-filter.c:1378
+#, c-format
+msgid "ignoring broken ref %s"
+msgstr "忽略损坏的引用 %s"
 
-#: builtin/add.c:256
-msgid "update tracked files"
-msgstr "更新已跟踪的文件"
+#: ref-filter.c:1633
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "格式:缺少 %%(end) 元素"
 
-#: builtin/add.c:257
-msgid "record only the fact that the path will be added later"
-msgstr "只记录,该路径稍后再添加"
+#: ref-filter.c:1687
+#, c-format
+msgid "malformed object name %s"
+msgstr "非法的对象名 %s"
 
-#: builtin/add.c:258
-msgid "add changes from all tracked and untracked files"
-msgstr "添加所有改变的已跟踪文件和未跟踪文件"
+#: remote.c:746
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "不能同时获取 %s 和 %s 至 %s"
 
-#: builtin/add.c:261
-msgid "ignore paths removed in the working tree (same as --no-all)"
-msgstr "忽略工作区中移除的路径(和 --no-all 相同)"
+#: remote.c:750
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s 通常跟踪 %s,而非 %s"
 
-#: builtin/add.c:263
-msgid "don't add, only refresh the index"
-msgstr "不添加,只刷新索引"
+#: remote.c:754
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s 同时跟踪 %s 和 %s"
 
-#: builtin/add.c:264
-msgid "just skip files which cannot be added because of errors"
-msgstr "跳过因出错不能添加的文件"
+#: remote.c:762
+msgid "Internal error"
+msgstr "内部错误"
 
-#: builtin/add.c:265
-msgid "check if - even missing - files are ignored in dry run"
-msgstr "检查在演习模式下文件(即使不存在)是否被忽略"
+#: remote.c:1677 remote.c:1720
+msgid "HEAD does not point to a branch"
+msgstr "HEAD 没有指向一个分支"
 
-#: builtin/add.c:287
+#: remote.c:1686
 #, c-format
-msgid "Use -f if you really want to add them.\n"
-msgstr "使用 -f 参数如果您确实要添加它们。\n"
+msgid "no such branch: '%s'"
+msgstr "没有此分支:'%s'"
 
-#: builtin/add.c:294
-msgid "adding files failed"
-msgstr "添加文件失败"
+#: remote.c:1689
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "尚未给分支 '%s' 设置上游"
 
-#: builtin/add.c:330
-msgid "-A and -u are mutually incompatible"
-msgstr "-A 和 -u 选项互斥"
+#: remote.c:1695
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
 
-#: builtin/add.c:337
-msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
+#: remote.c:1710
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "推送目标 '%s' 至远程 '%s' 没有本地跟踪分支"
 
-#: builtin/add.c:352
+#: remote.c:1725
 #, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr "没有指定文件,也没有文件被添加。\n"
+msgid "branch '%s' has no remote for pushing"
+msgstr "分支 '%s' 没有设置要推送的远程服务器"
 
-#: builtin/add.c:353
+#: remote.c:1736
 #, c-format
-msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "也许您想要执行 'git add .'?\n"
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "向 '%s' 推送引用规格未包含 '%s'"
 
-#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914
-#: builtin/commit.c:337 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298
-#: builtin/submodule--helper.c:35
-msgid "index file corrupt"
-msgstr "索引文件损坏"
+#: remote.c:1749
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "推送无目标(push.default 是 'nothing')"
 
-#: builtin/add.c:439 builtin/apply.c:4659 builtin/mv.c:280 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr "无法写入新索引文件"
+#: remote.c:1771
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "无法解析 'simple' 推送至一个单独的目标"
 
-#: builtin/am.c:256 builtin/commit.c:738 builtin/merge.c:1078
+#: remote.c:2073
 #, c-format
-msgid "could not read '%s'"
-msgstr "不能读取 '%s'"
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "您的分支基于 '%s',但此上游分支已经不存在。\n"
 
-#: builtin/am.c:430
-msgid "could not parse author script"
-msgstr "不能解析作者脚本"
+#: remote.c:2077
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (使用 \"git branch --unset-upstream\" 来修复)\n"
 
-#: builtin/am.c:507
+#: remote.c:2080
 #, c-format
-msgid "'%s' was deleted by the applypatch-msg hook"
-msgstr "'%s' 被 applypatch-msg 钩子删除"
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "您的分支与上游分支 '%s' 一致。\n"
 
-#: builtin/am.c:548 builtin/notes.c:300
+#: remote.c:2084
 #, c-format
-msgid "Malformed input line: '%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"
+
+#: remote.c:2090
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (使用 \"git push\" 来发布您的本地提交)\n"
 
-#: builtin/am.c:585 builtin/notes.c:315
+#: remote.c:2093
 #, c-format
-msgid "Failed to copy notes from '%s' to '%s'"
-msgstr "从 '%s' 拷贝注解到 '%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"
 
-#: builtin/am.c:611
-msgid "fseek failed"
-msgstr "fseek 失败"
+#  译者:注意保持前导空格
+#: remote.c:2101
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (使用 \"git pull\" 来更新您的本地分支)\n"
 
-#: builtin/am.c:772 builtin/am.c:860
+#: remote.c:2104
 #, c-format
-msgid "could not open '%s' for reading: %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"
+
+#  译者:注意保持前导空格
+#: remote.c:2114
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr "  (使用 \"git pull\" 来合并远程分支)\n"
+
+#: revision.c:2158
+msgid "your current branch appears to be broken"
+msgstr "您的当前分支好像被损坏"
 
-#: builtin/am.c:779
+#: revision.c:2161
 #, c-format
-msgid "could not open '%s' for writing: %s"
-msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s' è¿\9bè¡\8cå\86\99å\85¥ï¼\9a%s"
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "æ\82¨ç\9a\84å½\93å\89\8då\88\86æ\94¯ '%s' å°\9aæ\97 ä»»ä½\95æ\8f\90交"
 
-#: builtin/am.c:788
+#: revision.c:2355
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent 与 --bisect 不兼容"
+
+#: run-command.c:106
+msgid "open /dev/null failed"
+msgstr "不能打开 /dev/null"
+
+#: run-command.c:108
 #, c-format
-msgid "could not parse patch '%s'"
-msgstr "无法解析补丁 '%s'"
+msgid "dup2(%d,%d) failed"
+msgstr "不能调用 dup2(%d,%d)"
 
-#: builtin/am.c:853
-msgid "Only one StGIT patch series can be applied at once"
-msgstr "一次只能有一个 StGIT 补丁队列被应用"
+#: send-pack.c:297
+msgid "failed to sign the push certificate"
+msgstr "无法为推送证书签名"
 
-#: builtin/am.c:901
-msgid "invalid timestamp"
-msgstr "æ\97 æ\95\88ç\9a\84æ\97¶é\97´æ\88³"
+#: send-pack.c:410
+msgid "the receiving end does not support --signed push"
+msgstr "æ\8e¥æ\94¶ç«¯ä¸\8dæ\94¯æ\8c\81ç­¾å\90\8dæ\8e¨é\80\81"
 
-#: builtin/am.c:904 builtin/am.c:912
-msgid "invalid Date line"
-msgstr "无效的日期行"
+#: send-pack.c:412
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr "未发送推送证书,因为接收端不支持签名推送"
 
-#: builtin/am.c:909
-msgid "invalid timezone offset"
-msgstr "æ\97 æ\95\88ç\9a\84æ\97¶å\8cºå\81\8f移å\80¼"
+#: send-pack.c:424
+msgid "the receiving end does not support --atomic push"
+msgstr "æ\8e¥æ\94¶ç«¯ä¸\8dæ\94¯æ\8c\81å\8e\9få­\90æ\8e¨é\80\81"
 
-#: builtin/am.c:996
-msgid "Patch format detection failed."
-msgstr "补丁格式检测失败。"
+#: send-pack.c:429
+msgid "the receiving end does not support push options"
+msgstr "接收端不支持推送选项"
+
+#: sequencer.c:171
+msgid "revert"
+msgstr "还原"
+
+#: sequencer.c:171
+msgid "cherry-pick"
+msgstr "拣选"
 
-#: builtin/am.c:1001 builtin/clone.c:378
+#: sequencer.c:228
+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:231
+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:244 sequencer.c:1209
 #, c-format
-msgid "failed to create directory '%s'"
-msgstr "无法创建目录 '%s'"
+msgid "could not lock '%s'"
+msgstr "不能锁定 '%s'"
 
-#: builtin/am.c:1005
-msgid "Failed to split patches."
-msgstr "无法拆分补丁。"
+#: sequencer.c:247 sequencer.c:1125 sequencer.c:1214
+#, c-format
+msgid "could not write to '%s'"
+msgstr "不能写入 '%s'"
 
-#: builtin/am.c:1137 builtin/commit.c:363
-msgid "unable to write index file"
-msgstr "无法写入索引文件"
+#: sequencer.c:251
+#, c-format
+msgid "could not write eol to '%s'"
+msgstr "不能将换行符写入 '%s'"
 
-#: builtin/am.c:1188
+#: sequencer.c:255 sequencer.c:1130 sequencer.c:1216
 #, c-format
-msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "当您解决这一问题,执行 \"%s --continue\"。"
+msgid "failed to finalize '%s'."
+msgstr "无法完成 '%s'。"
 
-#: builtin/am.c:1189
+#: sequencer.c:279 builtin/am.c:259 builtin/commit.c:749 builtin/merge.c:1032
 #, c-format
-msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr "如果您想要跳过这一补丁,则执行 \"%s --skip\"。"
+msgid "could not read '%s'"
+msgstr "不能读取 '%s'"
 
-#: builtin/am.c:1190
+#: sequencer.c:305
 #, c-format
-msgid "To restore the original branch and stop patching, run \"%s --abort\"."
-msgstr "若要复原至原始分支并停止补丁操作,执行 \"%s --abort\"。"
+msgid "your local changes would be overwritten by %s."
+msgstr "您的本地修改将被%s覆盖。"
 
-#: builtin/am.c:1328
-msgid "Patch is empty. Was it split wrong?"
-msgstr "补丁为空。是不是切分错误?"
+#: sequencer.c:309
+msgid "commit your changes or stash them to proceed."
+msgstr "提交您的修改或保存进度后再继续。"
 
-#: builtin/am.c:1402 builtin/log.c:1350
+#: sequencer.c:324
 #, c-format
-msgid "invalid ident line: %s"
-msgstr "包含无效的身份标识:%s"
+msgid "%s: fast-forward"
+msgstr "%s:快进"
 
-#: builtin/am.c:1429
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:399
 #, c-format
-msgid "unable to parse commit %s"
-msgstr "不能解析提交 %s"
+msgid "%s: Unable to write new index file"
+msgstr "%s:无法写入新索引文件"
 
-#: builtin/am.c:1631
-msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr "ä»\93åº\93缺ä¹\8få¿\85è¦\81ç\9a\84æ\95°æ\8d®å¯¹è±¡ä»¥è¿\9bè¡\8cä¸\89æ\96¹å\90\88并ã\80\82"
+#: sequencer.c:418
+msgid "could not resolve HEAD commit\n"
+msgstr "ä¸\8dè\83½è§£æ\9e\90 HEAD æ\8f\90交\n"
 
-#: builtin/am.c:1633
-msgid "Using index info to reconstruct a base tree..."
-msgstr "使ç\94¨ç´¢å¼\95æ\9d¥é\87\8d建ä¸\80个ï¼\88ä¸\89æ\96¹å\90\88并ç\9a\84ï¼\89å\9fºç¡\80ç\9b®å½\95æ \91..."
+#: sequencer.c:438
+msgid "unable to update cache tree\n"
+msgstr "ä¸\8dè\83½æ\9b´æ\96°ç¼\93å­\98\n"
 
-#: builtin/am.c:1652
+#: sequencer.c:483
+#, c-format
 msgid ""
-"Did you hand edit your patch?\n"
-"It does not apply to blobs recorded in its index."
+"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"
+"\n"
+"  git commit --amend %s\n"
+"\n"
+"如果这些变更要形成一个新提交,执行:\n"
+"\n"
+"  git commit %s\n"
+"\n"
+"无论哪种情况,当您完成提交,继续执行:\n"
+"\n"
+"  git rebase --continue\n"
 
-#: builtin/am.c:1658
-msgid "Falling back to patching base and 3-way merge..."
-msgstr "回落到基础版本上打补丁及进行三方合并..."
+#: sequencer.c:567
+#, c-format
+msgid "could not parse commit %s\n"
+msgstr "不能解析提交 %s\n"
 
-#: builtin/am.c:1673
-msgid "Failed to merge in the changes."
-msgstr "无法合并变更。"
+#: sequencer.c:572
+#, c-format
+msgid "could not parse parent commit %s\n"
+msgstr "不能解析父提交 %s\n"
 
-#: builtin/am.c:1697 builtin/merge.c:633
-msgid "git write-tree failed to write a tree"
-msgstr "git write-tree 无法写入一树对象"
+#: sequencer.c:656
+msgid "your index file is unmerged."
+msgstr "您的索引文件未完成合并。"
 
-#: builtin/am.c:1704
-msgid "applying to an empty history"
-msgstr "正应用到一个空历史上"
+#: sequencer.c:675
+#, c-format
+msgid "commit %s is a merge but no -m option was given."
+msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
 
-#: builtin/am.c:1717 builtin/commit.c:1755 builtin/merge.c:830
-#: builtin/merge.c:855
-msgid "failed to write commit object"
-msgstr "æ\97 æ³\95å\86\99æ\8f\90交对象"
+#: sequencer.c:683
+#, c-format
+msgid "commit %s does not have parent %d"
+msgstr "æ\8f\90交 %s æ²¡æ\9c\89第 %d ä¸ªç\88¶æ\8f\90交"
 
-#: builtin/am.c:1749 builtin/am.c:1753
+#: sequencer.c:687
 #, c-format
-msgid "cannot resume: %s does not exist."
-msgstr "æ\97 æ³\95继续ï¼\9a%s ä¸\8då­\98å\9c¨。"
+msgid "mainline was specified but commit %s is not a merge."
+msgstr "æ\8c\87å®\9aäº\86主线ï¼\8cä½\86æ\98¯æ\8f\90交 %s ä¸\8dæ\98¯ä¸\80个å\90\88并æ\8f\90交。"
 
-#: builtin/am.c:1769
-msgid "cannot be interactive without stdin connected to a terminal."
-msgstr "标准输入没有和终端关联,不能进行交互式操作。"
+#. TRANSLATORS: The first %s will be a "todo" command like
+#. "revert" or "pick", the second %s a SHA1.
+#: sequencer.c:700
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s:不能解析父提交 %s"
 
-#: builtin/am.c:1774
-msgid "Commit Body is:"
-msgstr "提交内容为:"
+#: sequencer.c:705
+#, c-format
+msgid "cannot get commit message for %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:1784
-msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
-msgstr "应用?是[y]/否[n]/编辑[e]/查看补丁[v]/应用所有[a]:"
+#: sequencer.c:797
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "不能还原 %s... %s"
 
-#: builtin/am.c:1834
+#: sequencer.c:798
 #, c-format
-msgid "Dirty index: cannot apply patches (dirty: %s)"
-msgstr "脏索引:不能应用补丁(脏文件:%s)"
+msgid "could not apply %s... %s"
+msgstr "不能应用 %s... %s"
 
-#: builtin/am.c:1869 builtin/am.c:1941
+#: sequencer.c:833
+msgid "empty commit set passed"
+msgstr "提供了空的提交集"
+
+#: sequencer.c:843
 #, c-format
-msgid "Applying: %.*s"
-msgstr "应用:%.*s"
+msgid "git %s: failed to read the index"
+msgstr "git %s:无法读取索引"
 
-#: builtin/am.c:1885
-msgid "No changes -- Patch already applied."
-msgstr "没有变更 —— 补丁已经应用过。"
+#: sequencer.c:850
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s:无法刷新索引"
 
-#: builtin/am.c:1893
+#: sequencer.c:944
 #, c-format
-msgid "Patch failed at %s %.*s"
-msgstr "打补丁失败于 %s %.*s"
+msgid "invalid line %d: %.*s"
+msgstr "无效行 %d:%.*s"
+
+#: sequencer.c:950
+msgid "no commits parsed."
+msgstr "没有解析提交。"
 
-#: builtin/am.c:1899
+#: sequencer.c:966
 #, c-format
-msgid "The copy of the patch that failed is found in: %s"
-msgstr "失败的补丁文件副本位于:%s"
+msgid "could not read '%s'."
+msgstr "不能读取 '%s'。"
 
-#: builtin/am.c:1944
-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"
-"您也许想要跳过这个补丁。"
+#: sequencer.c:972
+#, c-format
+msgid "unusable instruction sheet: '%s'"
+msgstr "无用的指令清单:'%s'"
 
-#: builtin/am.c:1951
-msgid ""
-"You still have unmerged paths in your index.\n"
-"Did you forget to use 'git add'?"
-msgstr ""
-"您的索引中仍有未合并的路径。\n"
-"您是否忘了执行 'git add'?"
+#: sequencer.c:983
+msgid "cannot cherry-pick during a revert."
+msgstr "不能在回退中执行拣选。"
 
-#: builtin/am.c:2059 builtin/am.c:2063 builtin/am.c:2075 builtin/reset.c:308
-#: builtin/reset.c:316
+#: sequencer.c:985
+msgid "cannot revert during a cherry-pick."
+msgstr "不能在拣选中执行回退。"
+
+#: sequencer.c:1028
 #, c-format
-msgid "Could not parse object '%s'."
-msgstr "不能解析对象 '%s'。"
+msgid "invalid key: %s"
+msgstr "无效键名:%s"
 
-#: builtin/am.c:2111
-msgid "failed to clean index"
-msgstr "无法清空索引"
+#: sequencer.c:1031
+#, c-format
+msgid "invalid value for %s: %s"
+msgstr "%s 的值无效:%s"
 
-#: builtin/am.c:2145
-msgid ""
-"You seem to have moved HEAD since the last 'am' failure.\n"
-"Not rewinding to ORIG_HEAD"
-msgstr "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
+#: sequencer.c:1063
+#, c-format
+msgid "malformed options sheet: '%s'"
+msgstr "非法的选项清单:'%s'"
+
+#: sequencer.c:1101
+msgid "a cherry-pick or revert is already in progress"
+msgstr "一个拣选或还原操作已在进行"
+
+#: sequencer.c:1102
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: builtin/am.c:2206
+#: sequencer.c:1106
 #, c-format
-msgid "Invalid value for --patch-format: %s"
-msgstr "无效的 --patch-format 值:%s"
+msgid "could not create sequencer directory '%s'"
+msgstr "不能创建序列目录 '%s'"
 
-#: builtin/am.c:2239
-msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
-msgstr "git am [<选项>] [(<mbox>|<Maildir>)...]"
+#: sequencer.c:1120
+msgid "could not lock HEAD"
+msgstr "不能锁定 HEAD"
 
-#: builtin/am.c:2240
-msgid "git am [<options>] (--continue | --skip | --abort)"
-msgstr "git am [<选项>] (--continue | --skip | --abort)"
+#: sequencer.c:1151 sequencer.c:1289
+msgid "no cherry-pick or revert in progress"
+msgstr "拣选或还原操作并未进行"
 
-#: builtin/am.c:2246
-msgid "run interactively"
-msgstr "以交äº\92å¼\8fæ\96¹å¼\8fè¿\90è¡\8c"
+#: sequencer.c:1153
+msgid "cannot resolve HEAD"
+msgstr "ä¸\8dè\83½è§£æ\9e\90 HEAD"
 
-#: builtin/am.c:2248
-msgid "historical option -- no-op"
-msgstr "老的参数 —— 无作用"
+#: sequencer.c:1155 sequencer.c:1189
+msgid "cannot abort from a branch yet to be born"
+msgstr "不能从尚未建立的分支终止"
 
-#: builtin/am.c:2250
-msgid "allow fall back on 3way merging if needed"
-msgstr "如果必要,允许使用三方合并。"
+#: sequencer.c:1175 builtin/grep.c:578
+#, c-format
+msgid "cannot open '%s'"
+msgstr "不能打开 '%s'"
 
-#: builtin/am.c:2251 builtin/init-db.c:474 builtin/prune-packed.c:57
-#: builtin/repack.c:171
-msgid "be quiet"
-msgstr "静默模式"
+#: sequencer.c:1177
+#, c-format
+msgid "cannot read '%s': %s"
+msgstr "不能读取 '%s':%s"
 
-#: builtin/am.c:2253
-msgid "add a Signed-off-by line to the commit message"
-msgstr "在提交说明中添加一个 Signed-off-by 签名"
+#: sequencer.c:1178
+msgid "unexpected end of file"
+msgstr "意外的文件结束"
 
-#: builtin/am.c:2256
-msgid "recode into utf8 (default)"
-msgstr "使用 utf8 字符集(默认)"
+#: sequencer.c:1184
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
 
-#: builtin/am.c:2258
-msgid "pass -k flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -k 参数"
+#: sequencer.c:1354
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s:不能拣选一个%s"
 
-#: builtin/am.c:2260
-msgid "pass -b flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -b 参数"
+#: sequencer.c:1358
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s:错误的版本"
 
-#: builtin/am.c:2262
-msgid "pass -m flag to git-mailinfo"
-msgstr "向 git-mailinfo 传递 -m 参数"
+#: sequencer.c:1391
+msgid "can't revert as initial commit"
+msgstr "不能作为初始提交回退"
 
-#: builtin/am.c:2264
-msgid "pass --keep-cr flag to git-mailsplit for mbox format"
-msgstr "针对 mbox 格式,向 git-mailsplit 传递 --keep-cr 参数"
+#: 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>...' 来指定本地不存在的路径。"
 
-#: builtin/am.c:2267
-msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
-msgstr "不向 git-mailsplit 传递 --keep-cr 参数,覆盖 am.keepcr 的设置"
+#: 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>...]'"
 
-#: builtin/am.c:2270
-msgid "strip everything before a scissors line"
-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 <command> [<revision>...] -- [<file>...]'"
 
-#: builtin/am.c:2271 builtin/apply.c:4544
-msgid "action"
-msgstr "动作"
+#: setup.c:468
+#, c-format
+msgid "Expected git repo version <= %d, found %d"
+msgstr "期望 git 仓库版本 <= %d,却得到 %d"
 
-#: 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:2290 builtin/am.c:2293
-#: builtin/am.c:2299
-msgid "pass it through git-apply"
-msgstr "传递给 git-apply"
+#: setup.c:476
+msgid "unknown repository extensions found:"
+msgstr "发现未知的仓库扩展:"
 
-#: builtin/am.c:2280 builtin/apply.c:4568
-msgid "root"
-msgstr "根目录"
+#: setup.c:762
+#, c-format
+msgid "Not a git repository (or any of the parent directories): %s"
+msgstr "不是一个 git 仓库(或者任何父目录):%s"
 
-#: builtin/am.c:2283 builtin/am.c:2286 builtin/apply.c:4506
-#: builtin/apply.c:4509 builtin/clone.c:86 builtin/fetch.c:95
-#: builtin/pull.c:171 builtin/submodule--helper.c:72
-#: builtin/submodule--helper.c:160 builtin/submodule--helper.c:163
-msgid "path"
-msgstr "路径"
+#: setup.c:764 setup.c:915 builtin/index-pack.c:1641
+msgid "Cannot come back to cwd"
+msgstr "无法返回当前工作目录"
 
-#: builtin/am.c:2289 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
-#: builtin/grep.c:704 builtin/merge.c:198 builtin/pull.c:131
-#: builtin/pull.c:185 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"
+#: setup.c:845
+msgid "Unable to read current working directory"
+msgstr "不能读取当前工作目录"
 
-#: builtin/am.c:2292 builtin/apply.c:4512
-msgid "num"
-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)。"
 
-#: builtin/am.c:2295 builtin/for-each-ref.c:37 builtin/replace.c:438
-#: builtin/tag.c:372
-msgid "format"
-msgstr "格式"
+#: setup.c:927
+#, c-format
+msgid "Cannot change to '%s/..'"
+msgstr "不能切换到 '%s/..'"
 
-#: builtin/am.c:2296
-msgid "format the patch(es) are in"
-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"
+"文件属主必须始终拥有读写权限。"
 
-#: builtin/am.c:2302
-msgid "override error message when patch failure occurs"
-msgstr "打补丁失败时显示的错误信息"
+#: sha1_file.c:473
+#, c-format
+msgid "path '%s' does not exist"
+msgstr "路径 '%s' 不存在"
 
-#: builtin/am.c:2304
-msgid "continue applying patches after resolving a conflict"
-msgstr "冲突解决后继续应用补丁"
+#: sha1_file.c:499
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "尚不支持将参考仓库 '%s' 作为一个链接检出。"
 
-#: builtin/am.c:2307
-msgid "synonyms for --continue"
-msgstr "和 --continue 同义"
+#: sha1_file.c:505
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "参考仓库 '%s' 不是一个本地仓库。"
 
-#: builtin/am.c:2310
-msgid "skip the current patch"
-msgstr "跳过当前补丁"
+#: sha1_file.c:511
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "参考仓库 '%s' 是一个浅克隆"
 
-#: builtin/am.c:2313
-msgid "restore the original branch and abort the patching operation."
-msgstr "恢复原始分支并终止打补丁操作。"
+#: sha1_file.c:519
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "参考仓库 '%s' 已被嫁接"
 
-#: builtin/am.c:2317
-msgid "lie about committer date"
-msgstr "å°\86ä½\9cè\80\85æ\97¥æ\9c\9fä½\9c为æ\8f\90交æ\97¥æ\9c\9f"
+#: sha1_file.c:1159
+msgid "offset before end of packfile (broken .idx?)"
+msgstr "å\81\8f移é\87\8få\9c¨å\8c\85æ\96\87件ç»\93æ\9d\9fä¹\8bå\89\8dï¼\88æ\8d\9få\9d\8fç\9a\84 .idxï¼\9fï¼\89"
 
-#: builtin/am.c:2319
-msgid "use current timestamp for author date"
-msgstr "用当前时间作为作者日期"
+#: sha1_file.c:2592
+#, c-format
+msgid "offset before start of pack index for %s (corrupt index?)"
+msgstr "偏移量在 %s 的包索引开始之前(损坏的索引?)"
 
-#: builtin/am.c:2321 builtin/commit.c:1593 builtin/merge.c:225
-#: builtin/pull.c:159 builtin/revert.c:92 builtin/tag.c:355
-msgid "key-id"
-msgstr "key-id"
+#: sha1_file.c:2596
+#, c-format
+msgid "offset beyond end of pack index for %s (truncated index?)"
+msgstr "偏移量越过了 %s 的包索引的结尾(被截断的索引?)"
 
-#: builtin/am.c:2322
-msgid "GPG-sign commits"
-msgstr "使用 GPG 签名提交"
+#: sha1_name.c:407
+#, c-format
+msgid "short SHA1 %s is ambiguous"
+msgstr "歧义的短 SHA1 %s"
 
-#: builtin/am.c:2325
-msgid "(internal use for git-rebase)"
-msgstr "(内部使用,用于 git-rebase)"
+#: sha1_name.c:418
+msgid "The candidates are:"
+msgstr "候选者有:"
 
-#: builtin/am.c:2340
+#: sha1_name.c:578
 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."
+"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 ""
-"参数 -b/--binary 已经很长时间不做任何实质操作了,并且将被移除。\n"
-"请不要再使用它了。"
+"Git 通常不会创建一个以40位十六进制字符命名的引用,因为当你提供40位\n"
+"十六进制字符时将被忽略。不过这些引用也可能被错误地创建。例如:\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"当 \"$br\" 空白时一个40位十六进制的引用将被创建。请检查这些引用,\n"
+"可能需要删除它们。用 \"git config advice.objectNameWarning false\"\n"
+"命令关闭本消息通知。"
 
-#: builtin/am.c:2347
-msgid "failed to read the index"
-msgstr "无法读取索引"
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr "无法修改未合并的 .gitmodules,先解决合并冲突"
 
-#: builtin/am.c:2362
+#: submodule.c:68 submodule.c:102
 #, c-format
-msgid "previous rebase directory %s still exists but mbox given."
-msgstr "之前的变基目录 %s 仍然存在,但却提供了 mbox。"
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "无法在 .gitmodules 中找到 path=%s 的小节"
+
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr "不能更新 .gitmodules 条目 %s"
+
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "无法移除 %s 的 .gitmodules 条目"
+
+#: submodule.c:120
+msgid "staging updated .gitmodules failed"
+msgstr "将更新后 .gitmodules 添加暂存区失败"
+
+#: submodule.c:158
+msgid "negative values not allowed for submodule.fetchJobs"
+msgstr "submodule.fetchJobs 不允许为负值"
+
+#: submodule-config.c:358
+#, c-format
+msgid "invalid value for %s"
+msgstr "%s 的值无效"
+
+#: trailer.c:238
+#, c-format
+msgid "running trailer command '%s' failed"
+msgstr "执行 trailer 命令 '%s' 失败"
+
+#: 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 "键 '%2$s' 的未知取值 '%1$s'"
+
+#: trailer.c:523 trailer.c:528 builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "多于一个 %s"
+
+#: trailer.c:672
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "签名 '%.*s' 的键为空"
+
+#: trailer.c:695
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "不能读取输入文件 '%s'"
+
+#: trailer.c:698
+msgid "could not read from stdin"
+msgstr "不能自标准输入读取"
+
+#: trailer.c:929 builtin/am.c:44
+#, c-format
+msgid "could not stat %s"
+msgstr "不能获取 %s 的文件状态"
+
+#: trailer.c:931
+#, c-format
+msgid "file %s is not a regular file"
+msgstr "文件 %s 不是一个正规文件"
+
+#: trailer.c:933
+#, c-format
+msgid "file %s is not writable by user"
+msgstr "文件 %s 用户不可写"
+
+#: trailer.c:945
+msgid "could not open temporary file"
+msgstr "不能打开临时文件"
+
+#: trailer.c:983
+#, 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 "传输:无效的深度选项 '%s'"
+
+#: transport.c:817
+#, c-format
+msgid ""
+"The following submodule paths contain changes that can\n"
+"not be found on any remote:\n"
+msgstr "下列子模组路径所包含的修改在任何远程源中都找不到:\n"
+
+#: transport.c:821
+#, 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"
+
+#: transport.c:829
+msgid "Aborting."
+msgstr "正在终止。"
+
+#: transport-helper.c:1075
+#, 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: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
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by checkout:\n"
+"%%s"
+msgstr ""
+"您对下列文件的本地修改将被检出操作覆盖:\n"
+"%%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 ""
+"您对下列文件的本地修改将被合并操作覆盖:\n"
+"%%s请在合并前提交您的修改或者保存进度。"
+
+#: unpack-trees.c:71
+#, c-format
+msgid ""
+"Your local changes to the following files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"您对下列文件的本地修改将被合并操作覆盖:\n"
+"%%s"
+
+#: 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 之前提交您的修改或者保存进度。"
+
+#: 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"
+
+#: unpack-trees.c:81
+#, c-format
+msgid ""
+"Updating the following directories would lose untracked files in it:\n"
+"%s"
+msgstr ""
+"更新如下目录将会丢失其中未跟踪的文件:\n"
+"%s"
+
+#: 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请在切换分支之前移动或删除。"
+
+#: unpack-trees.c:87
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by checkout:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被删除:\n"
+"%%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请在合并前移动或删除。"
+
+#: unpack-trees.c:92
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by merge:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被删除:\n"
+"%%s"
+
+#: 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 前移动或删除。"
+
+#: unpack-trees.c:97
+#, c-format
+msgid ""
+"The following untracked working tree files would be removed by %s:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被删除:\n"
+"%%s"
+
+#: 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."
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
+"%%s请在切换分支前移动或删除。"
+
+#: unpack-trees.c:104
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by "
+"checkout:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为检出操作而被覆盖:\n"
+"%%s"
+
+#: 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请在合并前移动或删除。"
+
+#: unpack-trees.c:109
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by merge:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为合并操作而被覆盖:\n"
+"%%s"
+
+#: unpack-trees.c:112
+#, 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:114
+#, c-format
+msgid ""
+"The following untracked working tree files would be overwritten by %s:\n"
+"%%s"
+msgstr ""
+"工作区中下列未跟踪的文件将会因为 %s 操作而被覆盖:\n"
+"%%s"
+
+#: unpack-trees.c:121
+#, c-format
+msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
+msgstr "条目 '%s' 和 '%s' 重叠。无法合并。"
+
+#: unpack-trees.c:124
+#, c-format
+msgid ""
+"Cannot update sparse checkout: the following entries are not up-to-date:\n"
+"%s"
+msgstr ""
+"无法更新稀疏检出:如下条目不是最新:\n"
+"%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"
+
+#: unpack-trees.c:128
+#, c-format
+msgid ""
+"The following working tree files would be removed by sparse checkout "
+"update:\n"
+"%s"
+msgstr ""
+"工作区中下列文件将被稀疏检出更新所删除:\n"
+"%s"
+
+#: unpack-trees.c:205
+#, c-format
+msgid "Aborting\n"
+msgstr "终止中\n"
+
+#: unpack-trees.c:237
+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 "缺失主机名且 URL 方案不是 '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:1705 builtin/merge.c:1029
+#: 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:1172
+msgid "No commands done."
+msgstr "没有命令被执行。"
+
+#: wt-status.c:1175
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "最后一条命令已完成(%d 条命令被执行):"
+msgstr[1] "最后的命令已完成(%d 条命令被执行):"
+
+#: wt-status.c:1186
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (更多参见文件 %s)"
+
+#: wt-status.c:1191
+msgid "No commands remaining."
+msgstr "未剩下任何命令。"
+
+#: wt-status.c:1194
+#, 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 条命令):"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1202
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (使用 \"git rebase --edit-todo\" 来查看和编辑)"
+
+#: wt-status.c:1215
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作。"
+
+#: wt-status.c:1220
+msgid "You are currently rebasing."
+msgstr "您在执行变基操作。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1234
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (解决冲突,然后运行 \"git rebase --continue\")"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1236
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (使用 \"git rebase --skip\" 跳过此补丁)"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1238
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (使用 \"git rebase --abort\" 以检出原有分支)"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1244
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git rebase --continue\")"
+
+#: wt-status.c:1248
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时拆分提交。"
+
+#: wt-status.c:1253
+msgid "You are currently splitting a commit during a rebase."
+msgstr "您在执行变基操作时拆分提交。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1256
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (一旦您工作目录提交干净后,运行 \"git rebase --continue\")"
+
+#: wt-status.c:1260
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "您在执行将分支 '%s' 变基到 '%s' 的操作时编辑提交。"
+
+#: wt-status.c:1265
+msgid "You are currently editing a commit during a rebase."
+msgstr "您在执行变基操作时编辑提交。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1268
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (使用 \"git commit --amend\" 修补当前提交)"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1270
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
+
+#: wt-status.c:1280
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "您在执行拣选提交 %s 的操作。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1285
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (解决冲突并运行 \"git cherry-pick --continue\")"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1288
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git cherry-pick --continue\")"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1290
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (使用 \"git cherry-pick --abort\" 以取消拣选操作)"
+
+#: wt-status.c:1299
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "您在执行反转提交 %s 的操作。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1304
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (解决冲突并运行 \"git revert --continue\")"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1307
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr "  (所有冲突已解决:运行 \"git revert --continue\")"
+
+#  译者:注意保持前导空格
+#: 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 "You are currently bisecting, started from branch '%s'."
+msgstr "您在执行从分支 '%s' 开始的二分查找操作。"
+
+#: wt-status.c:1324
+msgid "You are currently bisecting."
+msgstr "您在执行二分查找操作。"
+
+#  译者:注意保持前导空格
+#: wt-status.c:1327
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (使用 \"git bisect reset\" 以回到原有分支)"
+
+#: wt-status.c:1524
+msgid "On branch "
+msgstr "位于分支 "
+
+#: wt-status.c:1530
+msgid "interactive rebase in progress; onto "
+msgstr "交互式变基操作正在进行中;至 "
+
+#: wt-status.c:1532
+msgid "rebase in progress; onto "
+msgstr "变基操作正在进行中;至 "
+
+#: wt-status.c:1537
+msgid "HEAD detached at "
+msgstr "头指针分离于 "
+
+#: wt-status.c:1539
+msgid "HEAD detached from "
+msgstr "头指针分离自 "
+
+#: wt-status.c:1542
+msgid "Not currently on any branch."
+msgstr "当前不在任何分支上。"
+
+#: wt-status.c:1560
+msgid "Initial commit"
+msgstr "初始提交"
+
+#: wt-status.c:1574
+msgid "Untracked files"
+msgstr "未跟踪的文件"
 
-#: builtin/am.c:2386
+#: wt-status.c:1576
+msgid "Ignored files"
+msgstr "忽略的文件"
+
+#: wt-status.c:1580
 #, 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 ""
-"发现了错误的 %s 目录。\n"
-"使ç\94¨ \"git am --abort\" å\88 é\99¤å®\83。"
+"耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能提高速度,\n"
+"ä½\86æ\82¨é\9c\80è¦\81å°\8få¿\83ä¸\8dè¦\81å¿\98äº\86æ·»å\8a æ\96°æ\96\87件ï¼\88å\8f\82è§\81 'git help status'ï¼\89。"
 
-#: builtin/am.c:2392
-msgid "Resolve operation not in progress, we are not resuming."
-msgstr "解决操作未进行,我们不会继续。"
+#: wt-status.c:1586
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "未跟踪的文件没有列出%s"
 
-#: builtin/apply.c:59
-msgid "git apply [<options>] [<patch>...]"
-msgstr "git apply [<选项>] [<补丁>...]"
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1588
+msgid " (use -u option to show untracked files)"
+msgstr "(使用 -u 参数显示未跟踪的文件)"
 
-#: builtin/apply.c:111
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr "未能识别的空白字符选项 '%s'"
+#: wt-status.c:1594
+msgid "No changes"
+msgstr "没有修改"
 
-#: builtin/apply.c:126
+#: wt-status.c:1599
 #, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr "未能识别的空白字符忽略选项 '%s'"
+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:818
+#: wt-status.c:1602
 #, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr "无法准备时间戳正则表达式 %s"
+msgid "no changes added to commit\n"
+msgstr "修改尚未加入提交\n"
 
-#: builtin/apply.c:827
+#: wt-status.c:1605
 #, c-format
-msgid "regexec returned %d for input: %s"
-msgstr "regexec 返回 %d,输入为:%s"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr "提交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
 
-#: builtin/apply.c:908
+#: wt-status.c:1608
 #, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr "不能在补丁的第 %d 行找到文件名"
+msgid "nothing added to commit but untracked files present\n"
+msgstr "提交为空,但是存在尚未跟踪的文件\n"
 
-#: builtin/apply.c:940
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1611
 #, 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 (create/copy files and use \"git add\" to track)\n"
+msgstr "无文件要提交(创建/拷贝文件并使用 \"git add\" 建立跟踪)\n"
 
-#: builtin/apply.c:944
+#: wt-status.c:1614 wt-status.c:1619
 #, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
+msgid "nothing to commit\n"
+msgstr "无文件要提交\n"
 
-#: builtin/apply.c:945
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1617
 #, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "无文件要提交(使用 -u 显示未跟踪的文件)\n"
 
-#: builtin/apply.c:952
+#  译者:中文字符串拼接,可删除前导空格
+#: wt-status.c:1621
 #, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null"
+msgid "nothing to commit, working tree clean\n"
+msgstr "无文件要提交,干净的工作区\n"
 
-#: builtin/apply.c:1415
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr "recount:意外的行:%.*s"
+#  译者:注意保持句尾空格
+#: wt-status.c:1728
+msgid "Initial commit on "
+msgstr "初始提交于 "
 
-#: builtin/apply.c:1472
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr "第 %d 行的补丁片段没有头信息:%.*s"
+#: wt-status.c:1732
+msgid "HEAD (no branch)"
+msgstr "HEAD(非分支)"
 
-#: builtin/apply.c:1489
-#, 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 行)"
+#: wt-status.c:1761
+msgid "gone"
+msgstr "丢失"
 
-#: builtin/apply.c:1655
-msgid "new file depends on old contents"
-msgstr "新文件依赖旧内容"
+#  译者:注意保持句尾空格
+#: wt-status.c:1763 wt-status.c:1771
+msgid "behind "
+msgstr "落后 "
 
-#: builtin/apply.c:1657
-msgid "deleted file still has contents"
-msgstr "删除的文件仍有内容"
+#: wt-status.c:1766 wt-status.c:1769
+msgid "ahead "
+msgstr "领先 "
 
-#: builtin/apply.c:1683
+#. TRANSLATORS: the action is e.g. "pull with rebase"
+#: wt-status.c:2270
 #, c-format
-msgid "corrupt patch at line %d"
-msgstr "补丁在第 %d 行损坏"
+msgid "cannot %s: You have unstaged changes."
+msgstr "不能%s:您有未暂存的变更。"
+
+#: wt-status.c:2276
+msgid "additionally, your index contains uncommitted changes."
+msgstr "而且您的索引中包含未提交的变更。"
 
-#: builtin/apply.c:1719
+#: wt-status.c:2278
 #, c-format
-msgid "new file %s depends on old contents"
-msgstr "新文件 %s 依赖旧内容"
+msgid "cannot %s: Your index contains uncommitted changes."
+msgstr "不能%s:您的索引中包含未提交的变更。"
 
-#: builtin/apply.c:1721
+#: compat/precompose_utf8.c:57 builtin/clone.c:414
 #, c-format
-msgid "deleted file %s still has contents"
-msgstr "删除的文件 %s 仍有内容"
+msgid "failed to unlink '%s'"
+msgstr "无法删除 '%s'"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<选项>] [--] <路径规格>..."
 
-#: builtin/apply.c:1724
+#: builtin/add.c:80
 #, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** 警告:文件 %s 成为空文件但并未删除"
+msgid "unexpected diff status %c"
+msgstr "意外的差异状态 %c"
+
+#: builtin/add.c:85 builtin/commit.c:291
+msgid "updating files failed"
+msgstr "更新文件失败"
 
-#: builtin/apply.c:1870
+#: builtin/add.c:95
 #, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr "二进制补丁在第 %d 行损坏:%.*s"
+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:840
+msgid "Could not read the index"
+msgstr "不能读取索引"
 
-#: builtin/apply.c:1899
+#: builtin/add.c:220
 #, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr "未能识别的二进制补丁位于第 %d 行"
+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/apply.c:2050
+#: builtin/add.c:230
 #, c-format
-msgid "patch with only garbage at line %d"
-msgstr "补丁文件的第 %d 行只有垃圾数据"
+msgid "Could not stat '%s'"
+msgstr "不能查看文件状态 '%s'"
+
+#: builtin/add.c:232
+msgid "Empty patch. Aborted."
+msgstr "空补丁。异常终止。"
 
-#: builtin/apply.c:2140
+#: builtin/add.c:237
 #, c-format
-msgid "unable to read symlink %s"
-msgstr "无法读取符号链接 %s"
+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: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/add.c:269
+msgid "interactive picking"
+msgstr "交互式拣选"
+
+#: builtin/add.c:270 builtin/checkout.c:1156 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:947
+msgid "(+/-)x"
+msgstr "(+/-)x"
 
-#: builtin/apply.c:2144
+#: builtin/add.c:283 builtin/update-index.c:948
+msgid "override the executable bit of the listed files"
+msgstr "覆盖列表里文件的可执行位"
+
+#: builtin/add.c:305
 #, c-format
-msgid "unable to open or read %s"
-msgstr "不能打开或读取 %s"
+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:2777
+#: builtin/add.c:359
 #, c-format
-msgid "invalid start of line: '%c'"
-msgstr "无效的行首字符:'%c'"
+msgid "--chmod param '%s' must be either -x or +x"
+msgstr "参数 --chmod 取值 '%s' 必须是 -x 或 +x"
 
-#: builtin/apply.c:2896
+#: builtin/add.c:374
 #, 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 "Nothing specified, nothing added.\n"
+msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/apply.c:2908
+#: builtin/add.c:375
 #, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "也许您想要执行 'git add .'?\n"
+
+#: 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/am.c:414
+msgid "could not parse author script"
+msgstr "不能解析作者脚本"
 
-#: builtin/apply.c:2914
+#: builtin/am.c:491
 #, 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:2934
+#: builtin/am.c:532
 #, c-format
-msgid "missing binary patch data for '%s'"
-msgstr "缺失 '%s' 的二进制补丁数据"
+msgid "Malformed input line: '%s'."
+msgstr "非法的输入行:'%s'。"
 
-#: builtin/apply.c:3035
+#: builtin/am.c:569
 #, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr "二进制补丁未应用到 '%s'"
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "从 '%s' 拷贝注解到 '%s' 时失败"
+
+#: builtin/am.c:595
+msgid "fseek failed"
+msgstr "fseek 失败"
 
-#: builtin/apply.c:3041
+#: builtin/am.c:775
 #, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
+msgid "could not parse patch '%s'"
+msgstr "无法解析补丁 '%s'"
+
+#: builtin/am.c:840
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "一次只能有一个 StGIT 补丁队列被应用"
+
+#: builtin/am.c:887
+msgid "invalid timestamp"
+msgstr "无效的时间戳"
+
+#: builtin/am.c:890 builtin/am.c:898
+msgid "invalid Date line"
+msgstr "无效的日期行"
 
-#: builtin/apply.c:3062
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr "打补丁失败:%s:%ld"
+#: builtin/am.c:895
+msgid "invalid timezone offset"
+msgstr "无效的时区偏移值"
 
-#: builtin/apply.c:3186
-#, c-format
-msgid "cannot checkout %s"
-msgstr "不能检出 %s"
+#: builtin/am.c:984
+msgid "Patch format detection failed."
+msgstr "补丁格式检测失败。"
 
-#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#: builtin/am.c:989 builtin/clone.c:379
 #, c-format
-msgid "read of %s failed"
-msgstr "读取 %s 失败"
+msgid "failed to create directory '%s'"
+msgstr "无法创建目录 '%s'"
 
-#: builtin/apply.c:3239
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr "读取位于符号链接中的 '%s'"
+#: builtin/am.c:993
+msgid "Failed to split patches."
+msgstr "无法拆分补丁。"
 
-#: builtin/apply.c:3267 builtin/apply.c:3489
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr "路径 %s 已经被重命名/删除"
+#: builtin/am.c:1125 builtin/commit.c:376
+msgid "unable to write index file"
+msgstr "无法写入索引文件"
 
-#: builtin/apply.c:3348 builtin/apply.c:3503
+#: 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:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#: 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:3357 builtin/apply.c:3511
+#: 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:3459
-msgid "removal patch leaves file contents"
-msgstr "移除补丁仍留下了文件内容"
+#: builtin/am.c:1316
+msgid "Patch is empty. Was it split wrong?"
+msgstr "补丁为空。是不是切分错误?"
 
-#: builtin/apply.c:3528
+#: 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:3530
+#: 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:3689 builtin/apply.c:3691
-#, 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 "仓库缺乏必要的数据对象以进行三方合并。"
 
-#: builtin/apply.c:3746
-#, 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:3749
-#, 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:3769
-#, 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 "回落到基础版本上打补丁及进行三方合并..."
 
-#: builtin/apply.c:3774
-#, 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:3794
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr "受影响的文件 '%s' 位于符号链接中"
+#: builtin/am.c:1686 builtin/merge.c:628
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/apply.c:3798
-#, c-format
-msgid "%s: patch does not apply"
-msgstr "%s:补丁未应用"
+#: builtin/am.c:1693
+msgid "applying to an empty history"
+msgstr "正应用到一个空历史上"
 
-#: builtin/apply.c:3812
-#, c-format
-msgid "Checking patch %s..."
-msgstr "æ£\80æ\9f¥è¡¥ä¸\81 %s..."
+#: builtin/am.c:1706 builtin/commit.c:1769 builtin/merge.c:798
+#: builtin/merge.c:823
+msgid "failed to write commit object"
+msgstr "æ\97 æ³\95å\86\99æ\8f\90交对象"
 
-#: builtin/apply.c:3905 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:4048
-#, 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:4077
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr "子模组 %s 损坏的补丁"
+#: builtin/am.c:1764
+msgid "Commit Body is:"
+msgstr "提交内容为:"
 
-#: builtin/apply.c:4081
-#, c-format
-msgid "unable to stat newly created 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:4086
+#: 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 "脏索引:不能应用补丁(脏文件:%s)"
 
-#: builtin/apply.c:4089 builtin/apply.c:4197
+#: 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:4122
-#, c-format
-msgid "closing file '%s'"
-msgstr "关闭文件 '%s'"
+#: builtin/am.c:1877
+msgid "No changes -- Patch already applied."
+msgstr "没有变更 —— 补丁已经应用过。"
 
-#: builtin/apply.c:4171
+#: 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:4258
+#: 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:4266
-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:4269
-#, 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 个被拒绝..."
+#: 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:4279
+#: 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 "截短 .rej 文件名为 %.*s.rej"
+msgid "Could not parse object '%s'."
+msgstr "不能解析对象 '%s'。"
 
-#: builtin/apply.c:4300
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr "第 #%d 个片段成功应用。"
+#: 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 "您好像在上一次 'am' 失败后移动了 HEAD。未回退至 ORIG_HEAD"
 
-#: builtin/apply.c:4303
+#: builtin/am.c:2200
 #, c-format
-msgid "Rejected hunk #%d."
-msgstr "æ\8b\92ç»\9d第 #%d ä¸ªç\89\87段ã\80\82"
+msgid "Invalid value for --patch-format: %s"
+msgstr "æ\97 æ\95\88ç\9a\84 --patch-format å\80¼ï¼\9a%s"
 
-#: builtin/apply.c:4393
-msgid "unrecognized input"
-msgstr "未能识别的输入"
+#: builtin/am.c:2233
+msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
+msgstr "git am [<选项>] [(<mbox> | <Maildir>)...]"
 
-#: builtin/apply.c:4404
-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:4507
-msgid "don't apply changes matching the given path"
-msgstr "ä¸\8dè¦\81åº\94ç\94¨ä¸\8eç»\99å\87ºè·¯å¾\84å\90\91å\8c¹é\85\8dç\9a\84å\8f\98æ\9b´"
+#: builtin/am.c:2240
+msgid "run interactively"
+msgstr "以交äº\92å¼\8fæ\96¹å¼\8fè¿\90è¡\8c"
 
-#: builtin/apply.c:4510
-msgid "apply changes matching the given path"
-msgstr "应用与给出路径向匹配的变更"
+#: builtin/am.c:2242
+msgid "historical option -- no-op"
+msgstr "老的参数 —— 无作用"
 
-#: builtin/apply.c:4513
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr "从传统的 diff 路径中移除指定数量的前导斜线"
+#: builtin/am.c:2244
+msgid "allow fall back on 3way merging if needed"
+msgstr "如果必要,允许使用三方合并。"
 
-#: builtin/apply.c:4516
-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:4518
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
+#: builtin/am.c:2247
+msgid "add a Signed-off-by line to the commit message"
+msgstr "在提交说明中添加一个 Signed-off-by 签名"
 
-#: builtin/apply.c:4522
-msgid "show number of added and deleted lines in decimal notation"
-msgstr "以å\8d\81è¿\9bå\88¶æ\95°æ\98¾ç¤ºæ·»å\8a å\92\8cå\88 é\99¤ç\9a\84è¡\8cæ\95°"
+#: builtin/am.c:2250
+msgid "recode into utf8 (default)"
+msgstr "使ç\94¨ utf8 å­\97符é\9b\86ï¼\88é»\98认ï¼\89"
 
-#: builtin/apply.c:4524
-msgid "instead of applying the patch, output a summary for the input"
-msgstr "不应用补丁,而是显示输入的概要"
+#: builtin/am.c:2252
+msgid "pass -k flag to git-mailinfo"
+msgstr "向 git-mailinfo 传递 -k 参数"
 
-#: builtin/apply.c:4526
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr "不应用补丁,而是查看补丁是否可应用"
+#: builtin/am.c:2254
+msgid "pass -b flag to git-mailinfo"
+msgstr "向 git-mailinfo 传递 -b 参数"
 
-#: builtin/apply.c:4528
-msgid "make sure the patch is applicable to the current index"
-msgstr "确认补丁可以应用到当前索引"
+#: builtin/am.c:2256
+msgid "pass -m flag to git-mailinfo"
+msgstr "向 git-mailinfo 传递 -m 参数"
 
-#: builtin/apply.c:4530
-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 "针对 mbox 格式,向 git-mailsplit 传递 --keep-cr 参数"
 
-#: builtin/apply.c:4532
-msgid "accept a patch that touches outside the working area"
-msgstr "接受修改工作区之外文件的补丁"
+#: builtin/am.c:2261
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr "不向 git-mailsplit 传递 --keep-cr 参数,覆盖 am.keepcr 的设置"
 
-#: builtin/apply.c:4534
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
+#: builtin/am.c:2264
+msgid "strip everything before a scissors line"
+msgstr "丢弃裁切线前的所有内容"
 
-#: builtin/apply.c:4536
-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:4538
-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:4541 builtin/checkout-index.c:169 builtin/ls-files.c:425
-msgid "paths are separated with NUL character"
-msgstr "路径以 NUL 字符分隔"
+#: builtin/am.c:2289 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "格式"
 
-#: builtin/apply.c:4543
-msgid "ensure at least <n> lines of context match"
-msgstr "确保至少匹配 <n> 行上下文"
+#: builtin/am.c:2290
+msgid "format the patch(es) are in"
+msgstr "补丁的格式"
 
-#: builtin/apply.c:4545
-msgid "detect new or modified lines that have whitespace errors"
-msgstr "æ£\80æ\9f¥æ\96°å¢\9eå\92\8cä¿®æ\94¹ç\9a\84è¡\8c中é\97´ç\9a\84空ç\99½å­\97符滥ç\94¨"
+#: builtin/am.c:2296
+msgid "override error message when patch failure occurs"
+msgstr "æ\89\93è¡¥ä¸\81失败æ\97¶æ\98¾ç¤ºç\9a\84é\94\99误信æ\81¯"
 
-#: builtin/apply.c:4548 builtin/apply.c:4551
-msgid "ignore changes in whitespace when finding context"
-msgstr "查找上下文时忽略空白字符的变更"
+#: builtin/am.c:2298
+msgid "continue applying patches after resolving a conflict"
+msgstr "冲突解决后继续应用补丁"
 
-#: builtin/apply.c:4554
-msgid "apply the patch in reverse"
-msgstr "å\8f\8då\90\91åº\94ç\94¨è¡¥ä¸\81"
+#: builtin/am.c:2301
+msgid "synonyms for --continue"
+msgstr "å\92\8c --continue å\90\8cä¹\89"
 
-#: builtin/apply.c:4556
-msgid "don't expect at least one line of context"
-msgstr "无需至少一行上下文"
+#: builtin/am.c:2304
+msgid "skip the current patch"
+msgstr "跳过当前补丁"
 
-#: builtin/apply.c:4558
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
+#: builtin/am.c:2307
+msgid "restore the original branch and abort the patching operation."
+msgstr "恢复原始分支并终止打补丁操作。"
 
-#: builtin/apply.c:4560
-msgid "allow overlapping hunks"
-msgstr "å\85\81许é\87\8då\8f ç\9a\84è¡¥ä¸\81ç\89\87段"
+#: builtin/am.c:2311
+msgid "lie about committer date"
+msgstr "å°\86ä½\9cè\80\85æ\97¥æ\9c\9fä½\9c为æ\8f\90交æ\97¥æ\9c\9f"
 
-#: builtin/apply.c:4563
-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:4566
-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:4569
-msgid "prepend <root> to all filenames"
-msgstr "为æ\89\80æ\9c\89æ\96\87件å\90\8då\89\8dæ·»å\8a  <æ ¹ç\9b®å½\95>"
+#: builtin/am.c:2316
+msgid "GPG-sign commits"
+msgstr "使ç\94¨ GPG ç­¾å\90\8dæ\8f\90交"
 
-#: builtin/apply.c:4591
-msgid "--3way outside a repository"
-msgstr "--3way 在一个仓库之外"
+#: builtin/am.c:2319
+msgid "(internal use for git-rebase)"
+msgstr "(内部使用,用于 git-rebase)"
 
-#: builtin/apply.c:4599
-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 已经很长时间不做任何实质操作了,并且将被移除。\n"
+"请不要再使用它了。"
 
-#: builtin/apply.c:4602
-msgid "--cached outside a repository"
-msgstr "--cached 在一个仓库之外"
+#: builtin/am.c:2341
+msgid "failed to read the index"
+msgstr "无法读取索引"
 
-#: builtin/apply.c:4621
+#: builtin/am.c:2356
 #, c-format
-msgid "can't open patch '%s'"
-msgstr "ä¸\8dè\83½æ\89\93å¼\80è¡¥ä¸\81 '%s'"
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "ä¹\8bå\89\8dç\9a\84å\8f\98å\9fºç\9b®å½\95 %s ä»\8dç\84¶å­\98å\9c¨ï¼\8cä½\86å\8d´æ\8f\90ä¾\9bäº\86 mboxã\80\82"
 
-#: builtin/apply.c:4635
+#: builtin/am.c:2380
 #, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] "抑制下仍有 %d 个空白字符误用"
-msgstr[1] "抑制下仍有 %d 个空白字符误用"
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"发现了错误的 %s 目录。\n"
+"使用 \"git am --abort\" 删除它。"
 
-#: builtin/apply.c:4641 builtin/apply.c:4651
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d 行有空白字符误用。"
-msgstr[1] "%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
@@ -3499,7 +4609,7 @@ 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]"
@@ -3521,138 +4631,184 @@ msgstr "git blame [<选项>] [<版本选项>] [<版本>] [--] <文件>"
 msgid "<rev-opts> are documented in git-rev-list(1)"
 msgstr "<版本选项> 的文档记录在 git-rev-list(1) 中"
 
-#: builtin/blame.c:1782
+#: builtin/blame.c:1781
 msgid "Blaming lines"
 msgstr "追踪代码行"
 
-#: builtin/blame.c:2530
+#: builtin/blame.c:2577
 msgid "Show blame entries as we find them, incrementally"
 msgstr "增量式地显示发现的 blame 条目"
 
-#: builtin/blame.c:2531
+#: builtin/blame.c:2578
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
 msgstr "边界提交显示空的 SHA-1(默认:关闭)"
 
-#: builtin/blame.c:2532
+#: builtin/blame.c:2579
 msgid "Do not treat root commits as boundaries (Default: off)"
 msgstr "不把根提交作为边界(默认:关闭)"
 
-#: builtin/blame.c:2533
+#: builtin/blame.c:2580
 msgid "Show work cost statistics"
 msgstr "显示命令消耗统计"
 
-#: builtin/blame.c:2534
+#: builtin/blame.c:2581
 msgid "Force progress reporting"
 msgstr "强制进度显示"
 
-#: builtin/blame.c:2535
+#: builtin/blame.c:2582
 msgid "Show output score for blame entries"
 msgstr "显示判断 blame 条目位移的得分诊断信息"
 
-#: builtin/blame.c:2536
+#: builtin/blame.c:2583
 msgid "Show original filename (Default: auto)"
 msgstr "显示原始文件名(默认:自动)"
 
-#: builtin/blame.c:2537
+#: builtin/blame.c:2584
 msgid "Show original linenumber (Default: off)"
 msgstr "显示原始的行号(默认:关闭)"
 
-#: builtin/blame.c:2538
+#: builtin/blame.c:2585
 msgid "Show in a format designed for machine consumption"
 msgstr "显示为一个适合机器读取的格式"
 
-#: builtin/blame.c:2539
+#: builtin/blame.c:2586
 msgid "Show porcelain format with per-line commit information"
 msgstr "为每一行显示机器适用的提交信息"
 
-#: builtin/blame.c:2540
+#: builtin/blame.c:2587
 msgid "Use the same output mode as git-annotate (Default: off)"
 msgstr "使用和 git-annotate 相同的输出模式(默认:关闭)"
 
-#: builtin/blame.c:2541
+#: builtin/blame.c:2588
 msgid "Show raw timestamp (Default: off)"
 msgstr "显示原始时间戳(默认:关闭)"
 
-#: builtin/blame.c:2542
+#: builtin/blame.c:2589
 msgid "Show long commit SHA1 (Default: off)"
 msgstr "显示长的 SHA1 提交号(默认:关闭)"
 
-#: builtin/blame.c:2543
+#: builtin/blame.c:2590
 msgid "Suppress author name and timestamp (Default: off)"
 msgstr "隐藏作者名字和时间戳(默认:关闭)"
 
-#: builtin/blame.c:2544
+#: builtin/blame.c:2591
 msgid "Show author email instead of name (Default: off)"
 msgstr "显示作者的邮箱而不是名字(默认:关闭)"
 
-#: builtin/blame.c:2545
+#: builtin/blame.c:2592
 msgid "Ignore whitespace differences"
 msgstr "忽略空白差异"
 
-#: builtin/blame.c:2546
+#: 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:2547
+#: builtin/blame.c:2603
 msgid "Use revisions from <file> instead of calling git-rev-list"
 msgstr "使用来自 <文件> 的修订集而不是调用 git-rev-list"
 
-#: builtin/blame.c:2548
+#: builtin/blame.c:2604
 msgid "Use <file>'s contents as the final image"
 msgstr "使用 <文件> 的内容作为最终的图片"
 
-#: builtin/blame.c:2549 builtin/blame.c:2550
+#: builtin/blame.c:2605 builtin/blame.c:2606
 msgid "score"
 msgstr "得分"
 
-#: builtin/blame.c:2549
+#: builtin/blame.c:2605
 msgid "Find line copies within and across files"
 msgstr "找到文件内及跨文件的行拷贝"
 
-#: builtin/blame.c:2550
+#: builtin/blame.c:2606
 msgid "Find line movements within and across files"
 msgstr "找到文件内及跨文件的行移动"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "n,m"
 msgstr "n,m"
 
-#: builtin/blame.c:2551
+#: builtin/blame.c:2607
 msgid "Process only line range n,m, counting from 1"
 msgstr "只处理行范围在 n 和 m 之间的,从 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:2640
+#: builtin/blame.c:2700
 msgid "4 years, 11 months ago"
 msgstr "4 年 11 个月前"
 
-#: builtin/branch.c:25
+#: 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 "在 %2$s 中无此路径 %1$s"
+
+#: builtin/blame.c:2854
+#, c-format
+msgid "cannot read blob %s for path %s"
+msgstr "不能为路径 %2$s 读取对象 %1$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 行"
+
+#: builtin/branch.c:26
 msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
 msgstr "git branch [<选项>] [-r | -a] [--merged | --no-merged]"
 
-#: builtin/branch.c:26
+#: builtin/branch.c:27
 msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
 msgstr "git branch [<选项>] [-l] [-f] <分支名> [<起始点>]"
 
-#: builtin/branch.c:27
+#: builtin/branch.c:28
 msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
 msgstr "git branch [<选项>] [-r] (-d | -D) <分支名>..."
 
-#: builtin/branch.c:28
+#: builtin/branch.c:29
 msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
 msgstr "git branch [<选项>] (-m | -M) [<旧分支>] <新分支>"
 
-#: builtin/branch.c:29
+#: builtin/branch.c:30
 msgid "git branch [<options>] [-r | -a] [--points-at]"
 msgstr "git branch [<选项>] [-r | -a] [--points-at]"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:142
+#: builtin/branch.c:143
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -3662,7 +4818,7 @@ msgstr ""
 "         '%s',但未合并到 HEAD。"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:146
+#: builtin/branch.c:147
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -3671,12 +4827,12 @@ msgstr ""
 "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n"
 "         然而却尚未被合并到分支 '%s' 。"
 
-#: builtin/branch.c:160
+#: builtin/branch.c:161
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "无法查询 '%s' 指向的提交对象"
 
-#: builtin/branch.c:164
+#: builtin/branch.c:165
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -3685,335 +4841,367 @@ msgstr ""
 "分支 '%s' 没有完全合并。\n"
 "如果您确认要删除它,执行 'git branch -D %s'。"
 
-#: builtin/branch.c:177
+#: builtin/branch.c:178
 msgid "Update of config-file failed"
 msgstr "无法更新 config 文件"
 
-#: builtin/branch.c:205
+#: builtin/branch.c:206
 msgid "cannot use -a with -d"
 msgstr "不能将 -a 和 -d 同时使用"
 
-#: builtin/branch.c:211
+#: builtin/branch.c:212
 msgid "Couldn't look up commit object for HEAD"
 msgstr "无法查询 HEAD 指向的提交对象"
 
-#: builtin/branch.c:219
+#: builtin/branch.c:226
 #, c-format
-msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "æ\97 æ³\95å\88 é\99¤æ\82¨å½\93å\89\8dæ\89\80å\9c¨ç\9a\84å\88\86æ\94¯ '%s'。"
+msgid "Cannot delete branch '%s' checked out at '%s'"
+msgstr "æ\97 æ³\95å\88 é\99¤æ£\80å\87ºäº\8e '%2$s' ç\9a\84å\88\86æ\94¯ '%1$s'。"
 
-#: builtin/branch.c:235
+#: builtin/branch.c:241
 #, c-format
 msgid "remote-tracking branch '%s' not found."
 msgstr "未能找到远程跟踪分支 '%s'。"
 
-#: builtin/branch.c:236
+#: builtin/branch.c:242
 #, c-format
 msgid "branch '%s' not found."
 msgstr "分支 '%s' 未发现。"
 
-#: builtin/branch.c:251
+#: builtin/branch.c:257
 #, c-format
 msgid "Error deleting remote-tracking branch '%s'"
 msgstr "无法删除远程跟踪分支 '%s'"
 
-#: builtin/branch.c:252
+#: builtin/branch.c:258
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "无法删除分支 '%s'"
 
-#: builtin/branch.c:259
+#: builtin/branch.c:265
 #, c-format
 msgid "Deleted remote-tracking branch %s (was %s).\n"
 msgstr "已删除远程跟踪分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:260
+#: builtin/branch.c:266
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "已删除分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:303
+#: builtin/branch.c:312
 #, c-format
 msgid "[%s: gone]"
 msgstr "[%s: 丢失]"
 
-#: builtin/branch.c:308
+#: builtin/branch.c:317
 #, c-format
 msgid "[%s]"
 msgstr "[%s]"
 
-#: builtin/branch.c:313
+#: builtin/branch.c:322
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s:落后 %d]"
 
-#: builtin/branch.c:315
+#: builtin/branch.c:324
 #, c-format
 msgid "[behind %d]"
 msgstr "[落后 %d]"
 
-#: builtin/branch.c:319
+#: builtin/branch.c:328
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s:领先 %d]"
 
-#: builtin/branch.c:321
+#: builtin/branch.c:330
 #, c-format
 msgid "[ahead %d]"
 msgstr "[领先 %d]"
 
-#: builtin/branch.c:324
+#: builtin/branch.c:333
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s:领先 %d,落后 %d]"
 
-#: builtin/branch.c:327
+#: builtin/branch.c:336
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[领先 %d,落后 %d]"
 
-#: builtin/branch.c:340
+#: builtin/branch.c:349
 msgid " **** invalid ref ****"
 msgstr " **** 无效引用 ****"
 
-#: builtin/branch.c:366
+#: builtin/branch.c:375
 #, c-format
 msgid "(no branch, rebasing %s)"
 msgstr "(非分支,正变基 %s)"
 
-#: builtin/branch.c:369
+#: builtin/branch.c:378
 #, c-format
 msgid "(no branch, bisect started on %s)"
 msgstr "(非分支,二分查找开始于 %s)"
 
-#: builtin/branch.c:375
+#. 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)"
 
-#: builtin/branch.c:378
+#. 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:382
+#: builtin/branch.c:393
 msgid "(no branch)"
 msgstr "(非分支)"
 
-#: builtin/branch.c:524
+#: builtin/branch.c:544
+#, c-format
+msgid "Branch %s is being rebased at %s"
+msgstr "分支 %s 正被变基到 %s"
+
+#: builtin/branch.c:548
+#, c-format
+msgid "Branch %s is being bisected at %s"
+msgstr "分支 %s 正被二分查找于 %s"
+
+#: builtin/branch.c:563
 msgid "cannot rename the current branch while not on any."
 msgstr "无法重命名当前分支因为不处于任何分支上。"
 
-#: builtin/branch.c:534
+#: builtin/branch.c:573
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "无效的分支名:'%s'"
 
-#: builtin/branch.c:549
+#: builtin/branch.c:590
 msgid "Branch rename failed"
 msgstr "分支重命名失败"
 
-#: builtin/branch.c:553
+#: builtin/branch.c:594
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "重命名掉一个错误命名的旧分支 '%s'"
 
-#: builtin/branch.c:557
+#: builtin/branch.c:597
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "分支重命名为 %s,但 HEAD 没有更新!"
 
-#: builtin/branch.c:564
+#: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "分支被重命名,但更新 config 文件失败"
 
-#: builtin/branch.c:586
+#: builtin/branch.c:620
 #, c-format
-msgid "could not write branch description template: %s"
-msgstr "不能写分支描述模版:%s"
+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:615
+#: builtin/branch.c:651
 msgid "Generic options"
 msgstr "通用选项"
 
-#: builtin/branch.c:617
+#: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "显示哈希值和主题,若参数出现两次则显示上游分支"
 
-#: builtin/branch.c:618
+#: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "不显示信息"
 
-#: builtin/branch.c:619
+#: builtin/branch.c:655
 msgid "set up tracking mode (see git-pull(1))"
 msgstr "设置跟踪模式(参见 git-pull(1))"
 
-#: builtin/branch.c:621
+#: builtin/branch.c:657
 msgid "change upstream info"
 msgstr "改变上游信息"
 
-#: builtin/branch.c:625
+#: builtin/branch.c:659
+msgid "upstream"
+msgstr "上游"
+
+#: builtin/branch.c:659
+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 "使用彩色输出"
 
-#: builtin/branch.c:626
+#: builtin/branch.c:662
 msgid "act on remote-tracking branches"
 msgstr "作用于远程跟踪分支"
 
-#: builtin/branch.c:628 builtin/branch.c:629
+#: builtin/branch.c:664 builtin/branch.c:665
 msgid "print only branches that contain the commit"
 msgstr "只打印包含该提交的分支"
 
-#: builtin/branch.c:632
+#: builtin/branch.c:668
 msgid "Specific git-branch actions:"
 msgstr "具体的 git-branch 动作:"
 
-#: builtin/branch.c:633
+#: builtin/branch.c:669
 msgid "list both remote-tracking and local branches"
 msgstr "列出远程跟踪及本地分支"
 
-#: builtin/branch.c:635
+#: builtin/branch.c:671
 msgid "delete fully merged branch"
 msgstr "删除完全合并的分支"
 
-#: builtin/branch.c:636
+#: builtin/branch.c:672
 msgid "delete branch (even if not merged)"
 msgstr "删除分支(即使没有合并)"
 
-#: builtin/branch.c:637
+#: builtin/branch.c:673
 msgid "move/rename a branch and its reflog"
 msgstr "移动/重命名一个分支,以及它的引用日志"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:674
 msgid "move/rename a branch, even if target exists"
 msgstr "移动/重命名一个分支,即使目标已存在"
 
-#: builtin/branch.c:639
+#: builtin/branch.c:675
 msgid "list branch names"
 msgstr "列出分支名"
 
-#: builtin/branch.c:640
+#: builtin/branch.c:676
 msgid "create the branch's reflog"
 msgstr "创建分支的引用日志"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:678
 msgid "edit the description for the branch"
 msgstr "标记分支的描述"
 
-#: builtin/branch.c:643
+#: builtin/branch.c:679
 msgid "force creation, move/rename, deletion"
 msgstr "强制创建、移动/重命名、删除"
 
-#: builtin/branch.c:644
+#: builtin/branch.c:680
 msgid "print only branches that are merged"
 msgstr "只打印已经合并的分支"
 
-#: builtin/branch.c:645
+#: builtin/branch.c:681
 msgid "print only branches that are not merged"
 msgstr "只打印尚未合并的分支"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:682
 msgid "list branches in columns"
 msgstr "以列的方式显示分支"
 
-#: builtin/branch.c:647 builtin/for-each-ref.c:38 builtin/tag.c:366
+#: builtin/branch.c:683 builtin/for-each-ref.c:38 builtin/tag.c:366
 msgid "key"
 msgstr "key"
 
-#: builtin/branch.c:648 builtin/for-each-ref.c:39 builtin/tag.c:367
+#: builtin/branch.c:684 builtin/for-each-ref.c:39 builtin/tag.c:367
 msgid "field name to sort on"
 msgstr "排序的字段名"
 
-#: builtin/branch.c:650 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 "对象"
 
-#: builtin/branch.c:651
+#: builtin/branch.c:687
 msgid "print only branches of the object"
 msgstr "只打印指向该对象的分支"
 
-#: builtin/branch.c:669
+#: builtin/branch.c:705
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "无法将 HEAD 解析为有效引用。"
 
-#: builtin/branch.c:673 builtin/clone.c:705
+#: builtin/branch.c:709 builtin/clone.c:706
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD 没有位于 /refs/heads 之下!"
 
-#: builtin/branch.c:693
+#: builtin/branch.c:729
 msgid "--column and --verbose are incompatible"
 msgstr "--column 和 --verbose 不兼容"
 
-#: builtin/branch.c:704 builtin/branch.c:746
+#: builtin/branch.c:740 builtin/branch.c:782
 msgid "branch name required"
 msgstr "必须提供分支名"
 
-#: builtin/branch.c:722
+#: builtin/branch.c:758
 msgid "Cannot give description to detached HEAD"
 msgstr "不能向分离头指针提供描述"
 
-#: builtin/branch.c:727
+#: builtin/branch.c:763
 msgid "cannot edit description of more than one branch"
 msgstr "不能为一个以上的分支编辑描述"
 
-#: builtin/branch.c:734
+#: builtin/branch.c:770
 #, c-format
 msgid "No commit on branch '%s' yet."
 msgstr "分支 '%s' 尚无提交。"
 
-#: builtin/branch.c:737
+#: builtin/branch.c:773
 #, c-format
 msgid "No branch named '%s'."
 msgstr "没有分支 '%s'。"
 
-#: builtin/branch.c:752
+#: builtin/branch.c:788
 msgid "too many branches for a rename operation"
 msgstr "为重命名操作提供了太多的分支名"
 
-#: builtin/branch.c:757
+#: builtin/branch.c:793
 msgid "too many branches to set new upstream"
 msgstr "为设置新上游提供了太多的分支名"
 
-#: builtin/branch.c:761
+#: builtin/branch.c:797
 #, 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:764 builtin/branch.c:786 builtin/branch.c:807
+#: builtin/branch.c:800 builtin/branch.c:822 builtin/branch.c:843
 #, c-format
 msgid "no such branch '%s'"
 msgstr "没有此分支 '%s'"
 
-#: builtin/branch.c:768
+#: builtin/branch.c:804
 #, c-format
 msgid "branch '%s' does not exist"
 msgstr "分支 '%s' 不存在"
 
-#: builtin/branch.c:780
+#: builtin/branch.c:816
 msgid "too many branches to unset upstream"
 msgstr "为取消上游设置操作提供了太多的分支名"
 
-#: builtin/branch.c:784
+#: builtin/branch.c:820
 msgid "could not unset upstream of HEAD when it does not point to any branch."
 msgstr "无法取消 HEAD 的上游设置因为它没有指向一个分支"
 
-#: builtin/branch.c:790
+#: builtin/branch.c:826
 #, c-format
 msgid "Branch '%s' has no upstream information"
 msgstr "分支 '%s' 没有上游信息"
 
-#: builtin/branch.c:804
+#: builtin/branch.c:840
 msgid "it does not make sense to create 'HEAD' manually"
 msgstr "手工创建 'HEAD' 没有意义"
 
-#: builtin/branch.c:810
+#: builtin/branch.c:846
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义"
 
-#: builtin/branch.c:813
+#: builtin/branch.c:849
 #, c-format
 msgid ""
 "The --set-upstream flag is deprecated and will be removed. Consider using --"
@@ -4021,7 +5209,7 @@ msgid ""
 msgstr ""
 "选项 --set-upstream 已弃用并将被移除。考虑使用 --track 或 --set-upstream-to\n"
 
-#: builtin/branch.c:830
+#: builtin/branch.c:866
 #, c-format
 msgid ""
 "\n"
@@ -4032,16 +5220,6 @@ msgstr ""
 "如果你想用 '%s' 跟踪 '%s', 这么做:\n"
 "\n"
 
-#: builtin/branch.c:831
-#, c-format
-msgid "    git branch -d %s\n"
-msgstr "    git branch -d %s\n"
-
-#: builtin/branch.c:832
-#, c-format
-msgid "    git branch --set-upstream-to %s\n"
-msgstr "    git branch --set-upstream-to %s\n"
-
 #: builtin/bundle.c:51
 #, c-format
 msgid "%s is okay\n"
@@ -4055,63 +5233,79 @@ 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>"
+"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: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 "对于数据对象,对其内容执行 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:923
+msgid "blob"
+msgstr "数据对象"
 
-#: builtin/cat-file.c:475
+#: 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 参数显示所有对象"
 
@@ -4131,7 +5325,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 "从标准输入读出文件名"
 
@@ -4139,7 +5333,7 @@ msgstr "从标准输入读出文件名"
 msgid "terminate input and output records by a NUL character"
 msgstr "输入和输出的记录使用 NUL 字符终结"
 
-#: builtin/check-ignore.c:18 builtin/checkout.c:1136 builtin/gc.c:325
+#: builtin/check-ignore.c:18 builtin/checkout.c:1137 builtin/gc.c:325
 msgid "suppress progress reporting"
 msgstr "不显示进度报告"
 
@@ -4229,8 +5423,9 @@ msgid "write the content to temporary files"
 msgstr "将内容写入临时文件"
 
 #: builtin/checkout-index.c:174 builtin/column.c:30
-#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
-#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: 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 "字符串"
 
@@ -4280,80 +5475,76 @@ msgstr "path '%s':无法合并"
 msgid "Unable to add merge result for '%s'"
 msgstr "无法为 '%s' 添加合并结果"
 
-#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
-#: builtin/checkout.c:260
+#: 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/checkout.c:263 builtin/checkout.c:266
+#: builtin/checkout.c:262 builtin/checkout.c:265
 #, c-format
 msgid "'%s' cannot be used with %s"
 msgstr "'%s' 不能和 %s 同时使用"
 
-#: builtin/checkout.c:269
+#: builtin/checkout.c:268
 #, c-format
 msgid "Cannot update paths and switch to branch '%s' at the same time."
 msgstr "不能同时更新路径并切换到分支'%s'。"
 
-#: builtin/checkout.c:280 builtin/checkout.c:474
-msgid "corrupt index file"
-msgstr "损坏的索引文件"
-
-#: builtin/checkout.c:340 builtin/checkout.c:347
+#: builtin/checkout.c:339 builtin/checkout.c:346
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:496
+#: builtin/checkout.c:494
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:623
+#: builtin/checkout.c:624
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "不能对 '%s' 执行 reflog 操作:%s\n"
 
-#: builtin/checkout.c:661
+#: builtin/checkout.c:663
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:665 builtin/clone.c:659
+#: builtin/checkout.c:667 builtin/clone.c:660
 msgid "unable to update HEAD"
 msgstr "不能更新 HEAD"
 
-#: builtin/checkout.c:669
+#: builtin/checkout.c:671
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:672
+#: builtin/checkout.c:674
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:676
+#: builtin/checkout.c:678
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:678 builtin/checkout.c:1068
+#: builtin/checkout.c:680 builtin/checkout.c:1069
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:680
+#: builtin/checkout.c:682
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
 
 #  译者:注意保持前导空格
-#: builtin/checkout.c:732
+#: builtin/checkout.c:733
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 及其它 %d 个。\n"
 
-#: builtin/checkout.c:738
+#: builtin/checkout.c:739
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -4374,7 +5565,7 @@ msgstr[1] ""
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:757
+#: 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"
@@ -4401,150 +5592,150 @@ msgstr[1] ""
 " git branch <新分支名> %s\n"
 "\n"
 
-#: builtin/checkout.c:793
+#: builtin/checkout.c:794
 msgid "internal error in revision walk"
 msgstr "在版本遍历时遇到内部错误"
 
-#: builtin/checkout.c:797
+#: builtin/checkout.c:798
 msgid "Previous HEAD position was"
 msgstr "之前的 HEAD 位置是"
 
-#: builtin/checkout.c:824 builtin/checkout.c:1063
+#: builtin/checkout.c:825 builtin/checkout.c:1064
 msgid "You are on a branch yet to be born"
 msgstr "您位于一个尚未初始化的分支"
 
-#: builtin/checkout.c:969
+#: builtin/checkout.c:970
 #, c-format
 msgid "only one reference expected, %d given."
-msgstr "å\8fªè¦\81一个引用,却给出了 %d 个"
+msgstr "åº\94å\8fªæ\9c\89一个引用,却给出了 %d 个"
 
-#: builtin/checkout.c:1009 builtin/worktree.c:211
+#: builtin/checkout.c:1010 builtin/worktree.c:214
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
-#: builtin/checkout.c:1038
+#: builtin/checkout.c:1039
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "引用不是一个树:%s"
 
-#: builtin/checkout.c:1077
+#: builtin/checkout.c:1078
 msgid "paths cannot be used with switching branches"
 msgstr "路径不能和切换分支同时使用"
 
-#: builtin/checkout.c:1080 builtin/checkout.c:1084
+#: builtin/checkout.c:1081 builtin/checkout.c:1085
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' 不能和切换分支同时使用"
 
-#: builtin/checkout.c:1088 builtin/checkout.c:1091 builtin/checkout.c:1096
-#: builtin/checkout.c:1099
+#: 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:1104
+#: builtin/checkout.c:1105
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "不能切换分支到一个非提交 '%s'"
 
-#: builtin/checkout.c:1137 builtin/checkout.c:1139 builtin/clone.c:84
-#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:318
-#: builtin/worktree.c:320
+#: 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:1138
+#: builtin/checkout.c:1139
 msgid "create and checkout a new branch"
 msgstr "创建并检出一个新的分支"
 
-#: builtin/checkout.c:1140
+#: builtin/checkout.c:1141
 msgid "create/reset and checkout a branch"
 msgstr "创建/重置并检出一个分支"
 
-#: builtin/checkout.c:1141
+#: builtin/checkout.c:1142
 msgid "create reflog for new branch"
 msgstr "为新的分支创建引用日志"
 
-#: builtin/checkout.c:1142
-msgid "detach the HEAD at named commit"
-msgstr "成为指向该提交的分离头指针"
+#: builtin/checkout.c:1143 builtin/worktree.c:328
+msgid "detach HEAD at named commit"
+msgstr "HEAD 从指定的提交分离"
 
-#: builtin/checkout.c:1143
+#: builtin/checkout.c:1144
 msgid "set upstream info for new branch"
 msgstr "为新的分支设置上游信息"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new-branch"
 msgstr "新分支"
 
-#: builtin/checkout.c:1145
+#: builtin/checkout.c:1146
 msgid "new unparented branch"
 msgstr "新的没有父提交的分支"
 
-#: builtin/checkout.c:1146
+#: builtin/checkout.c:1147
 msgid "checkout our version for unmerged files"
 msgstr "对尚未合并的文件检出我们的版本"
 
-#: builtin/checkout.c:1148
+#: builtin/checkout.c:1149
 msgid "checkout their version for unmerged files"
 msgstr "对尚未合并的文件检出他们的版本"
 
-#: builtin/checkout.c:1150
+#: builtin/checkout.c:1151
 msgid "force checkout (throw away local modifications)"
 msgstr "强制检出(丢弃本地修改)"
 
-#: builtin/checkout.c:1151
+#: builtin/checkout.c:1152
 msgid "perform a 3-way merge with the new branch"
 msgstr "和新的分支执行三方合并"
 
-#: builtin/checkout.c:1152 builtin/merge.c:227
+#: builtin/checkout.c:1153 builtin/merge.c:231
 msgid "update ignored files (default)"
 msgstr "更新忽略的文件(默认)"
 
-#: builtin/checkout.c:1153 builtin/log.c:1269 parse-options.h:250
+#: builtin/checkout.c:1154 builtin/log.c:1466 parse-options.h:251
 msgid "style"
 msgstr "风格"
 
-#: builtin/checkout.c:1154
+#: builtin/checkout.c:1155
 msgid "conflict style (merge or diff3)"
 msgstr "冲突输出风格(merge 或 diff3)"
 
-#: builtin/checkout.c:1157
+#: builtin/checkout.c:1158
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "对路径不做稀疏检出的限制"
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1160
 msgid "second guess 'git checkout <no-such-branch>'"
 msgstr "二次猜测'git checkout <无此分支>'"
 
-#: builtin/checkout.c:1161
+#: builtin/checkout.c:1162
 msgid "do not check if another worktree is holding the given ref"
 msgstr "不检查指定的引用是否被其他工作区所占用"
 
-#: builtin/checkout.c:1162 builtin/clone.c:58 builtin/fetch.c:116
-#: builtin/merge.c:224 builtin/pull.c:113 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:1193
+#: builtin/checkout.c:1194
 msgid "-b, -B and --orphan are mutually exclusive"
 msgstr "-b、-B 和 --orphan 是互斥的"
 
-#: builtin/checkout.c:1210
+#: builtin/checkout.c:1211
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1215
+#: builtin/checkout.c:1216
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1251
+#: builtin/checkout.c:1252
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1258
+#: builtin/checkout.c:1259
 #, c-format
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -4553,12 +5744,12 @@ msgstr ""
 "不能同时更新路径并切换到分支'%s'。\n"
 "您是想要检出 '%s' 但其未能解析为提交么?"
 
-#: builtin/checkout.c:1263
+#: 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:1267
+#: builtin/checkout.c:1268
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -4709,8 +5900,8 @@ msgstr "交互式清除"
 msgid "remove whole directories"
 msgstr "删除整个目录"
 
-#: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:722
-#: builtin/ls-files.c:456 builtin/name-rev.c:307 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 "模式"
 
@@ -4748,104 +5939,130 @@ msgstr ""
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<选项>] [--] <仓库> [<路径>]"
 
-#: builtin/clone.c:60
+#: builtin/clone.c:65
 msgid "don't create a checkout"
 msgstr "不创建一个检出"
 
-#: builtin/clone.c:61 builtin/clone.c:63 builtin/init-db.c:469
+#: builtin/clone.c:66 builtin/clone.c:68 builtin/init-db.c:478
 msgid "create a bare repository"
 msgstr "创建一个纯仓库"
 
-#: builtin/clone.c:65
+#: builtin/clone.c:70
 msgid "create a mirror repository (implies bare)"
 msgstr "创建一个镜像仓库(也是纯仓库)"
 
-#: builtin/clone.c:67
+#: builtin/clone.c:72
 msgid "to clone from a local repository"
 msgstr "从本地仓库克隆"
 
-#: builtin/clone.c:69
+#: builtin/clone.c:74
 msgid "don't use local hardlinks, always copy"
 msgstr "不使用本地硬链接,始终复制"
 
-#: builtin/clone.c:71
+#: builtin/clone.c:76
 msgid "setup as shared repository"
 msgstr "设置为共享仓库"
 
-#: builtin/clone.c:73 builtin/clone.c:75
+#: builtin/clone.c:78 builtin/clone.c:80
 msgid "initialize submodules in the clone"
 msgstr "在克隆时初始化子模组"
 
-#: builtin/clone.c:76 builtin/init-db.c:466
+#: builtin/clone.c:82
+msgid "number of submodules cloned in parallel"
+msgstr "并发克隆的子模组的数量"
+
+#: builtin/clone.c:83 builtin/init-db.c:475
 msgid "template-directory"
 msgstr "模板目录"
 
-#: builtin/clone.c:77 builtin/init-db.c:467
+#: builtin/clone.c:84 builtin/init-db.c:476
 msgid "directory from which templates will be used"
 msgstr "模板目录将被使用"
 
-#: builtin/clone.c:79 builtin/submodule--helper.c:173
+#: 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:81
+#: builtin/clone.c:90
 msgid "use --reference only while cloning"
 msgstr "仅在克隆时参考 --reference 指向的本地仓库"
 
-#: builtin/clone.c:82 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:83
+#: builtin/clone.c:92
 msgid "use <name> instead of 'origin' to track upstream"
 msgstr "使用 <名称> 而不是 'origin' 去跟踪上游"
 
-#: builtin/clone.c:85
+#: builtin/clone.c:94
 msgid "checkout <branch> instead of the remote's HEAD"
 msgstr "检出 <分支> 而不是远程 HEAD"
 
-#: builtin/clone.c:87
+#: builtin/clone.c:96
 msgid "path to git-upload-pack on the remote"
 msgstr "远程 git-upload-pack 路径"
 
-#: builtin/clone.c:88 builtin/fetch.c:117 builtin/grep.c:665
-#: builtin/pull.c:193
+#: builtin/clone.c:97 builtin/fetch.c:120 builtin/grep.c:668
+#: builtin/pull.c:202
 msgid "depth"
 msgstr "深度"
 
-#: builtin/clone.c:89
+#: builtin/clone.c:98
 msgid "create a shallow clone of that depth"
 msgstr "创建一个指定深度的浅克隆"
 
-#: builtin/clone.c:91
+#: 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:92 builtin/init-db.c:475
+#: builtin/clone.c:106
+msgid "any cloned submodules will be shallow"
+msgstr "子模组将以浅下载模式克隆"
+
+#: builtin/clone.c:107 builtin/init-db.c:484
 msgid "gitdir"
 msgstr "git目录"
 
-#: builtin/clone.c:93 builtin/init-db.c:476
+#: builtin/clone.c:108 builtin/init-db.c:485
 msgid "separate git dir from working tree"
 msgstr "git目录和工作区分离"
 
-#: builtin/clone.c:94
+#: builtin/clone.c:109
 msgid "key=value"
 msgstr "key=value"
 
-#: builtin/clone.c:95
+#: builtin/clone.c:110
 msgid "set config inside the new repository"
 msgstr "在新仓库中设置配置信息"
 
-#: builtin/clone.c:96 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:98 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:239
+#: builtin/clone.c:250
 msgid ""
 "No directory name could be guessed.\n"
 "Please specify a directory on the command line"
@@ -4853,57 +6070,42 @@ msgstr ""
 "无法猜到目录名。\n"
 "请在命令行指定一个目录"
 
-#: builtin/clone.c:305
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr "尚不支持将参考仓库 '%s' 作为一个链接检出。"
-
-#: builtin/clone.c:307
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr "参考仓库 '%s' 不是一个本地仓库。"
-
-#: builtin/clone.c:312
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr "参考仓库 '%s' 是一个浅克隆"
-
-#: builtin/clone.c:315
+#: 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 "info: 不能为 '%s' 添加一个备用:%s\n"
 
-#: builtin/clone.c:380 builtin/diff.c:84
+#: builtin/clone.c:375
 #, c-format
-msgid "failed to stat '%s'"
-msgstr "æ\97 æ³\95æ\9e\9a举 '%s' ç\8a¶æ\80\81"
+msgid "failed to open '%s'"
+msgstr "æ\97 æ³\95æ\89\93å¼\80 '%s'"
 
-#: builtin/clone.c:382
+#: builtin/clone.c:383
 #, c-format
 msgid "%s exists and is not a directory"
 msgstr "%s 存在且不是一个目录"
 
-#: builtin/clone.c:396
+#: builtin/clone.c:397
 #, c-format
 msgid "failed to stat %s\n"
 msgstr "无法枚举 %s 状态\n"
 
-#: builtin/clone.c:418
+#: builtin/clone.c:419
 #, c-format
 msgid "failed to create link '%s'"
 msgstr "无法创建链接 '%s'"
 
-#: builtin/clone.c:422
+#: builtin/clone.c:423
 #, c-format
 msgid "failed to copy file to '%s'"
 msgstr "无法拷贝文件至 '%s'"
 
-#: builtin/clone.c:447 builtin/clone.c:631
+#: builtin/clone.c:448
 #, c-format
 msgid "done.\n"
 msgstr "完成。\n"
 
-#: builtin/clone.c:459
+#: builtin/clone.c:460
 msgid ""
 "Clone succeeded, but checkout failed.\n"
 "You can inspect what was checked out with 'git status'\n"
@@ -4913,126 +6115,135 @@ msgstr ""
 "您可以通过 'git status' 检查哪些已被检出,然后使用命令\n"
 "'git checkout -f HEAD' 重试\n"
 
-#: builtin/clone.c:536
+#: builtin/clone.c:537
 #, c-format
 msgid "Could not find remote branch %s to clone."
 msgstr "不能发现要克隆的远程分支 %s。"
 
-#: builtin/clone.c:626
-#, c-format
-msgid "Checking connectivity... "
-msgstr "检查连接... "
-
-#: builtin/clone.c:629
+#: builtin/clone.c:632
 msgid "remote did not send all necessary objects"
 msgstr "远程没有发送所有必须的对象"
 
-#: builtin/clone.c:647
+#: builtin/clone.c:648
 #, c-format
 msgid "unable to update %s"
 msgstr "不能更新 %s"
 
-#: builtin/clone.c:696
+#: builtin/clone.c:697
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
 msgstr "远程 HEAD 指向一个不存在的引用,无法检出。\n"
 
-#: builtin/clone.c:727
+#: builtin/clone.c:728
 msgid "unable to checkout working tree"
 msgstr "不能检出工作区"
 
-#: builtin/clone.c:753
+#: builtin/clone.c:768
 msgid "unable to write parameters to config file"
 msgstr "无法将参数写入配置文件"
 
-#: builtin/clone.c:816
+#: builtin/clone.c:831
 msgid "cannot repack to clean up"
 msgstr "无法执行 repack 来清理"
 
-#: builtin/clone.c:818
+#: builtin/clone.c:833
 msgid "cannot unlink temporary alternates file"
 msgstr "无法删除临时的 alternates 文件"
 
-#: builtin/clone.c:850
+#: builtin/clone.c:866 builtin/receive-pack.c:1895
 msgid "Too many arguments."
 msgstr "太多参数。"
 
-#: builtin/clone.c:854
+#: builtin/clone.c:870
 msgid "You must specify a repository to clone."
 msgstr "您必须指定一个仓库来克隆。"
 
-#: builtin/clone.c:865
+#: builtin/clone.c:883
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
 msgstr "--bare 和 --origin %s 选项不兼容。"
 
-#: builtin/clone.c:868
+#: builtin/clone.c:886
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "--bare 和 --separate-git-dir 选项不兼容。"
 
-#: builtin/clone.c:881
+#: builtin/clone.c:899
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "仓库 '%s' 不存在"
 
-#: builtin/clone.c:887 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:897
+#: builtin/clone.c:915
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "目标路径 '%s' 已经存在,并且不是一个空目录。"
 
-#: builtin/clone.c:907
+#: builtin/clone.c:925
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "工作区 '%s' 已经存在。"
 
-#: builtin/clone.c:922 builtin/clone.c:933 builtin/submodule--helper.c:218
-#: builtin/worktree.c:219 builtin/worktree.c:246
+#: 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:925
+#: builtin/clone.c:943
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "不能创建工作区目录 '%s'"
 
-#: builtin/clone.c:943
+#: builtin/clone.c:955
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "克隆到纯仓库 '%s'...\n"
 
-#: builtin/clone.c:945
+#: builtin/clone.c:957
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "正克隆到 '%s'...\n"
 
-#: builtin/clone.c:984
+#: 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:// 协议试试。"
+msgstr "--depth 在本地克隆时被忽略,请改用 file:// 协议。"
+
+#: builtin/clone.c:1021
+msgid "--shallow-since is ignored in local clones; use file:// instead."
+msgstr "--shallow-since 在本地克隆时被忽略,请改用 file:// 协议。"
 
-#: builtin/clone.c:987
+#: 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:992
+#: builtin/clone.c:1031
 msgid "--local is ignored"
 msgstr "--local 被忽略"
 
-#: builtin/clone.c:996
+#: builtin/clone.c:1035
 #, c-format
 msgid "Don't know how to clone %s"
 msgstr "不知道如何克隆 %s"
 
-#: builtin/clone.c:1045 builtin/clone.c:1053
+#: 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:1056
+#: builtin/clone.c:1101
 msgid "You appear to have cloned an empty repository."
 msgstr "您似乎克隆了一个空仓库。"
 
@@ -5166,103 +6377,103 @@ msgstr ""
 "然后执行 \"git cherry-pick --continue\" 继续对其余提交执行拣选\n"
 "操作。\n"
 
-#: builtin/commit.c:305
+#: builtin/commit.c:318
 msgid "failed to unpack HEAD tree object"
 msgstr "无法解包 HEAD 树对象"
 
-#: builtin/commit.c:346
+#: builtin/commit.c:359
 msgid "unable to create temporary index"
 msgstr "不能创建临时索引"
 
-#: builtin/commit.c:352
+#: builtin/commit.c:365
 msgid "interactive add failed"
 msgstr "交互式添加失败"
 
-#: builtin/commit.c:365
+#: builtin/commit.c:378
 msgid "unable to update temporary index"
 msgstr "无法更新临时索引"
 
-#: builtin/commit.c:367
+#: builtin/commit.c:380
 msgid "Failed to update main cache tree"
 msgstr "不能更新树的主缓存"
 
-#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+#: 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:445
+#: builtin/commit.c:458
 msgid "cannot do a partial commit during a merge."
 msgstr "在合并过程中不能做部分提交。"
 
-#: builtin/commit.c:447
+#: builtin/commit.c:460
 msgid "cannot do a partial commit during a cherry-pick."
 msgstr "在拣选过程中不能做部分提交。"
 
-#: builtin/commit.c:456
+#: builtin/commit.c:469
 msgid "cannot read the index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:475
+#: builtin/commit.c:488
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:580
+#: builtin/commit.c:582
 #, c-format
 msgid "commit '%s' lacks author header"
 msgstr "提交 '%s' 缺少作者信息"
 
-#: builtin/commit.c:582
+#: builtin/commit.c:584
 #, c-format
 msgid "commit '%s' has malformed author line"
 msgstr "提交 '%s' 有非法的作者信息"
 
-#: builtin/commit.c:601
+#: builtin/commit.c:603
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:609
+#: builtin/commit.c:611
 #, c-format
 msgid "invalid date format: %s"
 msgstr "无效的日期格式:%s"
 
-#: builtin/commit.c:653
+#: 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:690 builtin/commit.c:723 builtin/commit.c:1080
+#: 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:702 builtin/shortlog.c:285
+#: builtin/commit.c:704 builtin/shortlog.c:286
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:704
+#: builtin/commit.c:706
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:708
+#: builtin/commit.c:710
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
 
-#: builtin/commit.c:730
-msgid "could not read MERGE_MSG"
-msgstr "不能读取 MERGE_MSG"
-
-#: builtin/commit.c:734
+#: builtin/commit.c:737 builtin/commit.c:745
 msgid "could not read SQUASH_MSG"
 msgstr "不能读取 SQUASH_MSG"
 
-#: builtin/commit.c:785
+#: builtin/commit.c:742
+msgid "could not read MERGE_MSG"
+msgstr "不能读取 MERGE_MSG"
+
+#: builtin/commit.c:796
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:803
+#: builtin/commit.c:814
 #, c-format
 msgid ""
 "\n"
@@ -5276,7 +6487,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:808
+#: builtin/commit.c:819
 #, c-format
 msgid ""
 "\n"
@@ -5290,7 +6501,7 @@ msgstr ""
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:821
+#: builtin/commit.c:832
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5299,7 +6510,7 @@ msgstr ""
 "请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:828
+#: builtin/commit.c:839
 #, c-format
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
@@ -5310,346 +6521,350 @@ msgstr ""
 "也可以删除它们。一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:848
+#: builtin/commit.c:859
 #, c-format
 msgid "%sAuthor:    %.*s <%.*s>"
 msgstr "%s作者:  %.*s <%.*s>"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:856
+#: builtin/commit.c:867
 #, c-format
 msgid "%sDate:      %s"
 msgstr "%s日期:  %s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:863
+#: builtin/commit.c:874
 #, c-format
 msgid "%sCommitter: %.*s <%.*s>"
 msgstr "%s提交者:%.*s <%.*s>"
 
-#: builtin/commit.c:881
+#: builtin/commit.c:892
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:938
+#: builtin/commit.c:954
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:953 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:1055
+#: 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:1070 builtin/commit.c:1310
+#: builtin/commit.c:1086 builtin/commit.c:1327
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1107
+#: builtin/commit.c:1124
 msgid "--long and -z are incompatible"
 msgstr "--long 和 -z 选项不兼容"
 
-#: builtin/commit.c:1137
+#: builtin/commit.c:1154
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1146
+#: builtin/commit.c:1163
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1149
+#: builtin/commit.c:1166
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1151
+#: builtin/commit.c:1168
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1154
+#: builtin/commit.c:1171
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1164
+#: builtin/commit.c:1181
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1166
+#: builtin/commit.c:1183
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1174
+#: 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:1191
+#: 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:1193
+#: builtin/commit.c:1210
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1195
+#: builtin/commit.c:1212
 msgid "Clever... amending the last one with dirty index."
 msgstr "聪明... 用脏索引修补最后一个提交。"
 
-#: builtin/commit.c:1197
+#: builtin/commit.c:1214
 msgid "Explicit paths specified without -i or -o; assuming --only paths..."
 msgstr "指定了明确的路径而没有使用 -i 或 -o 选项,认为是 --only paths..."
 
-#: builtin/commit.c:1209 builtin/tag.c:475
+#: builtin/commit.c:1226 builtin/tag.c:474
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1214
+#: builtin/commit.c:1231
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1324 builtin/commit.c:1605
+#: builtin/commit.c:1341 builtin/commit.c:1617
 msgid "show status concisely"
 msgstr "以简洁的格式显示状态"
 
-#: builtin/commit.c:1326 builtin/commit.c:1607
+#: builtin/commit.c:1343 builtin/commit.c:1619
 msgid "show branch information"
 msgstr "显示分支信息"
 
-#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:512
-#: builtin/worktree.c:430
+#: 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:1331 builtin/commit.c:1611
+#: builtin/commit.c:1348 builtin/commit.c:1623
 msgid "show status in long format (default)"
 msgstr "以长格式显示状态(默认)"
 
-#: builtin/commit.c:1334 builtin/commit.c:1614
+#: builtin/commit.c:1351 builtin/commit.c:1626
 msgid "terminate entries with NUL"
 msgstr "条目以 NUL 字符结尾"
 
-#: builtin/commit.c:1336 builtin/commit.c:1617 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:1337 builtin/commit.c:1617
+#: 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:1340
+#: builtin/commit.c:1357
 msgid "show ignored files"
 msgstr "显示忽略的文件"
 
-#: builtin/commit.c:1341 parse-options.h:155
+#: builtin/commit.c:1358 parse-options.h:155
 msgid "when"
 msgstr "何时"
 
-#: builtin/commit.c:1342
+#: builtin/commit.c:1359
 msgid ""
 "ignore changes to submodules, optional when: all, dirty, untracked. "
 "(Default: all)"
 msgstr ""
 "忽略子模组的更改,“何时”的可选参数:all、dirty、untracked。(默认:all)"
 
-#: builtin/commit.c:1344
+#: builtin/commit.c:1361
 msgid "list untracked files in columns"
 msgstr "以列的方式显示未跟踪的文件"
 
-#: builtin/commit.c:1430
+#: builtin/commit.c:1437
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1432
+#: builtin/commit.c:1439
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1477
+#: builtin/commit.c:1484
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1480
+#: builtin/commit.c:1487
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1587
 msgid "suppress summary after successful commit"
 msgstr "提交成功后不显示概述信息"
 
-#: builtin/commit.c:1576
+#: builtin/commit.c:1588
 msgid "show diff in commit message template"
 msgstr "在提交说明模板里显示差异"
 
-#: builtin/commit.c:1578
+#: builtin/commit.c:1590
 msgid "Commit message options"
 msgstr "提交说明选项"
 
-#: builtin/commit.c:1579 builtin/tag.c:351
+#: builtin/commit.c:1591 builtin/tag.c:351
 msgid "read message from file"
 msgstr "从文件中读取提交说明"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "author"
 msgstr "作者"
 
-#: builtin/commit.c:1580
+#: builtin/commit.c:1592
 msgid "override author for commit"
 msgstr "提交时覆盖作者"
 
-#: builtin/commit.c:1581 builtin/gc.c:326
+#: builtin/commit.c:1593 builtin/gc.c:326
 msgid "date"
 msgstr "日期"
 
-#: builtin/commit.c:1581
+#: builtin/commit.c:1593
 msgid "override date for commit"
 msgstr "提交时覆盖日期"
 
-#: builtin/commit.c:1582 builtin/merge.c:218 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:1582
+#: builtin/commit.c:1594
 msgid "commit message"
 msgstr "提交说明"
 
-#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
-#: builtin/commit.c:1586 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:1583
+#: builtin/commit.c:1595
 msgid "reuse and edit message from specified commit"
 msgstr "重用并编辑指定提交的提交说明"
 
-#: builtin/commit.c:1584
+#: builtin/commit.c:1596
 msgid "reuse message from specified commit"
 msgstr "重用指定提交的提交说明"
 
-#: builtin/commit.c:1585
+#: builtin/commit.c:1597
 msgid "use autosquash formatted message to fixup specified commit"
 msgstr "使用 autosquash 格式的提交说明用以修正指定的提交"
 
-#: builtin/commit.c:1586
+#: builtin/commit.c:1598
 msgid "use autosquash formatted message to squash specified commit"
 msgstr "使用 autosquash 格式的提交说明用以压缩至指定的提交"
 
-#: builtin/commit.c:1587
+#: builtin/commit.c:1599
 msgid "the commit is authored by me now (used with -C/-c/--amend)"
 msgstr "现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)"
 
-#: builtin/commit.c:1588 builtin/log.c:1219 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:1589
+#: builtin/commit.c:1601
 msgid "use specified template file"
 msgstr "使用指定的模板文件"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1602
 msgid "force edit of commit"
 msgstr "强制编辑提交"
 
 #  译者:可选值,不能翻译(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1591
+#: builtin/commit.c:1603
 msgid "default"
 msgstr "default"
 
-#: builtin/commit.c:1591 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:1592
+#: builtin/commit.c:1604
 msgid "include status in commit message template"
 msgstr "在提交说明模板里包含状态信息"
 
-#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:160
+#: 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:1597
+#: builtin/commit.c:1609
 msgid "Commit contents options"
 msgstr "提交内容选项"
 
-#: builtin/commit.c:1598
+#: builtin/commit.c:1610
 msgid "commit all changed files"
 msgstr "提交所有改动的文件"
 
-#: builtin/commit.c:1599
+#: builtin/commit.c:1611
 msgid "add specified files to index for commit"
 msgstr "添加指定的文件到索引区等待提交"
 
-#: builtin/commit.c:1600
+#: builtin/commit.c:1612
 msgid "interactively add files"
 msgstr "交互式添加文件"
 
-#: builtin/commit.c:1601
+#: builtin/commit.c:1613
 msgid "interactively add changes"
 msgstr "交互式添加变更"
 
-#: builtin/commit.c:1602
+#: builtin/commit.c:1614
 msgid "commit only specified files"
 msgstr "只提交指定的文件"
 
-#: builtin/commit.c:1603
-msgid "bypass pre-commit hook"
-msgstr "绕过 pre-commit 钩子"
+#: builtin/commit.c:1615
+msgid "bypass pre-commit and commit-msg hooks"
+msgstr "绕过 pre-commit 和 commit-msg 钩子"
 
-#: builtin/commit.c:1604
+#: builtin/commit.c:1616
 msgid "show what would be committed"
 msgstr "显示将要提交的内容"
 
-#: builtin/commit.c:1615
+#: builtin/commit.c:1627
 msgid "amend previous commit"
 msgstr "修改先前的提交"
 
-#: builtin/commit.c:1616
+#: builtin/commit.c:1628
 msgid "bypass post-rewrite hook"
 msgstr "绕过 post-rewrite 钩子"
 
-#: builtin/commit.c:1621
+#: builtin/commit.c:1633
 msgid "ok to record an empty change"
 msgstr "允许一个空提交"
 
-#: builtin/commit.c:1623
+#: builtin/commit.c:1635
 msgid "ok to record a change with an empty message"
 msgstr "允许空的提交说明"
 
-#: builtin/commit.c:1652
+#: builtin/commit.c:1664
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1698
+#: builtin/commit.c:1712
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1705
+#: builtin/commit.c:1719
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1724
+#: builtin/commit.c:1738
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1735
+#: builtin/commit.c:1749
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1740
+#: builtin/commit.c:1754
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1788
+#: 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"
@@ -5662,139 +6877,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 "数据对象 ID"
 
-#: 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 "获取值:name [value-regex]"
 
-#: builtin/config.c:64
+#: builtin/config.c:63
 msgid "get all values: key [value-regex]"
 msgstr "获得所有的值:key [value-regex]"
 
-#: builtin/config.c:65
+#: builtin/config.c:64
 msgid "get values for regexp: name-regex [value-regex]"
 msgstr "根据正则表达式获得值:name-regex [value-regex]"
 
-#: builtin/config.c:66
+#: builtin/config.c:65
 msgid "get value specific for the URL: section[.var] URL"
 msgstr "获得 URL 取值:section[.var] URL"
 
-#: builtin/config.c:67
+#: builtin/config.c:66
 msgid "replace all matching variables: name value [value_regex]"
 msgstr "替换所有匹配的变量:name value [value_regex]"
 
-#: builtin/config.c:68
+#: builtin/config.c:67
 msgid "add a new variable: name value"
 msgstr "添加一个新的变量:name value"
 
-#: builtin/config.c:69
+#: builtin/config.c:68
 msgid "remove a variable: name [value-regex]"
 msgstr "删除一个变量:name [value-regex]"
 
-#: builtin/config.c:70
+#: builtin/config.c:69
 msgid "remove all matches: name [value-regex]"
 msgstr "删除所有匹配项:name [value-regex]"
 
-#: builtin/config.c:71
+#: builtin/config.c:70
 msgid "rename section: old-name new-name"
 msgstr "重命名小节:old-name new-name"
 
-#: builtin/config.c:72
+#: builtin/config.c:71
 msgid "remove a section: name"
 msgstr "删除一个小节:name"
 
-#: 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-is-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 or --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 "终止值是 NUL 字节"
 
-#: 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:469
+#: builtin/config.c:471
 #, c-format
 msgid ""
 "# This is Git's per-user configuration file.\n"
@@ -5809,16 +7024,25 @@ msgstr ""
 "#\tname = %s\n"
 "#\temail = %s\n"
 
-#: builtin/config.c:611
+#: 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 "以用户可读的格式显示大小"
 
@@ -5845,7 +7069,7 @@ msgstr "附注标签 %s 没有嵌入名称"
 msgid "tag '%s' is really '%s' here"
 msgstr "标签 '%s' 的确是在 '%s'"
 
-#: builtin/describe.c:250 builtin/log.c:459
+#: builtin/describe.c:250 builtin/log.c:480
 #, c-format
 msgid "Not a valid object name %s"
 msgstr "不是一个有效的对象名 %s"
@@ -5938,7 +7162,7 @@ msgstr "考虑最近 <n> 个标签(默认:10)"
 msgid "only consider tags matching <pattern>"
 msgstr "只考虑匹配 <模式> 的标签"
 
-#: builtin/describe.c:410 builtin/name-rev.c:314
+#: builtin/describe.c:410 builtin/name-rev.c:320
 msgid "show abbreviated commit object as fallback"
 msgstr "显示简写的提交号作为后备"
 
@@ -5972,21 +7196,21 @@ msgstr "'%s':不是一个正规文件或符号链接"
 msgid "invalid option: %s"
 msgstr "无效选项:%s"
 
-#: builtin/diff.c:358
+#: builtin/diff.c:361
 msgid "Not a git repository"
 msgstr "不是一个 git 仓库"
 
-#: builtin/diff.c:401
+#: builtin/diff.c:404
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "提供了无效对象 '%s'。"
 
-#: builtin/diff.c:410
+#: builtin/diff.c:413
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "提供了超过两个数据对象:'%s'"
 
-#: builtin/diff.c:417
+#: builtin/diff.c:420
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "无法处理的对象 '%s'。"
@@ -6043,183 +7267,182 @@ 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:166
+#: builtin/fetch.c:95 builtin/pull.c:175
 msgid "fetch from all remotes"
 msgstr "从所有的远程抓取"
 
-#: builtin/fetch.c:94 builtin/pull.c:169
+#: 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:172
+#: builtin/fetch.c:99 builtin/pull.c:181
 msgid "path to upload pack on remote end"
 msgstr "上传包到远程的路径"
 
-#: builtin/fetch.c:97 builtin/pull.c:174
+#: 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:176
+#: 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:179
+#: 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:182
+#: builtin/fetch.c:111 builtin/pull.c:191
 msgid "on-demand"
 msgstr "on-demand"
 
-#: builtin/fetch.c:109 builtin/pull.c:183
+#: builtin/fetch.c:112 builtin/pull.c:192
 msgid "control recursive fetching of submodules"
 msgstr "控制子模组的递归抓取"
 
-#: builtin/fetch.c:113 builtin/pull.c:191
+#: 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:194
+#: builtin/fetch.c:121 builtin/fetch.c:127 builtin/pull.c:203
 msgid "deepen history of shallow clone"
 msgstr "深化浅克隆的历史"
 
-#: builtin/fetch.c:120 builtin/pull.c:197
+#: 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:122 builtin/log.c:1236
+#: 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:200
+#: 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:202
+#: builtin/fetch.c:138 builtin/pull.c:211
 msgid "refmap"
 msgstr "引用映射"
 
-#: builtin/fetch.c:130 builtin/pull.c:203
+#: 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:610 builtin/fetch.c:851
-#, c-format
-msgid "cannot open %s: %s\n"
-msgstr "无法打开 %s:%s\n"
+#: 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"
@@ -6229,87 +7452,95 @@ 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 "选项 \"%s\" 的值 \"%s\" 对于 %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 "获取组并指定引用规格没有意义"
 
@@ -6318,23 +7549,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 "从文件中读取"
 
@@ -6394,63 +7625,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:553
+#: builtin/fsck.c:588
 msgid "git fsck [<options>] [<object>...]"
 msgstr "git fsck [<选项>] [<对象>...]"
 
-#: builtin/fsck.c:559
+#: builtin/fsck.c:594
 msgid "show unreachable objects"
 msgstr "显示不可达的对象"
 
-#: builtin/fsck.c:560
+#: builtin/fsck.c:595
 msgid "show dangling objects"
 msgstr "显示摇摆的对象"
 
-#: builtin/fsck.c:561
+#: builtin/fsck.c:596
 msgid "report tags"
 msgstr "报告标签"
 
-#: builtin/fsck.c:562
+#: builtin/fsck.c:597
 msgid "report root nodes"
 msgstr "报告根节点"
 
-#: builtin/fsck.c:563
+#: builtin/fsck.c:598
 msgid "make index objects head nodes"
 msgstr "将索引亦作为检查的头节点"
 
-#: builtin/fsck.c:564
+#: builtin/fsck.c:599
 msgid "make reflogs head nodes (default)"
 msgstr "将引用日志作为检查的头节点(默认)"
 
-#: builtin/fsck.c:565
+#: builtin/fsck.c:600
 msgid "also consider packs and alternate objects"
 msgstr "也考虑包和备用对象"
 
-#: builtin/fsck.c:566
+#: builtin/fsck.c:601
 msgid "check only connectivity"
 msgstr "仅检查连通性"
 
-#: builtin/fsck.c:567
+#: builtin/fsck.c:602
 msgid "enable more strict checking"
 msgstr "启用更严格的检查"
 
-#: builtin/fsck.c:569
+#: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "将摇摆对象写入 .git/lost-found 中"
 
-#: builtin/fsck.c:570 builtin/prune.c:107
+#: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "显示进度"
 
-#: builtin/fsck.c:631
+#: builtin/fsck.c:606
+msgid "show verbose names for reachable objects"
+msgstr "显示可达对象的详细名称"
+
+#: builtin/fsck.c:665
 msgid "Checking objects"
 msgstr "检查对象中"
 
@@ -6539,225 +7770,220 @@ msgstr "grep:无法创建线程:%s"
 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: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 "无法抓取来自于 %s 类型的对象"
 
-#: builtin/grep.c:558
+#: builtin/grep.c:561
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "开关 `%c' 期望一个数字值"
 
-#: builtin/grep.c:575
-#, c-format
-msgid "cannot open '%s'"
-msgstr "不能打开 '%s'"
-
-#: builtin/grep.c:644
+#: builtin/grep.c:647
 msgid "search in index instead of in the work tree"
 msgstr "在索引区搜索而不是在工作区"
 
-#: builtin/grep.c:646
+#: builtin/grep.c:649
 msgid "find in contents not managed by git"
 msgstr "在未被 git 管理的内容中查找"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/grep.c:648
+#: builtin/grep.c:651
 msgid "search in both tracked and untracked files"
 msgstr "在跟踪和未跟踪的文件中搜索"
 
-#: builtin/grep.c:650
+#: builtin/grep.c:653
 msgid "ignore files specified via '.gitignore'"
 msgstr "忽略 '.gitignore' 包含的文件"
 
-#: builtin/grep.c:653
+#: builtin/grep.c:656
 msgid "show non-matching lines"
 msgstr "显示未匹配的行"
 
-#: builtin/grep.c:655
+#: builtin/grep.c:658
 msgid "case insensitive matching"
 msgstr "不区分大小写匹配"
 
-#: builtin/grep.c:657
+#: builtin/grep.c:660
 msgid "match patterns only at word boundaries"
 msgstr "只在单词边界匹配模式"
 
-#: builtin/grep.c:659
+#: builtin/grep.c:662
 msgid "process binary files as text"
 msgstr "把二进制文件当做文本处理"
 
-#: builtin/grep.c:661
+#: builtin/grep.c:664
 msgid "don't match patterns in binary files"
 msgstr "不在二进制文件中匹配模式"
 
-#: builtin/grep.c:664
+#: builtin/grep.c:667
 msgid "process binary files with textconv filters"
 msgstr "用 textconv 过滤器处理二进制文件"
 
-#: builtin/grep.c:666
+#: builtin/grep.c:669
 msgid "descend at most <depth> levels"
 msgstr "最多以指定的深度向下寻找"
 
-#: builtin/grep.c:670
+#: builtin/grep.c:673
 msgid "use extended POSIX regular expressions"
 msgstr "使用扩展的 POSIX 正则表达式"
 
-#: builtin/grep.c:673
+#: builtin/grep.c:676
 msgid "use basic POSIX regular expressions (default)"
 msgstr "使用基本的 POSIX 正则表达式(默认)"
 
-#: builtin/grep.c:676
+#: builtin/grep.c:679
 msgid "interpret patterns as fixed strings"
 msgstr "把模式解析为固定的字符串"
 
-#: builtin/grep.c:679
+#: builtin/grep.c:682
 msgid "use Perl-compatible regular expressions"
 msgstr "使用 Perl 兼容的正则表达式"
 
-#: builtin/grep.c:682
+#: builtin/grep.c:685
 msgid "show line numbers"
 msgstr "显示行号"
 
-#: builtin/grep.c:683
+#: builtin/grep.c:686
 msgid "don't show filenames"
 msgstr "不显示文件名"
 
-#: builtin/grep.c:684
+#: builtin/grep.c:687
 msgid "show filenames"
 msgstr "显示文件名"
 
-#: builtin/grep.c:686
+#: builtin/grep.c:689
 msgid "show filenames relative to top directory"
 msgstr "显示相对于顶级目录的文件名"
 
-#: builtin/grep.c:688
+#: builtin/grep.c:691
 msgid "show only filenames instead of matching lines"
 msgstr "只显示文件名而不显示匹配的行"
 
-#: builtin/grep.c:690
+#: builtin/grep.c:693
 msgid "synonym for --files-with-matches"
 msgstr "和 --files-with-matches 同义"
 
-#: builtin/grep.c:693
+#: builtin/grep.c:696
 msgid "show only the names of files without match"
 msgstr "只显示未匹配的文件名"
 
-#: builtin/grep.c:695
+#: builtin/grep.c:698
 msgid "print NUL after filenames"
 msgstr "在文件名后输出 NUL 字符"
 
-#: builtin/grep.c:697
+#: builtin/grep.c:700
 msgid "show the number of matches instead of matching lines"
 msgstr "显示总匹配行数,而不显示匹配的行"
 
-#: builtin/grep.c:698
+#: builtin/grep.c:701
 msgid "highlight matches"
 msgstr "高亮显示匹配项"
 
-#: builtin/grep.c:700
+#: builtin/grep.c:703
 msgid "print empty line between matches from different files"
 msgstr "在不同文件的匹配项之间打印空行"
 
-#: builtin/grep.c:702
+#: builtin/grep.c:705
 msgid "show filename only once above matches from same file"
 msgstr "只在同一文件的匹配项的上面显示一次文件名"
 
-#: builtin/grep.c:705
+#: builtin/grep.c:708
 msgid "show <n> context lines before and after matches"
 msgstr "显示匹配项前后的 <n> 行上下文"
 
-#: builtin/grep.c:708
+#: builtin/grep.c:711
 msgid "show <n> context lines before matches"
 msgstr "显示匹配项前 <n> 行上下文"
 
-#: builtin/grep.c:710
+#: builtin/grep.c:713
 msgid "show <n> context lines after matches"
 msgstr "显示匹配项后 <n> 行上下文"
 
-#: builtin/grep.c:712
+#: builtin/grep.c:715
 msgid "use <n> worker threads"
 msgstr "使用 <n> 个工作线程"
 
-#: builtin/grep.c:713
+#: builtin/grep.c:716
 msgid "shortcut for -C NUM"
 msgstr "快捷键 -C 数字"
 
-#: builtin/grep.c:716
+#: builtin/grep.c:719
 msgid "show a line with the function name before matches"
 msgstr "在匹配的前面显示一行函数名"
 
-#: builtin/grep.c:718
+#: builtin/grep.c:721
 msgid "show the surrounding function"
 msgstr "显示所在函数的前后内容"
 
-#: builtin/grep.c:721
+#: builtin/grep.c:724
 msgid "read patterns from file"
 msgstr "从文件读取模式"
 
-#: builtin/grep.c:723
+#: builtin/grep.c:726
 msgid "match <pattern>"
 msgstr "匹配 <模式>"
 
-#: builtin/grep.c:725
+#: builtin/grep.c:728
 msgid "combine patterns specified with -e"
 msgstr "组合用 -e 参数设定的模式"
 
-#: builtin/grep.c:737
+#: builtin/grep.c:740
 msgid "indicate hit with exit status without output"
 msgstr "不输出,而用退出码标识命中状态"
 
-#: builtin/grep.c:739
+#: builtin/grep.c:742
 msgid "show only matches from files that match all patterns"
 msgstr "只显示匹配所有模式的文件中的匹配"
 
-#: builtin/grep.c:741
+#: builtin/grep.c:744
 msgid "show parse tree for grep expression"
 msgstr "显示 grep 表达式的解析树"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "pager"
 msgstr "分页"
 
-#: builtin/grep.c:745
+#: builtin/grep.c:748
 msgid "show matching files in the pager"
 msgstr "分页显示匹配的文件"
 
-#: builtin/grep.c:748
+#: builtin/grep.c:751
 msgid "allow calling of grep(1) (ignored by this build)"
 msgstr "允许调用 grep(1)(本次构建忽略)"
 
-#: builtin/grep.c:811
+#: builtin/grep.c:814
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:843 builtin/index-pack.c:1475
+#: builtin/grep.c:846 builtin/index-pack.c:1480
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "指定的线程数无效(%d)"
 
-#: builtin/grep.c:873
+#: builtin/grep.c:876
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:902
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:904
+#: builtin/grep.c:907
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 或 --untracked 不能和版本同时使用。"
 
-#: builtin/grep.c:907
+#: builtin/grep.c:910
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:915
+#: builtin/grep.c:918
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
@@ -6773,83 +7999,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': %s"
-msgstr "无法执行 '%s':%s"
+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"
@@ -6858,7 +8088,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"
@@ -6867,430 +8097,431 @@ 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"
+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"
+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"
 msgstr[0] "无法填充 %d 字节"
 msgstr[1] "无法填充 %d 字节"
 
-#: builtin/index-pack.c:277
+#: builtin/index-pack.c:279
 msgid "early EOF"
 msgstr "过早的文件结束符(EOF)"
 
-#: 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 "包中有错误的对象位于 %lu:%s"
+msgid "pack has bad object at offset %<PRIuMAX>: %s"
+msgstr "包中有错误的对象位于偏移量 %<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 "偏移值覆盖了 delta 基准对象"
 
-#: builtin/index-pack.c:530
+#: builtin/index-pack.c:535
 msgid "delta base offset is out of bound"
 msgstr "delta 基准偏移越界"
 
-#: 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 "无法读取包文件"
 
-#: 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 字节"
+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: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 "发现 %s 出现 SHA1 冲突!"
 
-#: 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 "无法应用 delta"
 
-#: 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 "不能枚举包文件状态"
 
-#: 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 "处理 delta 中"
 
-#: 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 objects"
-msgstr "完成 %d 个本地对象"
+msgid "completed with %d local object"
+msgid_plural "completed with %d local objects"
+msgstr[0] "完成 %d 个本地对象"
+msgstr[1] "完成 %d 个本地对象"
 
-#: builtin/index-pack.c:1263
+#: builtin/index-pack.c:1268
 #, c-format
 msgid "Unexpected tail checksum for %s (disk corruption?)"
 msgstr "对 %s 的尾部校验出现意外(磁盘损坏?)"
 
-#: builtin/index-pack.c:1267
+#: builtin/index-pack.c:1272
 #, 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:1291
+#: builtin/index-pack.c:1296
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "不能压缩附加对象(%d)"
 
-#: builtin/index-pack.c:1367
+#: builtin/index-pack.c:1372
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "本地对象 %s 已损坏"
 
-#: builtin/index-pack.c:1391
+#: builtin/index-pack.c:1396
 msgid "error while closing pack file"
 msgstr "关闭包文件时出错"
 
-#: builtin/index-pack.c:1404
+#: builtin/index-pack.c:1409
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "无法写保留文件 '%s'"
 
-#: builtin/index-pack.c:1412
+#: builtin/index-pack.c:1417
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "无法关闭保留文件 '%s'"
 
-#: builtin/index-pack.c:1425
+#: builtin/index-pack.c:1430
 msgid "cannot store pack file"
 msgstr "无法存储包文件"
 
-#: builtin/index-pack.c:1436
+#: builtin/index-pack.c:1441
 msgid "cannot store index file"
 msgstr "无法存储索引文件"
 
-#: builtin/index-pack.c:1469
+#: builtin/index-pack.c:1474
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "坏的 pack.indexversion=%<PRIu32>"
 
-#: builtin/index-pack.c:1479 builtin/index-pack.c:1664
+#: builtin/index-pack.c:1484 builtin/index-pack.c:1681
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "没有线程支持,忽略 %s"
 
-#: builtin/index-pack.c:1538
+#: builtin/index-pack.c:1542
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "无法打开现存包文件 '%s'"
 
-#: builtin/index-pack.c:1540
+#: builtin/index-pack.c:1544
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "无法为 %s 打开包索引文件"
 
-#: builtin/index-pack.c:1587
+#: builtin/index-pack.c:1591
 #, 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:1594
+#: builtin/index-pack.c:1598
 #, 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:1624
-msgid "Cannot come back to cwd"
-msgstr "无法返回当前工作目录"
+#: builtin/index-pack.c:1611
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "包文件名 '%s' 没有以 '.pack' 结尾"
 
-#: builtin/index-pack.c:1676 builtin/index-pack.c:1679
-#: builtin/index-pack.c:1691 builtin/index-pack.c:1695
+#: 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:1709
+#: builtin/index-pack.c:1732
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 不能和 --stdin 同时使用"
 
-#: builtin/index-pack.c:1713 builtin/index-pack.c:1722
-#, c-format
-msgid "packfile name '%s' does not end with '.pack'"
-msgstr "包文件名 '%s' 没有以 '.pack' 结尾"
-
-#: builtin/index-pack.c:1730
+#: 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 "不能枚举 '%s' 状态"
 
-#: builtin/init-db.c:61
+#: builtin/init-db.c:60
 #, c-format
 msgid "cannot stat template '%s'"
 msgstr "不能枚举模版 '%s' 状态"
 
-#: 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:118
+#: builtin/init-db.c:119
 #, c-format
 msgid "templates not found %s"
 msgstr "模版未找到 %s"
 
-#: builtin/init-db.c:131
-#, c-format
-msgid "not copying templates of a wrong format version %d from '%s'"
-msgstr "没有从 '%2$s' 复制带有错误版本 %1$d 的模版"
-
-#: builtin/init-db.c:309 builtin/init-db.c:312
+#: builtin/init-db.c:134
 #, c-format
-msgid "%s already exists"
-msgstr "%s 已经存在"
+msgid "not copying templates from '%s': %s"
+msgstr "没有从 '%s' 复制模版:%s"
 
-#: builtin/init-db.c:340
+#: builtin/init-db.c:327
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "不能处理 %d 类型的文件"
 
-#: builtin/init-db.c:343
+#: 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:399
+#: 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:400
-msgid "Reinitialized existing"
-msgstr "重新初始化现存的"
+#: 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:400
-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:401
-msgid " shared"
-msgstr "å\85±äº«"
+#: builtin/init-db.c:409
+#, c-format
+msgid "Initialized empty Git repository in %s%s\n"
+msgstr "å·²å\88\9då§\8bå\8c\96空ç\9a\84 Git ä»\93åº\93äº\8e %s%s\n"
 
-#: builtin/init-db.c:448
+#: builtin/init-db.c:457
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -7298,32 +8529,32 @@ msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<模板目录>] [--shared[=<权限>]] "
 "[<目录>]"
 
-#: builtin/init-db.c:471
+#: builtin/init-db.c:480
 msgid "permissions"
 msgstr "权限"
 
-#: builtin/init-db.c:472
+#: builtin/init-db.c:481
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "指定 git 仓库是多个用户之间共享的"
 
-#: builtin/init-db.c:506 builtin/init-db.c:511
+#: builtin/init-db.c:515 builtin/init-db.c:520
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "不能创建目录 %s"
 
-#: builtin/init-db.c:515
+#: builtin/init-db.c:524
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "不能切换目录到 %s"
 
-#: builtin/init-db.c:536
+#: 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:564
+#: builtin/init-db.c:573
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "不能访问工作区 '%s'"
@@ -7356,379 +8587,430 @@ 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:131
+#: builtin/log.c:139
 msgid "suppress diff output"
 msgstr "不显示差异输出"
 
-#: builtin/log.c:132
+#: builtin/log.c:140
 msgid "show source"
 msgstr "显示源"
 
-#: builtin/log.c:133
+#: builtin/log.c:141
 msgid "Use mail map file"
 msgstr "使用邮件映射文件"
 
-#: builtin/log.c:134
+#: builtin/log.c:142
 msgid "decorate options"
 msgstr "修饰选项"
 
-#: builtin/log.c:137
+#: builtin/log.c:145
 msgid "Process line range n,m in file, counting from 1"
 msgstr "处理文件中第 n 到 m 之间的行,从 1 开始"
 
-#: builtin/log.c:233
+#: builtin/log.c:241
 #, c-format
 msgid "Final output: %d %s\n"
 msgstr "最终输出:%d %s\n"
 
-#: builtin/log.c:465
+#: builtin/log.c:486
 #, c-format
 msgid "git show %s: bad file"
 msgstr "git show %s: 损坏的文件"
 
-#: builtin/log.c:479 builtin/log.c:572
+#: builtin/log.c:500 builtin/log.c:594
 #, c-format
 msgid "Could not read object %s"
 msgstr "不能读取对象 %s"
 
-#: builtin/log.c:596
+#: builtin/log.c:618
 #, c-format
 msgid "Unknown type: %d"
 msgstr "未知类型:%d"
 
-#: builtin/log.c:715
+#: builtin/log.c:739
 msgid "format.headers without value"
 msgstr "format.headers 没有值"
 
-#: builtin/log.c:801
+#: builtin/log.c:839
 msgid "name of output directory is too long"
 msgstr "输出目录名太长"
 
-#: builtin/log.c:816
+#: builtin/log.c:854
 #, c-format
 msgid "Cannot open patch file %s"
 msgstr "无法打开补丁文件 %s"
 
-#: builtin/log.c:830
+#: builtin/log.c:868
 msgid "Need exactly one range."
 msgstr "只需要一个范围。"
 
-#: builtin/log.c:840
+#: builtin/log.c:878
 msgid "Not a range."
 msgstr "不是一个范围。"
 
-#: builtin/log.c:946
+#: builtin/log.c:984
 msgid "Cover letter needs email format"
 msgstr "信封需要邮件地址格式"
 
-#: builtin/log.c:1025
+#: builtin/log.c:1063
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "不正常的 in-reply-to:%s"
 
-#: builtin/log.c:1053
+#: builtin/log.c:1091
 msgid "git format-patch [<options>] [<since> | <revision-range>]"
 msgstr "git format-patch [<选项>] [<从> | <版本范围>]"
 
-#: builtin/log.c:1098
+#: builtin/log.c:1141
 msgid "Two output directories?"
 msgstr "两个输出目录?"
 
-#: builtin/log.c:1214
+#: 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: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:1263
+msgid "Could not find exact merge base."
+msgstr "不能找到准确的合并基线。"
+
+#: 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 ""
+"无法得到上游地址,如果你想自动记录基线提交,请使用命令\n"
+"git branch --set-upstream-to 来跟踪一个远程分支。或者你可以通过\n"
+"参数 --base=<base-commit-id> 手动指定一个基线提交。"
+
+#: builtin/log.c:1287
+msgid "Failed to find exact merge base"
+msgstr "无法找到准确的合并基线"
+
+#: builtin/log.c:1298
+msgid "base commit should be the ancestor of revision list"
+msgstr "基线提交应该是版本列表的祖先"
+
+#: builtin/log.c:1302
+msgid "base commit shouldn't be in revision list"
+msgstr "基线提交不应该出现在版本列表中"
+
+#: builtin/log.c:1351
+msgid "cannot get patch id"
+msgstr "无法得到补丁 id"
+
+#: builtin/log.c:1408
 msgid "use [PATCH n/m] even with a single patch"
 msgstr "使用 [PATCH n/m],即使只有一个补丁"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1411
 msgid "use [PATCH] even with multiple patches"
 msgstr "使用 [PATCH],即使有多个补丁"
 
-#: builtin/log.c:1221
+#: builtin/log.c:1415
 msgid "print patches to standard out"
 msgstr "打印补丁到标准输出"
 
-#: builtin/log.c:1223
+#: builtin/log.c:1417
 msgid "generate a cover letter"
 msgstr "生成一封附信"
 
-#: builtin/log.c:1225
+#: builtin/log.c:1419
 msgid "use simple number sequence for output file names"
 msgstr "使用简单的数字序列作为输出文件名"
 
-#: builtin/log.c:1226
+#: builtin/log.c:1420
 msgid "sfx"
 msgstr "后缀"
 
-#: builtin/log.c:1227
+#: builtin/log.c:1421
 msgid "use <sfx> instead of '.patch'"
 msgstr "使用 <后缀> 代替 '.patch'"
 
-#: builtin/log.c:1229
+#: builtin/log.c:1423
 msgid "start numbering patches at <n> instead of 1"
 msgstr "补丁以 <n> 开始编号,而不是1"
 
-#: builtin/log.c:1231
+#: builtin/log.c:1425
 msgid "mark the series as Nth re-roll"
 msgstr "标记补丁系列是第几次重制"
 
-#: builtin/log.c:1233
+#: 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:1236
+#: builtin/log.c:1433
 msgid "store resulting files in <dir>"
 msgstr "把结果文件存储在 <目录>"
 
-#: builtin/log.c:1239
+#: builtin/log.c:1436
 msgid "don't strip/add [PATCH]"
 msgstr "不删除/添加 [PATCH]"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1439
 msgid "don't output binary diffs"
 msgstr "不输出二进制差异"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1441
 msgid "output all-zero hash in From header"
 msgstr "在 From 头信息中输出全为零的哈希值"
 
-#: builtin/log.c:1246
+#: builtin/log.c:1443
 msgid "don't include a patch matching a commit upstream"
 msgstr "不包含已在上游提交中的补丁"
 
-#: builtin/log.c:1248
+#: builtin/log.c:1445
 msgid "show patch format instead of default (patch + stat)"
 msgstr "显示纯补丁格式而非默认的(补丁+状态)"
 
-#: builtin/log.c:1250
+#: builtin/log.c:1447
 msgid "Messaging"
 msgstr "邮件发送"
 
-#: builtin/log.c:1251
+#: builtin/log.c:1448
 msgid "header"
 msgstr "header"
 
-#: builtin/log.c:1252
+#: builtin/log.c:1449
 msgid "add email header"
 msgstr "添加邮件头"
 
-#: builtin/log.c:1253 builtin/log.c:1255
+#: builtin/log.c:1450 builtin/log.c:1452
 msgid "email"
 msgstr "邮件地址"
 
-#: builtin/log.c:1253
+#: builtin/log.c:1450
 msgid "add To: header"
 msgstr "添加收件人"
 
-#: builtin/log.c:1255
+#: builtin/log.c:1452
 msgid "add Cc: header"
 msgstr "添加抄送"
 
-#: builtin/log.c:1257
+#: builtin/log.c:1454
 msgid "ident"
 msgstr "标识"
 
-#: builtin/log.c:1258
+#: builtin/log.c:1455
 msgid "set From address to <ident> (or committer ident if absent)"
 msgstr "将 From 地址设置为 <标识>(如若不提供,则用提交者 ID 做为地址)"
 
-#: builtin/log.c:1260
+#: builtin/log.c:1457
 msgid "message-id"
 msgstr "邮件标识"
 
-#: builtin/log.c:1261
+#: builtin/log.c:1458
 msgid "make first mail a reply to <message-id>"
 msgstr "使第一封邮件作为对 <邮件标识> 的回复"
 
-#: builtin/log.c:1262 builtin/log.c:1265
+#: builtin/log.c:1459 builtin/log.c:1462
 msgid "boundary"
 msgstr "边界"
 
-#: builtin/log.c:1263
+#: builtin/log.c:1460
 msgid "attach the patch"
 msgstr "附件方式添加补丁"
 
-#: builtin/log.c:1266
+#: builtin/log.c:1463
 msgid "inline the patch"
 msgstr "内联显示补丁"
 
-#: builtin/log.c:1270
+#: builtin/log.c:1467
 msgid "enable message threading, styles: shallow, deep"
 msgstr "启用邮件线索,风格:浅,深"
 
-#: builtin/log.c:1272
+#: builtin/log.c:1469
 msgid "signature"
 msgstr "签名"
 
-#: builtin/log.c:1273
+#: builtin/log.c:1470
 msgid "add a signature"
 msgstr "添加一个签名"
 
-#: builtin/log.c:1275
+#: builtin/log.c:1471
+msgid "base-commit"
+msgstr "基线提交"
+
+#: builtin/log.c:1472
+msgid "add prerequisite tree info to the patch series"
+msgstr "为补丁列表添加前置树信息"
+
+#: builtin/log.c:1474
 msgid "add a signature from a file"
 msgstr "从文件添加一个签名"
 
-#: builtin/log.c:1276
+#: builtin/log.c:1475
 msgid "don't print the patch filenames"
 msgstr "不要打印补丁文件名"
 
-#: builtin/log.c:1365
+#: builtin/log.c:1565
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 和 -k 互斥。"
 
-#: builtin/log.c:1367
-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:1375
+#: builtin/log.c:1575
 msgid "--name-only does not make sense"
 msgstr "--name-only 无意义"
 
-#: builtin/log.c:1377
+#: builtin/log.c:1577
 msgid "--name-status does not make sense"
 msgstr "--name-status 无意义"
 
-#: builtin/log.c:1379
+#: builtin/log.c:1579
 msgid "--check does not make sense"
 msgstr "--check 无意义"
 
-#: builtin/log.c:1407
+#: builtin/log.c:1609
 msgid "standard output, or directory, which one?"
 msgstr "标准输出或目录,哪一个?"
 
-#: builtin/log.c:1409
+#: builtin/log.c:1611
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/log.c:1506
+#: builtin/log.c:1705
 #, c-format
 msgid "unable to read signature file '%s'"
 msgstr "无法读取签名文件 '%s'"
 
-#: builtin/log.c:1569
+#: builtin/log.c:1777
 msgid "Failed to create output files"
 msgstr "无法创建输出文件"
 
-#: builtin/log.c:1617
+#: builtin/log.c:1826
 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
 msgstr "git cherry [-v] [<上游> [<头> [<限制>]]]"
 
-#: builtin/log.c:1671
+#: builtin/log.c:1880
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "不能找到跟踪的远程分支,请手工指定 <上游>。\n"
 
-#: builtin/log.c:1682 builtin/log.c:1684 builtin/log.c:1696
-#, c-format
-msgid "Unknown commit %s"
-msgstr "未知提交 %s"
-
-#: 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 "显示 resolve-undo 信息"
 
-#: 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 "显示调试数据"
 
@@ -7814,183 +9096,173 @@ 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:100
+#: builtin/merge.c:102
 msgid "switch `m' requires a value"
 msgstr "开关 `m' 需要一个值"
 
-#: builtin/merge.c:137
+#: builtin/merge.c:139
 #, c-format
 msgid "Could not find merge strategy '%s'.\n"
 msgstr "不能找到合并策略 '%s'。\n"
 
-#: builtin/merge.c:138
+#: builtin/merge.c:140
 #, c-format
 msgid "Available strategies are:"
 msgstr "可用的策略有:"
 
-#: builtin/merge.c:143
+#: builtin/merge.c:145
 #, c-format
 msgid "Available custom strategies are:"
 msgstr "可用的自定义策略有:"
 
-#: builtin/merge.c:193 builtin/pull.c:123
+#: builtin/merge.c:195 builtin/pull.c:127
 msgid "do not show a diffstat at the end of the merge"
 msgstr "在合并的最后不显示差异统计"
 
-#: builtin/merge.c:196 builtin/pull.c:126
+#: builtin/merge.c:198 builtin/pull.c:130
 msgid "show a diffstat at the end of the merge"
 msgstr "在合并的最后显示差异统计"
 
-#: builtin/merge.c:197 builtin/pull.c:129
+#: builtin/merge.c:199 builtin/pull.c:133
 msgid "(synonym to --stat)"
 msgstr "(和 --stat 同义)"
 
-#: builtin/merge.c:199 builtin/pull.c:132
+#: 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:202 builtin/pull.c:135
+#: builtin/merge.c:204 builtin/pull.c:139
 msgid "create a single commit instead of doing a merge"
 msgstr "创建一个单独的提交而不是做一次合并"
 
-#: builtin/merge.c:204 builtin/pull.c:138
+#: builtin/merge.c:206 builtin/pull.c:142
 msgid "perform a commit if the merge succeeds (default)"
 msgstr "如果合并成功,执行一次提交(默认)"
 
-#: builtin/merge.c:206 builtin/pull.c:141
+#: builtin/merge.c:208 builtin/pull.c:145
 msgid "edit message before committing"
 msgstr "在提交前编辑提交说明"
 
-#: builtin/merge.c:207
+#: builtin/merge.c:209
 msgid "allow fast-forward (default)"
 msgstr "允许快进(默认)"
 
-#: builtin/merge.c:209 builtin/pull.c:147
+#: builtin/merge.c:211 builtin/pull.c:151
 msgid "abort if fast-forward is not possible"
 msgstr "如果不能快进就放弃合并"
 
-#: builtin/merge.c:213
-msgid "Verify that the named commit has a valid GPG signature"
+#: builtin/merge.c:215 builtin/pull.c:154
+msgid "verify that the named commit has a valid GPG signature"
 msgstr "验证指定的提交是否包含一个有效的 GPG 签名"
 
-#: builtin/merge.c:214 builtin/notes.c:770 builtin/pull.c:152
+#: builtin/merge.c:216 builtin/notes.c:774 builtin/pull.c:158
 #: builtin/revert.c:89
 msgid "strategy"
 msgstr "策略"
 
-#: builtin/merge.c:215 builtin/pull.c:153
+#: builtin/merge.c:217 builtin/pull.c:159
 msgid "merge strategy to use"
 msgstr "要使用的合并策略"
 
-#: builtin/merge.c:216 builtin/pull.c:156
+#: builtin/merge.c:218 builtin/pull.c:162
 msgid "option=value"
 msgstr "option=value"
 
-#: builtin/merge.c:217 builtin/pull.c:157
+#: builtin/merge.c:219 builtin/pull.c:163
 msgid "option for selected merge strategy"
 msgstr "所选的合并策略的选项"
 
-#: builtin/merge.c:219
+#: builtin/merge.c:221
 msgid "merge commit message (for a non-fast-forward merge)"
 msgstr "合并的提交说明(针对非快进式合并)"
 
-#: builtin/merge.c:223
+#: builtin/merge.c:225
 msgid "abort the current in-progress merge"
 msgstr "放弃当前正在进行的合并"
 
-#: builtin/merge.c:251
+#: builtin/merge.c:227 builtin/pull.c:170
+msgid "allow merging unrelated histories"
+msgstr "允许合并不相关的历史"
+
+#: builtin/merge.c:255
 msgid "could not run stash."
 msgstr "不能进行进度保存。"
 
-#: builtin/merge.c:256
+#: builtin/merge.c:260
 msgid "stash failed"
 msgstr "进度保存失败"
 
-#: builtin/merge.c:261
+#: builtin/merge.c:265
 #, c-format
 msgid "not a valid object: %s"
 msgstr "不是一个有效对象:%s"
 
-#: builtin/merge.c:280 builtin/merge.c:297
+#: builtin/merge.c:284 builtin/merge.c:301
 msgid "read-tree failed"
 msgstr "读取树失败"
 
 #  译者:注意保持前导空格
-#: builtin/merge.c:327
+#: builtin/merge.c:331
 msgid " (nothing to squash)"
 msgstr " (无可压缩)"
 
-#: builtin/merge.c:340
+#: builtin/merge.c:342
 #, c-format
 msgid "Squash commit -- not updating HEAD\n"
 msgstr "压缩提交 -- 未更新 HEAD\n"
 
-#: builtin/merge.c:344 builtin/merge.c:764 builtin/merge.c:976
-#: builtin/merge.c:989
-#, c-format
-msgid "Could not write to '%s'"
-msgstr "不能写入 '%s'"
-
-#: builtin/merge.c:372
-msgid "Writing SQUASH_MSG"
-msgstr "写入 SQUASH_MSG"
-
-#: builtin/merge.c:374
-msgid "Finishing SQUASH_MSG"
-msgstr "完成 SQUASH_MSG"
-
-#: builtin/merge.c:397
+#: builtin/merge.c:392
 #, c-format
 msgid "No merge message -- not updating HEAD\n"
 msgstr "无合并信息 -- 未更新 HEAD\n"
 
-#: builtin/merge.c:448
+#: builtin/merge.c:443
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' 没有指向一个提交"
 
-#: builtin/merge.c:538
+#: builtin/merge.c:533
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "坏的 branch.%s.mergeoptions 字符串:%s"
 
-#: builtin/merge.c:657
+#: builtin/merge.c:652
 msgid "Not handling anything other than two heads merge."
 msgstr "不能处理两个头合并之外的任何操作。"
 
-#: builtin/merge.c:671
+#: builtin/merge.c:666
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive 的未知选项:-X%s"
 
-#: builtin/merge.c:684
+#: builtin/merge.c:681
 #, c-format
 msgid "unable to write %s"
 msgstr "不能写 %s"
 
-#: builtin/merge.c:773
+#: builtin/merge.c:733
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "不能从 '%s' 读取"
 
-#: builtin/merge.c:782
+#: 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:788
+#: builtin/merge.c:748
 #, c-format
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
@@ -8004,52 +9276,66 @@ msgstr ""
 "\n"
 "以 '%c' 开头的行将被忽略,而且空提交说明将会终止提交。\n"
 
-#: builtin/merge.c:812
+#: builtin/merge.c:772
 msgid "Empty commit message."
 msgstr "空提交信息。"
 
-#: builtin/merge.c:824
+#: builtin/merge.c:792
 #, c-format
 msgid "Wonderful.\n"
 msgstr "太棒了。\n"
 
-#: builtin/merge.c:879
+#: builtin/merge.c:847
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "自动合并失败,修正冲突然后提交修正的结果。\n"
 
-#: builtin/merge.c:895
+#: builtin/merge.c:863
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' 不是一个提交"
 
-#: builtin/merge.c:936
+#: builtin/merge.c:904
 msgid "No current branch."
 msgstr "没有当前分支。"
 
-#: builtin/merge.c:938
+#: builtin/merge.c:906
 msgid "No remote for the current branch."
 msgstr "当前分支没有对应的远程仓库。"
 
-#: builtin/merge.c:940
+#: builtin/merge.c:908
 msgid "No default upstream defined for the current branch."
 msgstr "当前分支没有定义默认的上游分支。"
 
-#: builtin/merge.c:945
+#: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "对于 %s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:1080
+#: builtin/merge.c:960
+#, c-format
+msgid "Bad value '%s' in environment '%s'"
+msgstr "环境 '%2$s' 中存在坏的取值 '%1$s'"
+
+#: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "不能关闭 '%s'"
 
-#: builtin/merge.c:1207
+#: 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:1223
+#: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8057,7 +9343,7 @@ msgstr ""
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1230
+#: builtin/merge.c:1185
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you merge."
@@ -8065,100 +9351,112 @@ msgstr ""
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1233
+#: builtin/merge.c:1188
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1242
+#: builtin/merge.c:1197
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1250
+#: builtin/merge.c:1205
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1267
+#: builtin/merge.c:1222
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1269
+#: builtin/merge.c:1224
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1275
+#: builtin/merge.c:1229
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1277
+#: builtin/merge.c:1231
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1332
+#: builtin/merge.c:1287
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr "提交 %s 有一个非可信的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1335
+#: builtin/merge.c:1290
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "提交 %s 有一个错误的声称来自 %s 的 GPG 签名。"
 
-#: builtin/merge.c:1338
+#: builtin/merge.c:1293
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "提交 %s 没有一个 GPG 签名。"
 
-#: builtin/merge.c:1341
+#: builtin/merge.c:1296
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "提交 %s 有一个来自 %s 的好的 GPG 签名。\n"
 
-#: builtin/merge.c:1424
+#: builtin/merge.c:1358
+msgid "refusing to merge unrelated histories"
+msgstr "拒绝合并无关的历史"
+
+#: 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:1461
+#: builtin/merge.c:1418
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1468
+#: builtin/merge.c:1425
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1500
+#: 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:1523 builtin/merge.c:1602
+#: builtin/merge.c:1479 builtin/merge.c:1558
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1527
+#: builtin/merge.c:1483
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1593
+#: builtin/merge.c:1549
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1595
+#: builtin/merge.c:1551
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1604
+#: builtin/merge.c:1560
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1616
+#: builtin/merge.c:1572
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
@@ -8183,23 +9481,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 "根据 <引用> 的引用日志查找 <提交> 的派生处"
 
@@ -8243,6 +9541,37 @@ 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。"
+
+#: 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]"
@@ -8268,7 +9597,7 @@ msgstr "git mv [<选项>] <源>... <目标>"
 msgid "Directory %s is in index and no submodule?"
 msgstr "目录 %s 在索引中并且不是子模组?"
 
-#: builtin/mv.c:72
+#: builtin/mv.c:72 builtin/rm.c:317
 msgid "Please stage your changes to .gitmodules or stash them to proceed"
 msgstr "请将您的修改暂存到 .gitmodules 中或保存进度后再继续"
 
@@ -8285,109 +9614,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:257 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:251
+#: builtin/name-rev.c:257
 msgid "git name-rev [<options>] <commit>..."
 msgstr "git name-rev [<选项>] <提交>..."
 
-#: builtin/name-rev.c:252
+#: builtin/name-rev.c:258
 msgid "git name-rev [<options>] --all"
 msgstr "git name-rev [<选项>] --all"
 
-#: builtin/name-rev.c:253
+#: builtin/name-rev.c:259
 msgid "git name-rev [<options>] --stdin"
 msgstr "git name-rev [<选项>] --stdin"
 
-#: builtin/name-rev.c:305
+#: builtin/name-rev.c:311
 msgid "print only names (no SHA-1)"
 msgstr "只打印名称(无 SHA-1)"
 
-#: builtin/name-rev.c:306
+#: builtin/name-rev.c:312
 msgid "only use tags to name the commits"
 msgstr "只使用标签来命名提交"
 
-#: builtin/name-rev.c:308
+#: builtin/name-rev.c:314
 msgid "only use refs matching <pattern>"
 msgstr "只使用和 <模式> 相匹配的引用"
 
-#: builtin/name-rev.c:310
+#: builtin/name-rev.c:316
 msgid "list all commits reachable from all refs"
 msgstr "列出可以从所有引用访问的提交"
 
-#: builtin/name-rev.c:311
+#: builtin/name-rev.c:317
 msgid "read from stdin"
 msgstr "从标准输入读取"
 
-#: builtin/name-rev.c:312
+#: builtin/name-rev.c:318
 msgid "allow to print `undefined` names (default)"
 msgstr "允许打印 `未定义` 的名称(默认)"
 
-#: builtin/name-rev.c:318
+#: builtin/name-rev.c:324
 msgid "dereference tags in the input (internal use)"
 msgstr "反向解析输入中的标签(内部使用)"
 
@@ -8500,6 +9829,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'"
@@ -8514,129 +9847,140 @@ msgstr "不能读取 'show' 的输出"
 msgid "failed to finish 'show' for object '%s'"
 msgstr "无法为对象 '%s' 完成 'show'"
 
-#: 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"
+#: 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"
+msgid "the note contents have been left in %s"
 msgstr "注解内容被留在 %s 中"
 
-#: builtin/notes.c:232 builtin/tag.c:440
+#: builtin/notes.c:233 builtin/tag.c:439
 #, c-format
 msgid "cannot read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/notes.c:234 builtin/tag.c:443
+#: builtin/notes.c:235 builtin/tag.c:442
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "不能打开或读取 '%s'"
 
-#: 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:880 builtin/tag.c:456
+#: 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."
+msgid "failed to resolve '%s' as a valid ref."
 msgstr "无法解析 '%s' 为一个有效引用。"
 
-#: builtin/notes.c:256
+#: 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 "无法读取对象 '%s'。"
+msgid "failed to copy notes from '%s' to '%s'"
+msgstr "从 '%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 "不能从非数据对象 '%s' 中读取注解数据"
+msgid "refusing to %s notes in %s (outside of refs/notes/)"
+msgstr "拒绝向 %2$s(在 refs/notes/ 之外)%1$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:945
+#: 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."
+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:885
+#: 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."
+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"
@@ -8645,241 +9989,318 @@ msgstr ""
 "子命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
 "请换用 'git notes add -f -m/-F/-c/-C'。\n"
 
-#: builtin/notes.c:767
+#: 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:769
+#: builtin/notes.c:773
 msgid "Merge options"
 msgstr "合并选项"
 
-#: builtin/notes.c:771
+#: 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:773
+#: builtin/notes.c:777
 msgid "Committing unmerged notes"
 msgstr "提交未合并的注解"
 
-#: builtin/notes.c:775
+#: builtin/notes.c:779
 msgid "finalize notes merge by committing unmerged notes"
 msgstr "通过提交未合并的注解来完成注解合并"
 
-#: builtin/notes.c:777
+#: builtin/notes.c:781
 msgid "Aborting notes merge resolution"
 msgstr "中止注解合并的方案"
 
-#: builtin/notes.c:779
+#: builtin/notes.c:783
 msgid "abort notes merge"
 msgstr "中止注解合并"
 
-#: builtin/notes.c:856
+#: 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 "A notes merge into %s is already in-progress at %s"
-msgstr "一个到 %s 的注解合并已经在 %s 执行中"
+msgid "unknown -s/--strategy: %s"
+msgstr "未知的 -s/--strategy:%s"
 
-#: builtin/notes.c:883
+#: builtin/notes.c:860
+#, c-format
+msgid "a notes merge into %s is already in-progress at %s"
+msgstr "位于 %2$s 的一个到 %1$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 ""
+"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:887
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "对象 %s 没有注解\n"
 
-#: builtin/notes.c:895
+#: builtin/notes.c:899
 msgid "attempt to remove non-existent note is not an error"
 msgstr "尝试删除不存在的注解不是一个错误"
 
-#: builtin/notes.c:898
+#: builtin/notes.c:902
 msgid "read object names from the standard input"
 msgstr "从标准输入读取对象名称"
 
-#: builtin/notes.c:979
+#: 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:980
+#: builtin/notes.c:984
 msgid "use notes from <notes-ref>"
 msgstr "从 <注解引用> 使用注解"
 
-#: builtin/notes.c:1015 builtin/remote.c:1626
+#: 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 "git pack-objects [<选项>...] <base-name> [< <引用列表> | < <对象列表>]"
 
-#: 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:772
+#: builtin/pack-objects.c:768
+msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
+msgstr "禁用 bitmap 写入,因为 pack.packSizeLimit 设置使得包被切分为多个"
+
+#: builtin/pack-objects.c:781
 msgid "Writing objects"
 msgstr "写入对象中"
 
-#: builtin/pack-objects.c:1012
+#: builtin/pack-objects.c:1070
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr "禁用 bitmap 写入,因为一些对象将不会被打包"
 
-#: builtin/pack-objects.c:2172
+#: builtin/pack-objects.c:2346
 msgid "Compressing objects"
 msgstr "压缩对象中"
 
-#: builtin/pack-objects.c:2558
+#: builtin/pack-objects.c:2759
 #, c-format
 msgid "unsupported index version %s"
 msgstr "不支持的索引版本 %s"
 
-#: builtin/pack-objects.c:2562
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "bad index version '%s'"
 msgstr "坏的索引版本 '%s'"
 
-#: builtin/pack-objects.c:2592
+#: builtin/pack-objects.c:2793
 msgid "do not show progress meter"
 msgstr "不显示进度表"
 
-#: builtin/pack-objects.c:2594
+#: builtin/pack-objects.c:2795
 msgid "show progress meter"
 msgstr "显示进度表"
 
-#: builtin/pack-objects.c:2596
+#: builtin/pack-objects.c:2797
 msgid "show progress meter during object writing phase"
 msgstr "在对象写入阶段显示进度表"
 
-#: builtin/pack-objects.c:2599
+#: builtin/pack-objects.c:2800
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "当进度表显示时类似于 --all-progress"
 
-#: builtin/pack-objects.c:2600
+#: builtin/pack-objects.c:2801
 msgid "version[,offset]"
 msgstr "版本[,偏移]"
 
-#: builtin/pack-objects.c:2601
+#: builtin/pack-objects.c:2802
 msgid "write the pack index file in the specified idx format version"
 msgstr "用指定的 idx 格式版本来写包索引文件"
 
-#: builtin/pack-objects.c:2604
+#: builtin/pack-objects.c:2805
 msgid "maximum size of each output pack file"
 msgstr "每个输出包的最大尺寸"
 
-#: builtin/pack-objects.c:2606
+#: builtin/pack-objects.c:2807
 msgid "ignore borrowed objects from alternate object store"
 msgstr "忽略从备用对象存储里借用对象"
 
-#: builtin/pack-objects.c:2608
+#: builtin/pack-objects.c:2809
 msgid "ignore packed objects"
 msgstr "忽略包对象"
 
-#: builtin/pack-objects.c:2610
+#: builtin/pack-objects.c:2811
 msgid "limit pack window by objects"
 msgstr "限制打包窗口的对象数"
 
-#: builtin/pack-objects.c:2612
+#: builtin/pack-objects.c:2813
 msgid "limit pack window by memory in addition to object limit"
 msgstr "除对象数量限制外设置打包窗口的内存限制"
 
-#: builtin/pack-objects.c:2614
+#: builtin/pack-objects.c:2815
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr "打包允许的 delta 链的最大长度"
 
-#: builtin/pack-objects.c:2616
+#: builtin/pack-objects.c:2817
 msgid "reuse existing deltas"
 msgstr "重用已存在的 deltas"
 
-#: builtin/pack-objects.c:2618
+#: builtin/pack-objects.c:2819
 msgid "reuse existing objects"
 msgstr "重用已存在的对象"
 
-#: builtin/pack-objects.c:2620
+#: builtin/pack-objects.c:2821
 msgid "use OFS_DELTA objects"
 msgstr "使用 OFS_DELTA 对象"
 
-#: builtin/pack-objects.c:2622
+#: builtin/pack-objects.c:2823
 msgid "use threads when searching for best delta matches"
 msgstr "使用线程查询最佳 delta 匹配"
 
-#: builtin/pack-objects.c:2624
+#: builtin/pack-objects.c:2825
 msgid "do not create an empty pack output"
 msgstr "不创建空的包输出"
 
-#: builtin/pack-objects.c:2626
+#: builtin/pack-objects.c:2827
 msgid "read revision arguments from standard input"
 msgstr "从标准输入读取版本号参数"
 
-#: builtin/pack-objects.c:2628
+#: builtin/pack-objects.c:2829
 msgid "limit the objects to those that are not yet packed"
 msgstr "限制那些尚未打包的对象"
 
-#: builtin/pack-objects.c:2631
+#: builtin/pack-objects.c:2832
 msgid "include objects reachable from any reference"
 msgstr "包括可以从任何引用访问到的对象"
 
-#: builtin/pack-objects.c:2634
+#: builtin/pack-objects.c:2835
 msgid "include objects referred by reflog entries"
 msgstr "包括被引用日志引用到的对象"
 
-#: builtin/pack-objects.c:2637
+#: builtin/pack-objects.c:2838
 msgid "include objects referred to by the index"
 msgstr "包括被索引引用到的对象"
 
-#: builtin/pack-objects.c:2640
+#: builtin/pack-objects.c:2841
 msgid "output pack to stdout"
 msgstr "输出包到标准输出"
 
-#: builtin/pack-objects.c:2642
+#: builtin/pack-objects.c:2843
 msgid "include tag objects that refer to objects to be packed"
 msgstr "包括那些引用了待打包对象的标签对象"
 
-#: builtin/pack-objects.c:2644
+#: builtin/pack-objects.c:2845
 msgid "keep unreachable objects"
 msgstr "维持不可达的对象"
 
-#: builtin/pack-objects.c:2645 parse-options.h:142
-msgid "time"
-msgstr "æ\97¶é\97´"
+#: builtin/pack-objects.c:2847
+msgid "pack loose unreachable objects"
+msgstr "æ\89\93å\8c\85æ\9d¾æ\95£ç\9a\84ä¸\8då\8f¯è¾¾å¯¹è±¡"
 
-#: builtin/pack-objects.c:2646
+#: builtin/pack-objects.c:2849
 msgid "unpack unreachable objects newer than <time>"
 msgstr "将比给定 <时间> 新的无法访问的对象解包"
 
-#: builtin/pack-objects.c:2649
+#: builtin/pack-objects.c:2852
 msgid "create thin packs"
 msgstr "创建精简包"
 
-#: builtin/pack-objects.c:2651
+#: builtin/pack-objects.c:2854
 msgid "create packs suitable for shallow fetches"
 msgstr "创建适合浅克隆仓库获取的包"
 
-#: builtin/pack-objects.c:2653
+#: builtin/pack-objects.c:2856
 msgid "ignore packs that have companion .keep file"
 msgstr "忽略配有 .keep 文件的包"
 
-#: builtin/pack-objects.c:2655
+#: builtin/pack-objects.c:2858
 msgid "pack compression level"
 msgstr "打包压缩级别"
 
-#: builtin/pack-objects.c:2657
+#: builtin/pack-objects.c:2860
 msgid "do not hide commits by grafts"
 msgstr "显示被嫁接隐藏的提交"
 
-#: builtin/pack-objects.c:2659
+#: builtin/pack-objects.c:2862
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr "使用 bitmap 索引(如果有的话)以提高对象计数时的速度"
 
-#: builtin/pack-objects.c:2661
+#: builtin/pack-objects.c:2864
 msgid "write a bitmap index together with the pack index"
 msgstr "在建立包索引的同时创建 bitmap 索引"
 
-#: builtin/pack-objects.c:2752
+#: builtin/pack-objects.c:2993
 msgid "Counting objects"
 msgstr "对象计数中"
 
@@ -8907,15 +10328,11 @@ msgstr "正在删除重复对象"
 msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
 msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
 
-#: builtin/prune.c:105 builtin/worktree.c:124
-msgid "do not remove, show only"
-msgstr "不删除,只显示"
-
-#: builtin/prune.c:106 builtin/worktree.c:125
+#: builtin/prune.c:106 builtin/worktree.c:128
 msgid "report pruned objects"
 msgstr "报告清除的对象"
 
-#: builtin/prune.c:109 builtin/worktree.c:127
+#: builtin/prune.c:109 builtin/worktree.c:130
 msgid "expire objects older than <time>"
 msgstr "使早于给定时间的对象过期"
 
@@ -8923,69 +10340,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:117
+#: builtin/pull.c:121
 msgid "Options related to merging"
 msgstr "和合并相关的选项"
 
-#: builtin/pull.c:120
+#: builtin/pull.c:124
 msgid "incorporate changes by rebasing rather than merging"
 msgstr "使用变基操作取代合并操作以合入修改"
 
-#: builtin/pull.c:144 builtin/revert.c:105
+#: builtin/pull.c:148 builtin/revert.c:101
 msgid "allow fast-forward"
 msgstr "允许快进式"
 
-#: builtin/pull.c:150
-msgid "verify that the named commit has a valid GPG signature"
-msgstr "验证指定的提交是否包含一个有效的 GPG 签名"
+#: builtin/pull.c:157
+msgid "automatically stash/stash pop before and after rebase"
+msgstr "自动在变基操作前后执行 stash/stash pop"
 
-#: builtin/pull.c:164
+#: builtin/pull.c:173
 msgid "Options related to fetching"
 msgstr "和获取相关的参数"
 
-#: builtin/pull.c:186
+#: builtin/pull.c:195
 msgid "number of submodules pulled in parallel"
 msgstr "并发拉取的子模组的数量"
 
-#: builtin/pull.c:275
+#: builtin/pull.c:284
 #, c-format
 msgid "Invalid value for pull.ff: %s"
 msgstr "pull.ff 的取值无效:%s"
 
-#: builtin/pull.c:359
-msgid "Cannot pull with rebase: You have unstaged changes."
-msgstr "无法通过变基方式拉取:您有未暂存的变更。"
-
-#: builtin/pull.c:365
-msgid "Additionally, your index contains uncommitted changes."
-msgstr "而且您的索引中包含未提交的变更。"
-
-#: builtin/pull.c:367
-msgid "Cannot pull with rebase: Your index contains uncommitted changes."
-msgstr "无法通过变基方式拉取:您的索引中包含未提交的变更。"
-
-#: builtin/pull.c:443
+#: builtin/pull.c:397
 msgid ""
 "There is no candidate for rebasing against among the refs that you just "
 "fetched."
 msgstr "在您刚刚获取到的引用中没有变基操作的候选。"
 
-#: builtin/pull.c:445
+#: builtin/pull.c:399
 msgid ""
 "There are no candidates for merging among the refs that you just fetched."
 msgstr "在您刚刚获取到的引用中没有合并操作的候选。"
 
-#: builtin/pull.c:446
+#: 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:449
+#: builtin/pull.c:403
 #, c-format
 msgid ""
 "You asked to pull from the remote '%s', but did not specify\n"
@@ -8995,38 +10405,42 @@ msgstr ""
 "您要求从远程 '%s' 拉取,但是未指定一个分支。因为这不是当前\n"
 "分支默认的远程仓库,您必须在命令行中指定一个分支名。"
 
-#: builtin/pull.c:454
+#: builtin/pull.c:408 git-parse-remote.sh:73
 msgid "You are not currently on a branch."
 msgstr "您当前不在一个分支上。"
 
-#: builtin/pull.c:456 builtin/pull.c:471
+#: 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:458 builtin/pull.c:473
+#: 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:459 builtin/pull.c:474
+#: builtin/pull.c:413 builtin/pull.c:428
 msgid "See git-pull(1) for details."
 msgstr "详见 git-pull(1)。"
 
-#: builtin/pull.c:469
+#: 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:451
+#: 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:478
-#, c-format
+#: 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:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
-msgstr ""
-"如果您想要为此分支创建跟踪信息,您可以执行:\n"
-"\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"If you wish to set tracking information for this branch you can do so with:"
+msgstr "如果您想要为此分支创建跟踪信息,您可以执行:"
 
-#: builtin/pull.c:483
+#: builtin/pull.c:437
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
@@ -9035,11 +10449,27 @@ msgstr ""
 "您的配置中指定要合并远程的引用 '%s',\n"
 "但是没有获取到这个引用。"
 
-#: builtin/pull.c:841
+#: 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:870
+#: 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"
@@ -9049,7 +10479,7 @@ msgstr ""
 "fetch 更新了当前的分支。快进您的工作区\n"
 "至提交 %s。"
 
-#: builtin/pull.c:875
+#: builtin/pull.c:843
 #, c-format
 msgid ""
 "Cannot fast-forward your working tree.\n"
@@ -9066,11 +10496,11 @@ msgstr ""
 "$ git reset --hard\n"
 "恢复之前的状态。"
 
-#: builtin/pull.c:890
+#: builtin/pull.c:858
 msgid "Cannot merge multiple branches into empty head."
 msgstr "无法将多个分支合并到空分支。"
 
-#: builtin/pull.c:894
+#: builtin/pull.c:862
 msgid "Cannot rebase onto multiple branches."
 msgstr "无法变基到多个分支。"
 
@@ -9223,12 +10653,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 "
@@ -9249,103 +10679,115 @@ msgstr ""
 "\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 or --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 "绕过 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 "server-specific"
+
+#: 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>) "
@@ -9420,6 +10862,63 @@ msgstr "跳过应用稀疏检出过滤器"
 msgid "debug unpack-trees"
 msgstr "调试 unpack-trees"
 
+#: builtin/receive-pack.c:26
+msgid "git receive-pack <git-dir>"
+msgstr "git receive-pack <git-dir>"
+
+#: 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"
+"不一致,并且将需要执行 'git reset --hard' 将工作区匹配到 HEAD。\n"
+"\n"
+"您可以在远程仓库中设置 'receive.denyCurrentBranch' 配置变量为\n"
+"'ignore' 或 'warn' 以允许推送到当前分支。然而不推荐这么做,除非您\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 ""
+"默认禁止删除当前分支,因为下一次 'git clone' 将不会检出任何文件,\n"
+"导致混淆。\n"
+"\n"
+"您可以在远程仓库中设置 'receive.denyDeleteCurrent' 配置变量为\n"
+"'warn' 或 'ignore' 以允许删除当前分支,显示或者不显示警告。\n"
+"\n"
+"若要屏蔽此信息,您可以设置它为 'refuse'。"
+
+#: builtin/receive-pack.c:1883
+msgid "quiet"
+msgstr "静默模式"
+
+#: builtin/receive-pack.c:1897
+msgid "You must specify a directory."
+msgstr "您必须指定一个目录。"
+
 #: builtin/reflog.c:423
 #, c-format
 msgid "'%s' for '%s' is not a valid timestamp"
@@ -9565,12 +11064,12 @@ msgstr "指定一个 master 分支并使用 --mirror 选项没有意义"
 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' 不是一个有效的远程名称"
@@ -9593,17 +11092,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"
@@ -9614,17 +11113,17 @@ msgstr ""
 "\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:"
@@ -9634,131 +11133,144 @@ msgid_plural ""
 msgstr[0] "注意:ref/remotes 层级之外的一个分支未被移除。要删除它,使用:"
 msgstr[1] "注意:ref/remotes 层级之外的一些分支未被移除。要删除它们,使用:"
 
-#: 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,不能变基到一个以上的分支"
 
-#: 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 "  获取地址:%s"
 
-#: builtin/remote.c:1148 builtin/remote.c:1299
+#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1295
 msgid "(no URL)"
 msgstr "(无 URL)"
 
-#: builtin/remote.c:1157 builtin/remote.c:1159
+#. 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"
 msgstr "  推送地址:%s"
 
-#: builtin/remote.c:1161 builtin/remote.c:1163 builtin/remote.c:1165
+#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  HEAD 分支:%s"
 
-#: builtin/remote.c:1167
+#  译者:中文字符串拼接,可删除前导空格
+#: 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:1179
+#: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
@@ -9766,230 +11278,243 @@ msgstr[0] "  远程分支:%s"
 msgstr[1] "  远程分支:%s"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/remote.c:1182 builtin/remote.c:1209
+#: builtin/remote.c:1179 builtin/remote.c:1205
 msgid " (status not queried)"
 msgstr "(状态未查询)"
 
-#: builtin/remote.c:1191
+#: builtin/remote.c:1188
 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:1199
+#: builtin/remote.c:1196
 msgid "  Local refs will be mirrored by 'git push'"
 msgstr "  本地引用将在 'git push' 时被镜像"
 
-#: builtin/remote.c:1206
+#: 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:"
 msgstr[1] "  为 'git push' 配置的本地引用%s:"
 
-#: builtin/remote.c:1227
+#: builtin/remote.c:1223
 msgid "set refs/remotes/<name>/HEAD according to remote"
 msgstr "根据远程设置 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1229
+#: builtin/remote.c:1225
 msgid "delete refs/remotes/<name>/HEAD"
 msgstr "删除 refs/remotes/<名称>/HEAD"
 
-#: builtin/remote.c:1244
+#: builtin/remote.c:1240
 msgid "Cannot determine remote HEAD"
 msgstr "无法确定远程 HEAD"
 
-#: builtin/remote.c:1246
+#: builtin/remote.c:1242
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
 msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:"
 
-#: builtin/remote.c:1256
+#: builtin/remote.c:1252
 #, c-format
 msgid "Could not delete %s"
 msgstr "无法删除 %s"
 
-#: builtin/remote.c:1264
+#: builtin/remote.c:1260
 #, c-format
 msgid "Not a valid ref: %s"
 msgstr "不是一个有效引用:%s"
 
-#: builtin/remote.c:1266
+#: builtin/remote.c:1262
 #, c-format
 msgid "Could not setup %s"
 msgstr "不能设置 %s"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1284
+#: builtin/remote.c:1280
 #, c-format
 msgid " %s will become dangling!"
 msgstr " %s 将成为摇摆状态!"
 
 #  译者:注意保持前导空格
-#: builtin/remote.c:1285
+#: builtin/remote.c:1281
 #, c-format
 msgid " %s has become dangling!"
 msgstr " %s 已成为摇摆状态!"
 
-#: builtin/remote.c:1295
+#: builtin/remote.c:1291
 #, c-format
 msgid "Pruning %s"
 msgstr "修剪 %s"
 
-#: builtin/remote.c:1296
+#: builtin/remote.c:1292
 #, c-format
 msgid "URL: %s"
 msgstr "URL:%s"
 
-#: builtin/remote.c:1312
+#: builtin/remote.c:1308
 #, c-format
 msgid " * [would prune] %s"
 msgstr " * [将删除] %s"
 
-#: builtin/remote.c:1315
+#: builtin/remote.c:1311
 #, c-format
 msgid " * [pruned] %s"
 msgstr " * [已删除] %s"
 
-#: builtin/remote.c:1360
+#: builtin/remote.c:1356
 msgid "prune remotes after fetching"
 msgstr "抓取后清除远程"
 
-#: builtin/remote.c:1423 builtin/remote.c:1477 builtin/remote.c:1545
+#: builtin/remote.c:1419 builtin/remote.c:1473 builtin/remote.c:1541
 #, c-format
 msgid "No such remote '%s'"
 msgstr "没有此远程 '%s'"
 
-#: builtin/remote.c:1439
+#: builtin/remote.c:1435
 msgid "add branch"
 msgstr "添加分支"
 
-#: builtin/remote.c:1446
+#: builtin/remote.c:1442
 msgid "no remote specified"
 msgstr "未指定远程"
 
-#: builtin/remote.c:1463
+#: builtin/remote.c:1459
 msgid "query push URLs rather than fetch URLs"
 msgstr "查询推送 URL 地址,而非获取 URL 地址"
 
-#: builtin/remote.c:1465
+#: builtin/remote.c:1461
 msgid "return all URLs"
 msgstr "返回所有 URL 地址"
 
-#: builtin/remote.c:1493
+#: builtin/remote.c:1489
 #, c-format
 msgid "no URLs configured for remote '%s'"
 msgstr "没有给远程仓库 '%s' 设定 URL"
 
-#: builtin/remote.c:1519
+#: builtin/remote.c:1515
 msgid "manipulate push URLs"
 msgstr "操作推送 URLS"
 
-#: builtin/remote.c:1521
+#: builtin/remote.c:1517
 msgid "add URL"
 msgstr "添加 URL"
 
-#: builtin/remote.c:1523
+#: builtin/remote.c:1519
 msgid "delete URLs"
 msgstr "删除 URLS"
 
-#: builtin/remote.c:1530
+#: builtin/remote.c:1526
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 无意义"
 
-#: builtin/remote.c:1571
+#: builtin/remote.c:1567
 #, c-format
 msgid "Invalid old URL pattern: %s"
 msgstr "无效的旧 URL 匹配模版:%s"
 
-#: builtin/remote.c:1579
+#: builtin/remote.c:1575
 #, c-format
 msgid "No such URL found: %s"
 msgstr "未找到此 URL:%s"
 
-#: builtin/remote.c:1581
+#: builtin/remote.c:1577
 msgid "Will not delete all non-push URLs"
 msgstr "将不会删除所有非推送 URL 地址"
 
-#: builtin/remote.c:1595
+#: 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 "向 git-pack-objects 传递参数 --no-reuse-delta"
 
-#: builtin/repack.c:168
+#: builtin/repack.c:169
 msgid "pass --no-reuse-object to git-pack-objects"
 msgstr "向 git-pack-objects 传递参数 --no-reuse-object"
 
-#: 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 "向 git-pack-objects 传递参数 --local"
 
-#: builtin/repack.c:175
+#: builtin/repack.c:176
 msgid "write bitmap index"
 msgstr "写 bitmap 索引"
 
-#: 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 "不能删除珍品仓库中的打包文件"
 
-#: 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>"
@@ -10089,8 +11614,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>...]"
@@ -10211,27 +11736,27 @@ msgstr "不能重置索引文件至版本 '%s'。"
 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"
@@ -10302,31 +11827,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 "拣选失败"
 
@@ -10410,10 +11931,6 @@ msgstr "允许递归删除"
 msgid "exit with a zero status even if nothing matched"
 msgstr "即使没有匹配,也以零状态退出"
 
-#: builtin/rm.c:317
-msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-msgstr "请将您的修改缓存到 .gitmodules 中或保存进度后再继续"
-
 #: builtin/rm.c:335
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -10491,70 +12008,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: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 个以上的引用"
+
+#: 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>[,<base>]"
 
-#: builtin/show-branch.c:670
+#: builtin/show-branch.c:669
 msgid "show <n> most recent ref-log entries starting at base"
 msgstr "显示从 base 开始的 <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 个条目。"
+
+#: 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 个以上的版本。"
+
+#: 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 | --"
@@ -10615,81 +12186,221 @@ msgstr "跳过和移除所有的注释行"
 msgid "prepend comment character and space to each line"
 msgstr "为每一行的行首添加注释符和空格"
 
-#: builtin/submodule--helper.c:73 builtin/submodule--helper.c:161
+#: 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:1055
+#, c-format
+msgid "Expecting a full ref name, got %s"
+msgstr "期望一个完整的引用名称,却得到 %s"
+
+#: builtin/submodule--helper.c:71
+#, c-format
+msgid "cannot strip one component off url '%s'"
+msgstr "无法从 url '%s' 剥离一个组件"
+
+#: builtin/submodule--helper.c:282 builtin/submodule--helper.c:408
+#: builtin/submodule--helper.c:590
 msgid "alternative anchor for relative paths"
 msgstr "相对路径的替代锚记(anchor)"
 
-#: builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:287
 msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper list [--prefix=<路径>] [<路径>...]"
 
-#: builtin/submodule--helper.c:108
+#: builtin/submodule--helper.c:329 builtin/submodule--helper.c:343
+#, c-format
+msgid "No url found for submodule path '%s' in .gitmodules"
+msgstr "在 .gitmodules 中未找到子模组 '%s' 的 url"
+
+#: builtin/submodule--helper.c:369
+#, c-format
+msgid "Failed to register url for submodule path '%s'"
+msgstr "无法为子模组 '%s' 注册 url"
+
+#: 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:383
+#, c-format
+msgid "warning: command update mode suggested for submodule '%s'\n"
+msgstr "警告:建议子模组 '%s' 使用命令更新模式\n"
+
+#: builtin/submodule--helper.c:390
+#, c-format
+msgid "Failed to register update mode for submodule path '%s'"
+msgstr "无法为子模组 '%s' 注册更新模式"
+
+#: builtin/submodule--helper.c:409
+msgid "Suppress output for initializing a submodule"
+msgstr "初始化子模组时抑制输出"
+
+#: builtin/submodule--helper.c:414
+msgid "git submodule--helper init [<path>]"
+msgstr "git submodule--helper init [<路径>]"
+
+#: builtin/submodule--helper.c:435
 msgid "git submodule--helper name <path>"
 msgstr "git submodule--helper name <路径>"
 
-#: builtin/submodule--helper.c:114
+#: builtin/submodule--helper.c:441
 #, c-format
 msgid "no submodule mapping found in .gitmodules for path '%s'"
 msgstr "在 .gitmodules 中没有发现路径 '%s' 的子模组映射"
 
-#: builtin/submodule--helper.c:164
+#: 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 "不能识别 submodule.alternateErrorStrategy 的取值 '%s'"
+
+#: builtin/submodule--helper.c:570
+#, c-format
+msgid "Value '%s' for submodule.alternateLocation is not recognized"
+msgstr "不能识别 submodule.alternateLocaion 的取值 '%s'"
+
+#: builtin/submodule--helper.c:593
 msgid "where the new submodule will be cloned to"
 msgstr "新的子模组将要克隆的路径"
 
-#: builtin/submodule--helper.c:167
+#: builtin/submodule--helper.c:596
 msgid "name of the new submodule"
 msgstr "新子模组的名称"
 
-#: builtin/submodule--helper.c:170
+#: builtin/submodule--helper.c:599
 msgid "url where to clone the submodule from"
 msgstr "克隆子模组的 url 地址"
 
-#: builtin/submodule--helper.c:176
+#: builtin/submodule--helper.c:605
 msgid "depth for shallow clones"
 msgstr "浅克隆的深度"
 
-#: builtin/submodule--helper.c:182
+#: 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>] [--url <url>][--depth <depth>] [--] [<path>...]"
+"<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>"
 msgstr ""
 "git submodule--helper clone [--prefix=<路径>] [--quiet] [--reference <仓库>] "
-"[--name <名字>] [--url <地址>][--depth <深度>] [--] [<路径>...]"
+"[--name <名字>] [--depth <深度>] --url <url> --path <路径>"
 
-#: builtin/submodule--helper.c:196 builtin/submodule--helper.c:202
-#: builtin/submodule--helper.c:210
+#: builtin/submodule--helper.c:638 builtin/submodule--helper.c:648
 #, c-format
 msgid "could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/submodule--helper.c:198
+#: builtin/submodule--helper.c:644
 #, c-format
 msgid "clone of '%s' into submodule path '%s' failed"
 msgstr "无法克隆 '%s' 到子模组路径 '%s'"
 
-#: builtin/submodule--helper.c:221
+#: builtin/submodule--helper.c:660
 #, c-format
 msgid "cannot open file '%s'"
 msgstr "无法打开文件 '%s'"
 
-#: builtin/submodule--helper.c:226
+#: builtin/submodule--helper.c:665
 #, c-format
 msgid "could not close file %s"
 msgstr "无法关闭文件 %s"
 
-#: builtin/submodule--helper.c:241
+#: builtin/submodule--helper.c:672
 #, c-format
 msgid "could not get submodule directory for '%s'"
 msgstr "无法得到 '%s' 的子模组目录"
 
-#: builtin/submodule--helper.c:267
-msgid "fatal: submodule--helper subcommand must be called with a subcommand"
-msgstr "严重错误:submodule-helper 子命令必须由另外的子命令调用"
+#: builtin/submodule--helper.c:726
+#, c-format
+msgid "Submodule path '%s' not initialized"
+msgstr "子模组 '%s' 尚未初始化"
+
+#: builtin/submodule--helper.c:730
+msgid "Maybe you want to use 'update --init'?"
+msgstr "也许您想要执行 'update --init'?"
+
+#: builtin/submodule--helper.c:756
+#, c-format
+msgid "Skipping unmerged submodule %s"
+msgstr "略过未合并的子模组 %s"
+
+#: builtin/submodule--helper.c:777
+#, c-format
+msgid "Skipping submodule '%s'"
+msgstr "略过子模组 '%s'"
+
+#: 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:948
+msgid "path into the working tree, across nested submodule boundaries"
+msgstr "工作区中的路径,递归嵌套子模组"
+
+#: builtin/submodule--helper.c:952
+msgid "rebase, merge, checkout or none"
+msgstr "rebase、merge、checkout 或 none"
+
+#: builtin/submodule--helper.c:956
+msgid "Create a shallow clone truncated to the specified number of revisions"
+msgstr "创建一个指定深度的浅克隆"
+
+#: builtin/submodule--helper.c:959
+msgid "parallel jobs"
+msgstr "并发任务"
+
+#: 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:969
+msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper update_clone [--prefix=<路径>] [<路径>...]"
+
+#: builtin/submodule--helper.c:979
+msgid "bad value for update parameter"
+msgstr "update 参数取值错误"
+
+#: 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:274
+#: builtin/submodule--helper.c:1107
 #, c-format
-msgid "fatal: '%s' is not a valid submodule--helper subcommand"
-msgstr "严重错误:'%s' 不是一个有效的 submodule--helper 子命令"
+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>]"
@@ -10742,27 +12453,22 @@ msgstr ""
 msgid "git tag -v <tagname>..."
 msgstr "git tag -v <标签名>..."
 
-#: builtin/tag.c:80
+#: builtin/tag.c:81
 #, c-format
 msgid "tag name too long: %.*s..."
 msgstr "标签名称太长:%.*s..."
 
-#: builtin/tag.c:85
+#: builtin/tag.c:86
 #, c-format
 msgid "tag '%s' not found."
 msgstr "未发现标签 '%s'。"
 
-#: builtin/tag.c:100
+#: builtin/tag.c:101
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
 msgstr "已删除标签 '%s'(曾为 %s)\n"
 
-#: builtin/tag.c:112
-#, c-format
-msgid "could not verify the tag '%s'"
-msgstr "不能校验该标签 '%s'"
-
-#: builtin/tag.c:122
+#: builtin/tag.c:117
 #, c-format
 msgid ""
 "\n"
@@ -10775,7 +12481,7 @@ msgstr ""
 "  %s\n"
 "以 '%c' 开头的行将被忽略。\n"
 
-#: builtin/tag.c:126
+#: builtin/tag.c:121
 #, c-format
 msgid ""
 "\n"
@@ -10906,26 +12612,26 @@ msgstr "选项 --merged 和 --no-merged 只能和 -l 共用"
 msgid "only one -F or -m option is allowed."
 msgstr "只允许一个 -F 或 -m 选项。"
 
-#: builtin/tag.c:453
+#: builtin/tag.c:452
 msgid "too many params"
 msgstr "太多参数"
 
-#: builtin/tag.c:459
+#: builtin/tag.c:458
 #, c-format
 msgid "'%s' is not a valid tag name."
 msgstr "'%s' 不是一个有效的标签名称。"
 
-#: builtin/tag.c:464
+#: builtin/tag.c:463
 #, c-format
 msgid "tag '%s' already exists"
 msgstr "标签 '%s' 已存在"
 
-#: builtin/tag.c:489
+#: builtin/tag.c:491
 #, 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 "展开对象中"
 
@@ -10987,139 +12693,147 @@ 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:输入的行以 null 字符终止"
 
-#: 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 "(for porcelains) 忘记保存的未解决的冲突"
 
-#: 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' 启用"
@@ -11168,7 +12882,7 @@ msgstr "git verify-commit [-v | --verbose] <提交>..."
 msgid "print commit contents"
 msgstr "打印提交内容"
 
-#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:35
 msgid "print raw gpg status output"
 msgstr "打印原始 gpg 状态输出"
 
@@ -11188,7 +12902,7 @@ msgstr "只显示统计"
 msgid "git verify-tag [-v | --verbose] <tag>..."
 msgstr "git verify-tag [-v | --verbose] <标签>..."
 
-#: builtin/verify-tag.c:83
+#: builtin/verify-tag.c:34
 msgid "print tag contents"
 msgstr "打印标签内容"
 
@@ -11197,78 +12911,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:39
+#: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "删除工作区/%s:不是一个有效的目录"
 
-#: builtin/worktree.c:45
+#: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "删除 worktrees/%s:gitdir 文件不存在"
 
-#: builtin/worktree.c:50
+#: builtin/worktree.c:53
 #, c-format
 msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
 msgstr "删除 worktrees/%s:无法读取 gitdir 文件 (%s)"
 
-#: builtin/worktree.c:61
+#: builtin/worktree.c:64
 #, c-format
 msgid "Removing worktrees/%s: invalid gitdir file"
 msgstr "删除 worktrees/%s:无效的 gitdir 文件"
 
-#: builtin/worktree.c:77
+#: builtin/worktree.c:80
 #, c-format
 msgid "Removing worktrees/%s: gitdir file points to non-existent location"
 msgstr "删除 worktrees/%s:gitdir 文件的指向不存在"
 
-#: builtin/worktree.c:112
-#, c-format
-msgid "failed to remove: %s"
-msgstr "无法删除:%s"
-
-#: builtin/worktree.c:201
+#: builtin/worktree.c:204
 #, c-format
 msgid "'%s' already exists"
 msgstr "'%s' 已经存在"
 
-#: builtin/worktree.c:233
+#: builtin/worktree.c:236
 #, c-format
 msgid "could not create directory of '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/worktree.c:269
+#: builtin/worktree.c:272
 #, c-format
 msgid "Preparing %s (identifier %s)"
 msgstr "准备 %s (标识符 %s)"
 
-#: builtin/worktree.c:317
+#: builtin/worktree.c:323
 msgid "checkout <branch> even if already checked out in other worktree"
 msgstr "检出分支 <branch> 即使已经被检出到其它工作区"
 
-#: builtin/worktree.c:319
+#: builtin/worktree.c:325
 msgid "create a new branch"
 msgstr "创建一个新分支"
 
-#: builtin/worktree.c:321
+#: builtin/worktree.c:327
 msgid "create or reset a branch"
 msgstr "创建或重置一个分支"
 
-#: builtin/worktree.c:322
-msgid "detach HEAD at named commit"
-msgstr "HEAD 从指定的提交分离"
-
 #: builtin/worktree.c:329
+msgid "populate the new working tree"
+msgstr "生成新的工作区"
+
+#: 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=<前缀>/]"
@@ -11285,7 +13030,39 @@ msgstr "将 <前缀> 子目录内容写到一个树对象"
 msgid "only useful for debugging"
 msgstr "只对调试有用"
 
-#: credential-cache--daemon.c:262
+#: 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 "在一次单独的请求/响应(request/response)交换后退出"
+
+#: 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 "不要尝试 <directory>/.git/ 如果 <directory> 不是一个 Git 目录"
+
+#: upload-pack.c:1034
+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 "调试信息输出到标准错误"
 
@@ -11299,7 +13076,11 @@ msgstr ""
 "查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的\n"
 "帮助。"
 
-#: http.c:321
+#: 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 "不支持公钥文件锁定,因为 cURL < 7.44.0"
 
@@ -11415,23 +13196,23 @@ 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 哈希值"
 
-#: rerere.h:38
+#: rerere.h:40
 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\" 来开始"
 
@@ -11439,56 +13220,57 @@ 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"
+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
 msgid "Bad rev input: $rev"
-msgstr "输入坏的版本:$rev"
+msgstr "坏的输入版本:$rev"
 
 #: git-bisect.sh:299
 #, sh-format
@@ -11627,7 +13409,45 @@ 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 "不应该执行章鱼式合并。"
+
+#: 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"
@@ -11638,16 +13458,21 @@ msgstr ""
 "如果您想跳过此补丁,则执行 \"git rebase --skip\"。\n"
 "要恢复原分支并停止变基,执行 \"git rebase --abort\"。"
 
-#: git-rebase.sh:165
+#: 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 "成功应用 autostash。"
 
-#: git-rebase.sh:168
+#: git-rebase.sh:170
 #, sh-format
 msgid "Cannot store $stash_sha1"
 msgstr "无法保存 $stash_sha1"
 
-#: git-rebase.sh:169
+#: git-rebase.sh:171
 msgid ""
 "Applying autostash resulted in conflicts.\n"
 "Your changes are safe in the stash.\n"
@@ -11657,31 +13482,27 @@ msgstr ""
 "您的修改安全地保存在 stash 中。\n"
 "您可以在任何时候运行 \"git stash pop\" 或 \"git stash drop\"。\n"
 
-#: git-rebase.sh:208
+#: git-rebase.sh:210
 msgid "The pre-rebase hook refused to rebase."
 msgstr "钩子 pre-rebase 拒绝变基操作。"
 
-#: git-rebase.sh:213
+#: git-rebase.sh:215
 msgid "It looks like git-am is in progress. Cannot rebase."
 msgstr "似乎正处于在 git-am 的执行过程中。无法变基。"
 
-#: git-rebase.sh:354
-msgid "The --exec option must be used with the --interactive option"
-msgstr "选项 --exec 必须和选项 --interactive 同时使用"
-
-#: git-rebase.sh:359
+#: git-rebase.sh:356
 msgid "No rebase in progress?"
 msgstr "没有正在进行的变基?"
 
-#: git-rebase.sh:370
+#: git-rebase.sh:367
 msgid "The --edit-todo action can only be used during interactive rebase."
 msgstr "动作 --edit-todo 只能用在交互式变基过程中。"
 
-#: git-rebase.sh:377
+#: git-rebase.sh:374
 msgid "Cannot read HEAD"
 msgstr "不能读取 HEAD"
 
-#: git-rebase.sh:380
+#: git-rebase.sh:377
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
@@ -11689,12 +13510,7 @@ msgstr ""
 "您必须编辑所有的合并冲突,然后通过 git add\n"
 "命令将它们标记为已解决"
 
-#: git-rebase.sh:398
-#, sh-format
-msgid "Could not move back to $head_name"
-msgstr "无法移回 $head_name"
-
-#: git-rebase.sh:417
+#: git-rebase.sh:414
 #, sh-format
 msgid ""
 "It seems that there is already a $state_dir_base directory, and\n"
@@ -11713,97 +13529,101 @@ msgstr ""
 "\t$cmd_clear_stale_rebase\n"
 "然后再重新执行变基操作。 为避免丢失重要数据,我已经停止当前操作。"
 
-#: git-rebase.sh:468
+#: git-rebase.sh:465
 #, sh-format
 msgid "invalid upstream $upstream_name"
 msgstr "无效的上游 $upstream_name"
 
-#: git-rebase.sh:492
+#: git-rebase.sh:489
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
 msgstr "$onto_name: 有一个以上的合并基准"
 
-#: git-rebase.sh:495 git-rebase.sh:499
+#: git-rebase.sh:492 git-rebase.sh:496
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: 没有合并基准"
 
-#: git-rebase.sh:504
+#: git-rebase.sh:501
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
 msgstr "没有指向一个有效的提交:$onto_name"
 
-#: git-rebase.sh:527
+#: git-rebase.sh:524
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
 msgstr "严重错误:无此分支:$branch_name"
 
-#: git-rebase.sh:560
+#: git-rebase.sh:557
 msgid "Cannot autostash"
 msgstr "无法 autostash"
 
-#: git-rebase.sh:565
+#: git-rebase.sh:562
 #, sh-format
 msgid "Created autostash: $stash_abbrev"
 msgstr "创建了 autostash: $stash_abbrev"
 
-#: git-rebase.sh:569
+#: git-rebase.sh:566
 msgid "Please commit or stash them."
 msgstr "请提交或为它们保存进度。"
 
-#: git-rebase.sh:589
+#: git-rebase.sh:586
 #, sh-format
 msgid "Current branch $branch_name is up to date."
 msgstr "当前分支 $branch_name 是最新的。"
 
-#: git-rebase.sh:593
+#: git-rebase.sh:590
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
 msgstr "当前分支 $branch_name 是最新的,强制变基。"
 
-#: git-rebase.sh:604
+#: git-rebase.sh:601
 #, sh-format
 msgid "Changes from $mb to $onto:"
 msgstr "变更从 $mb 到 $onto:"
 
-#: git-rebase.sh:613
+#: git-rebase.sh:610
 msgid "First, rewinding head to replay your work on top of it..."
 msgstr "首先,回退分支以便在上面重放您的工作..."
 
-#: git-rebase.sh:623
+#: 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 clear 不支持参数"
 
-#: 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 "无法用 $w_commit 更新 $ref_stash"
@@ -11818,7 +13638,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:239
+#: git-stash.sh:238
 #, sh-format
 msgid ""
 "error: unknown option for 'stash save': $option\n"
@@ -11827,113 +13647,125 @@ 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 "无法初始化 stash"
 
-#: 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 "未发现 stash。"
 
-#: 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' 不是 stash 样提交"
 
-#: git-stash.sh:467
+#: git-stash.sh:477
 #, sh-format
 msgid "'$args' is not a stash reference"
 msgstr "'$args' 不是一个 stash 引用"
 
-#: 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:104
-#, sh-format
-msgid "cannot strip one component off url '$remoteurl'"
-msgstr "无法从 url '$remoteurl' 剥离一个组件"
-
-#: git-submodule.sh:281
+#: git-submodule.sh:184
 msgid "Relative path can only be used from the toplevel of the working tree"
 msgstr "只能在工作区的顶级目录中使用相对路径"
 
-#: git-submodule.sh:291
+#: git-submodule.sh:194
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "仓库 URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 
-#: git-submodule.sh:308
+#: git-submodule.sh:211
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:312
+#: git-submodule.sh:215
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -11944,428 +13776,715 @@ msgstr ""
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:330
+#: git-submodule.sh:233
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存仓库到索引"
 
-#: git-submodule.sh:332
+#: 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:340
+#: git-submodule.sh:243
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr "本地发现 '$sm_name' 的一个 git 目录,与其对应的远程仓库:"
 
-#: git-submodule.sh:342
-#, sh-format
-msgid ""
-"If you want to reuse this local git directory instead of cloning again from"
-msgstr "如果您想重用此本地 git 目录而不是重新克隆自"
-
-#: git-submodule.sh:344
-#, sh-format
-msgid ""
-"use the '--force' option. If the local git directory is not the correct repo"
-msgstr "使用 '--force' 参数。如果本地 git 目录不是正确的仓库"
-
-#: git-submodule.sh:345
+#: git-submodule.sh:245
 #, 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 "或者您不确定其中含义使用 '--name' 参数选择另外一个名称。"
+msgstr ""
+"如果您想要重用这个本地 git 目录而非重新克隆自\n"
+"  $realrepo\n"
+"使用 '--force' 选项。如果本地 git 目录不是正确的仓库\n"
+"或者您不确定这里的含义,使用 '--name' 选项选择另外的名称。"
 
-#: git-submodule.sh:347
+#: git-submodule.sh:251
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "激活本地 git 目录到子模组 '$sm_name'。"
 
-#: git-submodule.sh:359
+#: git-submodule.sh:263
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:364
+#: git-submodule.sh:268
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:373
+#: git-submodule.sh:277
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:417
-#, sh-format
-msgid "Entering '$prefix$displaypath'"
-msgstr "正在进入 '$prefix$displaypath'"
-
-#: git-submodule.sh:437
-#, sh-format
-msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
-msgstr "停止于 '$prefix$displaypath',脚本返回非零值。"
-
-#: git-submodule.sh:483
-#, sh-format
-msgid "No url found for submodule path '$displaypath' in .gitmodules"
-msgstr "在 .gitmodules 中未找到子模组路径 '$displaypath' 的 url"
-
-#: git-submodule.sh:492
-#, sh-format
-msgid "Failed to register url for submodule path '$displaypath'"
-msgstr "无法为子模组路径 '$displaypath' 注册 url"
-
-#: git-submodule.sh:494
+#: git-submodule.sh:324
 #, sh-format
-msgid "Submodule '$name' ($url) registered for path '$displaypath'"
-msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
+msgid "Entering '$displaypath'"
+msgstr "正在进入 '$displaypath'"
 
-#: git-submodule.sh:511
+#: git-submodule.sh:344
 #, sh-format
-msgid "Failed to register update mode for submodule path '$displaypath'"
-msgstr "无法为子模组路径 '$displaypath' 注册更新模式"
+msgid "Stopping at '$displaypath'; script returned non-zero status."
+msgstr "停止于 '$displaypath';脚本返回非零值。"
 
-#: git-submodule.sh:549
+#: git-submodule.sh:415
 #, sh-format
-msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr "使用 '.' 如果您真的想要对所有子模组取消初始化"
+msgid "pathspec and --all are incompatible"
+msgstr "pathspec 和 --all 不兼容"
 
-#: git-submodule.sh:566
+#: git-submodule.sh:420
 #, sh-format
-msgid "Submodule work tree '$displaypath' contains a .git directory"
-msgstr "å­\90模ç»\84å·¥ä½\9cå\8cº '$displaypath' å\8c\85å\90«ä¸\80个 .git ç\9b®å½\95"
+msgid "Use '--all' if you really want to deinitialize all submodules"
+msgstr "å¦\82æ\9e\9cæ\82¨ç¡®å®\9eæ\83³è¦\81对æ\89\80æ\9c\89å­\90模ç»\84æ\89§è¡\8cå\8f\96æ¶\88å\88\9då§\8bå\8c\96ï¼\8c请使ç\94¨ '--all'"
 
-#: git-submodule.sh:567
+#: 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:573
+#: 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:576
+#: git-submodule.sh:451
 #, sh-format
 msgid "Cleared directory '$displaypath'"
 msgstr "已清除目录 '$displaypath'"
 
-#: git-submodule.sh:577
+#: git-submodule.sh:452
 #, sh-format
 msgid "Could not remove submodule work tree '$displaypath'"
 msgstr "无法移除子模组工作区 '$displaypath'"
 
-#: git-submodule.sh:580
+#: git-submodule.sh:455
 #, sh-format
 msgid "Could not create empty submodule directory '$displaypath'"
 msgstr "不能创建空的子模组目录 '$displaypath'"
 
-#: git-submodule.sh:589
+#: git-submodule.sh:464
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
 msgstr "子模组 '$name' ($url) 未对路径 '$displaypath' 注册"
 
-#: git-submodule.sh:723
-#, sh-format
-msgid ""
-"Submodule path '$displaypath' not initialized\n"
-"Maybe you want to use 'update --init'?"
-msgstr ""
-"子模组路径 '$displaypath' 没有初始化\n"
-"也许您想用 'update --init'?"
-
-#: git-submodule.sh:736
+#: git-submodule.sh:617
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中找到当前版本"
 
-#: git-submodule.sh:745
+#: git-submodule.sh:627
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:768
+#: git-submodule.sh:632
+#, 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:650
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中获取"
 
-#: git-submodule.sh:788
+#: 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 "无法在子模组路径 '$displaypath' 中检出 '$sha1'"
 
-#: git-submodule.sh:789
+#: git-submodule.sh:664
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "子模组路径 '$displaypath':检出 '$sha1'"
 
-#: git-submodule.sh:793
+#: git-submodule.sh:668
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr "无法在子模组路径 '$displaypath' 中变基 '$sha1'"
 
-#: git-submodule.sh:794
+#: git-submodule.sh:669
 #, sh-format
 msgid "Submodule path '$displaypath': rebased into '$sha1'"
 msgstr "子模组路径 '$displaypath':变基至 '$sha1'"
 
-#: git-submodule.sh:799
+#: git-submodule.sh:674
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$displaypath' 中"
 
-#: git-submodule.sh:800
+#: git-submodule.sh:675
 #, sh-format
 msgid "Submodule path '$displaypath': merged in '$sha1'"
 msgstr "子模组路径 '$displaypath':已合并入 '$sha1'"
 
-#: git-submodule.sh:805
+#: git-submodule.sh:680
 #, sh-format
-msgid ""
-"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
-msgstr "在子模组路径 '$prefix$sm_path' 中执行 '$command $sha1' 失败"
+msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'"
+msgstr "在子模组 '$displaypath' 中执行 '$command $sha1' 失败"
 
-#: git-submodule.sh:806
+#: git-submodule.sh:681
 #, sh-format
-msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
-msgstr "子模组路径 '$prefix$sm_path': '$command $sha1'"
+msgid "Submodule path '$displaypath': '$command $sha1'"
+msgstr "子模组 '$displaypath':'$command $sha1'"
 
-#: git-submodule.sh:836
+#: git-submodule.sh:712
 #, sh-format
 msgid "Failed to recurse into submodule path '$displaypath'"
 msgstr "无法递归进子模组路径 '$displaypath'"
 
-#: git-submodule.sh:944
+#: git-submodule.sh:820
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
-#: git-submodule.sh:996
+#: git-submodule.sh:872
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1016
+#: git-submodule.sh:892
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_src"
 msgstr "  警告:$display_name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1019
+#: git-submodule.sh:895
 #, sh-format
 msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
 msgstr "  警告:$display_name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:1022
+#: 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:1047
-msgid "blob"
-msgstr "数据对象"
-
-#: git-submodule.sh:1165
+#: git-submodule.sh:1045
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:1229
+#: git-submodule.sh:1112
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "为 '$displaypath' 同步子模组 url"
 
-#~ msgid "Forward-port local commits to the updated upstream head"
-#~ msgstr "本地提交转移至更新后的上游分支中"
-
-#~ msgid "unable to parse format"
-#~ msgstr "不能解析格式"
-
-#~ msgid "improper format entered align:%s"
-#~ msgstr "输入了不正确的格式 align:%s"
-
-#~ msgid "Could not set core.worktree in %s"
-#~ msgstr "不能在 %s 中设置 core.worktree"
-
-#  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
-#~ msgid ""
-#~ "push.default is unset; its implicit value has changed in\n"
-#~ "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-#~ "and maintain the traditional behavior, use:\n"
-#~ "\n"
-#~ "  git config --global push.default matching\n"
-#~ "\n"
-#~ "To squelch this message and adopt the new behavior now, use:\n"
-#~ "\n"
-#~ "  git config --global push.default simple\n"
-#~ "\n"
-#~ "When push.default is set to 'matching', git will push local branches\n"
-#~ "to the remote branches that already exist with the same name.\n"
-#~ "\n"
-#~ "Since Git 2.0, Git defaults to the more conservative 'simple'\n"
-#~ "behavior, which only pushes the current branch to the corresponding\n"
-#~ "remote branch that 'git pull' uses to update the current branch.\n"
-#~ "\n"
-#~ "See 'git help config' and search for 'push.default' for further "
-#~ "information.\n"
-#~ "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
-#~ "'current' instead of 'simple' if you sometimes use older versions of Git)"
-#~ msgstr ""
-#~ "push.default 尚未设置,它的默认值在 Git 2.0 已从 'matching'\n"
-#~ "变更为 'simple'。若要不再显示本信息并保持传统习惯,进行如下设置:\n"
-#~ "\n"
-#~ "  git config --global push.default matching\n"
-#~ "\n"
-#~ "若要不再显示本信息并从现在开始采用新的使用习惯,设置:\n"
-#~ "\n"
-#~ "  git config --global push.default simple\n"
-#~ "\n"
-#~ "当 push.default 设置为 'matching' 后,git 将推送和远程同名的所有\n"
-#~ "本地分支。\n"
-#~ "\n"
-#~ "从 Git 2.0 开始,Git 默认采用更为保守的 'simple' 模式,只推送当前\n"
-#~ "分支到远程关联的同名分支,即 'git push' 推送当前分支。\n"
-#~ "\n"
-#~ "参见 'git help config' 并查找 'push.default' 以获取更多信息。\n"
-#~ "('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
-#~ "为保持兼容,请用 'current' 代替 'simple')"
-
-#~ msgid "Could not append '%s'"
-#~ msgstr "不能追加 '%s'"
-
-#~ msgid "Could not set '%s'"
-#~ msgstr "不能设置 '%s'"
+#: git-parse-remote.sh:89
+#, sh-format
+msgid "See git-${cmd}(1) for details."
+msgstr "详见 git-${cmd}(1)。"
+
+#: git-rebase--interactive.sh:131
+#, sh-format
+msgid "Rebasing ($new_count/$total)"
+msgstr "变基中($new_count/$total)"
 
-#  译者:可选值,不能翻译
-#~ msgid "check|on-demand|no"
-#~ msgstr "check|on-demand|no"
+#: 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"
+msgstr ""
+"\n"
+"命令:\n"
+" p, pick = 使用提交\n"
+" r, reword = 使用提交,但修改提交说明\n"
+" e, edit = 使用提交,但停止以便进行提交修补\n"
+" s, squash = 使用提交,但和前一个版本融合\n"
+" f, fixup = 类似于 \"squash\",但丢弃提交说明日志\n"
+" x, exec = 使用 shell 运行命令(此行剩余部分)\n"
+" d, drop = 删除提交\n"
+"\n"
+"这些行可以被重新排序;它们会被从上至下地执行。\n"
+"\n"
+
+#: git-rebase--interactive.sh:162
+msgid ""
+"\n"
+"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
+msgstr ""
+"\n"
+"不要删除任意一行。使用 'drop' 显式地删除一个提交。\n"
+
+#: git-rebase--interactive.sh:166
+msgid ""
+"\n"
+"If you remove a line here THAT COMMIT WILL BE LOST.\n"
+msgstr ""
+"\n"
+"如果您在这里删除一行,对应的提交将会丢失。\n"
+
+#: git-rebase--interactive.sh:202
+#, 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:227
+#, sh-format
+msgid "$sha1: not a commit that can be picked"
+msgstr "$sha1:不是一个可以被拣选的提交"
+
+#: git-rebase--interactive.sh:266
+#, sh-format
+msgid "Invalid commit name: $sha1"
+msgstr "无效的提交名:$sha1"
+
+#: git-rebase--interactive.sh:308
+msgid "Cannot write current commit's replacement sha1"
+msgstr "不能写入当前提交的替代 sha1"
+
+#: git-rebase--interactive.sh:360
+#, sh-format
+msgid "Fast-forward to $sha1"
+msgstr "快进到 $sha1"
+
+#: git-rebase--interactive.sh:362
+#, sh-format
+msgid "Cannot fast-forward to $sha1"
+msgstr "不能快进到 $sha1"
+
+#: git-rebase--interactive.sh:371
+#, sh-format
+msgid "Cannot move HEAD to $first_parent"
+msgstr "不能移动 HEAD 到 $first_parent"
+
+#: git-rebase--interactive.sh:376
+#, sh-format
+msgid "Refusing to squash a merge: $sha1"
+msgstr "拒绝压缩一个合并:$sha1"
+
+#: git-rebase--interactive.sh:390
+#, sh-format
+msgid "Error redoing merge $sha1"
+msgstr "无法重做合并 $sha1"
+
+#: git-rebase--interactive.sh:398
+#, sh-format
+msgid "Could not pick $sha1"
+msgstr "不能拣选 $sha1"
+
+#: git-rebase--interactive.sh:407
+#, sh-format
+msgid "This is the commit message #${n}:"
+msgstr "这是提交说明 #${n}:"
+
+#: git-rebase--interactive.sh:412
+#, sh-format
+msgid "The commit message #${n} will be skipped:"
+msgstr "提交说明 #${n} 将被跳过:"
+
+#: 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] "这是一个 $count 个提交的组合。"
+msgstr[1] "这是一个 $count 个提交的组合。"
+
+#: git-rebase--interactive.sh:431
+#, sh-format
+msgid "Cannot write $fixup_msg"
+msgstr "不能写入 $fixup_msg"
+
+#: git-rebase--interactive.sh:434
+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
+#, sh-format
+msgid "Could not apply $sha1... $rest"
+msgstr "不能应用 $sha1... $rest"
+
+#: git-rebase--interactive.sh:549
+#, 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"
+"这通常是因为空的提交说明,或者 pre-commit 钩子执行失败。如果是 pre-commit\n"
+"钩子执行失败,你可能需要在重写提交说明前解决这个问题。"
+
+#: git-rebase--interactive.sh:564
+#, sh-format
+msgid "Stopped at $sha1_abbrev... $rest"
+msgstr "停止在 $sha1_abbrev... $rest"
+
+#: git-rebase--interactive.sh:579
+#, sh-format
+msgid "Cannot '$squash_style' without a previous commit"
+msgstr "没有父提交的情况下不能 '$squash_style'"
+
+#: git-rebase--interactive.sh:621
+#, sh-format
+msgid "Executing: $rest"
+msgstr "执行:$rest"
+
+#: git-rebase--interactive.sh:629
+#, sh-format
+msgid "Execution failed: $rest"
+msgstr "执行失败:$rest"
+
+#: git-rebase--interactive.sh:631
+msgid "and made changes to the index and/or the working tree"
+msgstr "并且修改索引和/或工作区"
+
+#  译者:注意保持前导空格
+#: git-rebase--interactive.sh:633
+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: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"
+msgstr ""
+"执行成功:$rest\n"
+"但是在索引和/或工作区中存在变更。提交或暂存修改,然后运行\n"
+"\n"
+"\tgit rebase --continue"
+
+#: git-rebase--interactive.sh:657
+#, sh-format
+msgid "Unknown command: $command $sha1 $rest"
+msgstr "未知命令:$command $sha1 $rest"
+
+#: git-rebase--interactive.sh:658
+msgid "Please fix this using 'git rebase --edit-todo'."
+msgstr "要修改请使用命令 'git rebase --edit-todo'。"
+
+#: git-rebase--interactive.sh:693
+#, sh-format
+msgid "Successfully rebased and updated $head_name."
+msgstr "成功变基并更新 $head_name。"
+
+#: git-rebase--interactive.sh:740
+msgid "Could not skip unnecessary pick commands"
+msgstr "不能跳过不必要的拣选命令"
+
+#: git-rebase--interactive.sh:898
+#, 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:931
+#, sh-format
+msgid ""
+"Warning: the command isn't recognized in the following line:\n"
+" - $line"
+msgstr ""
+"警告:下面一行中的命令未能被识别:\n"
+" - $line"
+
+#: git-rebase--interactive.sh:970
+msgid "could not detach HEAD"
+msgstr "不能检出为分离头指针"
+
+#: git-rebase--interactive.sh:1008
+msgid ""
+"Warning: some commits may have been dropped accidentally.\n"
+"Dropped commits (newer to older):"
+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."
+msgstr ""
+"为避免这条信息,使用 \"drop\" 指令显式地删除一个提交。\n"
+"\n"
+"使用 'git config rebase.missingCommitsCheck' 来修改警告级别。\n"
+"可选值有:ignore、warn、error。"
+
+#: git-rebase--interactive.sh:1027
+#, 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' and then run 'git rebase --"
+"continue'."
+msgstr ""
+"您可以用命令 'git rebase --edit-todo' 修正然后执行命令 'git rebase --"
+"continue'。"
+
+#: git-rebase--interactive.sh:1045
+msgid "Or you can abort the rebase with 'git rebase --abort'."
+msgstr "或者您可以使用 'git rebase --abort' 命令终止变基操作。"
+
+#: git-rebase--interactive.sh:1069
+msgid "Could not remove CHERRY_PICK_HEAD"
+msgstr "不能删除 CHERRY_PICK_HEAD"
+
+#: git-rebase--interactive.sh:1074
+#, 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"
+"  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:1091
+msgid "Error trying to find the author identity to amend commit"
+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."
+msgstr ""
+"您的工作区中有未提交的变更。请先提交然后再次运行 'git rebase --continue'。"
+
+#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
+msgid "Could not commit staged changes."
+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"
+msgstr ""
+"\n"
+"您正在修改运行中的交互式变基的 todo 文件。若要在编辑结束后继续变基,\n"
+"请执行:\n"
+"    git rebase --continue\n"
+"\n"
+
+#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1295
+msgid "Could not execute editor"
+msgstr "无法运行编辑器"
+
+#: git-rebase--interactive.sh:1150
+#, sh-format
+msgid "Could not checkout $switch_to"
+msgstr "不能检出 $switch_to"
+
+#: git-rebase--interactive.sh:1155
+msgid "No HEAD?"
+msgstr "没有 HEAD?"
+
+#: git-rebase--interactive.sh:1156
+#, sh-format
+msgid "Could not create temporary $state_dir"
+msgstr "不能创建临时 $state_dir"
+
+#: git-rebase--interactive.sh:1158
+msgid "Could not mark as interactive"
+msgstr "不能标记为交互式"
+
+#: git-rebase--interactive.sh:1168 git-rebase--interactive.sh:1173
+msgid "Could not init rewritten commits"
+msgstr "不能对重写提交进行初始化"
+
+#: git-rebase--interactive.sh:1273
+#, 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:1278
+msgid ""
+"\n"
+"However, if you remove everything, the rebase will be aborted.\n"
+"\n"
+msgstr ""
+"\n"
+"然而,如果您删除全部内容,变基操作将会终止。\n"
+"\n"
 
-#~ msgid "Missing author: %s"
-#~ msgstr "缺少作者:%s"
+#: git-rebase--interactive.sh:1285
+msgid "Note that empty commits are commented out"
+msgstr "注意空提交已被注释掉"
 
-#~ msgid "Testing "
-#~ msgstr "正在测试 "
+#: git-sh-setup.sh:89 git-sh-setup.sh:94
+#, sh-format
+msgid "usage: $dashless $USAGE"
+msgstr "用法:$dashless $USAGE"
 
-#~ msgid "unable to look up current user in the passwd file: %s"
-#~ msgstr "无法在口令文件中查询到当前用户:%s"
+#: git-sh-setup.sh:190
+#, sh-format
+msgid "Cannot chdir to $cdup, the toplevel of the working tree"
+msgstr "不能切换目录到 $cdup,工作区的顶级目录"
 
-#~ msgid "no such user"
-#~ 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 不能在没有工作区的情况下使用"
 
-#~ msgid "show usage"
-#~ msgstr "显示用法"
+#: git-sh-setup.sh:220
+msgid "Cannot rebase: You have unstaged changes."
+msgstr "不能变基:您有未暂存的变更。"
 
-#~ msgid "branch '%s' does not point at a commit"
-#~ msgstr "分支 '%s' 未指向一个提交"
+#: git-sh-setup.sh:223
+msgid "Cannot rewrite branches: You have unstaged changes."
+msgstr "不能重写分支:您有未暂存的变更。"
 
-#~ msgid "object '%s' does not point to a commit"
-#~ msgstr "对象 '%s' 没有指向一个提交"
+#: git-sh-setup.sh:226
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "无法通过变基方式拉取:您有未暂存的变更。"
 
-#~ msgid "print only merged branches"
-#~ msgstr "只打印合并的分支"
+#: git-sh-setup.sh:229
+#, sh-format
+msgid "Cannot $action: You have unstaged changes."
+msgstr "不能 $action:您有未暂存的变更。"
 
-#~ msgid "--dissociate given, but there is no --reference"
-#~ msgstr "提供了参数 --dissociate,但未提供 --reference"
+#: git-sh-setup.sh:242
+msgid "Cannot rebase: Your index contains uncommitted changes."
+msgstr "不能变基:您的索引中包含未提交的变更。"
 
-#~ msgid "insanely long template name %s"
-#~ msgstr "太长的模版名 %s"
+#: git-sh-setup.sh:245
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "无法通过变基方式拉取:您的索引中包含未提交的变更。"
 
-#~ msgid "insanely long symlink %s"
-#~ msgstr "太长的符号链接 %s"
+#: git-sh-setup.sh:248
+#, sh-format
+msgid "Cannot $action: Your index contains uncommitted changes."
+msgstr "不能 $action:您的索引中包含未提交的变更。"
 
-#~ msgid "insanely long template path %s"
-#~ msgstr "太长的模版路径 %s"
+#: git-sh-setup.sh:252
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "而且您的索引中包含未提交的变更。"
 
-#~ msgid "insane git directory %s"
-#~ msgstr "不正常的 git 目录 %s"
+#: git-sh-setup.sh:372
+msgid "You need to run this command from the toplevel of the working tree."
+msgstr "您需要在工作区的顶级目录中运行这个命令。"
 
-#~ msgid "unsupported sort specification '%s'"
-#~ msgstr "不支持的排序规格 '%s'"
+#: git-sh-setup.sh:377
+msgid "Unable to determine absolute path of git directory"
+msgstr "不能确定 git 目录的绝对路径"
 
-#~ msgid "unsupported sort specification '%s' in variable '%s'"
-#~ msgstr "不支持变量 '%2$s' 的排序规格 '%1$s'"
+#~ msgid "Could not write to %s"
+#~ msgstr "不能写入 %s"
 
-#~ msgid "switch 'points-at' requires an object"
-#~ msgstr "开关 'points-at' 需要一个对象"
+#~ msgid "Error wrapping up %s."
+#~ msgstr "错误收尾 %s。"
 
-#~ msgid "sort tags"
-#~ msgstr "æ\8e\92åº\8fæ \87ç­¾"
+#~ msgid "Your local changes would be overwritten by cherry-pick."
+#~ msgstr "æ\82¨ç\9a\84æ\9c¬å\9c°ä¿®æ\94¹å°\86被æ\8b£é\80\89æ\93\8dä½\9cè¦\86ç\9b\96ã\80\82"
 
-#~ msgid "--sort and -n are incompatible"
-#~ msgstr "--sort 和 -n 不兼容"
+#~ msgid "Cannot revert during another revert."
+#~ msgstr "不能在回退中执行另一回退。"
 
-#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-#~ msgstr "Gitdir '$a' 在子模组路径 '$b' 之下或相反"
+#~ msgid "Cannot cherry-pick during another cherry-pick."
+#~ msgstr "不能在拣选过程中执行另一拣选。"
 
-#~ msgid "false|true|preserve"
-#~ msgstr "false|true|preserve"
+#~ msgid "Could not parse line %d."
+#~ msgstr "不能解析第 %d 行。"
 
-#~ msgid "BUG: reopen a lockfile that is still open"
-#~ msgstr "BUG: 重新打开一个仍打开着的锁文件"
+#~ msgid "Could not open %s"
+#~ msgstr "不能打开 %s"
 
-#~ msgid "BUG: reopen a lockfile that has been committed"
-#~ msgstr "BUG: 重新打开一个已提交的锁文件"
+#~ msgid "Could not read %s."
+#~ msgstr "不能读取 %s。"
 
-#~ msgid "option %s does not accept negative form"
-#~ msgstr "选项 %s 不接受否定格式"
+#~ msgid "Could not format %s."
+#~ msgstr "不能格式化 %s。"
 
-#~ msgid "unable to parse value '%s' for option %s"
-#~ msgstr "不能解析选项 %1$s 的值 '%2$s'"
+#~ msgid "%s: %s"
+#~ msgstr "%s:%s"
 
-#~ msgid "-b and -B are mutually exclusive"
-#~ msgstr "-b 和 -B 互斥"
+#~ msgid "cannot open %s: %s"
+#~ msgstr "不能打开 %s:%s"
 
 #~ msgid "You need to set your committer info first"
-#~ msgstr "您需要先设置你的提交者信息"
-
-#~ msgid ""
-#~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
-#~ "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
-#~ "To restore the original branch and stop patching, run \"$cmdline --abort"
-#~ "\"."
-#~ msgstr ""
-#~ "当您解决了此问题后,执行 \"$cmdline --continue\"。\n"
-#~ "如果您想跳过此补丁,则执行 \"$cmdline --skip\"。\n"
-#~ "要恢复原分支并停止打补丁,执行 \"$cmdline --abort\"。"
-
-#~ msgid "Patch format $patch_format is not supported."
-#~ msgstr "不支持 $patch_format 补丁格式。"
-
-#~ msgid "Please make up your mind. --skip or --abort?"
-#~ msgstr "请下决心。--skip 或是 --abort ?"
-
-#~ msgid ""
-#~ "Patch is empty.  Was it split wrong?\n"
-#~ "If you would prefer to skip this patch, instead run \"$cmdline --skip\".\n"
-#~ "To restore the original branch and stop patching run \"$cmdline --abort\"."
-#~ msgstr ""
-#~ "补丁为空。是不是切分错误?\n"
-#~ "如果您想要跳过这个补丁,执行 \"$cmdline --skip\"。\n"
-#~ "要恢复原分支并停止打补丁,执行 \"$cmdline --abort\"。"
-
-#~ msgid "Patch does not have a valid e-mail address."
-#~ msgstr "补丁中没有一个有效的邮件地址。"
-
-#~ msgid "Applying: $FIRSTLINE"
-#~ msgstr "正应用:$FIRSTLINE"
-
-#~ msgid "Patch failed at $msgnum $FIRSTLINE"
-#~ msgstr "补丁失败于 $msgnum $FIRSTLINE"
-
-#~ msgid ""
-#~ "Pull is not possible because you have unmerged files.\n"
-#~ "Please, 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 ""
-#~ "Pull 不可用,因为您尚有未合并的文件。请先在工作区改正文件,\n"
-#~ "然后酌情使用 'git add/rm <文件>' 标记解决方案,再做提交。"
-
-#~ msgid "Pull is not possible because you have unmerged files."
-#~ msgstr "Pull 不可用,因为您尚有未合并的文件。"
+#~ msgstr "您需要先设置您的提交者信息"
index 92b2870a7eabb6a99ffbbcfc222d2ff1c1186fa0..37b2c3b1f9954d79bf799a3af979e8c337698b79 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -16,6 +16,7 @@ static struct cmt_fmt_map {
        const char *name;
        enum cmit_fmt format;
        int is_tformat;
+       int expand_tabs_in_log;
        int is_alias;
        const char *user_format;
 } *commit_formats;
@@ -87,13 +88,14 @@ static int git_pretty_formats_config(const char *var, const char *value, void *c
 static void setup_commit_formats(void)
 {
        struct cmt_fmt_map builtin_formats[] = {
-               { "raw",        CMIT_FMT_RAW,           0 },
-               { "medium",     CMIT_FMT_MEDIUM,        0 },
-               { "short",      CMIT_FMT_SHORT,         0 },
-               { "email",      CMIT_FMT_EMAIL,         0 },
-               { "fuller",     CMIT_FMT_FULLER,        0 },
-               { "full",       CMIT_FMT_FULL,          0 },
-               { "oneline",    CMIT_FMT_ONELINE,       1 }
+               { "raw",        CMIT_FMT_RAW,           0,      0 },
+               { "medium",     CMIT_FMT_MEDIUM,        0,      8 },
+               { "short",      CMIT_FMT_SHORT,         0,      0 },
+               { "email",      CMIT_FMT_EMAIL,         0,      0 },
+               { "mboxrd",     CMIT_FMT_MBOXRD,        0,      0 },
+               { "fuller",     CMIT_FMT_FULLER,        0,      8 },
+               { "full",       CMIT_FMT_FULL,          0,      8 },
+               { "oneline",    CMIT_FMT_ONELINE,       1,      0 }
        };
        commit_formats_len = ARRAY_SIZE(builtin_formats);
        builtin_formats_len = commit_formats_len;
@@ -172,6 +174,7 @@ void get_commit_format(const char *arg, struct rev_info *rev)
 
        rev->commit_format = commit_format->format;
        rev->use_terminator = commit_format->is_tformat;
+       rev->expand_tabs_in_log_default = commit_format->expand_tabs_in_log;
        if (commit_format->format == CMIT_FMT_USERFORMAT) {
                save_user_format(rev, commit_format->user_format,
                                 commit_format->is_tformat);
@@ -442,7 +445,7 @@ void pp_user_info(struct pretty_print_context *pp,
        if (pp->mailmap)
                map_user(pp->mailmap, &mailbuf, &maillen, &namebuf, &namelen);
 
-       if (pp->fmt == CMIT_FMT_EMAIL) {
+       if (cmit_fmt_is_mail(pp->fmt)) {
                if (pp->from_ident && ident_cmp(pp->from_ident, &ident)) {
                        struct strbuf buf = STRBUF_INIT;
 
@@ -492,6 +495,7 @@ void pp_user_info(struct pretty_print_context *pp,
                            show_ident_date(&ident, &pp->date_mode));
                break;
        case CMIT_FMT_EMAIL:
+       case CMIT_FMT_MBOXRD:
                strbuf_addf(sb, "Date: %s\n",
                            show_ident_date(&ident, DATE_MODE(RFC2822)));
                break;
@@ -505,7 +509,7 @@ void pp_user_info(struct pretty_print_context *pp,
        }
 }
 
-static int is_empty_line(const char *line, int *len_p)
+static int is_blank_line(const char *line, int *len_p)
 {
        int len = *len_p;
        while (len && isspace(line[len - 1]))
@@ -514,14 +518,14 @@ static int is_empty_line(const char *line, int *len_p)
        return !len;
 }
 
-static const char *skip_empty_lines(const char *msg)
+const char *skip_blank_lines(const char *msg)
 {
        for (;;) {
                int linelen = get_one_line(msg);
                int ll = linelen;
                if (!linelen)
                        break;
-               if (!is_empty_line(msg, &ll))
+               if (!is_blank_line(msg, &ll))
                        break;
                msg += linelen;
        }
@@ -533,22 +537,20 @@ static void add_merge_info(const struct pretty_print_context *pp,
 {
        struct commit_list *parent = commit->parents;
 
-       if ((pp->fmt == CMIT_FMT_ONELINE) || (pp->fmt == CMIT_FMT_EMAIL) ||
+       if ((pp->fmt == CMIT_FMT_ONELINE) || (cmit_fmt_is_mail(pp->fmt)) ||
            !parent || !parent->next)
                return;
 
        strbuf_addstr(sb, "Merge:");
 
        while (parent) {
-               struct commit *p = parent->item;
-               const char *hex = NULL;
+               struct object_id *oidp = &parent->item->object.oid;
+               strbuf_addch(sb, ' ');
                if (pp->abbrev)
-                       hex = find_unique_abbrev(p->object.oid.hash, pp->abbrev);
-               if (!hex)
-                       hex = oid_to_hex(&p->object.oid);
+                       strbuf_add_unique_abbrev(sb, oidp->hash, pp->abbrev);
+               else
+                       strbuf_addstr(sb, oid_to_hex(oidp));
                parent = parent->next;
-
-               strbuf_addf(sb, " %s", hex);
        }
        strbuf_addch(sb, '\n');
 }
@@ -873,7 +875,7 @@ const char *format_subject(struct strbuf *sb, const char *msg,
                int linelen = get_one_line(line);
 
                msg += linelen;
-               if (!linelen || is_empty_line(line, &linelen))
+               if (!linelen || is_blank_line(line, &linelen))
                        break;
 
                if (!sb)
@@ -892,11 +894,11 @@ static void parse_commit_message(struct format_commit_context *c)
        const char *msg = c->message + c->message_off;
        const char *start = c->message;
 
-       msg = skip_empty_lines(msg);
+       msg = skip_blank_lines(msg);
        c->subject_off = msg - start;
 
        msg = format_subject(NULL, msg, NULL);
-       msg = skip_empty_lines(msg);
+       msg = skip_blank_lines(msg);
        c->body_off = msg - start;
 
        c->commit_message_parsed = 1;
@@ -1020,9 +1022,15 @@ static size_t parse_padding_placeholder(struct strbuf *sb,
                int width;
                if (!end || end == start)
                        return 0;
-               width = strtoul(start, &next, 10);
+               width = strtol(start, &next, 10);
                if (next == start || width == 0)
                        return 0;
+               if (width < 0) {
+                       if (to_column)
+                               width += term_columns();
+                       if (width < 0)
+                               return 0;
+               }
                c->padding = to_column ? -width : width;
                c->flush_type = flush_type;
 
@@ -1055,13 +1063,15 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
        const struct commit *commit = c->commit;
        const char *msg = c->message;
        struct commit_list *p;
-       int h1, h2;
+       int ch;
 
        /* these are independent of the commit */
        switch (placeholder[0]) {
        case 'C':
                if (starts_with(placeholder + 1, "(auto)")) {
-                       c->auto_color = 1;
+                       c->auto_color = want_color(c->pretty_ctx->color);
+                       if (c->auto_color && sb->len)
+                               strbuf_addstr(sb, GIT_COLOR_RESET);
                        return 7; /* consumed 7 bytes, "C(auto)" */
                } else {
                        int ret = parse_color(sb, placeholder, c);
@@ -1079,14 +1089,11 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                return 1;
        case 'x':
                /* %x00 == NUL, %x0a == LF, etc. */
-               if (0 <= (h1 = hexval_table[0xff & placeholder[1]]) &&
-                   h1 <= 16 &&
-                   0 <= (h2 = hexval_table[0xff & placeholder[2]]) &&
-                   h2 <= 16) {
-                       strbuf_addch(sb, (h1<<4)|h2);
-                       return 3;
-               } else
+               ch = hex2chr(placeholder + 1);
+               if (ch < 0)
                        return 0;
+               strbuf_addch(sb, ch);
+               return 3;
        case 'w':
                if (placeholder[1] == '(') {
                        unsigned long width = 0, indent1 = 0, indent2 = 0;
@@ -1133,8 +1140,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                        strbuf_addstr(sb, diff_get_color(c->auto_color, DIFF_RESET));
                        return 1;
                }
-               strbuf_addstr(sb, find_unique_abbrev(commit->object.oid.hash,
-                                                    c->pretty_ctx->abbrev));
+               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;
@@ -1144,8 +1151,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
        case 't':               /* abbreviated tree hash */
                if (add_again(sb, &c->abbrev_tree_hash))
                        return 1;
-               strbuf_addstr(sb, find_unique_abbrev(commit->tree->object.oid.hash,
-                                                    c->pretty_ctx->abbrev));
+               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 */
@@ -1161,9 +1168,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                for (p = commit->parents; p; p = p->next) {
                        if (p != commit->parents)
                                strbuf_addch(sb, ' ');
-                       strbuf_addstr(sb, find_unique_abbrev(
-                                       p->item->object.oid.hash,
-                                       c->pretty_ctx->abbrev));
+                       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;
@@ -1224,8 +1230,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;
@@ -1297,6 +1307,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */
                if (!start)
                        start = sb->buf;
                occupied = utf8_strnwidth(start, -1, 1);
+               occupied += c->pretty_ctx->graph_width;
                padding = (-padding) - occupied;
        }
        while (1) {
@@ -1612,7 +1623,7 @@ void pp_title_line(struct pretty_print_context *pp,
        if (pp->after_subject) {
                strbuf_addstr(sb, pp->after_subject);
        }
-       if (pp->fmt == CMIT_FMT_EMAIL) {
+       if (cmit_fmt_is_mail(pp->fmt)) {
                strbuf_addch(sb, '\n');
        }
 
@@ -1629,6 +1640,82 @@ void pp_title_line(struct pretty_print_context *pp,
        strbuf_release(&title);
 }
 
+static int pp_utf8_width(const char *start, const char *end)
+{
+       int width = 0;
+       size_t remain = end - start;
+
+       while (remain) {
+               int n = utf8_width(&start, &remain);
+               if (n < 0 || !start)
+                       return -1;
+               width += n;
+       }
+       return width;
+}
+
+static void strbuf_add_tabexpand(struct strbuf *sb, int tabwidth,
+                                const char *line, int linelen)
+{
+       const char *tab;
+
+       while ((tab = memchr(line, '\t', linelen)) != NULL) {
+               int width = pp_utf8_width(line, tab);
+
+               /*
+                * If it wasn't well-formed utf8, or it
+                * had characters with badly defined
+                * width (control characters etc), just
+                * give up on trying to align things.
+                */
+               if (width < 0)
+                       break;
+
+               /* Output the data .. */
+               strbuf_add(sb, line, tab - line);
+
+               /* .. and the de-tabified tab */
+               strbuf_addchars(sb, ' ', tabwidth - (width % tabwidth));
+
+               /* Skip over the printed part .. */
+               linelen -= tab + 1 - line;
+               line = tab + 1;
+       }
+
+       /*
+        * Print out everything after the last tab without
+        * worrying about width - there's nothing more to
+        * align.
+        */
+       strbuf_add(sb, line, linelen);
+}
+
+/*
+ * pp_handle_indent() prints out the intendation, and
+ * the whole line (without the final newline), after
+ * de-tabifying.
+ */
+static void pp_handle_indent(struct pretty_print_context *pp,
+                            struct strbuf *sb, int indent,
+                            const char *line, int linelen)
+{
+       strbuf_addchars(sb, ' ', indent);
+       if (pp->expand_tabs_in_log)
+               strbuf_add_tabexpand(sb, pp->expand_tabs_in_log, line, linelen);
+       else
+               strbuf_add(sb, line, linelen);
+}
+
+static int is_mboxrd_from(const char *line, int len)
+{
+       /*
+        * a line matching /^From $/ here would only have len == 4
+        * at this point because is_empty_line would've trimmed all
+        * trailing space
+        */
+       return len > 4 && starts_with(line + strspn(line, ">"), "From ");
+}
+
 void pp_remainder(struct pretty_print_context *pp,
                  const char **msg_p,
                  struct strbuf *sb,
@@ -1643,7 +1730,7 @@ void pp_remainder(struct pretty_print_context *pp,
                if (!linelen)
                        break;
 
-               if (is_empty_line(line, &linelen)) {
+               if (is_blank_line(line, &linelen)) {
                        if (first)
                                continue;
                        if (pp->fmt == CMIT_FMT_SHORT)
@@ -1653,8 +1740,17 @@ void pp_remainder(struct pretty_print_context *pp,
 
                strbuf_grow(sb, linelen + indent + 20);
                if (indent)
-                       strbuf_addchars(sb, ' ', indent);
-               strbuf_add(sb, line, linelen);
+                       pp_handle_indent(pp, sb, indent, line, linelen);
+               else if (pp->expand_tabs_in_log)
+                       strbuf_add_tabexpand(sb, pp->expand_tabs_in_log,
+                                            line, linelen);
+               else {
+                       if (pp->fmt == CMIT_FMT_MBOXRD &&
+                                       is_mboxrd_from(line, linelen))
+                               strbuf_addch(sb, '>');
+
+                       strbuf_add(sb, line, linelen);
+               }
                strbuf_addch(sb, '\n');
        }
 }
@@ -1678,14 +1774,14 @@ void pretty_print_commit(struct pretty_print_context *pp,
        encoding = get_log_output_encoding();
        msg = reencoded = logmsg_reencode(commit, NULL, encoding);
 
-       if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL)
+       if (pp->fmt == CMIT_FMT_ONELINE || cmit_fmt_is_mail(pp->fmt))
                indent = 0;
 
        /*
         * We need to check and emit Content-type: to mark it
         * as 8-bit if we haven't done so.
         */
-       if (pp->fmt == CMIT_FMT_EMAIL && need_8bit_cte == 0) {
+       if (cmit_fmt_is_mail(pp->fmt) && need_8bit_cte == 0) {
                int i, ch, in_body;
 
                for (in_body = i = 0; (ch = msg[i]); i++) {
@@ -1710,10 +1806,10 @@ void pretty_print_commit(struct pretty_print_context *pp,
        }
 
        /* Skip excess blank lines at the beginning of body, if any... */
-       msg = skip_empty_lines(msg);
+       msg = skip_blank_lines(msg);
 
        /* These formats treat the title line specially. */
-       if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL)
+       if (pp->fmt == CMIT_FMT_ONELINE || cmit_fmt_is_mail(pp->fmt))
                pp_title_line(pp, &msg, sb, encoding, need_8bit_cte);
 
        beginning_of_body = sb->len;
@@ -1730,7 +1826,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
         * format.  Make sure we did not strip the blank line
         * between the header and the body.
         */
-       if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
+       if (cmit_fmt_is_mail(pp->fmt) && sb->len <= beginning_of_body)
                strbuf_addch(sb, '\n');
 
        unuse_commit_buffer(commit, reencoded);
diff --git a/quote.c b/quote.c
index fe884d24521f91a0f1f30b3cf5f08734bab7bd31..53b98a5b840d8fd4d73fab27348b657501923dca 100644 (file)
--- a/quote.c
+++ b/quote.c
@@ -43,6 +43,19 @@ void sq_quote_buf(struct strbuf *dst, const char *src)
        free(to_free);
 }
 
+void sq_quotef(struct strbuf *dst, const char *fmt, ...)
+{
+       struct strbuf src = STRBUF_INIT;
+
+       va_list ap;
+       va_start(ap, fmt);
+       strbuf_vaddf(&src, fmt, ap);
+       va_end(ap);
+
+       sq_quote_buf(dst, src.buf);
+       strbuf_release(&src);
+}
+
 void sq_quote_argv(struct strbuf *dst, const char** argv, size_t maxlen)
 {
        int i;
@@ -440,3 +453,40 @@ void tcl_quote_buf(struct strbuf *sb, const char *src)
        }
        strbuf_addch(sb, '"');
 }
+
+void basic_regex_quote_buf(struct strbuf *sb, const char *src)
+{
+       char c;
+
+       if (*src == '^') {
+               /* only beginning '^' is special and needs quoting */
+               strbuf_addch(sb, '\\');
+               strbuf_addch(sb, *src++);
+       }
+       if (*src == '*')
+               /* beginning '*' is not special, no quoting */
+               strbuf_addch(sb, *src++);
+
+       while ((c = *src++)) {
+               switch (c) {
+               case '[':
+               case '.':
+               case '\\':
+               case '*':
+                       strbuf_addch(sb, '\\');
+                       strbuf_addch(sb, c);
+                       break;
+
+               case '$':
+                       /* only the end '$' is special and needs quoting */
+                       if (*src == '\0')
+                               strbuf_addch(sb, '\\');
+                       strbuf_addch(sb, c);
+                       break;
+
+               default:
+                       strbuf_addch(sb, c);
+                       break;
+               }
+       }
+}
diff --git a/quote.h b/quote.h
index 99e04d34bf223a0147e65623322ef2c2fb01e01d..66f5644aa29d0da4f95e693429ad6f8c0eb8cf09 100644 (file)
--- a/quote.h
+++ b/quote.h
@@ -25,10 +25,13 @@ struct strbuf;
  * sq_quote_buf() writes to an existing buffer of specified size; it
  * will return the number of characters that would have been written
  * excluding the final null regardless of the buffer size.
+ *
+ * sq_quotef() quotes the entire formatted string as a single result.
  */
 
 extern void sq_quote_buf(struct strbuf *, const char *src);
 extern void sq_quote_argv(struct strbuf *, const char **argv, size_t maxlen);
+extern void sq_quotef(struct strbuf *, const char *fmt, ...);
 
 /* This unwraps what sq_quote() produces in place, but returns
  * NULL if the input does not look like what sq_quote would have
@@ -67,5 +70,6 @@ extern char *quote_path_relative(const char *in, const char *prefix,
 extern void perl_quote_buf(struct strbuf *sb, const char *src);
 extern void python_quote_buf(struct strbuf *sb, const char *src);
 extern void tcl_quote_buf(struct strbuf *sb, const char *src);
+extern void basic_regex_quote_buf(struct strbuf *sb, const char *src);
 
 #endif
index ed352018964ef2260f5da51239800bbcc816ad1b..d0199cace4aa0ab22a46fdb5ac2777c4e7e6153b 100644 (file)
@@ -119,8 +119,7 @@ static int add_recent_loose(const unsigned char *sha1,
                 */
                if (errno == ENOENT)
                        return 0;
-               return error("unable to stat %s: %s",
-                            sha1_to_hex(sha1), strerror(errno));
+               return error_errno("unable to stat %s", sha1_to_hex(sha1));
        }
 
        add_recent_object(sha1, st.st_mtime, data);
index d9fb78bc559ac9de642833df5af63e33481cad52..db5d910642663e73e4e4fc8d91e0caba4445bdb1 100644 (file)
@@ -19,9 +19,6 @@
 #include "split-index.h"
 #include "utf8.h"
 
-static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
-                                              unsigned int options);
-
 /* Mask for the name length in ce_flags in the on-disk index */
 
 #define CE_NAMEMASK  (0x0fff)
@@ -159,12 +156,19 @@ 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);
+       static int cloexec = O_CLOEXEC;
+       int fd = open(ce->name, O_RDONLY | cloexec);
+
+       if ((cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) {
+               /* Try again w/o O_CLOEXEC: the kernel might not support it */
+               cloexec &= ~O_CLOEXEC;
+               fd = open(ce->name, O_RDONLY | cloexec);
+       }
 
        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;
@@ -181,7 +185,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);
@@ -205,7 +209,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)
@@ -265,7 +269,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;
        }
 
@@ -627,7 +631,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)
@@ -659,9 +663,10 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
        else
                ce->ce_flags |= CE_INTENT_TO_ADD;
 
-       if (trust_executable_bit && has_symlinks)
+
+       if (trust_executable_bit && has_symlinks) {
                ce->ce_mode = create_ce_mode(st_mode);
-       else {
+       else {
                /* If there is an existing entry, pick the mode bits and type
                 * from it, otherwise assume unexecutable regular file.
                 */
@@ -692,7 +697,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);
                }
@@ -706,7 +711,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)
@@ -744,7 +749,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;
@@ -756,6 +761,35 @@ struct cache_entry *make_cache_entry(unsigned int mode,
        return ret;
 }
 
+/*
+ * Chmod an index entry with either +x or -x.
+ *
+ * Returns -1 if the chmod for the particular cache entry failed (if it's
+ * not a regular file), -2 if an invalid flip argument is passed in, 0
+ * otherwise.
+ */
+int chmod_index_entry(struct index_state *istate, struct cache_entry *ce,
+                     char flip)
+{
+       if (!S_ISREG(ce->ce_mode))
+               return -1;
+       switch (flip) {
+       case '+':
+               ce->ce_mode |= 0111;
+               break;
+       case '-':
+               ce->ce_mode &= ~0111;
+               break;
+       default:
+               return -2;
+       }
+       cache_tree_invalidate_path(istate, ce->name);
+       ce->ce_flags |= CE_UPDATE_IN_BASE;
+       istate->cache_changed |= CE_ENTRY_CHANGED;
+
+       return 0;
+}
+
 int ce_same_name(const struct cache_entry *a, const struct cache_entry *b)
 {
        int len = ce_namelen(a);
@@ -1254,7 +1288,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
        return has_errors;
 }
 
-static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
+struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
                                               unsigned int options)
 {
        return refresh_cache_ent(&the_index, ce, options, NULL, NULL);
@@ -1424,7 +1458,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;
@@ -1849,7 +1883,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));
@@ -2038,7 +2072,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;
 
@@ -2285,7 +2319,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 bc551a752c460cd4751034b3d69d7e9b5dfc775e..f5f7a70c6d9b8ef36ecfe282167714640cace6b1 100644 (file)
@@ -235,7 +235,7 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
 {
        const char *sp;
        const char *arg;
-       int i, at;
+       int i, at, atom_len;
 
        sp = atom;
        if (*sp == '*' && sp < ep)
@@ -250,19 +250,19 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
                        return i;
        }
 
+       /*
+        * If the atom name has a colon, strip it and everything after
+        * it off - it specifies the format for this entry, and
+        * shouldn't be used for checking against the valid_atom
+        * table.
+        */
+       arg = memchr(sp, ':', ep - sp);
+       atom_len = (arg ? arg : ep) - sp;
+
        /* Is the atom a valid one? */
        for (i = 0; i < ARRAY_SIZE(valid_atom); i++) {
                int len = strlen(valid_atom[i].name);
-
-               /*
-                * If the atom name has a colon, strip it and everything after
-                * it off - it specifies the format for this entry, and
-                * shouldn't be used for checking against the valid_atom
-                * table.
-                */
-               arg = memchr(sp, ':', ep - sp);
-               if (len == (arg ? arg : ep) - sp &&
-                   !memcmp(valid_atom[i].name, sp, len))
+               if (len == atom_len && !memcmp(valid_atom[i].name, sp, len))
                        break;
        }
 
@@ -1017,7 +1017,7 @@ static void populate_value(struct ref_array_item *ref)
 
                        head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
                                                  sha1, NULL);
-                       if (!strcmp(ref->refname, head))
+                       if (head && !strcmp(ref->refname, head))
                                v->s = "*";
                        else
                                v->s = " ";
@@ -1573,25 +1573,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);
-}
-
-static int hex1(char ch)
-{
-       if ('0' <= ch && ch <= '9')
-               return ch - '0';
-       else if ('a' <= ch && ch <= 'f')
-               return ch - 'a' + 10;
-       else if ('A' <= ch && ch <= 'F')
-               return ch - 'A' + 10;
-       return -1;
-}
-static int hex2(const char *cp)
-{
-       if (cp[0] && cp[1])
-               return (hex1(cp[0]) << 4) | hex1(cp[1]);
-       else
-               return -1;
+       QSORT(array->items, array->nr, compare_refs);
 }
 
 static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state)
@@ -1603,7 +1585,7 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting
                        if (cp[1] == '%')
                                cp++;
                        else {
-                               int ch = hex2(cp + 1);
+                               int ch = hex2chr(cp + 1);
                                if (0 <= ch) {
                                        strbuf_addch(s, ch);
                                        cp += 3;
index 0ebd1da5ceb835066cf4eccd81eda4fba2cc0ac2..a246af27678a76d37c87bb56959ac050dff1f97f 100644 (file)
@@ -241,6 +241,12 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
                logobj = parse_object(reflog->osha1);
        } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT));
 
+       if (!logobj && commit_reflog->recno >= 0 && is_null_sha1(reflog->osha1)) {
+               /* a root commit, but there are still more entries to show */
+               reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
+               logobj = parse_object(reflog->nsha1);
+       }
+
        if (!logobj || logobj->type != OBJ_COMMIT) {
                commit_info->commit = NULL;
                commit->parents = NULL;
diff --git a/refs.c b/refs.c
index b0e6ece6f43437bb7d59490d64802baa3b277090..9bd0bc177bb8298148577ce0c3e52134452d6e51 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -9,6 +9,25 @@
 #include "object.h"
 #include "tag.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:
  * 0: An acceptable character for refs
@@ -120,25 +139,33 @@ int check_refname_format(const char *refname, int flags)
 
 int refname_is_safe(const char *refname)
 {
-       if (starts_with(refname, "refs/")) {
+       const char *rest;
+
+       if (skip_prefix(refname, "refs/", &rest)) {
                char *buf;
                int result;
+               size_t restlen = strlen(rest);
+
+               /* rest must not be empty, or start or end with "/" */
+               if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
+                       return 0;
 
-               buf = xmallocz(strlen(refname));
                /*
                 * Does the refname try to escape refs/?
                 * For example: refs/foo/../bar is safe but refs/foo/../../bar
                 * is not.
                 */
-               result = !normalize_path_copy(buf, refname + strlen("refs/"));
+               buf = xmallocz(restlen);
+               result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
                free(buf);
                return result;
        }
-       while (*refname) {
+
+       do {
                if (!isupper(*refname) && *refname != '_')
                        return 0;
                refname++;
-       }
+       } while (*refname);
        return 1;
 }
 
@@ -392,6 +419,13 @@ 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;
 
@@ -417,7 +451,6 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
                        warning("ignoring broken ref %s.", fullref);
                }
        }
-       free(last_branch);
        return refs_found;
 }
 
@@ -496,7 +529,7 @@ static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
        filename = git_path("%s", pseudoref);
        fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
        if (fd < 0) {
-               strbuf_addf(err, "Could not open '%s' for writing: %s",
+               strbuf_addf(err, "could not open '%s' for writing: %s",
                            filename, strerror(errno));
                return -1;
        }
@@ -507,14 +540,14 @@ static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
                if (read_ref(pseudoref, actual_old_sha1))
                        die("could not read ref '%s'", pseudoref);
                if (hashcmp(actual_old_sha1, old_sha1)) {
-                       strbuf_addf(err, "Unexpected sha1 when writing %s", pseudoref);
+                       strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
                        rollback_lock_file(&lock);
                        goto done;
                }
        }
 
        if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
-               strbuf_addf(err, "Could not write to '%s'", filename);
+               strbuf_addf(err, "could not write to '%s'", filename);
                rollback_lock_file(&lock);
                goto done;
        }
@@ -758,13 +791,32 @@ void ref_transaction_free(struct ref_transaction *transaction)
        free(transaction);
 }
 
-static struct ref_update *add_update(struct ref_transaction *transaction,
-                                    const char *refname)
+struct ref_update *ref_transaction_add_update(
+               struct ref_transaction *transaction,
+               const char *refname, unsigned int flags,
+               const unsigned char *new_sha1,
+               const unsigned char *old_sha1,
+               const char *msg)
 {
        struct ref_update *update;
+
+       if (transaction->state != REF_TRANSACTION_OPEN)
+               die("BUG: update called for transaction that is not open");
+
+       if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
+               die("BUG: REF_ISPRUNING set without REF_NODEREF");
+
        FLEX_ALLOC_STR(update, refname, refname);
        ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
        transaction->updates[transaction->nr++] = update;
+
+       update->flags = flags;
+
+       if (flags & REF_HAVE_NEW)
+               hashcpy(update->new_sha1, new_sha1);
+       if (flags & REF_HAVE_OLD)
+               hashcpy(update->old_sha1, old_sha1);
+       update->msg = xstrdup_or_null(msg);
        return update;
 }
 
@@ -775,32 +827,20 @@ int ref_transaction_update(struct ref_transaction *transaction,
                           unsigned int flags, const char *msg,
                           struct strbuf *err)
 {
-       struct ref_update *update;
-
        assert(err);
 
-       if (transaction->state != REF_TRANSACTION_OPEN)
-               die("BUG: update called for transaction that is not open");
-
-       if (new_sha1 && !is_null_sha1(new_sha1) &&
-           check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-               strbuf_addf(err, "refusing to update ref with bad name %s",
+       if ((new_sha1 && !is_null_sha1(new_sha1)) ?
+           check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
+           !refname_is_safe(refname)) {
+               strbuf_addf(err, "refusing to update ref with bad name '%s'",
                            refname);
                return -1;
        }
 
-       update = add_update(transaction, refname);
-       if (new_sha1) {
-               hashcpy(update->new_sha1, new_sha1);
-               flags |= REF_HAVE_NEW;
-       }
-       if (old_sha1) {
-               hashcpy(update->old_sha1, old_sha1);
-               flags |= REF_HAVE_OLD;
-       }
-       update->flags = flags;
-       if (msg)
-               update->msg = xstrdup(msg);
+       flags |= (new_sha1 ? REF_HAVE_NEW : 0) | (old_sha1 ? REF_HAVE_OLD : 0);
+
+       ref_transaction_add_update(transaction, refname, flags,
+                                  new_sha1, old_sha1, msg);
        return 0;
 }
 
@@ -842,6 +882,14 @@ int ref_transaction_verify(struct ref_transaction *transaction,
                                      flags, NULL, err);
 }
 
+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 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)
@@ -906,7 +954,7 @@ char *shorten_unambiguous_ref(const char *refname, int strict)
                        /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
                        total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
 
-               scanf_fmts = xmalloc(st_add(st_mult(nr_rules, sizeof(char *)), total_len));
+               scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
 
                offset = 0;
                for (i = 0; i < nr_rules; i++) {
@@ -1065,18 +1113,457 @@ const char *find_descendant_ref(const char *dirname,
        return NULL;
 }
 
-int rename_ref_available(const char *oldname, const char *newname)
+int rename_ref_available(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 = !verify_refname_available(new_refname, NULL, &skip, &err);
+       if (!ok)
                error("%s", err.buf);
 
        string_list_clear(&skip, 0);
        strbuf_release(&err);
+       return ok;
+}
+
+int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
+{
+       struct object_id oid;
+       int flag;
+
+       if (submodule) {
+               if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
+                       return fn("HEAD", &oid, 0, cb_data);
+
+               return 0;
+       }
+
+       if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
+               return fn("HEAD", &oid, flag, cb_data);
+
+       return 0;
+}
+
+int head_ref(each_ref_fn fn, void *cb_data)
+{
+       return head_ref_submodule(NULL, fn, cb_data);
+}
+
+/*
+ * Call fn for each reference in the specified submodule for which the
+ * refname begins with prefix. If trim is non-zero, then trim that
+ * many characters off the beginning of each refname before passing
+ * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
+ * include broken references in the iteration. If fn ever returns a
+ * 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,
+                          each_ref_fn fn, int trim, int flags, void *cb_data)
+{
+       struct ref_store *refs = get_ref_store(submodule);
+       struct ref_iterator *iter;
+
+       if (!refs)
+               return 0;
+
+       iter = refs->be->iterator_begin(refs, prefix, flags);
+       iter = prefix_ref_iterator_begin(iter, prefix, trim);
+
+       return do_for_each_ref_iterator(iter, fn, cb_data);
+}
+
+int for_each_ref(each_ref_fn fn, void *cb_data)
+{
+       return do_for_each_ref(NULL, "", fn, 0, 0, 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);
+}
+
+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);
+}
+
+int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
+{
+       unsigned int flag = 0;
+
+       if (broken)
+               flag = DO_FOR_EACH_INCLUDE_BROKEN;
+       return do_for_each_ref(NULL, 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)
+{
+       return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, 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);
+}
+
+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);
+       strbuf_release(&buf);
        return ret;
 }
+
+int for_each_rawref(each_ref_fn fn, void *cb_data)
+{
+       return do_for_each_ref(NULL, "", fn, 0,
+                              DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
+}
+
+/* This function needs to return a meaningful errno on failure */
+static const char *resolve_ref_recursively(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;
+       int symref_count;
+
+       if (!flags)
+               flags = &unused_flags;
+
+       *flags = 0;
+
+       if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+               if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+                   !refname_is_safe(refname)) {
+                       errno = EINVAL;
+                       return NULL;
+               }
+
+               /*
+                * dwim_ref() uses REF_ISBROKEN to distinguish between
+                * missing refs and refs that were present but invalid,
+                * to complain about the latter to stderr.
+                *
+                * We don't know whether the ref exists, so don't set
+                * REF_ISBROKEN yet.
+                */
+               *flags |= REF_BAD_NAME;
+       }
+
+       for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
+               unsigned int read_flags = 0;
+
+               if (refs->be->read_raw_ref(refs, refname,
+                                          sha1, &sb_refname, &read_flags)) {
+                       *flags |= read_flags;
+                       if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
+                               return NULL;
+                       hashclr(sha1);
+                       if (*flags & REF_BAD_NAME)
+                               *flags |= REF_ISBROKEN;
+                       return refname;
+               }
+
+               *flags |= read_flags;
+
+               if (!(read_flags & REF_ISSYMREF)) {
+                       if (*flags & REF_BAD_NAME) {
+                               hashclr(sha1);
+                               *flags |= REF_ISBROKEN;
+                       }
+                       return refname;
+               }
+
+               refname = sb_refname.buf;
+               if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
+                       hashclr(sha1);
+                       return refname;
+               }
+               if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
+                       if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
+                           !refname_is_safe(refname)) {
+                               errno = EINVAL;
+                               return NULL;
+                       }
+
+                       *flags |= REF_ISBROKEN | REF_BAD_NAME;
+               }
+       }
+
+       errno = ELOOP;
+       return NULL;
+}
+
+/* backend functions */
+int refs_init_db(struct strbuf *err)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->init_db(refs, err);
+}
+
+const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
+                              unsigned char *sha1, int *flags)
+{
+       return resolve_ref_recursively(get_ref_store(NULL), 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_ref_store(stripped);
+               free(stripped);
+       } else {
+               refs = get_ref_store(submodule);
+       }
+
+       if (!refs)
+               return -1;
+
+       if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) ||
+           is_null_sha1(sha1))
+               return -1;
+       return 0;
+}
+
+/* A pointer to the ref_store for the main repository: */
+static struct ref_store *main_ref_store;
+
+/* A linked list of ref_stores for submodules: */
+static struct ref_store *submodule_ref_stores;
+
+void base_ref_store_init(struct ref_store *refs,
+                        const struct ref_storage_be *be,
+                        const char *submodule)
+{
+       refs->be = be;
+       if (!submodule) {
+               if (main_ref_store)
+                       die("BUG: main_ref_store initialized twice");
+
+               refs->submodule = "";
+               refs->next = NULL;
+               main_ref_store = refs;
+       } else {
+               if (lookup_ref_store(submodule))
+                       die("BUG: ref_store for submodule '%s' initialized twice",
+                           submodule);
+
+               refs->submodule = xstrdup(submodule);
+               refs->next = submodule_ref_stores;
+               submodule_ref_stores = refs;
+       }
+}
+
+struct ref_store *ref_store_init(const char *submodule)
+{
+       const char *be_name = "files";
+       struct ref_storage_be *be = find_ref_storage_backend(be_name);
+
+       if (!be)
+               die("BUG: reference backend %s is unknown", be_name);
+
+       if (!submodule || !*submodule)
+               return be->init(NULL);
+       else
+               return be->init(submodule);
+}
+
+struct ref_store *lookup_ref_store(const char *submodule)
+{
+       struct ref_store *refs;
+
+       if (!submodule || !*submodule)
+               return main_ref_store;
+
+       for (refs = submodule_ref_stores; refs; refs = refs->next) {
+               if (!strcmp(submodule, refs->submodule))
+                       return refs;
+       }
+
+       return NULL;
+}
+
+struct ref_store *get_ref_store(const char *submodule)
+{
+       struct ref_store *refs;
+
+       if (!submodule || !*submodule) {
+               refs = lookup_ref_store(NULL);
+
+               if (!refs)
+                       refs = ref_store_init(NULL);
+       } else {
+               refs = lookup_ref_store(submodule);
+
+               if (!refs) {
+                       struct strbuf submodule_sb = STRBUF_INIT;
+
+                       strbuf_addstr(&submodule_sb, submodule);
+                       if (is_nonbare_repository_dir(&submodule_sb))
+                               refs = ref_store_init(submodule);
+                       strbuf_release(&submodule_sb);
+               }
+       }
+
+       return refs;
+}
+
+void assert_main_repository(struct ref_store *refs, const char *caller)
+{
+       if (*refs->submodule)
+               die("BUG: %s called for a submodule", caller);
+}
+
+/* backend functions */
+int pack_refs(unsigned int flags)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->pack_refs(refs, flags);
+}
+
+int peel_ref(const char *refname, unsigned char *sha1)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->peel_ref(refs, refname, sha1);
+}
+
+int create_symref(const char *ref_target, const char *refs_heads_master,
+                 const char *logmsg)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->create_symref(refs, ref_target, refs_heads_master,
+                                      logmsg);
+}
+
+int ref_transaction_commit(struct ref_transaction *transaction,
+                          struct strbuf *err)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->transaction_commit(refs, transaction, err);
+}
+
+int verify_refname_available(const char *refname,
+                            const struct string_list *extra,
+                            const struct string_list *skip,
+                            struct strbuf *err)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->verify_refname_available(refs, refname, extra, skip, err);
+}
+
+int for_each_reflog(each_ref_fn fn, void *cb_data)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+       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_ent_reverse(const char *refname, each_reflog_ent_fn fn,
+                               void *cb_data)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->for_each_reflog_ent_reverse(refs, refname,
+                                                    fn, cb_data);
+}
+
+int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
+                       void *cb_data)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
+}
+
+int reflog_exists(const char *refname)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->reflog_exists(refs, refname);
+}
+
+int safe_create_reflog(const char *refname, int force_create,
+                      struct strbuf *err)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->create_reflog(refs, refname, force_create, err);
+}
+
+int delete_reflog(const char *refname)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->delete_reflog(refs, refname);
+}
+
+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)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->reflog_expire(refs, 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 = get_ref_store(NULL);
+
+       return refs->be->initial_transaction_commit(refs, transaction, err);
+}
+
+int delete_refs(struct string_list *refnames, unsigned int flags)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->delete_refs(refs, refnames, flags);
+}
+
+int rename_ref(const char *oldref, const char *newref, const char *logmsg)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->rename_ref(refs, oldref, newref, logmsg);
+}
diff --git a/refs.h b/refs.h
index 2f3decb432cfeda97fd5da7f16dd4e5b725b59bc..69478439137d64f6dab7f20d4f157f6c7a982ac2 100644 (file)
--- a/refs.h
+++ b/refs.h
 #define RESOLVE_REF_NO_RECURSE 0x02
 #define RESOLVE_REF_ALLOW_BAD_NAME 0x04
 
-extern const char *resolve_ref_unsafe(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);
 
-extern char *resolve_refdup(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);
 
-extern int read_ref_full(const char *refname, int resolve_flags,
-                        unsigned char *sha1, int *flags);
-extern int read_ref(const char *refname, unsigned char *sha1);
+int read_ref_full(const char *refname, int resolve_flags,
+                 unsigned char *sha1, int *flags);
+int read_ref(const char *refname, unsigned char *sha1);
 
-extern int ref_exists(const char *refname);
+int ref_exists(const char *refname);
 
-extern int is_branch(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,
@@ -74,24 +76,27 @@ extern int is_branch(const char *refname);
  * Symbolic references are considered unpeelable, even if they
  * ultimately resolve to a peelable tag.
  */
-extern int peel_ref(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.
  */
-extern int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1);
+int resolve_gitlink_ref(const char *submodule, const char *refname,
+                       unsigned char *sha1);
 
 /*
  * Return true iff abbrev_name is a possible abbreviation for
  * full_name according to the rules defined by ref_rev_parse_rules in
  * refs.c.
  */
-extern int refname_match(const char *abbrev_name, const char *full_name);
+int refname_match(const char *abbrev_name, const char *full_name);
 
-extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
-extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
+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);
 
 /*
  * A ref_transaction represents a collection of ref updates
@@ -140,7 +145,9 @@ extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
 struct ref_transaction;
 
 /*
- * Bit values set in the flags argument passed to each_ref_fn():
+ * Bit values set in the flags argument passed to each_ref_fn() and
+ * stored in ref_iterator::flags. Other bits are for internal use
+ * only:
  */
 
 /* Reference is a symbolic reference. */
@@ -182,38 +189,45 @@ typedef int each_ref_fn(const char *refname,
  * modifies the reference also returns a nonzero value to immediately
  * stop the iteration.
  */
-extern int head_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
-extern int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken);
-extern int for_each_tag_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_branch_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_remote_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_replace_ref(each_ref_fn fn, void *cb_data);
-extern int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data);
-extern int for_each_glob_ref_in(each_ref_fn fn, const char *pattern, const char *prefix, void *cb_data);
-
-extern int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
-extern int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
-extern int for_each_ref_in_submodule(const char *submodule, const char *prefix,
+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);
+int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data,
+                       unsigned int broken);
+int for_each_tag_ref(each_ref_fn fn, void *cb_data);
+int for_each_branch_ref(each_ref_fn fn, void *cb_data);
+int for_each_remote_ref(each_ref_fn fn, void *cb_data);
+int for_each_replace_ref(each_ref_fn fn, void *cb_data);
+int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data);
+int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
+                        const char *prefix, void *cb_data);
+
+int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
+int for_each_ref_submodule(const char *submodule,
+                          each_ref_fn fn, void *cb_data);
+int for_each_ref_in_submodule(const char *submodule, const char *prefix,
                each_ref_fn fn, void *cb_data);
-extern int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
-extern int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
-extern int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data);
+int for_each_tag_ref_submodule(const char *submodule,
+                              each_ref_fn fn, void *cb_data);
+int for_each_branch_ref_submodule(const char *submodule,
+                                 each_ref_fn fn, void *cb_data);
+int for_each_remote_ref_submodule(const char *submodule,
+                                 each_ref_fn fn, void *cb_data);
 
-extern int head_ref_namespaced(each_ref_fn fn, void *cb_data);
-extern int for_each_namespaced_ref(each_ref_fn fn, void *cb_data);
+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 */
-extern int for_each_rawref(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)
 {
        return strpbrk(pattern, "?*[");
 }
 
-extern void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname);
-extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames);
+void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname);
+void warn_dangling_symrefs(FILE *fp, const char *msg_fmt,
+                          const struct string_list *refnames);
 
 /*
  * Flags for controlling behaviour of pack_refs()
@@ -245,13 +259,13 @@ int pack_refs(unsigned int flags);
 int safe_create_reflog(const char *refname, int force_create, struct strbuf *err);
 
 /** Reads log for the value of ref during at_time. **/
-extern int read_ref_at(const char *refname, unsigned int flags,
-                      unsigned long at_time, int cnt,
-                      unsigned char *sha1, char **msg,
-                      unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
+int read_ref_at(const char *refname, unsigned int flags,
+               unsigned long at_time, int cnt,
+               unsigned char *sha1, char **msg,
+               unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
 
 /** Check if a particular reflog exists */
-extern int reflog_exists(const char *refname);
+int reflog_exists(const char *refname);
 
 /*
  * Delete the specified reference. If old_sha1 is non-NULL, then
@@ -260,21 +274,26 @@ extern 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().
  */
-extern int delete_ref(const char *refname, const unsigned char *old_sha1,
-                     unsigned int flags);
+int delete_ref(const char *refname, const unsigned char *old_sha1,
+              unsigned int flags);
 
 /*
  * Delete the specified references. If there are any problems, emit
  * errors but attempt to keep going (i.e., the deletes are not done in
- * an all-or-nothing transaction).
+ * an all-or-nothing transaction). flags is passed through to
+ * ref_transaction_delete().
  */
-extern int delete_refs(struct string_list *refnames);
+int delete_refs(struct string_list *refnames, unsigned int flags);
 
 /** Delete a reflog */
-extern int delete_reflog(const char *refname);
+int delete_reflog(const char *refname);
 
 /* iterate over reflog entries */
-typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *);
+typedef int each_reflog_ent_fn(
+               unsigned char *old_sha1, unsigned char *new_sha1,
+               const char *committer, unsigned long timestamp,
+               int tz, const char *msg, 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);
 
@@ -282,7 +301,7 @@ int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn, void
  * Calls the specified function for each reflog file until it returns nonzero,
  * and returns the value
  */
-extern int for_each_reflog(each_ref_fn, void *);
+int for_each_reflog(each_ref_fn fn, void *cb_data);
 
 #define REFNAME_ALLOW_ONELEVEL 1
 #define REFNAME_REFSPEC_PATTERN 2
@@ -295,16 +314,25 @@ extern int for_each_reflog(each_ref_fn, void *);
  * allow a single "*" wildcard character in the refspec. No leading or
  * repeated slashes are accepted.
  */
-extern int check_refname_format(const char *refname, int flags);
+int check_refname_format(const char *refname, int flags);
 
-extern const char *prettify_refname(const char *refname);
+const char *prettify_refname(const char *refname);
 
-extern char *shorten_unambiguous_ref(const char *refname, int strict);
+char *shorten_unambiguous_ref(const char *refname, int strict);
 
 /** rename ref, return 0 on success **/
-extern int rename_ref(const char *oldref, const char *newref, const char *logmsg);
+int rename_ref(const char *oldref, const char *newref, const char *logmsg);
 
-extern int create_symref(const char *refname, const char *target, const char *logmsg);
+int create_symref(const char *refname, const char *target, const char *logmsg);
+
+/*
+ * Update HEAD of the specified gitdir.
+ * Similar to create_symref("relative-git-dir/HEAD", target, NULL), but
+ * this can update the main working tree's HEAD regardless of where
+ * $GIT_DIR points to.
+ * Return 0 if successful, non-zero otherwise.
+ * */
+int set_worktree_head_symref(const char *gitdir, const char *target);
 
 enum action_on_err {
        UPDATE_REFS_MSG_ON_ERR,
@@ -336,7 +364,7 @@ struct ref_transaction *ref_transaction_begin(struct strbuf *err);
  *     msg -- a message describing the change (for the reflog).
  *
  *     err -- a strbuf for receiving a description of any error that
- *         might have occured.
+ *         might have occurred.
  *
  * The functions make internal copies of refname and msg, so the
  * caller retains ownership of these parameters.
@@ -453,8 +481,11 @@ void ref_transaction_free(struct ref_transaction *transaction);
 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);
 
-extern int parse_hide_refs_config(const char *var, const char *value, const char *);
+int parse_hide_refs_config(const char *var, const char *value, const char *);
 
 /*
  * Check whether a ref is hidden. If no namespace is set, both the first and
@@ -464,7 +495,7 @@ extern int parse_hide_refs_config(const char *var, const char *value, const char
  * the ref is outside that namespace, the first parameter is NULL. The second
  * parameter always points to the full ref name.
  */
-extern int ref_is_hidden(const char *, const char *);
+int ref_is_hidden(const char *, const char *);
 
 enum ref_type {
        REF_TYPE_PER_WORKTREE,
@@ -513,11 +544,13 @@ typedef void reflog_expiry_cleanup_fn(void *cb_data);
  * enum expire_reflog_flags. The three function pointers are described
  * above. On success, return zero.
  */
-extern 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);
+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);
+
+int ref_storage_backend_exists(const char *name);
 
 #endif /* REFS_H */
index 81f68f846b69af65badfbe8c25d4a03601fb23c8..f9023939d5884e0f975d5997336313695e407ca1 100644 (file)
@@ -1,13 +1,14 @@
 #include "../cache.h"
 #include "../refs.h"
 #include "refs-internal.h"
+#include "../iterator.h"
+#include "../dir-iterator.h"
 #include "../lockfile.h"
 #include "../object.h"
 #include "../dir.h"
 
 struct ref_lock {
        char *ref_name;
-       char *orig_ref_name;
        struct lock_file *lk;
        struct object_id old_oid;
 };
@@ -38,7 +39,7 @@ struct ref_value {
        struct object_id peeled;
 };
 
-struct ref_cache;
+struct files_ref_store;
 
 /*
  * Information used (along with the information in ref_entry) to
@@ -77,8 +78,8 @@ struct ref_dir {
         */
        int sorted;
 
-       /* A pointer to the ref_cache that contains this ref_dir. */
-       struct ref_cache *ref_cache;
+       /* A pointer to the files_ref_store that contains this ref_dir. */
+       struct files_ref_store *ref_store;
 
        struct ref_entry **entries;
 };
@@ -160,7 +161,7 @@ struct ref_entry {
 
 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,
+static struct ref_entry *create_dir_entry(struct files_ref_store *ref_store,
                                          const char *dirname, size_t len,
                                          int incomplete);
 static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry);
@@ -182,7 +183,7 @@ static struct ref_dir *get_ref_dir(struct ref_entry *entry)
                        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,
+                               child_entry = create_dir_entry(dir->ref_store,
                                                               "refs/bisect/",
                                                               12, 1);
                                add_entry_to_dir(dir, child_entry);
@@ -260,13 +261,13 @@ static void clear_ref_dir(struct ref_dir *dir)
  * 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,
+static struct ref_entry *create_dir_entry(struct files_ref_store *ref_store,
                                          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->u.subdir.ref_store = ref_store;
        direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
        return direntry;
 }
@@ -342,7 +343,7 @@ static struct ref_dir *search_for_subdir(struct ref_dir *dir,
                 * therefore, create an empty record for it but mark
                 * the record complete.
                 */
-               entry = create_dir_entry(dir->ref_cache, subdirname, len, 0);
+               entry = create_dir_entry(dir->ref_store, subdirname, len, 0);
                add_entry_to_dir(dir, entry);
        } else {
                entry = dir->entries[entry_index];
@@ -500,7 +501,7 @@ static void sort_ref_dir(struct ref_dir *dir)
        if (dir->sorted == dir->nr)
                return;
 
-       qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
+       QSORT(dir->entries, dir->nr, ref_entry_cmp);
 
        /* Remove any duplicates: */
        for (i = 0, j = 0; j < dir->nr; j++) {
@@ -513,72 +514,37 @@ static void sort_ref_dir(struct ref_dir *dir)
        dir->sorted = dir->nr = i;
 }
 
-/* Include broken references in a do_for_each_ref*() iteration: */
-#define DO_FOR_EACH_INCLUDE_BROKEN 0x01
-
 /*
- * Return true iff the reference described by entry can be resolved to
- * an object in the database.  Emit a warning if the referred-to
- * object does not exist.
+ * 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
+ * does not exist, emit a warning and return false.
  */
-static int ref_resolves_to_object(struct ref_entry *entry)
+static int ref_resolves_to_object(const char *refname,
+                                 const struct object_id *oid,
+                                 unsigned int flags)
 {
-       if (entry->flag & REF_ISBROKEN)
+       if (flags & REF_ISBROKEN)
                return 0;
-       if (!has_sha1_file(entry->u.value.oid.hash)) {
-               error("%s does not point to a valid object!", entry->name);
+       if (!has_sha1_file(oid->hash)) {
+               error("%s does not point to a valid object!", refname);
                return 0;
        }
        return 1;
 }
 
 /*
- * current_ref is a performance hack: when iterating over references
- * using the for_each_ref*() functions, current_ref is set to the
- * current reference's entry before calling the callback function.  If
- * the callback function calls peel_ref(), then peel_ref() first
- * checks whether the reference to be peeled is the current reference
- * (it usually is) and if so, returns that reference's peeled version
- * if it is available.  This avoids a refname lookup in a common case.
+ * 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 struct ref_entry *current_ref;
-
-typedef int each_ref_entry_fn(struct ref_entry *entry, void *cb_data);
-
-struct ref_entry_cb {
-       const char *base;
-       int trim;
-       int flags;
-       each_ref_fn *fn;
-       void *cb_data;
-};
-
-/*
- * Handle one reference in a do_for_each_ref*()-style iteration,
- * calling an each_ref_fn for each entry.
- */
-static int do_one_ref(struct ref_entry *entry, void *cb_data)
+static int entry_resolves_to_object(struct ref_entry *entry)
 {
-       struct ref_entry_cb *data = cb_data;
-       struct ref_entry *old_current_ref;
-       int retval;
-
-       if (!starts_with(entry->name, data->base))
-               return 0;
-
-       if (!(data->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
-             !ref_resolves_to_object(entry))
-               return 0;
-
-       /* Store the old value, in case this is a recursive call: */
-       old_current_ref = current_ref;
-       current_ref = entry;
-       retval = data->fn(entry->name + data->trim, &entry->u.value.oid,
-                         entry->flag, data->cb_data);
-       current_ref = old_current_ref;
-       return retval;
+       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
@@ -607,78 +573,6 @@ static int do_for_each_entry_in_dir(struct ref_dir *dir, int offset,
        return 0;
 }
 
-/*
- * Call fn for each reference in the union of dir1 and dir2, in order
- * by refname.  Recurse into subdirectories.  If a value entry appears
- * in both dir1 and dir2, then only process the version that is in
- * dir2.  The input dirs must already be sorted, but subdirs will be
- * sorted as needed.  fn is called for all references, including
- * broken ones.
- */
-static int do_for_each_entry_in_dirs(struct ref_dir *dir1,
-                                    struct ref_dir *dir2,
-                                    each_ref_entry_fn fn, void *cb_data)
-{
-       int retval;
-       int i1 = 0, i2 = 0;
-
-       assert(dir1->sorted == dir1->nr);
-       assert(dir2->sorted == dir2->nr);
-       while (1) {
-               struct ref_entry *e1, *e2;
-               int cmp;
-               if (i1 == dir1->nr) {
-                       return do_for_each_entry_in_dir(dir2, i2, fn, cb_data);
-               }
-               if (i2 == dir2->nr) {
-                       return do_for_each_entry_in_dir(dir1, i1, fn, cb_data);
-               }
-               e1 = dir1->entries[i1];
-               e2 = dir2->entries[i2];
-               cmp = strcmp(e1->name, e2->name);
-               if (cmp == 0) {
-                       if ((e1->flag & REF_DIR) && (e2->flag & REF_DIR)) {
-                               /* Both are directories; descend them in parallel. */
-                               struct ref_dir *subdir1 = get_ref_dir(e1);
-                               struct ref_dir *subdir2 = get_ref_dir(e2);
-                               sort_ref_dir(subdir1);
-                               sort_ref_dir(subdir2);
-                               retval = do_for_each_entry_in_dirs(
-                                               subdir1, subdir2, fn, cb_data);
-                               i1++;
-                               i2++;
-                       } else if (!(e1->flag & REF_DIR) && !(e2->flag & REF_DIR)) {
-                               /* Both are references; ignore the one from dir1. */
-                               retval = fn(e2, cb_data);
-                               i1++;
-                               i2++;
-                       } else {
-                               die("conflict between reference and directory: %s",
-                                   e1->name);
-                       }
-               } else {
-                       struct ref_entry *e;
-                       if (cmp < 0) {
-                               e = e1;
-                               i1++;
-                       } else {
-                               e = e2;
-                               i2++;
-                       }
-                       if (e->flag & REF_DIR) {
-                               struct ref_dir *subdir = get_ref_dir(e);
-                               sort_ref_dir(subdir);
-                               retval = do_for_each_entry_in_dir(
-                                               subdir, 0, fn, cb_data);
-                       } else {
-                               retval = fn(e, cb_data);
-                       }
-               }
-               if (retval)
-                       return retval;
-       }
-}
-
 /*
  * 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
@@ -695,6 +589,153 @@ static void prime_ref_dir(struct ref_dir *dir)
        }
 }
 
+/*
+ * 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;
@@ -846,9 +887,9 @@ struct packed_ref_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;
 
@@ -869,17 +910,11 @@ 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 files_ref_store {
+       struct ref_store base;
        struct ref_entry *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;
@@ -908,7 +943,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;
@@ -920,7 +955,7 @@ 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);
@@ -932,42 +967,34 @@ 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)
+static struct ref_store *files_ref_store_create(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;
-}
+       struct files_ref_store *refs = xcalloc(1, sizeof(*refs));
+       struct ref_store *ref_store = (struct ref_store *)refs;
 
-static struct ref_cache *lookup_ref_cache(const char *submodule)
-{
-       struct ref_cache *refs;
+       base_ref_store_init(ref_store, &refs_be_files, submodule);
 
-       if (!submodule || !*submodule)
-               return &ref_cache;
-
-       for (refs = submodule_ref_caches; refs; refs = refs->next)
-               if (!strcmp(submodule, refs->name))
-                       return refs;
-       return NULL;
+       return ref_store;
 }
 
 /*
- * Return a pointer to a ref_cache for the specified submodule. For
- * the main repository, use submodule==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. If submodule_allowed is not true, then also die if
+ * files_ref_store is for a submodule (i.e., not for the main
+ * repository). 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, int submodule_allowed,
+               const char *caller)
 {
-       struct ref_cache *refs = lookup_ref_cache(submodule);
-       if (!refs)
-               refs = create_ref_cache(submodule);
-       return refs;
+       if (ref_store->be != &refs_be_files)
+               die("BUG: ref_store is type \"%s\" not \"files\" in %s",
+                   ref_store->be->name, caller);
+
+       if (!submodule_allowed)
+               assert_main_repository(ref_store, caller);
+
+       return (struct files_ref_store *)ref_store;
 }
 
 /* The length of a peeled reference line in packed-refs, including EOL: */
@@ -1099,15 +1126,16 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir)
 }
 
 /*
- * 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");
+       if (*refs->base.submodule)
+               packed_refs_file = git_pathdup_submodule(refs->base.submodule,
+                                                        "packed-refs");
        else
                packed_refs_file = git_pathdup("packed-refs");
 
@@ -1137,7 +1165,7 @@ static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_ca
        return get_ref_dir(packed_ref_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));
 }
@@ -1148,10 +1176,10 @@ 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");
@@ -1166,20 +1194,26 @@ static void add_packed_ref(const char *refname, const unsigned char *sha1)
  */
 static void read_loose_refs(const char *dirname, struct ref_dir *dir)
 {
-       struct ref_cache *refs = dir->ref_cache;
+       struct files_ref_store *refs = dir->ref_store;
        DIR *d;
        struct dirent *de;
        int dirnamelen = strlen(dirname);
        struct strbuf refname;
        struct strbuf path = STRBUF_INIT;
        size_t path_baselen;
+       int err = 0;
 
-       if (*refs->name)
-               strbuf_git_path_submodule(&path, refs->name, "%s", dirname);
+       if (*refs->base.submodule)
+               err = strbuf_git_path_submodule(&path, refs->base.submodule, "%s", dirname);
        else
                strbuf_git_path(&path, "%s", dirname);
        path_baselen = path.len;
 
+       if (err) {
+               strbuf_release(&path);
+               return;
+       }
+
        d = opendir(path.buf);
        if (!d) {
                strbuf_release(&path);
@@ -1210,10 +1244,10 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
                } else {
                        int read_ok;
 
-                       if (*refs->name) {
+                       if (*refs->base.submodule) {
                                hashclr(sha1);
                                flag = 0;
-                               read_ok = !resolve_gitlink_ref(refs->name,
+                               read_ok = !resolve_gitlink_ref(refs->base.submodule,
                                                               refname.buf, sha1);
                        } else {
                                read_ok = !read_ref_full(refname.buf,
@@ -1254,7 +1288,7 @@ static void read_loose_refs(const char *dirname, struct ref_dir *dir)
        closedir(d);
 }
 
-static struct ref_dir *get_loose_refs(struct ref_cache *refs)
+static struct ref_dir *get_loose_refs(struct files_ref_store *refs)
 {
        if (!refs->loose) {
                /*
@@ -1272,112 +1306,22 @@ static struct ref_dir *get_loose_refs(struct ref_cache *refs)
        return get_ref_dir(refs->loose);
 }
 
-/* We allow "recursive" symbolic refs. Only within reason, though */
-#define MAXDEPTH 5
-#define MAXREFLEN (1024)
-
-/*
- * 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;
-
-       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 > 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 = lookup_ref_cache(submodule.buf);
-       if (!refs) {
-               if (!is_nonbare_repository_dir(&submodule)) {
-                       strbuf_release(&submodule);
-                       return -1;
-               }
-               refs = create_ref_cache(submodule.buf);
-       }
-       strbuf_release(&submodule);
-
-       retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
-       return retval;
-}
-
 /*
  * 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(get_packed_refs(refs), refname);
 }
 
 /*
- * A loose ref file doesn't exist; check for a packed ref.  The
- * options are forwarded from resolve_safe_unsafe().
+ * A loose ref file doesn't exist; check for a packed ref.
  */
-static int resolve_missing_loose_ref(const char *refname,
-                                    int resolve_flags,
-                                    unsigned char *sha1,
-                                    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;
 
@@ -1385,208 +1329,400 @@ 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);
-               if (flags)
-                       *flags |= REF_ISPACKED;
-               return 0;
-       }
-       /* The reference is not a packed reference, either. */
-       if (resolve_flags & RESOLVE_REF_READING) {
-               errno = ENOENT;
-               return -1;
-       } else {
-               hashclr(sha1);
+               *flags |= REF_ISPACKED;
                return 0;
        }
+       /* refname is not a packed reference. */
+       return -1;
 }
 
-/* This function needs to return a meaningful errno on failure */
-static const char *resolve_ref_1(const char *refname,
-                                int resolve_flags,
-                                unsigned char *sha1,
-                                int *flags,
-                                struct strbuf *sb_refname,
-                                struct strbuf *sb_path,
-                                struct strbuf *sb_contents)
+static int files_read_raw_ref(struct ref_store *ref_store,
+                             const char *refname, unsigned char *sha1,
+                             struct strbuf *referent, unsigned int *type)
 {
-       int depth = MAXDEPTH;
-       int bad_name = 0;
+       struct files_ref_store *refs =
+               files_downcast(ref_store, 1, "read_raw_ref");
+       struct strbuf sb_contents = STRBUF_INIT;
+       struct strbuf sb_path = STRBUF_INIT;
+       const char *path;
+       const char *buf;
+       struct stat st;
+       int fd;
+       int ret = -1;
+       int save_errno;
+       int remaining_retries = 3;
+
+       *type = 0;
+       strbuf_reset(&sb_path);
 
-       if (flags)
-               *flags = 0;
+       if (*refs->base.submodule)
+               strbuf_git_path_submodule(&sb_path, refs->base.submodule, "%s", refname);
+       else
+               strbuf_git_path(&sb_path, "%s", refname);
 
-       if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
-               if (flags)
-                       *flags |= REF_BAD_NAME;
+       path = sb_path.buf;
 
-               if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
-                   !refname_is_safe(refname)) {
-                       errno = EINVAL;
-                       return NULL;
+stat_ref:
+       /*
+        * We might have to loop back here to avoid a race
+        * condition: first we lstat() the file, then we try
+        * to read it as a link or as a file.  But if somebody
+        * changes the type of the file (file <-> directory
+        * <-> symlink) between the lstat() and reading, then
+        * we don't want to report that as an error but rather
+        * try again starting with the lstat().
+        *
+        * We'll keep a count of the retries, though, just to avoid
+        * any confusing situation sending us into an infinite loop.
+        */
+
+       if (remaining_retries-- <= 0)
+               goto out;
+
+       if (lstat(path, &st) < 0) {
+               if (errno != ENOENT)
+                       goto out;
+               if (resolve_packed_ref(refs, refname, sha1, type)) {
+                       errno = ENOENT;
+                       goto out;
+               }
+               ret = 0;
+               goto out;
+       }
+
+       /* Follow "normalized" - ie "refs/.." symlinks by hand */
+       if (S_ISLNK(st.st_mode)) {
+               strbuf_reset(&sb_contents);
+               if (strbuf_readlink(&sb_contents, path, 0) < 0) {
+                       if (errno == ENOENT || errno == EINVAL)
+                               /* inconsistent with lstat; retry */
+                               goto stat_ref;
+                       else
+                               goto out;
+               }
+               if (starts_with(sb_contents.buf, "refs/") &&
+                   !check_refname_format(sb_contents.buf, 0)) {
+                       strbuf_swap(&sb_contents, referent);
+                       *type |= REF_ISSYMREF;
+                       ret = 0;
+                       goto out;
                }
                /*
-                * dwim_ref() uses REF_ISBROKEN to distinguish between
-                * missing refs and refs that were present but invalid,
-                * to complain about the latter to stderr.
-                *
-                * We don't know whether the ref exists, so don't set
-                * REF_ISBROKEN yet.
+                * It doesn't look like a refname; fall through to just
+                * treating it like a non-symlink, and reading whatever it
+                * points to.
                 */
-               bad_name = 1;
        }
-       for (;;) {
-               const char *path;
-               struct stat st;
-               char *buf;
-               int fd;
 
-               if (--depth < 0) {
-                       errno = ELOOP;
-                       return NULL;
+       /* Is it a directory? */
+       if (S_ISDIR(st.st_mode)) {
+               /*
+                * Even though there is a directory where the loose
+                * ref is supposed to be, there could still be a
+                * packed ref:
+                */
+               if (resolve_packed_ref(refs, refname, sha1, type)) {
+                       errno = EISDIR;
+                       goto out;
                }
+               ret = 0;
+               goto out;
+       }
+
+       /*
+        * Anything else, just open it and try to use it as
+        * a ref
+        */
+       fd = open(path, O_RDONLY);
+       if (fd < 0) {
+               if (errno == ENOENT && !S_ISLNK(st.st_mode))
+                       /* inconsistent with lstat; retry */
+                       goto stat_ref;
+               else
+                       goto out;
+       }
+       strbuf_reset(&sb_contents);
+       if (strbuf_read(&sb_contents, fd, 256) < 0) {
+               int save_errno = errno;
+               close(fd);
+               errno = save_errno;
+               goto out;
+       }
+       close(fd);
+       strbuf_rtrim(&sb_contents);
+       buf = sb_contents.buf;
+       if (starts_with(buf, "ref:")) {
+               buf += 4;
+               while (isspace(*buf))
+                       buf++;
+
+               strbuf_reset(referent);
+               strbuf_addstr(referent, buf);
+               *type |= REF_ISSYMREF;
+               ret = 0;
+               goto out;
+       }
+
+       /*
+        * Please note that FETCH_HEAD has additional
+        * data after the sha.
+        */
+       if (get_sha1_hex(buf, sha1) ||
+           (buf[40] != '\0' && !isspace(buf[40]))) {
+               *type |= REF_ISBROKEN;
+               errno = EINVAL;
+               goto out;
+       }
+
+       ret = 0;
+
+out:
+       save_errno = errno;
+       strbuf_release(&sb_path);
+       strbuf_release(&sb_contents);
+       errno = save_errno;
+       return ret;
+}
+
+static void unlock_ref(struct ref_lock *lock)
+{
+       /* Do not free lock->lk -- atexit() still looks at them */
+       if (lock->lk)
+               rollback_lock_file(lock->lk);
+       free(lock->ref_name);
+       free(lock);
+}
 
-               strbuf_reset(sb_path);
-               strbuf_git_path(sb_path, "%s", refname);
-               path = sb_path->buf;
+/*
+ * Lock refname, without following symrefs, and set *lock_p to point
+ * at a newly-allocated lock object. Fill in lock->old_oid, referent,
+ * and type similarly to read_raw_ref().
+ *
+ * The caller must verify that refname is a "safe" reference name (in
+ * the sense of refname_is_safe()) before calling this function.
+ *
+ * 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.
+ *
+ * If mustexist is not set and the reference is not found or is
+ * broken, lock the reference anyway but clear sha1.
+ *
+ * Return 0 on success. On failure, write an error message to err and
+ * return TRANSACTION_NAME_CONFLICT or TRANSACTION_GENERIC_ERROR.
+ *
+ * Implementation note: This function is basically
+ *
+ *     lock reference
+ *     read_raw_ref()
+ *
+ * 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
+ *   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(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,
+                       struct strbuf *referent,
+                       unsigned int *type,
+                       struct strbuf *err)
+{
+       struct ref_lock *lock;
+       struct strbuf ref_file = STRBUF_INIT;
+       int attempts_remaining = 3;
+       int ret = TRANSACTION_GENERIC_ERROR;
 
+       assert(err);
+       assert_main_repository(&refs->base, "lock_raw_ref");
+
+       *type = 0;
+
+       /* First lock the file so it can't change out from under us. */
+
+       *lock_p = lock = xcalloc(1, sizeof(*lock));
+
+       lock->ref_name = xstrdup(refname);
+       strbuf_git_path(&ref_file, "%s", refname);
+
+retry:
+       switch (safe_create_leading_directories(ref_file.buf)) {
+       case SCLD_OK:
+               break; /* success */
+       case SCLD_EXISTS:
                /*
-                * We might have to loop back here to avoid a race
-                * condition: first we lstat() the file, then we try
-                * to read it as a link or as a file.  But if somebody
-                * changes the type of the file (file <-> directory
-                * <-> symlink) between the lstat() and reading, then
-                * we don't want to report that as an error but rather
-                * try again starting with the lstat().
+                * Suppose refname is "refs/foo/bar". We just failed
+                * to create the containing directory, "refs/foo",
+                * because there was a non-directory in the way. This
+                * indicates a D/F conflict, probably because of
+                * another reference such as "refs/foo". There is no
+                * reason to expect this error to be transitory.
                 */
-       stat_ref:
-               if (lstat(path, &st) < 0) {
-                       if (errno != ENOENT)
-                               return NULL;
-                       if (resolve_missing_loose_ref(refname, resolve_flags,
-                                                     sha1, flags))
-                               return NULL;
-                       if (bad_name) {
-                               hashclr(sha1);
-                               if (flags)
-                                       *flags |= REF_ISBROKEN;
+               if (verify_refname_available(refname, extras, skip, err)) {
+                       if (mustexist) {
+                               /*
+                                * To the user the relevant error is
+                                * that the "mustexist" reference is
+                                * missing:
+                                */
+                               strbuf_reset(err);
+                               strbuf_addf(err, "unable to resolve reference '%s'",
+                                           refname);
+                       } else {
+                               /*
+                                * The error message set by
+                                * verify_refname_available_dir() is OK.
+                                */
+                               ret = TRANSACTION_NAME_CONFLICT;
                        }
-                       return refname;
+               } else {
+                       /*
+                        * The file that is in the way isn't a loose
+                        * reference. Report it as a low-level
+                        * failure.
+                        */
+                       strbuf_addf(err, "unable to create lock file %s.lock; "
+                                   "non-directory in the way",
+                                   ref_file.buf);
                }
+               goto error_return;
+       case SCLD_VANISHED:
+               /* Maybe another process was tidying up. Try again. */
+               if (--attempts_remaining > 0)
+                       goto retry;
+               /* fall through */
+       default:
+               strbuf_addf(err, "unable to create directory for %s",
+                           ref_file.buf);
+               goto error_return;
+       }
 
-               /* Follow "normalized" - ie "refs/.." symlinks by hand */
-               if (S_ISLNK(st.st_mode)) {
-                       strbuf_reset(sb_contents);
-                       if (strbuf_readlink(sb_contents, path, 0) < 0) {
-                               if (errno == ENOENT || errno == EINVAL)
-                                       /* inconsistent with lstat; retry */
-                                       goto stat_ref;
-                               else
-                                       return NULL;
-                       }
-                       if (starts_with(sb_contents->buf, "refs/") &&
-                           !check_refname_format(sb_contents->buf, 0)) {
-                               strbuf_swap(sb_refname, sb_contents);
-                               refname = sb_refname->buf;
-                               if (flags)
-                                       *flags |= REF_ISSYMREF;
-                               if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
-                                       hashclr(sha1);
-                                       return refname;
-                               }
-                               continue;
-                       }
-               }
+       if (!lock->lk)
+               lock->lk = xcalloc(1, sizeof(struct lock_file));
 
-               /* Is it a directory? */
-               if (S_ISDIR(st.st_mode)) {
-                       errno = EISDIR;
-                       return NULL;
+       if (hold_lock_file_for_update(lock->lk, ref_file.buf, LOCK_NO_DEREF) < 0) {
+               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;
                }
+       }
 
-               /*
-                * Anything else, just open it and try to use it as
-                * a ref
-                */
-               fd = open(path, O_RDONLY);
-               if (fd < 0) {
-                       if (errno == ENOENT)
-                               /* inconsistent with lstat; retry */
-                               goto stat_ref;
-                       else
-                               return NULL;
-               }
-               strbuf_reset(sb_contents);
-               if (strbuf_read(sb_contents, fd, 256) < 0) {
-                       int save_errno = errno;
-                       close(fd);
-                       errno = save_errno;
-                       return NULL;
-               }
-               close(fd);
-               strbuf_rtrim(sb_contents);
+       /*
+        * Now we hold the lock and can read the reference without
+        * fear that its value will change.
+        */
 
-               /*
-                * Is it a symbolic ref?
-                */
-               if (!starts_with(sb_contents->buf, "ref:")) {
+       if (files_read_raw_ref(&refs->base, refname,
+                              lock->old_oid.hash, referent, type)) {
+               if (errno == ENOENT) {
+                       if (mustexist) {
+                               /* Garden variety missing reference. */
+                               strbuf_addf(err, "unable to resolve reference '%s'",
+                                           refname);
+                               goto error_return;
+                       } else {
+                               /*
+                                * Reference is missing, but that's OK. We
+                                * know that there is not a conflict with
+                                * another loose reference because
+                                * (supposing that we are trying to lock
+                                * reference "refs/foo/bar"):
+                                *
+                                * - We were successfully able to create
+                                *   the lockfile refs/foo/bar.lock, so we
+                                *   know there cannot be a loose reference
+                                *   named "refs/foo".
+                                *
+                                * - We got ENOENT and not EISDIR, so we
+                                *   know that there cannot be a loose
+                                *   reference named "refs/foo/bar/baz".
+                                */
+                       }
+               } else if (errno == EISDIR) {
                        /*
-                        * Please note that FETCH_HEAD has a second
-                        * line containing other data.
+                        * There is a directory in the way. It might have
+                        * contained references that have been deleted. If
+                        * we don't require that the reference already
+                        * exists, try to remove the directory so that it
+                        * doesn't cause trouble when we want to rename the
+                        * lockfile into place later.
                         */
-                       if (get_sha1_hex(sb_contents->buf, sha1) ||
-                           (sb_contents->buf[40] != '\0' && !isspace(sb_contents->buf[40]))) {
-                               if (flags)
-                                       *flags |= REF_ISBROKEN;
-                               errno = EINVAL;
-                               return NULL;
-                       }
-                       if (bad_name) {
-                               hashclr(sha1);
-                               if (flags)
-                                       *flags |= REF_ISBROKEN;
+                       if (mustexist) {
+                               /* Garden variety missing reference. */
+                               strbuf_addf(err, "unable to resolve reference '%s'",
+                                           refname);
+                               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(refs),
+                                                   err)) {
+                                       /*
+                                        * The error message set by
+                                        * verify_refname_available() is OK.
+                                        */
+                                       ret = TRANSACTION_NAME_CONFLICT;
+                                       goto error_return;
+                               } else {
+                                       /*
+                                        * We can't delete the directory,
+                                        * but we also don't know of any
+                                        * references that it should
+                                        * contain.
+                                        */
+                                       strbuf_addf(err, "there is a non-empty directory '%s' "
+                                                   "blocking reference '%s'",
+                                                   ref_file.buf, refname);
+                                       goto error_return;
+                               }
                        }
-                       return refname;
-               }
-               if (flags)
-                       *flags |= REF_ISSYMREF;
-               buf = sb_contents->buf + 4;
-               while (isspace(*buf))
-                       buf++;
-               strbuf_reset(sb_refname);
-               strbuf_addstr(sb_refname, buf);
-               refname = sb_refname->buf;
-               if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
-                       hashclr(sha1);
-                       return refname;
+               } else if (errno == EINVAL && (*type & REF_ISBROKEN)) {
+                       strbuf_addf(err, "unable to resolve reference '%s': "
+                                   "reference broken", refname);
+                       goto error_return;
+               } else {
+                       strbuf_addf(err, "unable to resolve reference '%s': %s",
+                                   refname, strerror(errno));
+                       goto error_return;
                }
-               if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
-                       if (flags)
-                               *flags |= REF_ISBROKEN;
-
-                       if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
-                           !refname_is_safe(buf)) {
-                               errno = EINVAL;
-                               return NULL;
-                       }
-                       bad_name = 1;
+
+               /*
+                * 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.
+                */
+               if (verify_refname_available_dir(
+                                   refname, extras, skip,
+                                   get_packed_refs(refs),
+                                   err)) {
+                       goto error_return;
                }
        }
-}
 
-const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
-                              unsigned char *sha1, int *flags)
-{
-       static struct strbuf sb_refname = STRBUF_INIT;
-       struct strbuf sb_contents = STRBUF_INIT;
-       struct strbuf sb_path = STRBUF_INIT;
-       const char *ret;
+       ret = 0;
+       goto out;
 
-       ret = resolve_ref_1(refname, resolve_flags, sha1, flags,
-                           &sb_refname, &sb_path, &sb_contents);
-       strbuf_release(&sb_path);
-       strbuf_release(&sb_contents);
+error_return:
+       unlock_ref(lock);
+       *lock_p = NULL;
+
+out:
+       strbuf_release(&ref_file);
        return ret;
 }
 
@@ -1625,16 +1761,19 @@ static enum peel_status peel_entry(struct ref_entry *entry, int repeel)
        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, 0, "peel_ref");
        int flag;
        unsigned char base[20];
 
-       if (current_ref && (current_ref->name == refname
-                           || !strcmp(current_ref->name, refname))) {
-               if (peel_entry(current_ref, 0))
+       if (current_ref_iter && current_ref_iter->refname == refname) {
+               struct object_id peeled;
+
+               if (ref_iterator_peel(current_ref_iter, &peeled))
                        return -1;
-               hashcpy(sha1, current_ref->u.value.peeled.hash);
+               hashcpy(sha1, peeled.hash);
                return 0;
        }
 
@@ -1650,7 +1789,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;
@@ -1662,177 +1801,142 @@ int peel_ref(const char *refname, unsigned char *sha1)
        return peel_object(base, sha1);
 }
 
-/*
- * Call fn for each reference in the specified ref_cache, omitting
- * references not in the containing_dir of base.  fn is called for all
- * references, including broken ones.  If fn ever returns a non-zero
- * value, stop the iteration and return that value; otherwise, return
- * 0.
- */
-static int do_for_each_entry(struct ref_cache *refs, const char *base,
-                            each_ref_entry_fn fn, void *cb_data)
-{
+struct files_ref_iterator {
+       struct ref_iterator base;
+
        struct packed_ref_cache *packed_ref_cache;
-       struct ref_dir *loose_dir;
-       struct ref_dir *packed_dir;
-       int retval = 0;
+       struct ref_iterator *iter0;
+       unsigned int flags;
+};
 
-       /*
-        * We must make sure that all loose refs are read before accessing the
-        * packed-refs file; this avoids a race condition in which loose refs
-        * are migrated to the packed-refs file by a simultaneous process, but
-        * our in-memory view is from before the migration. get_packed_ref_cache()
-        * takes care of making sure our view is up to date with what is on
-        * disk.
-        */
-       loose_dir = get_loose_refs(refs);
-       if (base && *base) {
-               loose_dir = find_containing_dir(loose_dir, base, 0);
-       }
-       if (loose_dir)
-               prime_ref_dir(loose_dir);
+static int files_ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       struct files_ref_iterator *iter =
+               (struct files_ref_iterator *)ref_iterator;
+       int ok;
 
-       packed_ref_cache = get_packed_ref_cache(refs);
-       acquire_packed_ref_cache(packed_ref_cache);
-       packed_dir = get_packed_ref_dir(packed_ref_cache);
-       if (base && *base) {
-               packed_dir = find_containing_dir(packed_dir, base, 0);
-       }
-
-       if (packed_dir && loose_dir) {
-               sort_ref_dir(packed_dir);
-               sort_ref_dir(loose_dir);
-               retval = do_for_each_entry_in_dirs(
-                               packed_dir, loose_dir, fn, cb_data);
-       } else if (packed_dir) {
-               sort_ref_dir(packed_dir);
-               retval = do_for_each_entry_in_dir(
-                               packed_dir, 0, fn, cb_data);
-       } else if (loose_dir) {
-               sort_ref_dir(loose_dir);
-               retval = do_for_each_entry_in_dir(
-                               loose_dir, 0, fn, cb_data);
-       }
+       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;
 
-       release_packed_ref_cache(packed_ref_cache);
-       return retval;
-}
+               if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
+                   !ref_resolves_to_object(iter->iter0->refname,
+                                           iter->iter0->oid,
+                                           iter->iter0->flags))
+                       continue;
 
-/*
- * Call fn for each reference in the specified ref_cache for which the
- * refname begins with base.  If trim is non-zero, then trim that many
- * characters off the beginning of each refname before passing the
- * refname to fn.  flags can be DO_FOR_EACH_INCLUDE_BROKEN to include
- * broken references in the iteration.  If fn ever returns a non-zero
- * value, stop the iteration and return that value; otherwise, return
- * 0.
- */
-static int do_for_each_ref(struct ref_cache *refs, const char *base,
-                          each_ref_fn fn, int trim, int flags, void *cb_data)
-{
-       struct ref_entry_cb data;
-       data.base = base;
-       data.trim = trim;
-       data.flags = flags;
-       data.fn = fn;
-       data.cb_data = cb_data;
+               iter->base.refname = iter->iter0->refname;
+               iter->base.oid = iter->iter0->oid;
+               iter->base.flags = iter->iter0->flags;
+               return ITER_OK;
+       }
 
-       if (ref_paranoia < 0)
-               ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
-       if (ref_paranoia)
-               data.flags |= DO_FOR_EACH_INCLUDE_BROKEN;
+       iter->iter0 = NULL;
+       if (ref_iterator_abort(ref_iterator) != ITER_DONE)
+               ok = ITER_ERROR;
 
-       return do_for_each_entry(refs, base, do_one_ref, &data);
+       return ok;
 }
 
-static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
+static int files_ref_iterator_peel(struct ref_iterator *ref_iterator,
+                                  struct object_id *peeled)
 {
-       struct object_id oid;
-       int flag;
+       struct files_ref_iterator *iter =
+               (struct files_ref_iterator *)ref_iterator;
 
-       if (submodule) {
-               if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0)
-                       return fn("HEAD", &oid, 0, cb_data);
+       return ref_iterator_peel(iter->iter0, peeled);
+}
 
-               return 0;
-       }
+static int files_ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       struct files_ref_iterator *iter =
+               (struct files_ref_iterator *)ref_iterator;
+       int ok = ITER_DONE;
 
-       if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag))
-               return fn("HEAD", &oid, flag, cb_data);
+       if (iter->iter0)
+               ok = ref_iterator_abort(iter->iter0);
 
-       return 0;
+       release_packed_ref_cache(iter->packed_ref_cache);
+       base_ref_iterator_free(ref_iterator);
+       return ok;
 }
 
-int head_ref(each_ref_fn fn, void *cb_data)
-{
-       return do_head_ref(NULL, fn, cb_data);
-}
+static struct ref_iterator_vtable files_ref_iterator_vtable = {
+       files_ref_iterator_advance,
+       files_ref_iterator_peel,
+       files_ref_iterator_abort
+};
 
-int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
+static struct ref_iterator *files_ref_iterator_begin(
+               struct ref_store *ref_store,
+               const char *prefix, unsigned int flags)
 {
-       return do_head_ref(submodule, fn, cb_data);
-}
+       struct files_ref_store *refs =
+               files_downcast(ref_store, 1, "ref_iterator_begin");
+       struct ref_dir *loose_dir, *packed_dir;
+       struct ref_iterator *loose_iter, *packed_iter;
+       struct files_ref_iterator *iter;
+       struct ref_iterator *ref_iterator;
 
-int for_each_ref(each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(&ref_cache, "", fn, 0, 0, cb_data);
-}
+       if (!refs)
+               return empty_ref_iterator_begin();
 
-int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(get_ref_cache(submodule), "", fn, 0, 0, cb_data);
-}
+       if (ref_paranoia < 0)
+               ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
+       if (ref_paranoia)
+               flags |= DO_FOR_EACH_INCLUDE_BROKEN;
 
-int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(&ref_cache, prefix, fn, strlen(prefix), 0, cb_data);
-}
+       iter = xcalloc(1, sizeof(*iter));
+       ref_iterator = &iter->base;
+       base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable);
 
-int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
-{
-       unsigned int flag = 0;
+       /*
+        * We must make sure that all loose refs are read before
+        * accessing the packed-refs file; this avoids a race
+        * 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.
+        */
 
-       if (broken)
-               flag = DO_FOR_EACH_INCLUDE_BROKEN;
-       return do_for_each_ref(&ref_cache, prefix, fn, 0, flag, cb_data);
-}
+       loose_dir = get_loose_refs(refs);
 
-int for_each_ref_in_submodule(const char *submodule, const char *prefix,
-               each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(get_ref_cache(submodule), prefix, fn, strlen(prefix), 0, cb_data);
-}
+       if (prefix && *prefix)
+               loose_dir = find_containing_dir(loose_dir, prefix, 0);
 
-int for_each_replace_ref(each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(&ref_cache, git_replace_ref_base, fn,
-                              strlen(git_replace_ref_base), 0, cb_data);
-}
+       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();
+       }
+
+       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);
 
-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(&ref_cache, buf.buf, fn, 0, 0, cb_data);
-       strbuf_release(&buf);
-       return ret;
-}
+       if (prefix && *prefix)
+               packed_dir = find_containing_dir(packed_dir, prefix, 0);
 
-int for_each_rawref(each_ref_fn fn, void *cb_data)
-{
-       return do_for_each_ref(&ref_cache, "", fn, 0,
-                              DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
-}
+       if (packed_dir) {
+               packed_iter = cache_ref_iterator_begin(packed_dir);
+       } else {
+               /* There's nothing to iterate over. */
+               packed_iter = empty_ref_iterator_begin();
+       }
 
-static void unlock_ref(struct ref_lock *lock)
-{
-       /* Do not free lock->lk -- atexit() still looks at them */
-       if (lock->lk)
-               rollback_lock_file(lock->lk);
-       free(lock->ref_name);
-       free(lock->orig_ref_name);
-       free(lock);
+       iter->iter0 = overlay_ref_iterator_begin(loose_iter, packed_iter);
+       iter->flags = flags;
+
+       return ref_iterator;
 }
 
 /*
@@ -1852,18 +1956,18 @@ static int verify_lock(struct ref_lock *lock,
                          lock->old_oid.hash, NULL)) {
                if (old_sha1) {
                        int save_errno = errno;
-                       strbuf_addf(err, "can't verify ref %s", lock->ref_name);
+                       strbuf_addf(err, "can't verify ref '%s'", lock->ref_name);
                        errno = save_errno;
                        return -1;
                } else {
-                       hashclr(lock->old_oid.hash);
+                       oidclr(&lock->old_oid);
                        return 0;
                }
        }
        if (old_sha1 && hashcmp(lock->old_oid.hash, old_sha1)) {
-               strbuf_addf(err, "ref %s is at %s but expected %s",
+               strbuf_addf(err, "ref '%s' is at %s but expected %s",
                            lock->ref_name,
-                           sha1_to_hex(lock->old_oid.hash),
+                           oid_to_hex(&lock->old_oid),
                            sha1_to_hex(old_sha1));
                errno = EBUSY;
                return -1;
@@ -1885,24 +1989,24 @@ static int remove_empty_directories(struct strbuf *path)
  * 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,
-                                           unsigned int flags, int *type_p,
+                                           unsigned int flags, int *type,
                                            struct strbuf *err)
 {
        struct strbuf ref_file = STRBUF_INIT;
-       struct strbuf orig_ref_file = STRBUF_INIT;
-       const char *orig_refname = refname;
        struct ref_lock *lock;
        int last_errno = 0;
-       int type;
-       int lflags = 0;
+       int lflags = LOCK_NO_DEREF;
        int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
-       int resolve_flags = 0;
+       int resolve_flags = RESOLVE_REF_NO_RECURSE;
        int attempts_remaining = 3;
+       int resolved;
 
+       assert_main_repository(&refs->base, "lock_ref_sha1_basic");
        assert(err);
 
        lock = xcalloc(1, sizeof(struct ref_lock));
@@ -1911,48 +2015,41 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
                resolve_flags |= RESOLVE_REF_READING;
        if (flags & REF_DELETING)
                resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
-       if (flags & REF_NODEREF) {
-               resolve_flags |= RESOLVE_REF_NO_RECURSE;
-               lflags |= LOCK_NO_DEREF;
-       }
 
-       refname = resolve_ref_unsafe(refname, resolve_flags,
-                                    lock->old_oid.hash, &type);
-       if (!refname && errno == EISDIR) {
+       strbuf_git_path(&ref_file, "%s", refname);
+       resolved = !!resolve_ref_unsafe(refname, resolve_flags,
+                                       lock->old_oid.hash, type);
+       if (!resolved && errno == EISDIR) {
                /*
                 * we are trying to lock foo but we used to
                 * have foo/bar which now does not exist;
                 * it is normal for the empty directory 'foo'
                 * to remain.
                 */
-               strbuf_git_path(&orig_ref_file, "%s", orig_refname);
-               if (remove_empty_directories(&orig_ref_file)) {
+               if (remove_empty_directories(&ref_file)) {
                        last_errno = errno;
-                       if (!verify_refname_available_dir(orig_refname, extras, skip,
-                                                         get_loose_refs(&ref_cache), err))
+                       if (!verify_refname_available_dir(
+                                           refname, extras, skip,
+                                           get_loose_refs(refs), err))
                                strbuf_addf(err, "there are still refs under '%s'",
-                                           orig_refname);
+                                           refname);
                        goto error_return;
                }
-               refname = resolve_ref_unsafe(orig_refname, resolve_flags,
-                                            lock->old_oid.hash, &type);
+               resolved = !!resolve_ref_unsafe(refname, resolve_flags,
+                                               lock->old_oid.hash, type);
        }
-       if (type_p)
-           *type_p = type;
-       if (!refname) {
+       if (!resolved) {
                last_errno = errno;
                if (last_errno != ENOTDIR ||
-                   !verify_refname_available_dir(orig_refname, extras, skip,
-                                                 get_loose_refs(&ref_cache), err))
-                       strbuf_addf(err, "unable to resolve reference %s: %s",
-                                   orig_refname, strerror(last_errno));
+                   !verify_refname_available_dir(
+                                   refname, extras, skip,
+                                   get_loose_refs(refs), err))
+                       strbuf_addf(err, "unable to resolve reference '%s': %s",
+                                   refname, strerror(last_errno));
 
                goto error_return;
        }
 
-       if (flags & REF_NODEREF)
-               refname = orig_refname;
-
        /*
         * If the ref did not exist and we are creating it, make sure
         * there is no existing packed ref whose name begins with our
@@ -1961,7 +2058,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
         */
        if (is_null_oid(&lock->old_oid) &&
            verify_refname_available_dir(refname, extras, skip,
-                                        get_packed_refs(&ref_cache), err)) {
+                                        get_packed_refs(refs),
+                                        err)) {
                last_errno = ENOTDIR;
                goto error_return;
        }
@@ -1969,8 +2067,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
        lock->lk = xcalloc(1, sizeof(struct lock_file));
 
        lock->ref_name = xstrdup(refname);
-       lock->orig_ref_name = xstrdup(orig_refname);
-       strbuf_git_path(&ref_file, "%s", refname);
 
  retry:
        switch (safe_create_leading_directories_const(ref_file.buf)) {
@@ -1982,7 +2078,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
                /* fall through */
        default:
                last_errno = errno;
-               strbuf_addf(err, "unable to create directory for %s",
+               strbuf_addf(err, "unable to create directory for '%s'",
                            ref_file.buf);
                goto error_return;
        }
@@ -2013,7 +2109,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
 
  out:
        strbuf_release(&ref_file);
-       strbuf_release(&orig_ref_file);
        errno = last_errno;
        return lock;
 }
@@ -2051,13 +2146,14 @@ static int write_packed_entry_fn(struct ref_entry *entry, void *cb_data)
  * 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;
 
+       assert_main_repository(&refs->base, "lock_packed_refs");
+
        if (!timeout_configured) {
                git_config_get_int("core.packedrefstimeout", &timeout_value);
                timeout_configured = 1;
@@ -2073,7 +2169,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);
@@ -2086,14 +2182,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);
+               get_packed_ref_cache(refs);
        int error = 0;
        int save_errno = 0;
        FILE *out;
 
+       assert_main_repository(&refs->base, "commit_packed_refs");
+
        if (!packed_ref_cache->lock)
                die("internal error: packed-refs not locked");
 
@@ -2120,17 +2218,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);
+
+       assert_main_repository(&refs->base, "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 {
@@ -2167,7 +2267,7 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
                return 0;
 
        /* Do not pack symbolic or broken refs: */
-       if ((entry->flag & REF_ISSYMREF) || !ref_resolves_to_object(entry))
+       if ((entry->flag & REF_ISSYMREF) || !entry_resolves_to_object(entry))
                return 0;
 
        /* Add a packed ref cache entry equivalent to the loose entry. */
@@ -2241,7 +2341,7 @@ static void prune_ref(struct ref_to_prune *r)
        transaction = ref_transaction_begin(&err);
        if (!transaction ||
            ref_transaction_delete(transaction, r->name, r->sha1,
-                                  REF_ISPRUNING, NULL, &err) ||
+                                  REF_ISPRUNING | REF_NODEREF, NULL, &err) ||
            ref_transaction_commit(transaction, &err)) {
                ref_transaction_free(transaction);
                error("%s", err.buf);
@@ -2261,20 +2361,22 @@ static void prune_refs(struct ref_to_prune *r)
        }
 }
 
-int pack_refs(unsigned int flags)
+static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
 {
+       struct files_ref_store *refs =
+               files_downcast(ref_store, 0, "pack_refs");
        struct pack_refs_cb_data cbdata;
 
        memset(&cbdata, 0, sizeof(cbdata));
        cbdata.flags = flags;
 
-       lock_packed_refs(LOCK_DIE_ON_ERROR);
-       cbdata.packed_refs = get_packed_refs(&ref_cache);
+       lock_packed_refs(refs, LOCK_DIE_ON_ERROR);
+       cbdata.packed_refs = get_packed_refs(refs);
 
-       do_for_each_entry_in_dir(get_loose_refs(&ref_cache), 0,
+       do_for_each_entry_in_dir(get_loose_refs(refs), 0,
                                 pack_if_possible_fn, &cbdata);
 
-       if (commit_packed_refs())
+       if (commit_packed_refs(refs))
                die_errno("unable to overwrite old ref-pack file");
 
        prune_refs(cbdata.ref_to_prune);
@@ -2288,17 +2390,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;
 
+       assert_main_repository(&refs->base, "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;
                }
@@ -2308,11 +2412,11 @@ 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)) {
+       if (lock_packed_refs(refs, 0)) {
                unable_to_lock_message(git_path("packed-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)
@@ -2323,12 +2427,12 @@ static int repack_without_refs(struct string_list *refnames, struct strbuf *err)
                 * 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));
@@ -2353,15 +2457,18 @@ static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err)
        return 0;
 }
 
-int delete_refs(struct string_list *refnames)
+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, 0, "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
@@ -2382,7 +2489,7 @@ int delete_refs(struct string_list *refnames)
        for (i = 0; i < refnames->nr; i++) {
                const char *refname = refnames->items[i].string;
 
-               if (delete_ref(refname, NULL, 0))
+               if (delete_ref(refname, NULL, flags))
                        result |= error(_("could not remove reference %s"), refname);
        }
 
@@ -2452,13 +2559,16 @@ out:
        return ret;
 }
 
-int verify_refname_available(const char *newname,
-                            struct string_list *extras,
-                            struct string_list *skip,
-                            struct strbuf *err)
+static int files_verify_refname_available(struct ref_store *ref_store,
+                                         const char *newname,
+                                         const struct string_list *extras,
+                                         const struct string_list *skip,
+                                         struct strbuf *err)
 {
-       struct ref_dir *packed_refs = get_packed_refs(&ref_cache);
-       struct ref_dir *loose_refs = get_loose_refs(&ref_cache);
+       struct files_ref_store *refs =
+               files_downcast(ref_store, 1, "verify_refname_available");
+       struct ref_dir *packed_refs = get_packed_refs(refs);
+       struct ref_dir *loose_refs = get_loose_refs(refs);
 
        if (verify_refname_available_dir(newname, extras, skip,
                                         packed_refs, err) ||
@@ -2471,31 +2581,34 @@ int verify_refname_available(const char *newname,
 
 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,
-                            int flags, struct strbuf *err);
+                            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, 0, "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);
-       const char *symref = NULL;
        struct strbuf err = STRBUF_INIT;
 
        if (log && S_ISLNK(loginfo.st_mode))
                return error("reflog for %s is a symlink", oldrefname);
 
-       symref = resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING,
-                                   orig_sha1, &flag);
+       if (!resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
+                               orig_sha1, &flag))
+               return error("refname %s not found", oldrefname);
+
        if (flag & REF_ISSYMREF)
                return error("refname %s is a symbolic ref, renaming it is not supported",
                        oldrefname);
-       if (!symref)
-               return error("refname %s not found", oldrefname);
-
        if (!rename_ref_available(oldrefname, newrefname))
                return 1;
 
@@ -2508,8 +2621,16 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
                goto rollback;
        }
 
-       if (!read_ref_full(newrefname, RESOLVE_REF_READING, sha1, NULL) &&
-           delete_ref(newrefname, sha1, REF_NODEREF)) {
+       /*
+        * Since we are doing a shallow lookup, sha1 is not the
+        * correct value to pass to delete_ref as old_sha1. But that
+        * doesn't matter, because an old_sha1 check wouldn't add to
+        * 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) {
                        struct strbuf path = STRBUF_INIT;
                        int result;
@@ -2533,7 +2654,8 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
 
        logmoved = log;
 
-       lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, 0, 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);
@@ -2542,7 +2664,7 @@ 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, 0, &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;
@@ -2551,7 +2673,8 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
        return 0;
 
  rollback:
-       lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, 0, 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);
@@ -2561,7 +2684,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
        flag = log_all_ref_updates;
        log_all_ref_updates = 0;
        if (write_ref_to_lockfile(lock, orig_sha1, &err) ||
-           commit_ref_update(lock, orig_sha1, NULL, 0, &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);
        }
@@ -2588,6 +2711,30 @@ static int close_ref(struct ref_lock *lock)
 
 static int commit_ref(struct ref_lock *lock)
 {
+       char *path = get_locked_file_path(lock->lk);
+       struct stat st;
+
+       if (!lstat(path, &st) && S_ISDIR(st.st_mode)) {
+               /*
+                * There is a directory at the path we want to rename
+                * the lockfile to. Hopefully it is empty; try to
+                * delete it.
+                */
+               size_t len = strlen(path);
+               struct strbuf sb_path = STRBUF_INIT;
+
+               strbuf_attach(&sb_path, path, len, len);
+
+               /*
+                * If this fails, commit_lock_file() will also fail
+                * and will report the problem.
+                */
+               remove_empty_directories(&sb_path);
+               strbuf_release(&sb_path);
+       } else {
+               free(path);
+       }
+
        if (commit_lock_file(lock->lk))
                return -1;
        return 0;
@@ -2606,7 +2753,7 @@ static int log_ref_setup(const char *refname, struct strbuf *logfile, struct str
        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: "
+                       strbuf_addf(err, "unable to create directory for '%s': "
                                    "%s", logfile->buf, strerror(errno));
                        return -1;
                }
@@ -2620,7 +2767,7 @@ static int log_ref_setup(const char *refname, struct strbuf *logfile, struct str
 
                if (errno == EISDIR) {
                        if (remove_empty_directories(logfile)) {
-                               strbuf_addf(err, "There are still logs under "
+                               strbuf_addf(err, "there are still logs under "
                                            "'%s'", logfile->buf);
                                return -1;
                        }
@@ -2628,7 +2775,7 @@ static int log_ref_setup(const char *refname, struct strbuf *logfile, struct str
                }
 
                if (logfd < 0) {
-                       strbuf_addf(err, "unable to append to %s: %s",
+                       strbuf_addf(err, "unable to append to '%s': %s",
                                    logfile->buf, strerror(errno));
                        return -1;
                }
@@ -2640,11 +2787,16 @@ static int log_ref_setup(const char *refname, struct strbuf *logfile, struct str
 }
 
 
-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;
 
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "create_reflog");
+
        ret = log_ref_setup(refname, &sb, err, force_create);
        strbuf_release(&sb);
        return ret;
@@ -2697,13 +2849,13 @@ static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
        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,
+               strbuf_addf(err, "unable to append to '%s': %s", logfile->buf,
                            strerror(errno));
                close(logfd);
                return -1;
        }
        if (close(logfd)) {
-               strbuf_addf(err, "unable to append to %s: %s", logfile->buf,
+               strbuf_addf(err, "unable to append to '%s': %s", logfile->buf,
                            strerror(errno));
                return -1;
        }
@@ -2744,14 +2896,14 @@ static int write_ref_to_lockfile(struct ref_lock *lock,
        o = parse_object(sha1);
        if (!o) {
                strbuf_addf(err,
-                           "Trying to write ref %s with nonexistent object %s",
+                           "trying to write ref '%s' with nonexistent object %s",
                            lock->ref_name, sha1_to_hex(sha1));
                unlock_ref(lock);
                return -1;
        }
        if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
                strbuf_addf(err,
-                           "Trying to write non-commit object %s to branch %s",
+                           "trying to write non-commit object %s to branch '%s'",
                            sha1_to_hex(sha1), lock->ref_name);
                unlock_ref(lock);
                return -1;
@@ -2761,7 +2913,7 @@ static int write_ref_to_lockfile(struct ref_lock *lock,
            write_in_full(fd, &term, 1) != 1 ||
            close_ref(lock) < 0) {
                strbuf_addf(err,
-                           "Couldn't write %s", get_lock_file_path(lock->lk));
+                           "couldn't write '%s'", get_lock_file_path(lock->lk));
                unlock_ref(lock);
                return -1;
        }
@@ -2773,22 +2925,24 @@ 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,
-                            int flags, struct strbuf *err)
+                            struct strbuf *err)
 {
-       clear_loose_ref_cache(&ref_cache);
-       if (log_ref_write(lock->ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0 ||
-           (strcmp(lock->ref_name, lock->orig_ref_name) &&
-            log_ref_write(lock->orig_ref_name, lock->old_oid.hash, sha1, logmsg, flags, err) < 0)) {
+       assert_main_repository(&refs->base, "commit_ref_update");
+
+       clear_loose_ref_cache(refs);
+       if (log_ref_write(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",
+               strbuf_addf(err, "cannot update the ref '%s': %s",
                            lock->ref_name, old_msg);
                free(old_msg);
                unlock_ref(lock);
                return -1;
        }
-       if (strcmp(lock->orig_ref_name, "HEAD") != 0) {
+
+       if (strcmp(lock->ref_name, "HEAD") != 0) {
                /*
                 * Special hack: If a branch is updated directly and HEAD
                 * points to it (may happen on the remote side of a push
@@ -2804,6 +2958,7 @@ static int commit_ref_update(struct ref_lock *lock,
                unsigned char head_sha1[20];
                int head_flag;
                const char *head_ref;
+
                head_ref = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
                                              head_sha1, &head_flag);
                if (head_ref && (head_flag & REF_ISSYMREF) &&
@@ -2816,8 +2971,9 @@ static int commit_ref_update(struct ref_lock *lock,
                        }
                }
        }
+
        if (commit_ref(lock)) {
-               error("Couldn't set %s", lock->ref_name);
+               strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
                unlock_ref(lock);
                return -1;
        }
@@ -2875,13 +3031,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, 0, "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);
@@ -2894,16 +3055,59 @@ int create_symref(const char *refname, const char *target, const char *logmsg)
        return ret;
 }
 
-int reflog_exists(const char *refname)
+int set_worktree_head_symref(const char *gitdir, const char *target)
+{
+       static struct lock_file head_lock;
+       struct ref_lock *lock;
+       struct strbuf head_path = STRBUF_INIT;
+       const char *head_rel;
+       int ret;
+
+       strbuf_addf(&head_path, "%s/HEAD", absolute_path(gitdir));
+       if (hold_lock_file_for_update(&head_lock, head_path.buf,
+                                     LOCK_NO_DEREF) < 0) {
+               struct strbuf err = STRBUF_INIT;
+               unable_to_lock_message(head_path.buf, errno, &err);
+               error("%s", err.buf);
+               strbuf_release(&err);
+               strbuf_release(&head_path);
+               return -1;
+       }
+
+       /* head_rel will be "HEAD" for the main tree, "worktrees/wt/HEAD" for
+          linked trees */
+       head_rel = remove_leading_path(head_path.buf,
+                                      absolute_path(get_git_common_dir()));
+       /* to make use of create_symref_locked(), initialize ref_lock */
+       lock = xcalloc(1, sizeof(struct ref_lock));
+       lock->lk = &head_lock;
+       lock->ref_name = xstrdup(head_rel);
+
+       ret = create_symref_locked(lock, head_rel, target, NULL);
+
+       unlock_ref(lock); /* will free lock */
+       strbuf_release(&head_path);
+       return ret;
+}
+
+static int files_reflog_exists(struct ref_store *ref_store,
+                              const char *refname)
 {
        struct stat st;
 
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "reflog_exists");
+
        return !lstat(git_path("logs/%s", refname), &st) &&
                S_ISREG(st.st_mode);
 }
 
-int delete_reflog(const char *refname)
+static int files_delete_reflog(struct ref_store *ref_store,
+                              const char *refname)
 {
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "delete_reflog");
+
        return remove_path(git_path("logs/%s", refname));
 }
 
@@ -2946,13 +3150,19 @@ 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 strbuf sb = STRBUF_INIT;
        FILE *logfp;
        long pos;
        int ret = 0, at_tail = 1;
 
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "for_each_reflog_ent_reverse");
+
        logfp = fopen(git_path("logs/%s", refname), "r");
        if (!logfp)
                return -1;
@@ -3048,12 +3258,17 @@ 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)
 {
        FILE *logfp;
        struct strbuf sb = STRBUF_INIT;
        int ret = 0;
 
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "for_each_reflog_ent");
+
        logfp = fopen(git_path("logs/%s", refname), "r");
        if (!logfp)
                return -1;
@@ -3064,60 +3279,85 @@ int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_dat
        strbuf_release(&sb);
        return ret;
 }
-/*
- * Call fn for each reflog in the namespace indicated by name.  name
- * must be empty or end with '/'.  Name will be used as a scratch
- * space, but its contents will be restored before return.
- */
-static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data)
-{
-       DIR *d = opendir(git_path("logs/%s", name->buf));
-       int retval = 0;
-       struct dirent *de;
-       int oldlen = name->len;
 
-       if (!d)
-               return name->len ? errno : 0;
+struct files_reflog_iterator {
+       struct ref_iterator base;
 
-       while ((de = readdir(d)) != NULL) {
-               struct stat st;
+       struct dir_iterator *dir_iterator;
+       struct object_id oid;
+};
 
-               if (de->d_name[0] == '.')
+static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       struct files_reflog_iterator *iter =
+               (struct files_reflog_iterator *)ref_iterator;
+       struct dir_iterator *diter = iter->dir_iterator;
+       int ok;
+
+       while ((ok = dir_iterator_advance(diter)) == ITER_OK) {
+               int flags;
+
+               if (!S_ISREG(diter->st.st_mode))
                        continue;
-               if (ends_with(de->d_name, ".lock"))
+               if (diter->basename[0] == '.')
+                       continue;
+               if (ends_with(diter->basename, ".lock"))
                        continue;
-               strbuf_addstr(name, de->d_name);
-               if (stat(git_path("logs/%s", name->buf), &st) < 0) {
-                       ; /* silently ignore */
-               } else {
-                       if (S_ISDIR(st.st_mode)) {
-                               strbuf_addch(name, '/');
-                               retval = do_for_each_reflog(name, fn, cb_data);
-                       } else {
-                               struct object_id oid;
 
-                               if (read_ref_full(name->buf, 0, oid.hash, NULL))
-                                       retval = error("bad ref for %s", name->buf);
-                               else
-                                       retval = fn(name->buf, &oid, 0, cb_data);
-                       }
-                       if (retval)
-                               break;
+               if (read_ref_full(diter->relative_path, 0,
+                                 iter->oid.hash, &flags)) {
+                       error("bad ref for %s", diter->path.buf);
+                       continue;
                }
-               strbuf_setlen(name, oldlen);
+
+               iter->base.refname = diter->relative_path;
+               iter->base.oid = &iter->oid;
+               iter->base.flags = flags;
+               return ITER_OK;
        }
-       closedir(d);
-       return retval;
+
+       iter->dir_iterator = NULL;
+       if (ref_iterator_abort(ref_iterator) == ITER_ERROR)
+               ok = ITER_ERROR;
+       return ok;
+}
+
+static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator,
+                                  struct object_id *peeled)
+{
+       die("BUG: ref_iterator_peel() called for reflog_iterator");
 }
 
-int for_each_reflog(each_ref_fn fn, void *cb_data)
+static int files_reflog_iterator_abort(struct ref_iterator *ref_iterator)
 {
-       int retval;
-       struct strbuf name;
-       strbuf_init(&name, PATH_MAX);
-       retval = do_for_each_reflog(&name, fn, cb_data);
-       strbuf_release(&name);
-       return retval;
+       struct files_reflog_iterator *iter =
+               (struct files_reflog_iterator *)ref_iterator;
+       int ok = ITER_DONE;
+
+       if (iter->dir_iterator)
+               ok = dir_iterator_abort(iter->dir_iterator);
+
+       base_ref_iterator_free(ref_iterator);
+       return ok;
+}
+
+static struct ref_iterator_vtable files_reflog_iterator_vtable = {
+       files_reflog_iterator_advance,
+       files_reflog_iterator_peel,
+       files_reflog_iterator_abort
+};
+
+static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)
+{
+       struct files_reflog_iterator *iter = xcalloc(1, sizeof(*iter));
+       struct ref_iterator *ref_iterator = &iter->base;
+
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "reflog_iterator_begin");
+
+       base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable);
+       iter->dir_iterator = dir_iterator_begin(git_path("logs"));
+       return ref_iterator;
 }
 
 static int ref_update_reject_duplicates(struct string_list *refnames,
@@ -3130,169 +3370,475 @@ static int ref_update_reject_duplicates(struct string_list *refnames,
        for (i = 1; i < n; i++)
                if (!strcmp(refnames->items[i - 1].string, refnames->items[i].string)) {
                        strbuf_addf(err,
-                                   "Multiple updates for ref '%s' not allowed.",
+                                   "multiple updates for ref '%s' not allowed.",
                                    refnames->items[i].string);
                        return 1;
                }
        return 0;
 }
 
-int ref_transaction_commit(struct ref_transaction *transaction,
-                          struct strbuf *err)
+/*
+ * If update is a direct update of head_ref (the reference pointed to
+ * by HEAD), then add an extra REF_LOG_ONLY update for HEAD.
+ */
+static int split_head_update(struct ref_update *update,
+                            struct ref_transaction *transaction,
+                            const char *head_ref,
+                            struct string_list *affected_refnames,
+                            struct strbuf *err)
+{
+       struct string_list_item *item;
+       struct ref_update *new_update;
+
+       if ((update->flags & REF_LOG_ONLY) ||
+           (update->flags & REF_ISPRUNING) ||
+           (update->flags & REF_UPDATE_VIA_HEAD))
+               return 0;
+
+       if (strcmp(update->refname, head_ref))
+               return 0;
+
+       /*
+        * First make sure that HEAD is not already in the
+        * transaction. This insertion is O(N) in the transaction
+        * size, but it happens at most once per transaction.
+        */
+       item = string_list_insert(affected_refnames, "HEAD");
+       if (item->util) {
+               /* An entry already existed */
+               strbuf_addf(err,
+                           "multiple updates for 'HEAD' (including one "
+                           "via its referent '%s') are not allowed",
+                           update->refname);
+               return TRANSACTION_NAME_CONFLICT;
+       }
+
+       new_update = ref_transaction_add_update(
+                       transaction, "HEAD",
+                       update->flags | REF_LOG_ONLY | REF_NODEREF,
+                       update->new_sha1, update->old_sha1,
+                       update->msg);
+
+       item->util = new_update;
+
+       return 0;
+}
+
+/*
+ * update is for a symref that points at referent and doesn't have
+ * REF_NODEREF set. Split it into two updates:
+ * - The original update, but with REF_LOG_ONLY and REF_NODEREF set
+ * - A new, separate update for the referent reference
+ * Note that the new update will itself be subject to splitting when
+ * the iteration gets to it.
+ */
+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,
+                              struct strbuf *err)
+{
+       struct string_list_item *item;
+       struct ref_update *new_update;
+       unsigned int new_flags;
+
+       /*
+        * First make sure that referent is not already in the
+        * transaction. This insertion is O(N) in the transaction
+        * size, but it happens at most once per symref in a
+        * transaction.
+        */
+       item = string_list_insert(affected_refnames, referent);
+       if (item->util) {
+               /* An entry already existed */
+               strbuf_addf(err,
+                           "multiple updates for '%s' (including one "
+                           "via symref '%s') are not allowed",
+                           referent, update->refname);
+               return TRANSACTION_NAME_CONFLICT;
+       }
+
+       new_flags = update->flags;
+       if (!strcmp(update->refname, "HEAD")) {
+               /*
+                * Record that the new update came via HEAD, so that
+                * when we process it, split_head_update() doesn't try
+                * to add another reflog update for HEAD. Note that
+                * this bit will be propagated if the new_update
+                * itself needs to be split.
+                */
+               new_flags |= REF_UPDATE_VIA_HEAD;
+       }
+
+       new_update = ref_transaction_add_update(
+                       transaction, referent, new_flags,
+                       update->new_sha1, update->old_sha1,
+                       update->msg);
+
+       new_update->parent_update = update;
+
+       /*
+        * Change the symbolic ref update to log only. Also, it
+        * doesn't need to check its old SHA-1 value, as that will be
+        * done when new_update is processed.
+        */
+       update->flags |= REF_LOG_ONLY | REF_NODEREF;
+       update->flags &= ~REF_HAVE_OLD;
+
+       item->util = new_update;
+
+       return 0;
+}
+
+/*
+ * Return the refname under which update was originally requested.
+ */
+static const char *original_update_refname(struct ref_update *update)
+{
+       while (update->parent_update)
+               update = update->parent_update;
+
+       return update->refname;
+}
+
+/*
+ * Check whether the REF_HAVE_OLD and old_oid values stored in update
+ * are consistent with oid, which is the reference's current value. If
+ * everything is OK, return 0; otherwise, write an error message to
+ * err and return -1.
+ */
+static int check_old_oid(struct ref_update *update, struct object_id *oid,
+                        struct strbuf *err)
+{
+       if (!(update->flags & REF_HAVE_OLD) ||
+                  !hashcmp(oid->hash, update->old_sha1))
+               return 0;
+
+       if (is_null_sha1(update->old_sha1))
+               strbuf_addf(err, "cannot lock ref '%s': "
+                           "reference already exists",
+                           original_update_refname(update));
+       else if (is_null_oid(oid))
+               strbuf_addf(err, "cannot lock ref '%s': "
+                           "reference is missing but expected %s",
+                           original_update_refname(update),
+                           sha1_to_hex(update->old_sha1));
+       else
+               strbuf_addf(err, "cannot lock ref '%s': "
+                           "is at %s but expected %s",
+                           original_update_refname(update),
+                           oid_to_hex(oid),
+                           sha1_to_hex(update->old_sha1));
+
+       return -1;
+}
+
+/*
+ * Prepare for carrying out update:
+ * - Lock the reference referred to by update.
+ * - Read the reference under lock.
+ * - Check that its old SHA-1 value (if specified) is correct, and in
+ *   any case record it in update->lock->old_oid for later use when
+ *   writing the reflog.
+ * - If it is a symref update without REF_NODEREF, split it up into a
+ *   REF_LOG_ONLY update of the symref and add a separate update for
+ *   the referent to transaction.
+ * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY
+ *   update of HEAD.
+ */
+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,
+                              struct strbuf *err)
+{
+       struct strbuf referent = STRBUF_INIT;
+       int mustexist = (update->flags & REF_HAVE_OLD) &&
+               !is_null_sha1(update->old_sha1);
+       int ret;
+       struct ref_lock *lock;
+
+       assert_main_repository(&refs->base, "lock_ref_for_update");
+
+       if ((update->flags & REF_HAVE_NEW) && is_null_sha1(update->new_sha1))
+               update->flags |= REF_DELETING;
+
+       if (head_ref) {
+               ret = split_head_update(update, transaction, head_ref,
+                                       affected_refnames, err);
+               if (ret)
+                       return ret;
+       }
+
+       ret = lock_raw_ref(refs, update->refname, mustexist,
+                          affected_refnames, NULL,
+                          &lock, &referent,
+                          &update->type, err);
+       if (ret) {
+               char *reason;
+
+               reason = strbuf_detach(err, NULL);
+               strbuf_addf(err, "cannot lock ref '%s': %s",
+                           original_update_refname(update), reason);
+               free(reason);
+               return ret;
+       }
+
+       update->backend_data = lock;
+
+       if (update->type & REF_ISSYMREF) {
+               if (update->flags & REF_NODEREF) {
+                       /*
+                        * We won't be reading the referent as part of
+                        * 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 (update->flags & REF_HAVE_OLD) {
+                                       strbuf_addf(err, "cannot lock ref '%s': "
+                                                   "error reading reference",
+                                                   original_update_refname(update));
+                                       return -1;
+                               }
+                       } else if (check_old_oid(update, &lock->old_oid, err)) {
+                               return TRANSACTION_GENERIC_ERROR;
+                       }
+               } else {
+                       /*
+                        * Create a new update for the reference this
+                        * symref is pointing at. Also, we will record
+                        * and verify old_sha1 for this update as part
+                        * of processing the split-off update, so we
+                        * don't have to do it here.
+                        */
+                       ret = split_symref_update(refs, update,
+                                                 referent.buf, transaction,
+                                                 affected_refnames, err);
+                       if (ret)
+                               return ret;
+               }
+       } else {
+               struct ref_update *parent_update;
+
+               if (check_old_oid(update, &lock->old_oid, err))
+                       return TRANSACTION_GENERIC_ERROR;
+
+               /*
+                * If this update is happening indirectly because of a
+                * symref update, record the old SHA-1 in the parent
+                * update:
+                */
+               for (parent_update = update->parent_update;
+                    parent_update;
+                    parent_update = parent_update->parent_update) {
+                       struct ref_lock *parent_lock = parent_update->backend_data;
+                       oidcpy(&parent_lock->old_oid, &lock->old_oid);
+               }
+       }
+
+       if ((update->flags & REF_HAVE_NEW) &&
+           !(update->flags & REF_DELETING) &&
+           !(update->flags & REF_LOG_ONLY)) {
+               if (!(update->type & REF_ISSYMREF) &&
+                   !hashcmp(lock->old_oid.hash, update->new_sha1)) {
+                       /*
+                        * The reference already has the desired
+                        * value, so we don't need to write it.
+                        */
+               } else if (write_ref_to_lockfile(lock, update->new_sha1,
+                                                err)) {
+                       char *write_err = strbuf_detach(err, NULL);
+
+                       /*
+                        * The lock was freed upon failure of
+                        * write_ref_to_lockfile():
+                        */
+                       update->backend_data = NULL;
+                       strbuf_addf(err,
+                                   "cannot update ref '%s': %s",
+                                   update->refname, write_err);
+                       free(write_err);
+                       return TRANSACTION_GENERIC_ERROR;
+               } else {
+                       update->flags |= REF_NEEDS_COMMIT;
+               }
+       }
+       if (!(update->flags & REF_NEEDS_COMMIT)) {
+               /*
+                * We didn't call write_ref_to_lockfile(), so
+                * the lockfile is still open. Close it to
+                * free up the file descriptor:
+                */
+               if (close_ref(lock)) {
+                       strbuf_addf(err, "couldn't close '%s.lock'",
+                                   update->refname);
+                       return TRANSACTION_GENERIC_ERROR;
+               }
+       }
+       return 0;
+}
+
+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, 0, "ref_transaction_commit");
        int ret = 0, i;
-       int n = transaction->nr;
-       struct ref_update **updates = transaction->updates;
        struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;
        struct string_list_item *ref_to_delete;
        struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
+       char *head_ref = NULL;
+       int head_type;
+       struct object_id head_oid;
 
        assert(err);
 
        if (transaction->state != REF_TRANSACTION_OPEN)
                die("BUG: commit called for transaction that is not open");
 
-       if (!n) {
+       if (!transaction->nr) {
                transaction->state = REF_TRANSACTION_CLOSED;
                return 0;
        }
 
-       /* Fail if a refname appears more than once in the transaction: */
-       for (i = 0; i < n; i++)
-               string_list_append(&affected_refnames, updates[i]->refname);
+       /*
+        * Fail if a refname appears more than once in the
+        * transaction. (If we end up splitting up any updates using
+        * split_symref_update() or split_head_update(), those
+        * functions will check that the new updates don't have the
+        * same refname as any existing ones.)
+        */
+       for (i = 0; i < transaction->nr; i++) {
+               struct ref_update *update = transaction->updates[i];
+               struct string_list_item *item =
+                       string_list_append(&affected_refnames, update->refname);
+
+               /*
+                * We store a pointer to update in item->util, but at
+                * the moment we never use the value of this field
+                * except to check whether it is non-NULL.
+                */
+               item->util = update;
+       }
        string_list_sort(&affected_refnames);
        if (ref_update_reject_duplicates(&affected_refnames, err)) {
                ret = TRANSACTION_GENERIC_ERROR;
                goto cleanup;
        }
 
+       /*
+        * Special hack: If a branch is updated directly and HEAD
+        * points to it (may happen on the remote side of a push
+        * for example) then logically the HEAD reflog should be
+        * updated too.
+        *
+        * A generic solution would require reverse symref lookups,
+        * but finding all symrefs pointing to a given branch would be
+        * rather costly for this rare event (the direct update of a
+        * branch) to be worth it. So let's cheat and check with HEAD
+        * only, which should cover 99% of all usage scenarios (even
+        * 100% of the default ones).
+        *
+        * So if HEAD is a symbolic reference, then record the name of
+        * the reference that it points to. If we see an update of
+        * 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);
+
+       if (head_ref && !(head_type & REF_ISSYMREF)) {
+               free(head_ref);
+               head_ref = NULL;
+       }
+
        /*
         * Acquire all locks, verify old values if provided, check
         * that new values are valid, and write new values to the
         * lockfiles, ready to be activated. Only keep one lockfile
         * open at a time to avoid running out of file descriptors.
         */
-       for (i = 0; i < n; i++) {
-               struct ref_update *update = updates[i];
+       for (i = 0; i < transaction->nr; i++) {
+               struct ref_update *update = transaction->updates[i];
 
-               if ((update->flags & REF_HAVE_NEW) &&
-                   is_null_sha1(update->new_sha1))
-                       update->flags |= REF_DELETING;
-               update->lock = lock_ref_sha1_basic(
-                               update->refname,
-                               ((update->flags & REF_HAVE_OLD) ?
-                                update->old_sha1 : NULL),
-                               &affected_refnames, NULL,
-                               update->flags,
-                               &update->type,
-                               err);
-               if (!update->lock) {
-                       char *reason;
-
-                       ret = (errno == ENOTDIR)
-                               ? TRANSACTION_NAME_CONFLICT
-                               : TRANSACTION_GENERIC_ERROR;
-                       reason = strbuf_detach(err, NULL);
-                       strbuf_addf(err, "cannot lock ref '%s': %s",
-                                   update->refname, reason);
-                       free(reason);
+               ret = lock_ref_for_update(refs, update, transaction,
+                                         head_ref, &affected_refnames, err);
+               if (ret)
                        goto cleanup;
-               }
-               if ((update->flags & REF_HAVE_NEW) &&
-                   !(update->flags & REF_DELETING)) {
-                       int overwriting_symref = ((update->type & REF_ISSYMREF) &&
-                                                 (update->flags & REF_NODEREF));
-
-                       if (!overwriting_symref &&
-                           !hashcmp(update->lock->old_oid.hash, update->new_sha1)) {
-                               /*
-                                * The reference already has the desired
-                                * value, so we don't need to write it.
-                                */
-                       } else if (write_ref_to_lockfile(update->lock,
-                                                        update->new_sha1,
-                                                        err)) {
-                               char *write_err = strbuf_detach(err, NULL);
+       }
 
-                               /*
-                                * The lock was freed upon failure of
-                                * write_ref_to_lockfile():
-                                */
-                               update->lock = NULL;
-                               strbuf_addf(err,
-                                           "cannot update the ref '%s': %s",
-                                           update->refname, write_err);
-                               free(write_err);
+       /* 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->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)) {
+                               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->backend_data = NULL;
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
-                       } else {
-                               update->flags |= REF_NEEDS_COMMIT;
-                       }
-               }
-               if (!(update->flags & REF_NEEDS_COMMIT)) {
-                       /*
-                        * We didn't have to write anything to the lockfile.
-                        * Close it to free up the file descriptor:
-                        */
-                       if (close_ref(update->lock)) {
-                               strbuf_addf(err, "Couldn't close %s.lock",
-                                           update->refname);
-                               goto cleanup;
                        }
                }
-       }
-
-       /* Perform updates first so live commits remain referenced */
-       for (i = 0; i < n; i++) {
-               struct ref_update *update = updates[i];
-
                if (update->flags & REF_NEEDS_COMMIT) {
-                       if (commit_ref_update(update->lock,
-                                             update->new_sha1, update->msg,
-                                             update->flags, err)) {
-                               /* freed by commit_ref_update(): */
-                               update->lock = NULL;
+                       clear_loose_ref_cache(refs);
+                       if (commit_ref(lock)) {
+                               strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
+                               unlock_ref(lock);
+                               update->backend_data = NULL;
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
-                       } else {
-                               /* freed by commit_ref_update(): */
-                               update->lock = NULL;
                        }
                }
        }
-
        /* Perform deletes now that updates are safely completed */
-       for (i = 0; i < n; i++) {
-               struct ref_update *update = updates[i];
+       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) {
-                       if (delete_ref_loose(update->lock, update->type, err)) {
+               if (update->flags & REF_DELETING &&
+                   !(update->flags & REF_LOG_ONLY)) {
+                       if (delete_ref_loose(lock, update->type, err)) {
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
                        }
 
                        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);
+       clear_loose_ref_cache(refs);
 
 cleanup:
        transaction->state = REF_TRANSACTION_CLOSED;
 
-       for (i = 0; i < n; i++)
-               if (updates[i]->lock)
-                       unlock_ref(updates[i]->lock);
+       for (i = 0; i < transaction->nr; i++)
+               if (transaction->updates[i]->backend_data)
+                       unlock_ref(transaction->updates[i]->backend_data);
        string_list_clear(&refs_to_delete, 0);
+       free(head_ref);
        string_list_clear(&affected_refnames, 0);
+
        return ret;
 }
 
@@ -3304,12 +3850,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, 0, "initial_ref_transaction_commit");
        int ret = 0, i;
-       int n = transaction->nr;
-       struct ref_update **updates = transaction->updates;
        struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
 
        assert(err);
@@ -3318,8 +3865,9 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
                die("BUG: commit called for transaction that is not open");
 
        /* Fail if a refname appears more than once in the transaction: */
-       for (i = 0; i < n; i++)
-               string_list_append(&affected_refnames, updates[i]->refname);
+       for (i = 0; i < transaction->nr; i++)
+               string_list_append(&affected_refnames,
+                                  transaction->updates[i]->refname);
        string_list_sort(&affected_refnames);
        if (ref_update_reject_duplicates(&affected_refnames, err)) {
                ret = TRANSACTION_GENERIC_ERROR;
@@ -3341,8 +3889,8 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
        if (for_each_rawref(ref_present, &affected_refnames))
                die("BUG: initial ref transaction called with existing refs");
 
-       for (i = 0; i < n; i++) {
-               struct ref_update *update = updates[i];
+       for (i = 0; i < transaction->nr; i++) {
+               struct ref_update *update = transaction->updates[i];
 
                if ((update->flags & REF_HAVE_OLD) &&
                    !is_null_sha1(update->old_sha1))
@@ -3355,22 +3903,22 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction,
                }
        }
 
-       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;
                goto cleanup;
        }
 
-       for (i = 0; i < n; i++) {
-               struct ref_update *update = updates[i];
+       for (i = 0; i < transaction->nr; i++) {
+               struct ref_update *update = transaction->updates[i];
 
                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;
@@ -3420,13 +3968,16 @@ 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, 0, "reflog_expire");
        static struct lock_file reflog_lock;
        struct expire_reflog_cb cb;
        struct ref_lock *lock;
@@ -3445,7 +3996,9 @@ 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, 0, &type, &err);
+       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);
@@ -3524,3 +4077,47 @@ 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)
+{
+       /* Check validity (but we don't need the result): */
+       files_downcast(ref_store, 0, "init_db");
+
+       /*
+        * Create .git/refs/{heads,tags}
+        */
+       safe_create_dir(git_path("refs/heads"), 1);
+       safe_create_dir(git_path("refs/tags"), 1);
+       if (get_shared_repository()) {
+               adjust_shared_perm(git_path("refs/heads"));
+               adjust_shared_perm(git_path("refs/tags"));
+       }
+       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_verify_refname_available,
+
+       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/iterator.c b/refs/iterator.c
new file mode 100644 (file)
index 0000000..bce1f19
--- /dev/null
@@ -0,0 +1,384 @@
+/*
+ * Generic reference iterator infrastructure. See refs-internal.h for
+ * documentation about the design and use of reference iterators.
+ */
+
+#include "cache.h"
+#include "refs.h"
+#include "refs/refs-internal.h"
+#include "iterator.h"
+
+int ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       return ref_iterator->vtable->advance(ref_iterator);
+}
+
+int ref_iterator_peel(struct ref_iterator *ref_iterator,
+                     struct object_id *peeled)
+{
+       return ref_iterator->vtable->peel(ref_iterator, peeled);
+}
+
+int ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       return ref_iterator->vtable->abort(ref_iterator);
+}
+
+void base_ref_iterator_init(struct ref_iterator *iter,
+                           struct ref_iterator_vtable *vtable)
+{
+       iter->vtable = vtable;
+       iter->refname = NULL;
+       iter->oid = NULL;
+       iter->flags = 0;
+}
+
+void base_ref_iterator_free(struct ref_iterator *iter)
+{
+       /* Help make use-after-free bugs fail quickly: */
+       iter->vtable = NULL;
+       free(iter);
+}
+
+struct empty_ref_iterator {
+       struct ref_iterator base;
+};
+
+static int empty_ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       return ref_iterator_abort(ref_iterator);
+}
+
+static int empty_ref_iterator_peel(struct ref_iterator *ref_iterator,
+                                  struct object_id *peeled)
+{
+       die("BUG: peel called for empty iterator");
+}
+
+static int empty_ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       base_ref_iterator_free(ref_iterator);
+       return ITER_DONE;
+}
+
+static struct ref_iterator_vtable empty_ref_iterator_vtable = {
+       empty_ref_iterator_advance,
+       empty_ref_iterator_peel,
+       empty_ref_iterator_abort
+};
+
+struct ref_iterator *empty_ref_iterator_begin(void)
+{
+       struct empty_ref_iterator *iter = xcalloc(1, sizeof(*iter));
+       struct ref_iterator *ref_iterator = &iter->base;
+
+       base_ref_iterator_init(ref_iterator, &empty_ref_iterator_vtable);
+       return ref_iterator;
+}
+
+int is_empty_ref_iterator(struct ref_iterator *ref_iterator)
+{
+       return ref_iterator->vtable == &empty_ref_iterator_vtable;
+}
+
+struct merge_ref_iterator {
+       struct ref_iterator base;
+
+       struct ref_iterator *iter0, *iter1;
+
+       ref_iterator_select_fn *select;
+       void *cb_data;
+
+       /*
+        * A pointer to iter0 or iter1 (whichever is supplying the
+        * current value), or NULL if advance has not yet been called.
+        */
+       struct ref_iterator **current;
+};
+
+static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       struct merge_ref_iterator *iter =
+               (struct merge_ref_iterator *)ref_iterator;
+       int ok;
+
+       if (!iter->current) {
+               /* Initialize: advance both iterators to their first entries */
+               if ((ok = ref_iterator_advance(iter->iter0)) != ITER_OK) {
+                       iter->iter0 = NULL;
+                       if (ok == ITER_ERROR)
+                               goto error;
+               }
+               if ((ok = ref_iterator_advance(iter->iter1)) != ITER_OK) {
+                       iter->iter1 = NULL;
+                       if (ok == ITER_ERROR)
+                               goto error;
+               }
+       } else {
+               /*
+                * Advance the current iterator past the just-used
+                * entry:
+                */
+               if ((ok = ref_iterator_advance(*iter->current)) != ITER_OK) {
+                       *iter->current = NULL;
+                       if (ok == ITER_ERROR)
+                               goto error;
+               }
+       }
+
+       /* Loop until we find an entry that we can yield. */
+       while (1) {
+               struct ref_iterator **secondary;
+               enum iterator_selection selection =
+                       iter->select(iter->iter0, iter->iter1, iter->cb_data);
+
+               if (selection == ITER_SELECT_DONE) {
+                       return ref_iterator_abort(ref_iterator);
+               } else if (selection == ITER_SELECT_ERROR) {
+                       ref_iterator_abort(ref_iterator);
+                       return ITER_ERROR;
+               }
+
+               if ((selection & ITER_CURRENT_SELECTION_MASK) == 0) {
+                       iter->current = &iter->iter0;
+                       secondary = &iter->iter1;
+               } else {
+                       iter->current = &iter->iter1;
+                       secondary = &iter->iter0;
+               }
+
+               if (selection & ITER_SKIP_SECONDARY) {
+                       if ((ok = ref_iterator_advance(*secondary)) != ITER_OK) {
+                               *secondary = NULL;
+                               if (ok == ITER_ERROR)
+                                       goto error;
+                       }
+               }
+
+               if (selection & ITER_YIELD_CURRENT) {
+                       iter->base.refname = (*iter->current)->refname;
+                       iter->base.oid = (*iter->current)->oid;
+                       iter->base.flags = (*iter->current)->flags;
+                       return ITER_OK;
+               }
+       }
+
+error:
+       ref_iterator_abort(ref_iterator);
+       return ITER_ERROR;
+}
+
+static int merge_ref_iterator_peel(struct ref_iterator *ref_iterator,
+                                  struct object_id *peeled)
+{
+       struct merge_ref_iterator *iter =
+               (struct merge_ref_iterator *)ref_iterator;
+
+       if (!iter->current) {
+               die("BUG: peel called before advance for merge iterator");
+       }
+       return ref_iterator_peel(*iter->current, peeled);
+}
+
+static int merge_ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       struct merge_ref_iterator *iter =
+               (struct merge_ref_iterator *)ref_iterator;
+       int ok = ITER_DONE;
+
+       if (iter->iter0) {
+               if (ref_iterator_abort(iter->iter0) != ITER_DONE)
+                       ok = ITER_ERROR;
+       }
+       if (iter->iter1) {
+               if (ref_iterator_abort(iter->iter1) != ITER_DONE)
+                       ok = ITER_ERROR;
+       }
+       base_ref_iterator_free(ref_iterator);
+       return ok;
+}
+
+static struct ref_iterator_vtable merge_ref_iterator_vtable = {
+       merge_ref_iterator_advance,
+       merge_ref_iterator_peel,
+       merge_ref_iterator_abort
+};
+
+struct ref_iterator *merge_ref_iterator_begin(
+               struct ref_iterator *iter0, struct ref_iterator *iter1,
+               ref_iterator_select_fn *select, void *cb_data)
+{
+       struct merge_ref_iterator *iter = xcalloc(1, sizeof(*iter));
+       struct ref_iterator *ref_iterator = &iter->base;
+
+       /*
+        * We can't do the same kind of is_empty_ref_iterator()-style
+        * optimization here as overlay_ref_iterator_begin() does,
+        * because we don't know the semantics of the select function.
+        * It might, for example, implement "intersect" by passing
+        * references through only if they exist in both iterators.
+        */
+
+       base_ref_iterator_init(ref_iterator, &merge_ref_iterator_vtable);
+       iter->iter0 = iter0;
+       iter->iter1 = iter1;
+       iter->select = select;
+       iter->cb_data = cb_data;
+       iter->current = NULL;
+       return ref_iterator;
+}
+
+/*
+ * A ref_iterator_select_fn that overlays the items from front on top
+ * of those from back (like loose refs over packed refs). See
+ * overlay_ref_iterator_begin().
+ */
+static enum iterator_selection overlay_iterator_select(
+               struct ref_iterator *front, struct ref_iterator *back,
+               void *cb_data)
+{
+       int cmp;
+
+       if (!back)
+               return front ? ITER_SELECT_0 : ITER_SELECT_DONE;
+       else if (!front)
+               return ITER_SELECT_1;
+
+       cmp = strcmp(front->refname, back->refname);
+
+       if (cmp < 0)
+               return ITER_SELECT_0;
+       else if (cmp > 0)
+               return ITER_SELECT_1;
+       else
+               return ITER_SELECT_0_SKIP_1;
+}
+
+struct ref_iterator *overlay_ref_iterator_begin(
+               struct ref_iterator *front, struct ref_iterator *back)
+{
+       /*
+        * Optimization: if one of the iterators is empty, return the
+        * other one rather than incurring the overhead of wrapping
+        * them.
+        */
+       if (is_empty_ref_iterator(front)) {
+               ref_iterator_abort(front);
+               return back;
+       } else if (is_empty_ref_iterator(back)) {
+               ref_iterator_abort(back);
+               return front;
+       }
+
+       return merge_ref_iterator_begin(front, back,
+                                       overlay_iterator_select, NULL);
+}
+
+struct prefix_ref_iterator {
+       struct ref_iterator base;
+
+       struct ref_iterator *iter0;
+       char *prefix;
+       int trim;
+};
+
+static int prefix_ref_iterator_advance(struct ref_iterator *ref_iterator)
+{
+       struct prefix_ref_iterator *iter =
+               (struct prefix_ref_iterator *)ref_iterator;
+       int ok;
+
+       while ((ok = ref_iterator_advance(iter->iter0)) == ITER_OK) {
+               if (!starts_with(iter->iter0->refname, iter->prefix))
+                       continue;
+
+               iter->base.refname = iter->iter0->refname + iter->trim;
+               iter->base.oid = iter->iter0->oid;
+               iter->base.flags = iter->iter0->flags;
+               return ITER_OK;
+       }
+
+       iter->iter0 = NULL;
+       if (ref_iterator_abort(ref_iterator) != ITER_DONE)
+               return ITER_ERROR;
+       return ok;
+}
+
+static int prefix_ref_iterator_peel(struct ref_iterator *ref_iterator,
+                                   struct object_id *peeled)
+{
+       struct prefix_ref_iterator *iter =
+               (struct prefix_ref_iterator *)ref_iterator;
+
+       return ref_iterator_peel(iter->iter0, peeled);
+}
+
+static int prefix_ref_iterator_abort(struct ref_iterator *ref_iterator)
+{
+       struct prefix_ref_iterator *iter =
+               (struct prefix_ref_iterator *)ref_iterator;
+       int ok = ITER_DONE;
+
+       if (iter->iter0)
+               ok = ref_iterator_abort(iter->iter0);
+       free(iter->prefix);
+       base_ref_iterator_free(ref_iterator);
+       return ok;
+}
+
+static struct ref_iterator_vtable prefix_ref_iterator_vtable = {
+       prefix_ref_iterator_advance,
+       prefix_ref_iterator_peel,
+       prefix_ref_iterator_abort
+};
+
+struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
+                                              const char *prefix,
+                                              int trim)
+{
+       struct prefix_ref_iterator *iter;
+       struct ref_iterator *ref_iterator;
+
+       if (!*prefix && !trim)
+               return iter0; /* optimization: no need to wrap iterator */
+
+       iter = xcalloc(1, sizeof(*iter));
+       ref_iterator = &iter->base;
+
+       base_ref_iterator_init(ref_iterator, &prefix_ref_iterator_vtable);
+
+       iter->iter0 = iter0;
+       iter->prefix = xstrdup(prefix);
+       iter->trim = trim;
+
+       return ref_iterator;
+}
+
+struct ref_iterator *current_ref_iter = NULL;
+
+int do_for_each_ref_iterator(struct ref_iterator *iter,
+                            each_ref_fn fn, void *cb_data)
+{
+       int retval = 0, ok;
+       struct ref_iterator *old_ref_iter = current_ref_iter;
+
+       current_ref_iter = iter;
+       while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+               retval = fn(iter->refname, iter->oid, iter->flags, cb_data);
+               if (retval) {
+                       /*
+                        * If ref_iterator_abort() returns ITER_ERROR,
+                        * we ignore that error in deference to the
+                        * callback function's return value.
+                        */
+                       ref_iterator_abort(iter);
+                       goto out;
+               }
+       }
+
+out:
+       current_ref_iter = old_ref_iter;
+       if (ok == ITER_ERROR)
+               return -1;
+       return retval;
+}
index c7dded35f47e0c30131839b3378100e5a778476c..708b26082aebcc4c0f9c215db4c96dce15beec67 100644 (file)
@@ -15,7 +15,7 @@
 
 /*
  * Used as a flag in ref_update::flags when a loose ref is being
- * pruned.
+ * pruned. This flag must only be used when REF_NODEREF is set.
  */
 #define REF_ISPRUNING  0x04
 
  * value to ref_update::flags
  */
 
+/*
+ * Used as a flag in ref_update::flags when we want to log a ref
+ * update but not actually perform it.  This is used when a symbolic
+ * ref update is split up.
+ */
+#define REF_LOG_ONLY 0x80
+
+/*
+ * Internal flag, meaning that the containing ref_update was via an
+ * update to HEAD.
+ */
+#define REF_UPDATE_VIA_HEAD 0x100
+
 /*
  * Return true iff refname is minimally safe. "Safe" here means that
  * deleting a loose reference by this name will not do any damage, for
@@ -109,8 +122,8 @@ enum peel_status peel_object(const unsigned char *name, unsigned char *sha1);
  * extras and skip must be sorted.
  */
 int verify_refname_available(const char *newname,
-                            struct string_list *extras,
-                            struct string_list *skip,
+                            const struct string_list *extras,
+                            const struct string_list *skip,
                             struct strbuf *err);
 
 /*
@@ -130,26 +143,58 @@ int should_autocreate_reflog(const char *refname);
  * not exist before update.
  */
 struct ref_update {
+
        /*
         * If (flags & REF_HAVE_NEW), set the reference to this value:
         */
        unsigned char new_sha1[20];
+
        /*
         * If (flags & REF_HAVE_OLD), check that the reference
         * previously had this value:
         */
        unsigned char old_sha1[20];
+
        /*
         * One or more of REF_HAVE_NEW, REF_HAVE_OLD, REF_NODEREF,
-        * REF_DELETING, and REF_ISPRUNING:
+        * REF_DELETING, REF_ISPRUNING, REF_LOG_ONLY, and
+        * REF_UPDATE_VIA_HEAD:
         */
        unsigned int flags;
-       struct ref_lock *lock;
-       int type;
+
+       void *backend_data;
+       unsigned int type;
        char *msg;
+
+       /*
+        * If this ref_update was split off of a symref update via
+        * split_symref_update(), then this member points at that
+        * update. This is used for two purposes:
+        * 1. When reporting errors, we report the refname under which
+        *    the update was originally requested.
+        * 2. When we read the old value of this reference, we
+        *    propagate it back to its parent update for recording in
+        *    the latter's reflog.
+        */
+       struct ref_update *parent_update;
+
        const char refname[FLEX_ARRAY];
 };
 
+/*
+ * Add a ref_update with the specified properties to transaction, and
+ * return a pointer to the new object. This function does not verify
+ * that refname is well-formed. new_sha1 and old_sha1 are only
+ * dereferenced if the REF_HAVE_NEW and REF_HAVE_OLD bits,
+ * respectively, are set in flags.
+ */
+struct ref_update *ref_transaction_add_update(
+               struct ref_transaction *transaction,
+               const char *refname, unsigned int flags,
+               const unsigned char *new_sha1,
+               const unsigned char *old_sha1,
+               const char *msg);
+
 /*
  * Transaction states.
  * OPEN:   The transaction is in a valid state and can accept new updates.
@@ -195,6 +240,453 @@ 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 rename_ref_available(const char *old_refname, const char *new_refname);
+
+/* We allow "recursive" symbolic refs. Only within reason, though */
+#define SYMREF_MAXDEPTH 5
+
+/* Include broken references in a do_for_each_ref*() iteration: */
+#define DO_FOR_EACH_INCLUDE_BROKEN 0x01
+
+/*
+ * Reference iterators
+ *
+ * A reference iterator encapsulates the state of an in-progress
+ * iteration over references. Create an instance of `struct
+ * ref_iterator` via one of the functions in this module.
+ *
+ * A freshly-created ref_iterator doesn't yet point at a reference. To
+ * advance the iterator, call ref_iterator_advance(). If successful,
+ * this sets the iterator's refname, oid, and flags fields to describe
+ * the next reference and returns ITER_OK. The data pointed at by
+ * refname and oid belong to the iterator; if you want to retain them
+ * after calling ref_iterator_advance() again or calling
+ * ref_iterator_abort(), you must make a copy. When the iteration has
+ * been exhausted, ref_iterator_advance() releases any resources
+ * assocated with the iteration, frees the ref_iterator object, and
+ * returns ITER_DONE. If you want to abort the iteration early, call
+ * ref_iterator_abort(), which also frees the ref_iterator object and
+ * any associated resources. If there was an internal error advancing
+ * to the next entry, ref_iterator_advance() aborts the iteration,
+ * frees the ref_iterator, and returns ITER_ERROR.
+ *
+ * The reference currently being looked at can be peeled by calling
+ * ref_iterator_peel(). This function is often faster than peel_ref(),
+ * so it should be preferred when iterating over references.
+ *
+ * Putting it all together, a typical iteration looks like this:
+ *
+ *     int ok;
+ *     struct ref_iterator *iter = ...;
+ *
+ *     while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+ *             if (want_to_stop_iteration()) {
+ *                     ok = ref_iterator_abort(iter);
+ *                     break;
+ *             }
+ *
+ *             // Access information about the current reference:
+ *             if (!(iter->flags & REF_ISSYMREF))
+ *                     printf("%s is %s\n", iter->refname, oid_to_hex(&iter->oid));
+ *
+ *             // If you need to peel the reference:
+ *             ref_iterator_peel(iter, &oid);
+ *     }
+ *
+ *     if (ok != ITER_DONE)
+ *             handle_error();
+ */
+struct ref_iterator {
+       struct ref_iterator_vtable *vtable;
+       const char *refname;
+       const struct object_id *oid;
+       unsigned int flags;
+};
+
+/*
+ * Advance the iterator to the first or next item and return ITER_OK.
+ * If the iteration is exhausted, free the resources associated with
+ * the ref_iterator and return ITER_DONE. On errors, free the iterator
+ * resources and return ITER_ERROR. It is a bug to use ref_iterator or
+ * call this function again after it has returned ITER_DONE or
+ * ITER_ERROR.
+ */
+int ref_iterator_advance(struct ref_iterator *ref_iterator);
+
+/*
+ * If possible, peel the reference currently being viewed by the
+ * iterator. Return 0 on success.
+ */
+int ref_iterator_peel(struct ref_iterator *ref_iterator,
+                     struct object_id *peeled);
+
+/*
+ * End the iteration before it has been exhausted, freeing the
+ * reference iterator and any associated resources and returning
+ * ITER_DONE. If the abort itself failed, return ITER_ERROR.
+ */
+int ref_iterator_abort(struct ref_iterator *ref_iterator);
+
+/*
+ * An iterator over nothing (its first ref_iterator_advance() call
+ * returns ITER_DONE).
+ */
+struct ref_iterator *empty_ref_iterator_begin(void);
+
+/*
+ * Return true iff ref_iterator is an empty_ref_iterator.
+ */
+int is_empty_ref_iterator(struct ref_iterator *ref_iterator);
+
+/*
+ * A callback function used to instruct merge_ref_iterator how to
+ * interleave the entries from iter0 and iter1. The function should
+ * return one of the constants defined in enum iterator_selection. It
+ * must not advance either of the iterators itself.
+ *
+ * The function must be prepared to handle the case that iter0 and/or
+ * iter1 is NULL, which indicates that the corresponding sub-iterator
+ * has been exhausted. Its return value must be consistent with the
+ * current states of the iterators; e.g., it must not return
+ * ITER_SKIP_1 if iter1 has already been exhausted.
+ */
+typedef enum iterator_selection ref_iterator_select_fn(
+               struct ref_iterator *iter0, struct ref_iterator *iter1,
+               void *cb_data);
+
+/*
+ * Iterate over the entries from iter0 and iter1, with the values
+ * interleaved as directed by the select function. The iterator takes
+ * ownership of iter0 and iter1 and frees them when the iteration is
+ * over.
+ */
+struct ref_iterator *merge_ref_iterator_begin(
+               struct ref_iterator *iter0, struct ref_iterator *iter1,
+               ref_iterator_select_fn *select, void *cb_data);
+
+/*
+ * An iterator consisting of the union of the entries from front and
+ * back. If there are entries common to the two sub-iterators, use the
+ * one from front. Each iterator must iterate over its entries in
+ * strcmp() order by refname for this to work.
+ *
+ * The new iterator takes ownership of its arguments and frees them
+ * when the iteration is over. As a convenience to callers, if front
+ * or back is an empty_ref_iterator, then abort that one immediately
+ * and return the other iterator directly, without wrapping it.
+ */
+struct ref_iterator *overlay_ref_iterator_begin(
+               struct ref_iterator *front, struct ref_iterator *back);
+
+/*
+ * Wrap iter0, only letting through the references whose names start
+ * with prefix. If trim is set, set iter->refname to the name of the
+ * reference with that many characters trimmed off the front;
+ * otherwise set it to the full refname. The new iterator takes over
+ * ownership of iter0 and frees it when iteration is over. It makes
+ * its own copy of prefix.
+ *
+ * As an convenience to callers, if prefix is the empty string and
+ * trim is zero, this function returns iter0 directly, without
+ * wrapping it.
+ */
+struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
+                                              const char *prefix,
+                                              int trim);
+
+/* Internal implementation of reference iteration: */
+
+/*
+ * Base class constructor for ref_iterators. Initialize the
+ * ref_iterator part of iter, setting its vtable pointer as specified.
+ * This is meant to be called only by the initializers of derived
+ * classes.
+ */
+void base_ref_iterator_init(struct ref_iterator *iter,
+                           struct ref_iterator_vtable *vtable);
+
+/*
+ * Base class destructor for ref_iterators. Destroy the ref_iterator
+ * part of iter and shallow-free the object. This is meant to be
+ * called only by the destructors of derived classes.
+ */
+void base_ref_iterator_free(struct ref_iterator *iter);
+
+/* Virtual function declarations for ref_iterators: */
+
+typedef int ref_iterator_advance_fn(struct ref_iterator *ref_iterator);
+
+typedef int ref_iterator_peel_fn(struct ref_iterator *ref_iterator,
+                                struct object_id *peeled);
+
+/*
+ * Implementations of this function should free any resources specific
+ * to the derived class, then call base_ref_iterator_free() to clean
+ * up and free the ref_iterator object.
+ */
+typedef int ref_iterator_abort_fn(struct ref_iterator *ref_iterator);
+
+struct ref_iterator_vtable {
+       ref_iterator_advance_fn *advance;
+       ref_iterator_peel_fn *peel;
+       ref_iterator_abort_fn *abort;
+};
+
+/*
+ * current_ref_iter is a performance hack: when iterating over
+ * references using the for_each_ref*() functions, current_ref_iter is
+ * set to the reference iterator before calling the callback function.
+ * If the callback function calls peel_ref(), then peel_ref() first
+ * checks whether the reference to be peeled is the one referred to by
+ * the iterator (it usually is) and if so, asks the iterator for the
+ * peeled version of the reference if it is available. This avoids a
+ * refname lookup in a common case. current_ref_iter is set to NULL
+ * when the iteration is over.
+ */
+extern struct ref_iterator *current_ref_iter;
+
+/*
+ * The common backend for the for_each_*ref* functions. Call fn for
+ * each reference in iter. If the iterator itself ever returns
+ * ITER_ERROR, return -1. If fn ever returns a non-zero value, stop
+ * the iteration and return that value. Otherwise, return 0. In any
+ * case, free the iterator when done. This function is basically an
+ * adapter between the callback style of reference iteration and the
+ * iterator style.
+ */
+int do_for_each_ref_iterator(struct ref_iterator *iter,
+                            each_ref_fn fn, void *cb_data);
+
+/*
+ * 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 */
+
+/*
+ * Initialize the ref_store for the specified submodule, or for the
+ * main repository if submodule == NULL. 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 *submodule);
+
+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).
+ *
+ * - If refname is the name of a symbolic reference, write the full
+ *   name of the reference to which it refers (e.g.
+ *   "refs/heads/master") to referent and set the REF_ISSYMREF bit in
+ *   type (leaving sha1 unchanged). The caller is responsible for
+ *   validating that referent is a valid reference name.
+ *
+ * WARNING: refname might be used as part of a filename, so it is
+ * important from a security standpoint that it be safe in the sense
+ * of refname_is_safe(). Moreover, for symrefs this function sets
+ * referent to whatever the repository says, which might not be a
+ * properly-formatted or even safe reference name. NEITHER INPUT NOR
+ * OUTPUT REFERENCE NAMES ARE VALIDATED WITHIN THIS FUNCTION.
+ *
+ * Return 0 on success. If the ref doesn't exist, set errno to ENOENT
+ * and return -1. If the ref exists but is neither a symbolic ref nor
+ * a sha1, it is broken; set REF_ISBROKEN in type, set errno to
+ * EINVAL, and return -1. If there is another error reading the ref,
+ * set errno appropriately and return -1.
+ *
+ * Backend-specific flags might be set in type as well, regardless of
+ * outcome.
+ *
+ * It is OK for refname to point into referent. If so:
+ *
+ * - if the function succeeds with REF_ISSYMREF, referent will be
+ *   overwritten and the memory formerly pointed to by it might be
+ *   changed or even freed.
+ *
+ * - in all other cases, referent will be untouched, and therefore
+ *   refname will still be valid and unchanged.
+ */
+typedef int read_raw_ref_fn(struct ref_store *ref_store,
+                           const char *refname, unsigned char *sha1,
+                           struct strbuf *referent, unsigned int *type);
+
+typedef int verify_refname_available_fn(struct ref_store *ref_store,
+                                       const char *newname,
+                                       const struct string_list *extras,
+                                       const struct string_list *skip,
+                                       struct strbuf *err);
+
+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;
+       verify_refname_available_fn *verify_refname_available;
+
+       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;
+
+       /*
+        * The name of the submodule represented by this object, or
+        * the empty string if it represents the main repository's
+        * reference store:
+        */
+       const char *submodule;
+
+       /*
+        * Submodule reference store instances are stored in a linked
+        * list using this pointer.
+        */
+       struct ref_store *next;
+};
+
+/*
+ * Fill in the generic part of refs for the specified submodule and
+ * add it to our collection of reference stores.
+ */
+void base_ref_store_init(struct ref_store *refs,
+                        const struct ref_storage_be *be,
+                        const char *submodule);
+
+/*
+ * Create, record, and return a ref_store instance for the specified
+ * submodule (or the main repository if submodule is NULL).
+ *
+ * For backwards compatibility, submodule=="" is treated the same as
+ * submodule==NULL.
+ */
+struct ref_store *ref_store_init(const char *submodule);
+
+/*
+ * Return the ref_store instance for the specified submodule (or the
+ * main repository if submodule is NULL). If that ref_store hasn't
+ * been initialized yet, return NULL.
+ *
+ * For backwards compatibility, submodule=="" is treated the same as
+ * submodule==NULL.
+ */
+struct ref_store *lookup_ref_store(const char *submodule);
+
+/*
+ * 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_ref_store(const char *submodule);
+
+/*
+ * Die if refs is for a submodule (i.e., not for the main repository).
+ * caller is used in any necessary error messages.
+ */
+void assert_main_repository(struct ref_store *refs, const char *caller);
 
 #endif /* REFS_REFS_INTERNAL_H */
index 15e48e25fb9fb8cd2e9e3e7a63cf08d2f9483ea2..34a97e7328d440d48badd53bb0d3167a58558ee9 100644 (file)
@@ -20,6 +20,8 @@ static struct strbuf url = STRBUF_INIT;
 struct options {
        int verbosity;
        unsigned long depth;
+       char *deepen_since;
+       struct string_list deepen_not;
        unsigned progress : 1,
                check_self_contained_and_connected : 1,
                cloning : 1,
@@ -28,7 +30,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 +63,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;
@@ -254,7 +274,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 +291,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 +315,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 +404,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 +461,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;
 }
@@ -474,7 +501,7 @@ static int run_slot(struct active_request_slot *slot,
 static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
 {
        struct active_request_slot *slot;
-       struct curl_slist *headers = NULL;
+       struct curl_slist *headers = http_copy_default_headers();
        struct strbuf buf = STRBUF_INIT;
        int err;
 
@@ -503,7 +530,7 @@ static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
 static int post_rpc(struct rpc_state *rpc)
 {
        struct active_request_slot *slot;
-       struct curl_slist *headers = NULL;
+       struct curl_slist *headers = http_copy_default_headers();
        int use_gzip = rpc->gzip_request;
        char *gzip_body = NULL;
        size_t gzip_size = 0;
@@ -639,6 +666,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 +676,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 +757,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 +783,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 +824,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 +833,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;
 }
 
@@ -984,14 +1013,11 @@ static void parse_push(struct strbuf *buf)
        free(specs);
 }
 
-int main(int argc, const char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct strbuf buf = STRBUF_INIT;
        int nongit;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
        setup_git_directory_gently(&nongit);
        if (argc < 2) {
                error("remote-curl: usage: git remote-curl <remote> [<url>]");
@@ -1001,6 +1027,7 @@ int main(int argc, const char **argv)
        options.verbosity = 1;
        options.progress = !!isatty(2);
        options.thin = 1;
+       string_list_init(&options.deepen_not, 1);
 
        remote = remote_get(argv[1]);
 
index f05ff45298207258c257c2118206fbbfa0a4c670..f87bf851ba75af9229b1a9171191673af330505b 100644 (file)
@@ -284,7 +284,7 @@ static int do_command(struct strbuf *line)
        return 0;
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct strbuf buf = STRBUF_INIT, url_sb = STRBUF_INIT,
                        private_ref_sb = STRBUF_INIT, marksfilename_sb = STRBUF_INIT,
@@ -292,7 +292,6 @@ int main(int argc, char **argv)
        static struct remote *remote;
        const char *url_in;
 
-       git_extract_argv0_path(argv[0]);
        setup_git_directory();
        if (argc < 2 || argc > 3) {
                usage("git-remote-svn <remote-name> [<url>]");
index fc02698587c61d230200272ce4704403e1a6741f..ad6c5424edab2ae15ac17bfcf12ac4ee93b5aa3f 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -455,7 +455,6 @@ static void read_config(void)
 {
        static int loaded;
        struct object_id oid;
-       const char *head_ref;
        int flag;
 
        if (loaded)
@@ -463,10 +462,12 @@ static void read_config(void)
        loaded = 1;
 
        current_branch = NULL;
-       head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
-       if (head_ref && (flag & REF_ISSYMREF) &&
-           skip_prefix(head_ref, "refs/heads/", &head_ref)) {
-               current_branch = make_branch(head_ref, 0);
+       if (startup_info->have_repository) {
+               const char *head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
+               if (head_ref && (flag & REF_ISSYMREF) &&
+                   skip_prefix(head_ref, "refs/heads/", &head_ref)) {
+                       current_branch = make_branch(head_ref, 0);
+               }
        }
        git_config(handle_config, NULL);
        alias_all_urls();
@@ -1543,8 +1544,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
                 * branch.
                 */
                if (ref->expect_old_sha1) {
-                       if (ref->expect_old_no_trackback ||
-                           oidcmp(&ref->old_oid, &ref->old_oid_expect))
+                       if (oidcmp(&ref->old_oid, &ref->old_oid_expect))
                                reject_reason = REF_STATUS_REJECT_STALE;
                        else
                                /* If the ref isn't stale then force the update. */
@@ -1659,7 +1659,7 @@ int branch_merge_matches(struct branch *branch,
        return refname_match(branch->merge[i]->src, refname);
 }
 
-__attribute((format (printf,2,3)))
+__attribute__((format (printf,2,3)))
 static const char *error_buf(struct strbuf *err, const char *fmt, ...)
 {
        if (err) {
@@ -2073,7 +2073,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                        _("Your branch is based on '%s', but the upstream is gone.\n"),
                        base);
                if (advice_status_hints)
-                       strbuf_addf(sb,
+                       strbuf_addstr(sb,
                                _("  (use \"git branch --unset-upstream\" to fixup)\n"));
        } else if (!ours && !theirs) {
                strbuf_addf(sb,
@@ -2086,7 +2086,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                           ours),
                        base, ours);
                if (advice_status_hints)
-                       strbuf_addf(sb,
+                       strbuf_addstr(sb,
                                _("  (use \"git push\" to publish your local commits)\n"));
        } else if (!ours) {
                strbuf_addf(sb,
@@ -2097,7 +2097,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                           theirs),
                        base, theirs);
                if (advice_status_hints)
-                       strbuf_addf(sb,
+                       strbuf_addstr(sb,
                                _("  (use \"git pull\" to update your local branch)\n"));
        } else {
                strbuf_addf(sb,
@@ -2107,10 +2107,10 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                           "Your branch and '%s' have diverged,\n"
                               "and have %d and %d different commits each, "
                               "respectively.\n",
-                          theirs),
+                          ours + theirs),
                        base, ours, theirs);
                if (advice_status_hints)
-                       strbuf_addf(sb,
+                       strbuf_addstr(sb,
                                _("  (use \"git pull\" to merge the remote branch into yours)\n"));
        }
        free(base);
@@ -2293,6 +2293,8 @@ int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unse
        entry = add_cas_entry(cas, arg, colon - arg);
        if (!*colon)
                entry->use_tracking = 1;
+       else if (!colon[1])
+               hashclr(entry->expect);
        else if (get_sha1(colon + 1, entry->expect))
                return error("cannot parse expected object name '%s'", colon + 1);
        return 0;
@@ -2342,7 +2344,7 @@ static void apply_cas(struct push_cas_option *cas,
                if (!entry->use_tracking)
                        hashcpy(ref->old_oid_expect.hash, cas->entry[i].expect);
                else if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
-                       ref->expect_old_no_trackback = 1;
+                       oidclr(&ref->old_oid_expect);
                return;
        }
 
@@ -2352,7 +2354,7 @@ static void apply_cas(struct push_cas_option *cas,
 
        ref->expect_old_sha1 = 1;
        if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
-               ref->expect_old_no_trackback = 1;
+               oidclr(&ref->old_oid_expect);
 }
 
 void apply_push_cas(struct push_cas_option *cas,
index c21fd3788c78f28d57e7d76d472dc411986b34d1..924881169d9f6c5b9b09e2434d964f62e0e28d09 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -89,7 +89,6 @@ struct ref {
                force:1,
                forced_update:1,
                expect_old_sha1:1,
-               expect_old_no_trackback:1,
                deletion:1,
                matched:1;
 
index 587b7e2717b14748b92a5960f79947b5fba088f0..5d083ca572df0c8a2cb90c0b12c14e15b4134d48 100644 (file)
--- a/rerere.c
+++ b/rerere.c
@@ -8,6 +8,7 @@
 #include "ll-merge.h"
 #include "attr.h"
 #include "pathspec.h"
+#include "sha1-lookup.h"
 
 #define RESOLVED 0
 #define PUNTED 1
@@ -20,6 +21,29 @@ static int rerere_enabled = -1;
 /* automatically update cleanly resolved paths to the index */
 static int rerere_autoupdate;
 
+static int rerere_dir_nr;
+static int rerere_dir_alloc;
+
+#define RR_HAS_POSTIMAGE 1
+#define RR_HAS_PREIMAGE 2
+static struct rerere_dir {
+       unsigned char sha1[20];
+       int status_alloc, status_nr;
+       unsigned char *status;
+} **rerere_dir;
+
+static void free_rerere_dirs(void)
+{
+       int i;
+       for (i = 0; i < rerere_dir_nr; i++) {
+               free(rerere_dir[i]->status);
+               free(rerere_dir[i]);
+       }
+       free(rerere_dir);
+       rerere_dir_nr = rerere_dir_alloc = 0;
+       rerere_dir = NULL;
+}
+
 static void free_rerere_id(struct string_list_item *item)
 {
        free(item->util);
@@ -27,7 +51,33 @@ static void free_rerere_id(struct string_list_item *item)
 
 static const char *rerere_id_hex(const struct rerere_id *id)
 {
-       return id->hex;
+       return sha1_to_hex(id->collection->sha1);
+}
+
+static void fit_variant(struct rerere_dir *rr_dir, int variant)
+{
+       variant++;
+       ALLOC_GROW(rr_dir->status, variant, rr_dir->status_alloc);
+       if (rr_dir->status_nr < variant) {
+               memset(rr_dir->status + rr_dir->status_nr,
+                      '\0', variant - rr_dir->status_nr);
+               rr_dir->status_nr = variant;
+       }
+}
+
+static void assign_variant(struct rerere_id *id)
+{
+       int variant;
+       struct rerere_dir *rr_dir = id->collection;
+
+       variant = id->variant;
+       if (variant < 0) {
+               for (variant = 0; variant < rr_dir->status_nr; variant++)
+                       if (!rr_dir->status[variant])
+                               break;
+       }
+       fit_variant(rr_dir, variant);
+       id->variant = variant;
 }
 
 const char *rerere_path(const struct rerere_id *id, const char *file)
@@ -35,20 +85,103 @@ const char *rerere_path(const struct rerere_id *id, const char *file)
        if (!file)
                return git_path("rr-cache/%s", rerere_id_hex(id));
 
-       return git_path("rr-cache/%s/%s", rerere_id_hex(id), file);
+       if (id->variant <= 0)
+               return git_path("rr-cache/%s/%s", rerere_id_hex(id), file);
+
+       return git_path("rr-cache/%s/%s.%d",
+                       rerere_id_hex(id), file, id->variant);
+}
+
+static int is_rr_file(const char *name, const char *filename, int *variant)
+{
+       const char *suffix;
+       char *ep;
+
+       if (!strcmp(name, filename)) {
+               *variant = 0;
+               return 1;
+       }
+       if (!skip_prefix(name, filename, &suffix) || *suffix != '.')
+               return 0;
+
+       errno = 0;
+       *variant = strtol(suffix + 1, &ep, 10);
+       if (errno || *ep)
+               return 0;
+       return 1;
+}
+
+static void scan_rerere_dir(struct rerere_dir *rr_dir)
+{
+       struct dirent *de;
+       DIR *dir = opendir(git_path("rr-cache/%s", sha1_to_hex(rr_dir->sha1)));
+
+       if (!dir)
+               return;
+       while ((de = readdir(dir)) != NULL) {
+               int variant;
+
+               if (is_rr_file(de->d_name, "postimage", &variant)) {
+                       fit_variant(rr_dir, variant);
+                       rr_dir->status[variant] |= RR_HAS_POSTIMAGE;
+               } else if (is_rr_file(de->d_name, "preimage", &variant)) {
+                       fit_variant(rr_dir, variant);
+                       rr_dir->status[variant] |= RR_HAS_PREIMAGE;
+               }
+       }
+       closedir(dir);
+}
+
+static const unsigned char *rerere_dir_sha1(size_t i, void *table)
+{
+       struct rerere_dir **rr_dir = table;
+       return rr_dir[i]->sha1;
+}
+
+static struct rerere_dir *find_rerere_dir(const char *hex)
+{
+       unsigned char sha1[20];
+       struct rerere_dir *rr_dir;
+       int pos;
+
+       if (get_sha1_hex(hex, sha1))
+               return NULL; /* BUG */
+       pos = sha1_pos(sha1, rerere_dir, rerere_dir_nr, rerere_dir_sha1);
+       if (pos < 0) {
+               rr_dir = xmalloc(sizeof(*rr_dir));
+               hashcpy(rr_dir->sha1, sha1);
+               rr_dir->status = NULL;
+               rr_dir->status_nr = 0;
+               rr_dir->status_alloc = 0;
+               pos = -1 - pos;
+
+               /* Make sure the array is big enough ... */
+               ALLOC_GROW(rerere_dir, rerere_dir_nr + 1, rerere_dir_alloc);
+               /* ... and add it in. */
+               rerere_dir_nr++;
+               memmove(rerere_dir + pos + 1, rerere_dir + pos,
+                       (rerere_dir_nr - pos - 1) * sizeof(*rerere_dir));
+               rerere_dir[pos] = rr_dir;
+               scan_rerere_dir(rr_dir);
+       }
+       return rerere_dir[pos];
 }
 
 static int has_rerere_resolution(const struct rerere_id *id)
 {
-       struct stat st;
+       const int both = RR_HAS_POSTIMAGE|RR_HAS_PREIMAGE;
+       int variant = id->variant;
 
-       return !stat(rerere_path(id, "postimage"), &st);
+       if (variant < 0)
+               return 0;
+       return ((id->collection->status[variant] & both) == both);
 }
 
 static struct rerere_id *new_rerere_id_hex(char *hex)
 {
        struct rerere_id *id = xmalloc(sizeof(*id));
-       xsnprintf(id->hex, sizeof(id->hex), "%s", hex);
+       id->collection = find_rerere_dir(hex);
+       id->variant = -1; /* not known yet */
        return id;
 }
 
@@ -75,16 +208,26 @@ static void read_rr(struct string_list *rr)
                char *path;
                unsigned char sha1[20];
                struct rerere_id *id;
+               int variant;
 
                /* There has to be the hash, tab, path and then NUL */
                if (buf.len < 42 || get_sha1_hex(buf.buf, sha1))
                        die("corrupt MERGE_RR");
 
-               if (buf.buf[40] != '\t')
+               if (buf.buf[40] != '.') {
+                       variant = 0;
+                       path = buf.buf + 40;
+               } else {
+                       errno = 0;
+                       variant = strtol(buf.buf + 41, &path, 10);
+                       if (errno)
+                               die("corrupt MERGE_RR");
+               }
+               if (*(path++) != '\t')
                        die("corrupt MERGE_RR");
                buf.buf[40] = '\0';
-               path = buf.buf + 41;
                id = new_rerere_id_hex(buf.buf);
+               id->variant = variant;
                string_list_insert(rr, path)->util = id;
        }
        strbuf_release(&buf);
@@ -105,9 +248,16 @@ static int write_rr(struct string_list *rr, int out_fd)
                id = rr->items[i].util;
                if (!id)
                        continue;
-               strbuf_addf(&buf, "%s\t%s%c",
-                           rerere_id_hex(id),
-                           rr->items[i].string, 0);
+               assert(id->variant >= 0);
+               if (0 < id->variant)
+                       strbuf_addf(&buf, "%s.%d\t%s%c",
+                                   rerere_id_hex(id), id->variant,
+                                   rr->items[i].string, 0);
+               else
+                       strbuf_addf(&buf, "%s\t%s%c",
+                                   rerere_id_hex(id),
+                                   rr->items[i].string, 0);
+
                if (write_in_full(out_fd, buf.buf, buf.len) != buf.len)
                        die("unable to write rerere record");
 
@@ -351,8 +501,7 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output
                error("There were errors while writing %s (%s)",
                      path, strerror(io.io.wrerror));
        if (io.io.output && fclose(io.io.output))
-               io.io.wrerror = error("Failed to flush %s: %s",
-                                     path, strerror(errno));
+               io.io.wrerror = error_errno("Failed to flush %s", path);
 
        if (hunk_no < 0) {
                if (output)
@@ -364,103 +513,6 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output
        return hunk_no;
 }
 
-/*
- * Subclass of rerere_io that reads from an in-core buffer that is a
- * strbuf
- */
-struct rerere_io_mem {
-       struct rerere_io io;
-       struct strbuf input;
-};
-
-/*
- * ... and its getline() method implementation
- */
-static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
-{
-       struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
-       char *ep;
-       size_t len;
-
-       strbuf_release(sb);
-       if (!io->input.len)
-               return -1;
-       ep = memchr(io->input.buf, '\n', io->input.len);
-       if (!ep)
-               ep = io->input.buf + io->input.len;
-       else if (*ep == '\n')
-               ep++;
-       len = ep - io->input.buf;
-       strbuf_add(sb, io->input.buf, len);
-       strbuf_remove(&io->input, 0, len);
-       return 0;
-}
-
-static int handle_cache(const char *path, unsigned char *sha1, const char *output)
-{
-       mmfile_t mmfile[3] = {{NULL}};
-       mmbuffer_t result = {NULL, 0};
-       const struct cache_entry *ce;
-       int pos, len, i, hunk_no;
-       struct rerere_io_mem io;
-       int marker_size = ll_merge_marker_size(path);
-
-       /*
-        * Reproduce the conflicted merge in-core
-        */
-       len = strlen(path);
-       pos = cache_name_pos(path, len);
-       if (0 <= pos)
-               return -1;
-       pos = -pos - 1;
-
-       while (pos < active_nr) {
-               enum object_type type;
-               unsigned long size;
-
-               ce = active_cache[pos++];
-               if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
-                       break;
-               i = ce_stage(ce) - 1;
-               if (!mmfile[i].ptr) {
-                       mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
-                       mmfile[i].size = size;
-               }
-       }
-       for (i = 0; i < 3; i++)
-               if (!mmfile[i].ptr && !mmfile[i].size)
-                       mmfile[i].ptr = xstrdup("");
-
-       /*
-        * NEEDSWORK: handle conflicts from merges with
-        * merge.renormalize set, too
-        */
-       ll_merge(&result, path, &mmfile[0], NULL,
-                &mmfile[1], "ours",
-                &mmfile[2], "theirs", NULL);
-       for (i = 0; i < 3; i++)
-               free(mmfile[i].ptr);
-
-       memset(&io, 0, sizeof(io));
-       io.io.getline = rerere_mem_getline;
-       if (output)
-               io.io.output = fopen(output, "w");
-       else
-               io.io.output = NULL;
-       strbuf_init(&io.input, 0);
-       strbuf_attach(&io.input, result.ptr, result.size, result.size);
-
-       /*
-        * Grab the conflict ID and optionally write the original
-        * contents with conflict markers out.
-        */
-       hunk_no = handle_path(sha1, (struct rerere_io *)&io, marker_size);
-       strbuf_release(&io.input);
-       if (io.io.output)
-               fclose(io.io.output);
-       return hunk_no;
-}
-
 /*
  * Look at a cache entry at "i" and see if it is not conflicting,
  * conflicting and we are willing to handle, or conflicting and
@@ -568,6 +620,33 @@ int rerere_remaining(struct string_list *merge_rr)
        return 0;
 }
 
+/*
+ * Try using the given conflict resolution "ID" to see
+ * if that recorded conflict resolves cleanly what we
+ * got in the "cur".
+ */
+static int try_merge(const struct rerere_id *id, const char *path,
+                    mmfile_t *cur, mmbuffer_t *result)
+{
+       int ret;
+       mmfile_t base = {NULL, 0}, other = {NULL, 0};
+
+       if (read_mmfile(&base, rerere_path(id, "preimage")) ||
+           read_mmfile(&other, rerere_path(id, "postimage")))
+               ret = 1;
+       else
+               /*
+                * A three-way merge. Note that this honors user-customizable
+                * low-level merge driver settings.
+                */
+               ret = ll_merge(result, path, &base, NULL, cur, "", &other, "", NULL);
+
+       free(base.ptr);
+       free(other.ptr);
+
+       return ret;
+}
+
 /*
  * Find the conflict identified by "id"; the change between its
  * "preimage" (i.e. a previous contents with conflict markers) and its
@@ -582,30 +661,20 @@ static int merge(const struct rerere_id *id, const char *path)
 {
        FILE *f;
        int ret;
-       mmfile_t cur = {NULL, 0}, base = {NULL, 0}, other = {NULL, 0};
+       mmfile_t cur = {NULL, 0};
        mmbuffer_t result = {NULL, 0};
 
        /*
         * Normalize the conflicts in path and write it out to
         * "thisimage" temporary file.
         */
-       if (handle_file(path, NULL, rerere_path(id, "thisimage")) < 0) {
-               ret = 1;
-               goto out;
-       }
-
-       if (read_mmfile(&cur, rerere_path(id, "thisimage")) ||
-           read_mmfile(&base, rerere_path(id, "preimage")) ||
-           read_mmfile(&other, rerere_path(id, "postimage"))) {
+       if ((handle_file(path, NULL, rerere_path(id, "thisimage")) < 0) ||
+           read_mmfile(&cur, rerere_path(id, "thisimage"))) {
                ret = 1;
                goto out;
        }
 
-       /*
-        * A three-way merge. Note that this honors user-customizable
-        * low-level merge driver settings.
-        */
-       ret = ll_merge(&result, path, &base, NULL, &cur, "", &other, "", NULL);
+       ret = try_merge(id, path, &cur, &result);
        if (ret)
                goto out;
 
@@ -614,25 +683,20 @@ static int merge(const struct rerere_id *id, const char *path)
         * Mark that "postimage" was used to help gc.
         */
        if (utime(rerere_path(id, "postimage"), NULL) < 0)
-               warning("failed utime() on %s: %s",
-                       rerere_path(id, "postimage"),
-                       strerror(errno));
+               warning_errno("failed utime() on %s",
+                             rerere_path(id, "postimage"));
 
        /* Update "path" with the resolution */
        f = fopen(path, "w");
        if (!f)
-               return error("Could not open %s: %s", path,
-                            strerror(errno));
+               return error_errno("Could not open %s", path);
        if (fwrite(result.ptr, result.size, 1, f) != 1)
-               error("Could not write %s: %s", path, strerror(errno));
+               error_errno("Could not write %s", path);
        if (fclose(f))
-               return error("Writing %s failed: %s", path,
-                            strerror(errno));
+               return error_errno("Writing %s failed", path);
 
 out:
        free(cur.ptr);
-       free(base.ptr);
-       free(other.ptr);
        free(result.ptr);
 
        return ret;
@@ -661,6 +725,13 @@ static void update_paths(struct string_list *update)
                rollback_lock_file(&index_lock);
 }
 
+static void remove_variant(struct rerere_id *id)
+{
+       unlink_or_warn(rerere_path(id, "postimage"));
+       unlink_or_warn(rerere_path(id, "preimage"));
+       id->collection->status[id->variant] = 0;
+}
+
 /*
  * The path indicated by rr_item may still have conflict for which we
  * have a recorded resolution, in which case replay it and optionally
@@ -672,12 +743,47 @@ static void do_rerere_one_path(struct string_list_item *rr_item,
                               struct string_list *update)
 {
        const char *path = rr_item->string;
-       const struct rerere_id *id = rr_item->util;
+       struct rerere_id *id = rr_item->util;
+       struct rerere_dir *rr_dir = id->collection;
+       int variant;
+
+       variant = id->variant;
+
+       /* Has the user resolved it already? */
+       if (variant >= 0) {
+               if (!handle_file(path, NULL, NULL)) {
+                       copy_file(rerere_path(id, "postimage"), path, 0666);
+                       id->collection->status[variant] |= RR_HAS_POSTIMAGE;
+                       fprintf(stderr, "Recorded resolution for '%s'.\n", path);
+                       free_rerere_id(rr_item);
+                       rr_item->util = NULL;
+                       return;
+               }
+               /*
+                * There may be other variants that can cleanly
+                * replay.  Try them and update the variant number for
+                * this one.
+                */
+       }
+
+       /* Does any existing resolution apply cleanly? */
+       for (variant = 0; variant < rr_dir->status_nr; variant++) {
+               const int both = RR_HAS_PREIMAGE | RR_HAS_POSTIMAGE;
+               struct rerere_id vid = *id;
+
+               if ((rr_dir->status[variant] & both) != both)
+                       continue;
+
+               vid.variant = variant;
+               if (merge(&vid, path))
+                       continue; /* failed to replay */
 
-       /* Is there a recorded resolution we could attempt to apply? */
-       if (has_rerere_resolution(id)) {
-               if (merge(id, path))
-                       return; /* failed to replay */
+               /*
+                * If there already is a different variant that applies
+                * cleanly, there is no point maintaining our own variant.
+                */
+               if (0 <= id->variant && id->variant != variant)
+                       remove_variant(id);
 
                if (rerere_autoupdate)
                        string_list_insert(update, path);
@@ -685,15 +791,24 @@ static void do_rerere_one_path(struct string_list_item *rr_item,
                        fprintf(stderr,
                                "Resolved '%s' using previous resolution.\n",
                                path);
-       } else if (!handle_file(path, NULL, NULL)) {
-               /* The user has resolved it. */
-               copy_file(rerere_path(id, "postimage"), path, 0666);
-               fprintf(stderr, "Recorded resolution for '%s'.\n", path);
-       } else {
+               free_rerere_id(rr_item);
+               rr_item->util = NULL;
                return;
        }
-       free_rerere_id(rr_item);
-       rr_item->util = NULL;
+
+       /* None of the existing one applies; we need a new variant */
+       assign_variant(id);
+
+       variant = id->variant;
+       handle_file(path, NULL, rerere_path(id, "preimage"));
+       if (id->collection->status[variant] & RR_HAS_POSTIMAGE) {
+               const char *path = rerere_path(id, "postimage");
+               if (unlink(path))
+                       die_errno("cannot unlink stray '%s'", path);
+               id->collection->status[variant] &= ~RR_HAS_POSTIMAGE;
+       }
+       id->collection->status[variant] |= RR_HAS_PREIMAGE;
+       fprintf(stderr, "Recorded preimage for '%s'\n", path);
 }
 
 static int do_plain_rerere(struct string_list *rr, int fd)
@@ -731,24 +846,8 @@ static int do_plain_rerere(struct string_list *rr, int fd)
                id = new_rerere_id(sha1);
                string_list_insert(rr, path)->util = id;
 
-               /*
-                * If the directory does not exist, create
-                * it.  mkdir_in_gitdir() will fail with
-                * EEXIST if there already is one.
-                *
-                * NEEDSWORK: make sure "gc" does not remove
-                * preimage without removing the directory.
-                */
-               if (mkdir_in_gitdir(rerere_path(id, NULL)))
-                       continue;
-
-               /*
-                * We are the first to encounter this
-                * conflict.  Ask handle_file() to write the
-                * normalized contents to the "preimage" file.
-                */
-               handle_file(path, NULL, rerere_path(id, "preimage"));
-               fprintf(stderr, "Recorded preimage for '%s'\n", path);
+               /* Ensure that the directory exists. */
+               mkdir_in_gitdir(rerere_path(id, NULL));
        }
 
        for (i = 0; i < rr->nr; i++)
@@ -812,12 +911,112 @@ int setup_rerere(struct string_list *merge_rr, int flags)
 int rerere(int flags)
 {
        struct string_list merge_rr = STRING_LIST_INIT_DUP;
-       int fd;
+       int fd, status;
 
        fd = setup_rerere(&merge_rr, flags);
        if (fd < 0)
                return 0;
-       return do_plain_rerere(&merge_rr, fd);
+       status = do_plain_rerere(&merge_rr, fd);
+       free_rerere_dirs();
+       return status;
+}
+
+/*
+ * Subclass of rerere_io that reads from an in-core buffer that is a
+ * strbuf
+ */
+struct rerere_io_mem {
+       struct rerere_io io;
+       struct strbuf input;
+};
+
+/*
+ * ... and its getline() method implementation
+ */
+static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
+{
+       struct rerere_io_mem *io = (struct rerere_io_mem *)io_;
+       char *ep;
+       size_t len;
+
+       strbuf_release(sb);
+       if (!io->input.len)
+               return -1;
+       ep = memchr(io->input.buf, '\n', io->input.len);
+       if (!ep)
+               ep = io->input.buf + io->input.len;
+       else if (*ep == '\n')
+               ep++;
+       len = ep - io->input.buf;
+       strbuf_add(sb, io->input.buf, len);
+       strbuf_remove(&io->input, 0, len);
+       return 0;
+}
+
+static int handle_cache(const char *path, unsigned char *sha1, const char *output)
+{
+       mmfile_t mmfile[3] = {{NULL}};
+       mmbuffer_t result = {NULL, 0};
+       const struct cache_entry *ce;
+       int pos, len, i, hunk_no;
+       struct rerere_io_mem io;
+       int marker_size = ll_merge_marker_size(path);
+
+       /*
+        * Reproduce the conflicted merge in-core
+        */
+       len = strlen(path);
+       pos = cache_name_pos(path, len);
+       if (0 <= pos)
+               return -1;
+       pos = -pos - 1;
+
+       while (pos < active_nr) {
+               enum object_type type;
+               unsigned long size;
+
+               ce = active_cache[pos++];
+               if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
+                       break;
+               i = ce_stage(ce) - 1;
+               if (!mmfile[i].ptr) {
+                       mmfile[i].ptr = read_sha1_file(ce->oid.hash, &type,
+                                                      &size);
+                       mmfile[i].size = size;
+               }
+       }
+       for (i = 0; i < 3; i++)
+               if (!mmfile[i].ptr && !mmfile[i].size)
+                       mmfile[i].ptr = xstrdup("");
+
+       /*
+        * NEEDSWORK: handle conflicts from merges with
+        * merge.renormalize set, too?
+        */
+       ll_merge(&result, path, &mmfile[0], NULL,
+                &mmfile[1], "ours",
+                &mmfile[2], "theirs", NULL);
+       for (i = 0; i < 3; i++)
+               free(mmfile[i].ptr);
+
+       memset(&io, 0, sizeof(io));
+       io.io.getline = rerere_mem_getline;
+       if (output)
+               io.io.output = fopen(output, "w");
+       else
+               io.io.output = NULL;
+       strbuf_init(&io.input, 0);
+       strbuf_attach(&io.input, result.ptr, result.size, result.size);
+
+       /*
+        * Grab the conflict ID and optionally write the original
+        * contents with conflict markers out.
+        */
+       hunk_no = handle_path(sha1, (struct rerere_io *)&io, marker_size);
+       strbuf_release(&io.input);
+       if (io.io.output)
+               fclose(io.io.output);
+       return hunk_no;
 }
 
 static int rerere_forget_one_path(const char *path, struct string_list *rr)
@@ -838,11 +1037,43 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr)
 
        /* Nuke the recorded resolution for the conflict */
        id = new_rerere_id(sha1);
+
+       for (id->variant = 0;
+            id->variant < id->collection->status_nr;
+            id->variant++) {
+               mmfile_t cur = { NULL, 0 };
+               mmbuffer_t result = {NULL, 0};
+               int cleanly_resolved;
+
+               if (!has_rerere_resolution(id))
+                       continue;
+
+               handle_cache(path, sha1, rerere_path(id, "thisimage"));
+               if (read_mmfile(&cur, rerere_path(id, "thisimage"))) {
+                       free(cur.ptr);
+                       error("Failed to update conflicted state in '%s'", path);
+                       goto fail_exit;
+               }
+               cleanly_resolved = !try_merge(id, path, &cur, &result);
+               free(result.ptr);
+               free(cur.ptr);
+               if (cleanly_resolved)
+                       break;
+       }
+
+       if (id->collection->status_nr <= id->variant) {
+               error("no remembered resolution for '%s'", path);
+               goto fail_exit;
+       }
+
        filename = rerere_path(id, "postimage");
-       if (unlink(filename))
-               return (errno == ENOENT
-                       ? error("no remembered resolution for %s", path)
-                       : error("cannot unlink %s: %s", filename, strerror(errno)));
+       if (unlink(filename)) {
+               if (errno == ENOENT)
+                       error("no remembered resolution for %s", path);
+               else
+                       error_errno("cannot unlink %s", filename);
+               goto fail_exit;
+       }
 
        /*
         * Update the preimage so that the user can resolve the
@@ -861,6 +1092,10 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr)
        item->util = id;
        fprintf(stderr, "Forgot resolution for %s\n", path);
        return 0;
+
+fail_exit:
+       free(id);
+       return -1;
 }
 
 int rerere_forget(struct pathspec *pathspec)
@@ -897,29 +1132,16 @@ int rerere_forget(struct pathspec *pathspec)
  * Garbage collection support
  */
 
-/*
- * Note that this is not reentrant but is used only one-at-a-time
- * so it does not matter right now.
- */
-static struct rerere_id *dirname_to_id(const char *name)
-{
-       static struct rerere_id id;
-       xsnprintf(id.hex, sizeof(id.hex), "%s", name);
-       return &id;
-}
-
-static time_t rerere_created_at(const char *dir_name)
+static time_t rerere_created_at(struct rerere_id *id)
 {
        struct stat st;
-       struct rerere_id *id = dirname_to_id(dir_name);
 
        return stat(rerere_path(id, "preimage"), &st) ? (time_t) 0 : st.st_mtime;
 }
 
-static time_t rerere_last_used_at(const char *dir_name)
+static time_t rerere_last_used_at(struct rerere_id *id)
 {
        struct stat st;
-       struct rerere_id *id = dirname_to_id(dir_name);
 
        return stat(rerere_path(id, "postimage"), &st) ? (time_t) 0 : st.st_mtime;
 }
@@ -929,15 +1151,28 @@ static time_t rerere_last_used_at(const char *dir_name)
  */
 static void unlink_rr_item(struct rerere_id *id)
 {
-       unlink(rerere_path(id, "thisimage"));
-       unlink(rerere_path(id, "preimage"));
-       unlink(rerere_path(id, "postimage"));
-       /*
-        * NEEDSWORK: what if this rmdir() fails?  Wouldn't we then
-        * assume that we already have preimage recorded in
-        * do_plain_rerere()?
-        */
-       rmdir(rerere_path(id, NULL));
+       unlink_or_warn(rerere_path(id, "thisimage"));
+       remove_variant(id);
+       id->collection->status[id->variant] = 0;
+}
+
+static void prune_one(struct rerere_id *id, time_t now,
+                     int cutoff_resolve, int cutoff_noresolve)
+{
+       time_t then;
+       int cutoff;
+
+       then = rerere_last_used_at(id);
+       if (then)
+               cutoff = cutoff_resolve;
+       else {
+               then = rerere_created_at(id);
+               if (!then)
+                       return;
+               cutoff = cutoff_noresolve;
+       }
+       if (then < now - cutoff * 86400)
+               unlink_rr_item(id);
 }
 
 void rerere_gc(struct string_list *rr)
@@ -945,8 +1180,8 @@ void rerere_gc(struct string_list *rr)
        struct string_list to_remove = STRING_LIST_INIT_DUP;
        DIR *dir;
        struct dirent *e;
-       int i, cutoff;
-       time_t now = time(NULL), then;
+       int i;
+       time_t now = time(NULL);
        int cutoff_noresolve = 15;
        int cutoff_resolve = 60;
 
@@ -961,25 +1196,32 @@ void rerere_gc(struct string_list *rr)
                die_errno("unable to open rr-cache directory");
        /* Collect stale conflict IDs ... */
        while ((e = readdir(dir))) {
+               struct rerere_dir *rr_dir;
+               struct rerere_id id;
+               int now_empty;
+
                if (is_dot_or_dotdot(e->d_name))
                        continue;
-
-               then = rerere_last_used_at(e->d_name);
-               if (then) {
-                       cutoff = cutoff_resolve;
-               } else {
-                       then = rerere_created_at(e->d_name);
-                       if (!then)
-                               continue;
-                       cutoff = cutoff_noresolve;
+               rr_dir = find_rerere_dir(e->d_name);
+               if (!rr_dir)
+                       continue; /* or should we remove e->d_name? */
+
+               now_empty = 1;
+               for (id.variant = 0, id.collection = rr_dir;
+                    id.variant < id.collection->status_nr;
+                    id.variant++) {
+                       prune_one(&id, now, cutoff_resolve, cutoff_noresolve);
+                       if (id.collection->status[id.variant])
+                               now_empty = 0;
                }
-               if (then < now - cutoff * 86400)
+               if (now_empty)
                        string_list_append(&to_remove, e->d_name);
        }
        closedir(dir);
-       /* ... and then remove them one-by-one */
+
+       /* ... and then remove the empty directories */
        for (i = 0; i < to_remove.nr; i++)
-               unlink_rr_item(dirname_to_id(to_remove.items[i].string));
+               rmdir(git_path("rr-cache/%s", to_remove.items[i].string));
        string_list_clear(&to_remove, 0);
        rollback_lock_file(&write_lock);
 }
@@ -1000,8 +1242,10 @@ void rerere_clear(struct string_list *merge_rr)
 
        for (i = 0; i < merge_rr->nr; i++) {
                struct rerere_id *id = merge_rr->items[i].util;
-               if (!has_rerere_resolution(id))
+               if (!has_rerere_resolution(id)) {
                        unlink_rr_item(id);
+                       rmdir(rerere_path(id, NULL));
+               }
        }
        unlink_or_warn(git_path_merge_rr());
        rollback_lock_file(&write_lock);
index 1222e91921882b41ac9c1648960eca9305b27d8d..c2961feaaa8a8297d59fb13b120c1a57c8a2868a 100644 (file)
--- a/rerere.h
+++ b/rerere.h
@@ -16,8 +16,10 @@ struct pathspec;
  */
 extern void *RERERE_RESOLVED;
 
+struct rerere_dir;
 struct rerere_id {
-       char hex[41];
+       struct rerere_dir *collection;
+       int variant;
 };
 
 extern int setup_rerere(struct string_list *, int);
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 8b2dfe3160784f9780cf541a674fe89100d38a93..b37dbec378f3ae1a33d00d591c1042c609e45fa4 100644 (file)
@@ -59,10 +59,10 @@ static void mark_tree_contents_uninteresting(struct tree *tree)
        while (tree_entry(&desc, &entry)) {
                switch (object_type(entry.mode)) {
                case OBJ_TREE:
-                       mark_tree_uninteresting(lookup_tree(entry.sha1));
+                       mark_tree_uninteresting(lookup_tree(entry.oid->hash));
                        break;
                case OBJ_BLOB:
-                       mark_blob_uninteresting(lookup_blob(entry.sha1));
+                       mark_blob_uninteresting(lookup_blob(entry.oid->hash));
                        break;
                default:
                        /* Subproject commit - not in this repository */
@@ -846,7 +846,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)
                 */
                if (left_first != !!(flags & SYMMETRIC_LEFT))
                        continue;
-               commit->util = add_commit_patch_id(commit, &ids);
+               add_commit_patch_id(commit, &ids);
        }
 
        /* either cherry_mark or cherry_pick are true */
@@ -873,21 +873,9 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)
                id = has_commit_patch_id(commit, &ids);
                if (!id)
                        continue;
-               id->seen = 1;
-               commit->object.flags |= cherry_flag;
-       }
-
-       /* Now check the original side for seen ones */
-       for (p = list; p; p = p->next) {
-               struct commit *commit = p->item;
-               struct patch_id *ent;
 
-               ent = commit->util;
-               if (!ent)
-                       continue;
-               if (ent->seen)
-                       commit->object.flags |= cherry_flag;
-               commit->util = NULL;
+               commit->object.flags |= cherry_flag;
+               id->commit->object.flags |= cherry_flag;
        }
 
        free_patch_ids(&ids);
@@ -1287,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, "",
@@ -1301,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 == '^') {
@@ -1328,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);
@@ -1356,8 +1354,10 @@ void init_revisions(struct rev_info *revs, const char *prefix)
        revs->skip_count = -1;
        revs->max_count = -1;
        revs->max_parents = -1;
+       revs->expand_tabs_in_log = -1;
 
        revs->commit_format = CMIT_FMT_DEFAULT;
+       revs->expand_tabs_in_log_default = 8;
 
        init_grep_defaults();
        grep_init(&revs->grep_filter, prefix);
@@ -1423,7 +1423,7 @@ static void prepare_show_merge(struct rev_info *revs)
                       ce_same_name(ce, active_cache[i+1]))
                        i++;
        }
-       free_pathspec(&revs->prune_data);
+       clear_pathspec(&revs->prune_data);
        parse_pathspec(&revs->prune_data, PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL,
                       PATHSPEC_PREFER_FULL | PATHSPEC_LITERAL_PATH, "", prune);
        revs->limited = 1;
@@ -1529,17 +1529,33 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
                }
                *dotdot = '.';
        }
+
        dotdot = strstr(arg, "^@");
        if (dotdot && !dotdot[2]) {
                *dotdot = 0;
-               if (add_parents_only(revs, arg, flags))
+               if (add_parents_only(revs, arg, flags, 0))
                        return 0;
                *dotdot = '^';
        }
        dotdot = strstr(arg, "^!");
        if (dotdot && !dotdot[2]) {
                *dotdot = 0;
-               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM)))
+               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), 0))
+                       *dotdot = '^';
+       }
+       dotdot = strstr(arg, "^-");
+       if (dotdot) {
+               int exclude_parent = 1;
+
+               if (dotdot[2]) {
+                       char *end;
+                       exclude_parent = strtoul(dotdot + 2, &end, 10);
+                       if (*end != '\0' || !exclude_parent)
+                               return -1;
+               }
+
+               *dotdot = 0;
+               if (!add_parents_only(revs, arg, flags ^ (UNINTERESTING | BOTTOM), exclude_parent))
                        *dotdot = '^';
        }
 
@@ -1854,12 +1870,23 @@ 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(arg+9, revs);
+       } else if (!strcmp(arg, "--expand-tabs")) {
+               revs->expand_tabs_in_log = 8;
+       } else if (!strcmp(arg, "--no-expand-tabs")) {
+               revs->expand_tabs_in_log = 0;
+       } else if (skip_prefix(arg, "--expand-tabs=", &arg)) {
+               int val;
+               if (strtol_i(arg, 10, &val) < 0 || val < 0)
+                       die("'%s': not a non-negative integer", arg);
+               revs->expand_tabs_in_log = val;
        } else if (!strcmp(arg, "--show-notes") || !strcmp(arg, "--notes")) {
                revs->show_notes = 1;
                revs->show_notes_given = 1;
                revs->notes_opt.use_default_notes = 1;
        } else if (!strcmp(arg, "--show-signature")) {
                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="))
@@ -1960,16 +1987,16 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
        } else if (!strcmp(arg, "--grep-debug")) {
                revs->grep_filter.debug = 1;
        } else if (!strcmp(arg, "--basic-regexp")) {
-               grep_set_pattern_type_option(GREP_PATTERN_TYPE_BRE, &revs->grep_filter);
+               revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_BRE;
        } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
-               grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, &revs->grep_filter);
+               revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_ERE;
        } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
                revs->grep_filter.regflags |= REG_ICASE;
                DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE);
        } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) {
-               grep_set_pattern_type_option(GREP_PATTERN_TYPE_FIXED, &revs->grep_filter);
+               revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_FIXED;
        } else if (!strcmp(arg, "--perl-regexp")) {
-               grep_set_pattern_type_option(GREP_PATTERN_TYPE_PCRE, &revs->grep_filter);
+               revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_PCRE;
        } else if (!strcmp(arg, "--all-match")) {
                revs->grep_filter.all_match = 1;
        } else if (!strcmp(arg, "--invert-grep")) {
@@ -2327,6 +2354,9 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
        if (revs->first_parent_only && revs->bisect)
                die(_("--first-parent is incompatible with --bisect"));
 
+       if (revs->expand_tabs_in_log < 0)
+               revs->expand_tabs_in_log = revs->expand_tabs_in_log_default;
+
        return left;
 }
 
index dca0d381715cf5bc6888587feaec989012f51252..9fac1a607de6470ab0c9b7e5079e8d36c8d68c75 100644 (file)
@@ -148,6 +148,8 @@ struct rev_info {
                        linear:1;
 
        struct date_mode date_mode;
+       int             expand_tabs_in_log; /* unset if negative */
+       int             expand_tabs_in_log_default;
 
        unsigned int    abbrev;
        enum cmit_fmt   commit_format;
index c72601056cf5ae7be2593ae89af4effc26a1b043..ca905a9e8038dda26f8c4e146049ad00ed1cd8df 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;
@@ -31,6 +32,18 @@ static void cleanup_children(int sig, int in_signal)
        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 (!in_signal)
                        free(p);
@@ -49,10 +62,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;
 
@@ -233,7 +247,7 @@ static int wait_or_whine(pid_t pid, const char *argv0, int in_signal)
 
        if (waiting < 0) {
                failed_errno = errno;
-               error("waitpid for %s failed: %s", argv0, strerror(errno));
+               error_errno("waitpid for %s failed", argv0);
        } else if (waiting != pid) {
                error("waitpid is confused (%s)", argv0);
        } else if (WIFSIGNALED(status)) {
@@ -420,10 +434,9 @@ fail_pipe:
                }
        }
        if (cmd->pid < 0)
-               error("cannot fork() for %s: %s", cmd->argv[0],
-                       strerror(errno));
+               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()
@@ -482,9 +495,9 @@ fail_pipe:
                        cmd->dir, fhin, fhout, fherr);
        failed_errno = errno;
        if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
-               error("cannot spawn %s: %s", cmd->argv[0], strerror(errno));
+               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;
@@ -590,6 +603,16 @@ static void *run_thread(void *data)
        struct async *async = data;
        intptr_t ret;
 
+       if (async->isolate_sigpipe) {
+               sigset_t mask;
+               sigemptyset(&mask);
+               sigaddset(&mask, SIGPIPE);
+               if (pthread_sigmask(SIG_BLOCK, &mask, NULL) < 0) {
+                       ret = error("unable to block SIGPIPE in async thread");
+                       return (void *)ret;
+               }
+       }
+
        pthread_setspecific(async_key, async);
        ret = async->proc(async->proc_in, async->proc_out, async->data);
        return (void *)ret;
@@ -625,7 +648,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);
 }
@@ -675,13 +698,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;
@@ -693,7 +729,7 @@ int start_async(struct async *async)
                if (pipe(fdin) < 0) {
                        if (async->out > 0)
                                close(async->out);
-                       return error("cannot create pipe: %s", strerror(errno));
+                       return error_errno("cannot create pipe");
                }
                async->in = fdin[1];
        }
@@ -705,7 +741,7 @@ int start_async(struct async *async)
                                close_pair(fdin);
                        else if (async->in)
                                close(async->in);
-                       return error("cannot create pipe: %s", strerror(errno));
+                       return error_errno("cannot create pipe");
                }
                async->out = fdout[0];
        }
@@ -730,7 +766,7 @@ int start_async(struct async *async)
 
        async->pid = fork();
        if (async->pid < 0) {
-               error("fork (async) failed: %s", strerror(errno));
+               error_errno("fork (async) failed");
                goto error;
        }
        if (!async->pid) {
@@ -743,7 +779,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]);
@@ -777,7 +813,7 @@ int start_async(struct async *async)
        {
                int err = pthread_create(&async->tid, NULL, run_thread, async);
                if (err) {
-                       error("cannot create thread: %s", strerror(err));
+                       error_errno("cannot create thread");
                        goto error;
                }
        }
@@ -852,19 +888,161 @@ int run_hook_le(const char *const *env, const char *name, ...)
        return ret;
 }
 
-int capture_command(struct child_process *cmd, struct strbuf *buf, size_t hint)
+struct io_pump {
+       /* initialized by caller */
+       int fd;
+       int type; /* POLLOUT or POLLIN */
+       union {
+               struct {
+                       const char *buf;
+                       size_t len;
+               } out;
+               struct {
+                       struct strbuf *buf;
+                       size_t hint;
+               } in;
+       } u;
+
+       /* returned by pump_io */
+       int error; /* 0 for success, otherwise errno */
+
+       /* internal use */
+       struct pollfd *pfd;
+};
+
+static int pump_io_round(struct io_pump *slots, int nr, struct pollfd *pfd)
 {
-       cmd->out = -1;
+       int pollsize = 0;
+       int i;
+
+       for (i = 0; i < nr; i++) {
+               struct io_pump *io = &slots[i];
+               if (io->fd < 0)
+                       continue;
+               pfd[pollsize].fd = io->fd;
+               pfd[pollsize].events = io->type;
+               io->pfd = &pfd[pollsize++];
+       }
+
+       if (!pollsize)
+               return 0;
+
+       if (poll(pfd, pollsize, -1) < 0) {
+               if (errno == EINTR)
+                       return 1;
+               die_errno("poll failed");
+       }
+
+       for (i = 0; i < nr; i++) {
+               struct io_pump *io = &slots[i];
+
+               if (io->fd < 0)
+                       continue;
+
+               if (!(io->pfd->revents & (POLLOUT|POLLIN|POLLHUP|POLLERR|POLLNVAL)))
+                       continue;
+
+               if (io->type == POLLOUT) {
+                       ssize_t len = xwrite(io->fd,
+                                            io->u.out.buf, io->u.out.len);
+                       if (len < 0) {
+                               io->error = errno;
+                               close(io->fd);
+                               io->fd = -1;
+                       } else {
+                               io->u.out.buf += len;
+                               io->u.out.len -= len;
+                               if (!io->u.out.len) {
+                                       close(io->fd);
+                                       io->fd = -1;
+                               }
+                       }
+               }
+
+               if (io->type == POLLIN) {
+                       ssize_t len = strbuf_read_once(io->u.in.buf,
+                                                      io->fd, io->u.in.hint);
+                       if (len < 0)
+                               io->error = errno;
+                       if (len <= 0) {
+                               close(io->fd);
+                               io->fd = -1;
+                       }
+               }
+       }
+
+       return 1;
+}
+
+static int pump_io(struct io_pump *slots, int nr)
+{
+       struct pollfd *pfd;
+       int i;
+
+       for (i = 0; i < nr; i++)
+               slots[i].error = 0;
+
+       ALLOC_ARRAY(pfd, nr);
+       while (pump_io_round(slots, nr, pfd))
+               ; /* nothing */
+       free(pfd);
+
+       /* There may be multiple errno values, so just pick the first. */
+       for (i = 0; i < nr; i++) {
+               if (slots[i].error) {
+                       errno = slots[i].error;
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+
+int pipe_command(struct child_process *cmd,
+                const char *in, size_t in_len,
+                struct strbuf *out, size_t out_hint,
+                struct strbuf *err, size_t err_hint)
+{
+       struct io_pump io[3];
+       int nr = 0;
+
+       if (in)
+               cmd->in = -1;
+       if (out)
+               cmd->out = -1;
+       if (err)
+               cmd->err = -1;
+
        if (start_command(cmd) < 0)
                return -1;
 
-       if (strbuf_read(buf, cmd->out, hint) < 0) {
-               close(cmd->out);
+       if (in) {
+               io[nr].fd = cmd->in;
+               io[nr].type = POLLOUT;
+               io[nr].u.out.buf = in;
+               io[nr].u.out.len = in_len;
+               nr++;
+       }
+       if (out) {
+               io[nr].fd = cmd->out;
+               io[nr].type = POLLIN;
+               io[nr].u.in.buf = out;
+               io[nr].u.in.hint = out_hint;
+               nr++;
+       }
+       if (err) {
+               io[nr].fd = cmd->err;
+               io[nr].type = POLLIN;
+               io[nr].u.in.buf = err;
+               io[nr].u.in.hint = err_hint;
+               nr++;
+       }
+
+       if (pump_io(io, nr) < 0) {
                finish_command(cmd); /* throw away exit code */
                return -1;
        }
 
-       close(cmd->out);
        return finish_command(cmd);
 }
 
@@ -902,7 +1080,7 @@ struct parallel_processes {
        struct strbuf buffered_output; /* of finished children */
 };
 
-static int default_start_failure(struct strbuf *err,
+static int default_start_failure(struct strbuf *out,
                                 void *pp_cb,
                                 void *pp_task_cb)
 {
@@ -910,7 +1088,7 @@ static int default_start_failure(struct strbuf *err,
 }
 
 static int default_task_finished(int result,
-                                struct strbuf *err,
+                                struct strbuf *out,
                                 void *pp_cb,
                                 void *pp_task_cb)
 {
@@ -994,7 +1172,7 @@ static void pp_cleanup(struct parallel_processes *pp)
         * When get_next_task added messages to the buffer in its last
         * iteration, the buffered output is non empty.
         */
-       fputs(pp->buffered_output.buf, stderr);
+       strbuf_write(&pp->buffered_output, stderr);
        strbuf_release(&pp->buffered_output);
 
        sigchain_pop_common();
@@ -1079,7 +1257,7 @@ static void pp_output(struct parallel_processes *pp)
        int i = pp->output_owner;
        if (pp->children[i].state == GIT_CP_WORKING &&
            pp->children[i].err.len) {
-               fputs(pp->children[i].err.buf, stderr);
+               strbuf_write(&pp->children[i].err, stderr);
                strbuf_reset(&pp->children[i].err);
        }
 }
@@ -1117,11 +1295,11 @@ static int pp_collect_finished(struct parallel_processes *pp)
                        strbuf_addbuf(&pp->buffered_output, &pp->children[i].err);
                        strbuf_reset(&pp->children[i].err);
                } else {
-                       fputs(pp->children[i].err.buf, stderr);
+                       strbuf_write(&pp->children[i].err, stderr);
                        strbuf_reset(&pp->children[i].err);
 
                        /* Output all other finished child processes */
-                       fputs(pp->buffered_output.buf, stderr);
+                       strbuf_write(&pp->buffered_output, stderr);
                        strbuf_reset(&pp->buffered_output);
 
                        /*
index 3d1e59e26e33d062a10698fc139f7fc0f4ae14ec..dd1c78c28db90b5261454dd8fae925faf4548e21 100644 (file)
@@ -43,6 +43,8 @@ struct child_process {
        unsigned stdout_to_stderr:1;
        unsigned use_shell:1;
        unsigned clean_on_exit: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 }
@@ -79,17 +81,34 @@ int run_command_v_opt(const char **argv, int opt);
 int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env);
 
 /**
- * Execute the given command, capturing its stdout in the given strbuf.
+ * Execute the given command, sending "in" to its stdin, and capturing its
+ * stdout and stderr in the "out" and "err" strbufs. Any of the three may
+ * be NULL to skip processing.
+ *
  * Returns -1 if starting the command fails or reading fails, and otherwise
- * returns the exit code of the command. The output collected in the
- * buffer is kept even if the command returns a non-zero exit. The hint field
- * gives a starting size for the strbuf allocation.
+ * returns the exit code of the command. Any output collected in the
+ * buffers is kept even if the command returns a non-zero exit. The hint fields
+ * gives starting sizes for the strbuf allocations.
  *
  * The fields of "cmd" should be set up as they would for a normal run_command
- * invocation. But note that there is no need to set cmd->out; the function
- * sets it up for the caller.
+ * invocation. But note that there is no need to set the in, out, or err
+ * fields; pipe_command handles that automatically.
+ */
+int pipe_command(struct child_process *cmd,
+                const char *in, size_t in_len,
+                struct strbuf *out, size_t out_hint,
+                struct strbuf *err, size_t err_hint);
+
+/**
+ * Convenience wrapper around pipe_command for the common case
+ * of capturing only stdout.
  */
-int capture_command(struct child_process *cmd, struct strbuf *buf, size_t hint);
+static inline int capture_command(struct child_process *cmd,
+                                 struct strbuf *out,
+                                 size_t hint)
+{
+       return pipe_command(cmd, NULL, 0, out, hint, NULL, 0);
+}
 
 /*
  * The purpose of the following functions is to feed a pipe by running
@@ -116,12 +135,13 @@ struct async {
        int proc_in;
        int proc_out;
 #endif
+       int isolate_sigpipe;
 };
 
 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
@@ -140,7 +160,7 @@ void NORETURN async_exit(int code);
  * return the negative signal number.
  */
 typedef int (*get_next_task_fn)(struct child_process *cp,
-                               struct strbuf *err,
+                               struct strbuf *out,
                                void *pp_cb,
                                void **pp_task_cb);
 
@@ -149,7 +169,7 @@ typedef int (*get_next_task_fn)(struct child_process *cp,
  * a new process.
  *
  * You must not write to stdout or stderr in this function. Add your
- * message to the strbuf err instead, which will be printed without
+ * message to the strbuf out instead, which will be printed without
  * messing up the output of the other parallel processes.
  *
  * pp_cb is the callback cookie as passed into run_processes_parallel,
@@ -159,7 +179,7 @@ typedef int (*get_next_task_fn)(struct child_process *cp,
  * To send a signal to other child processes for abortion, return
  * the negative signal number.
  */
-typedef int (*start_failure_fn)(struct strbuf *err,
+typedef int (*start_failure_fn)(struct strbuf *out,
                                void *pp_cb,
                                void *pp_task_cb);
 
@@ -167,7 +187,7 @@ typedef int (*start_failure_fn)(struct strbuf *err,
  * This callback is called on every child process that finished processing.
  *
  * You must not write to stdout or stderr in this function. Add your
- * message to the strbuf err instead, which will be printed without
+ * message to the strbuf out instead, which will be printed without
  * messing up the output of the other parallel processes.
  *
  * pp_cb is the callback cookie as passed into run_processes_parallel,
@@ -178,7 +198,7 @@ typedef int (*start_failure_fn)(struct strbuf *err,
  * the negative signal number.
  */
 typedef int (*task_finished_fn)(int result,
-                               struct strbuf *err,
+                               struct strbuf *out,
                                void *pp_cb,
                                void *pp_task_cb);
 
index 047bd18fde3d09921902ebb656ab78bfbcf940a8..6195b43e9abacf346f52b6bbb758c9ca7b617d4e 100644 (file)
@@ -36,18 +36,15 @@ int option_parse_push_signed(const struct option *opt,
        die("bad %s argument: %s", opt->long_name, arg);
 }
 
-static int feed_object(const unsigned char *sha1, int fd, int negative)
+static void feed_object(const unsigned char *sha1, FILE *fh, int negative)
 {
-       char buf[42];
-
        if (negative && !has_sha1_file(sha1))
-               return 1;
+               return;
 
-       memcpy(buf + negative, sha1_to_hex(sha1), 40);
        if (negative)
-               buf[0] = '^';
-       buf[40 + negative] = '\n';
-       return write_or_whine(fd, buf, 41 + negative, "send-pack: send refs");
+               putc('^', fh);
+       fputs(sha1_to_hex(sha1), fh);
+       putc('\n', fh);
 }
 
 /*
@@ -73,6 +70,7 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
                NULL,
        };
        struct child_process po = CHILD_PROCESS_INIT;
+       FILE *po_in;
        int i;
 
        i = 4;
@@ -97,21 +95,22 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
         * We feed the pack-objects we just spawned with revision
         * parameters by writing to the pipe.
         */
+       po_in = xfdopen(po.in, "w");
        for (i = 0; i < extra->nr; i++)
-               if (!feed_object(extra->sha1[i], po.in, 1))
-                       break;
+               feed_object(extra->sha1[i], po_in, 1);
 
        while (refs) {
-               if (!is_null_oid(&refs->old_oid) &&
-                   !feed_object(refs->old_oid.hash, po.in, 1))
-                       break;
-               if (!is_null_oid(&refs->new_oid) &&
-                   !feed_object(refs->new_oid.hash, po.in, 0))
-                       break;
+               if (!is_null_oid(&refs->old_oid))
+                       feed_object(refs->old_oid.hash, po_in, 1);
+               if (!is_null_oid(&refs->new_oid))
+                       feed_object(refs->new_oid.hash, po_in, 0);
                refs = refs->next;
        }
 
-       close(po.in);
+       fflush(po_in);
+       if (ferror(po_in))
+               die_errno("error writing to pack-objects");
+       fclose(po_in);
 
        if (args->stateless_rpc) {
                char *buf = xmalloc(LARGE_PACKET_MAX);
@@ -182,8 +181,7 @@ static int receive_status(int in, struct ref *refs)
                        hint->status = REF_STATUS_REMOTE_REJECT;
                        ret = -1;
                }
-               if (msg)
-                       hint->remote_status = xstrdup(msg);
+               hint->remote_status = xstrdup_or_null(msg);
                /* start our next search from the next ref */
                hint = hint->next;
        }
@@ -261,12 +259,13 @@ static int generate_push_cert(struct strbuf *req_buf,
                              const char *push_cert_nonce)
 {
        const struct ref *ref;
+       struct string_list_item *item;
        char *signing_key = xstrdup(get_signing_key());
        const char *cp, *np;
        struct strbuf cert = STRBUF_INIT;
        int update_seen = 0;
 
-       strbuf_addf(&cert, "certificate version 0.1\n");
+       strbuf_addstr(&cert, "certificate version 0.1\n");
        strbuf_addf(&cert, "pusher %s ", signing_key);
        datestamp(&cert);
        strbuf_addch(&cert, '\n');
@@ -277,6 +276,9 @@ static int generate_push_cert(struct strbuf *req_buf,
        }
        if (push_cert_nonce[0])
                strbuf_addf(&cert, "nonce %s\n", push_cert_nonce);
+       if (args->push_options)
+               for_each_string_list_item(item, args->push_options)
+                       strbuf_addf(&cert, "push-option %s\n", item->string);
        strbuf_addstr(&cert, "\n");
 
        for (ref = remote_refs; ref; ref = ref->next) {
@@ -371,6 +373,8 @@ int send_pack(struct send_pack_args *args,
        int agent_supported = 0;
        int use_atomic = 0;
        int atomic_supported = 0;
+       int use_push_options = 0;
+       int push_options_supported = 0;
        unsigned cmds_sent = 0;
        int ret;
        struct async demux;
@@ -393,6 +397,8 @@ int send_pack(struct send_pack_args *args,
                args->use_thin_pack = 0;
        if (server_supports("atomic"))
                atomic_supported = 1;
+       if (server_supports("push-options"))
+               push_options_supported = 1;
 
        if (args->push_cert != SEND_PACK_PUSH_CERT_NEVER) {
                int len;
@@ -419,6 +425,11 @@ int send_pack(struct send_pack_args *args,
 
        use_atomic = atomic_supported && args->atomic;
 
+       if (args->push_options && !push_options_supported)
+               die(_("the receiving end does not support push options"));
+
+       use_push_options = push_options_supported && args->push_options;
+
        if (status_report)
                strbuf_addstr(&cap_buf, " report-status");
        if (use_sideband)
@@ -427,6 +438,8 @@ int send_pack(struct send_pack_args *args,
                strbuf_addstr(&cap_buf, " quiet");
        if (use_atomic)
                strbuf_addstr(&cap_buf, " atomic");
+       if (use_push_options)
+               strbuf_addstr(&cap_buf, " push-options");
        if (agent_supported)
                strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
 
@@ -513,11 +526,24 @@ 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;
                demux.data = fd;
                demux.out = -1;
+               demux.isolate_sigpipe = 1;
                if (start_async(&demux))
                        die("send-pack: unable to fork off sideband demultiplexer");
                in = demux.out;
@@ -531,8 +557,10 @@ int send_pack(struct send_pack_args *args,
                                close(out);
                        if (git_connection_is_socket(conn))
                                shutdown(fd[0], SHUT_WR);
-                       if (use_sideband)
+                       if (use_sideband) {
+                               close(demux.out);
                                finish_async(&demux);
+                       }
                        fd[1] = -1;
                        return -1;
                }
@@ -551,11 +579,11 @@ int send_pack(struct send_pack_args *args,
                packet_flush(out);
 
        if (use_sideband && cmds_sent) {
+               close(demux.out);
                if (finish_async(&demux)) {
                        error("error in sideband demultiplexer");
                        ret = -1;
                }
-               close(demux.out);
        }
 
        if (ret < 0)
index 57f222abccd7e77dad7e9a107e44971d16db79c2..67fc40f4ec1a0847fb16535334e07bf196e8028a 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef SEND_PACK_H
 #define SEND_PACK_H
 
+#include "string-list.h"
+
 /* Possible values for push_cert field in send_pack_args. */
 #define SEND_PACK_PUSH_CERT_NEVER 0
 #define SEND_PACK_PUSH_CERT_IF_ASKED 1
@@ -21,6 +23,7 @@ struct send_pack_args {
                push_cert:2,
                stateless_rpc:1,
                atomic:1;
+       const struct string_list *push_options;
 };
 
 struct option;
index e66f2fe0f0409cccf1647f7851044f91d68252a6..0b78f3149fe44058a6aa06c142f5893e4cab5e35 100644 (file)
 #include "merge-recursive.h"
 #include "refs.h"
 #include "argv-array.h"
+#include "quote.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 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")
+
+/*
+ * 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")
+/*
+ * 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")
+
+/* We will introduce the 'interactive rebase' mode later */
+static inline int is_rebase_i(const struct replay_opts *opts)
+{
+       return 0;
+}
+
+static const char *get_dir(const struct replay_opts *opts)
+{
+       return git_path_seq_dir();
+}
+
+static const char *get_todo_path(const struct replay_opts *opts)
+{
+       return git_path_todo_file();
+}
 
 static int is_rfc2822_line(const char *buf, int len)
 {
@@ -108,18 +139,37 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
        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_addf(&seq_dir, "%s", git_path(SEQ_DIR));
-       remove_dir_recursively(&seq_dir, 0);
-       strbuf_release(&seq_dir);
+       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;
+
+       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";
+       return opts->action == REPLAY_REVERT ? N_("revert") : N_("cherry-pick");
 }
 
 struct commit_message {
@@ -129,13 +179,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 +235,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 +301,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 +334,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 +354,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,7 +383,7 @@ 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);
@@ -293,11 +405,15 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        clean = merge_trees(&o,
                            head_tree,
                            next_tree, base_tree, &result);
+       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));
+               return error(_("%s: Unable to write new index file"),
+                       _(action_name(opts)));
        rollback_lock_file(&index_lock);
 
        if (opts->signoff)
@@ -315,7 +431,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);
 
@@ -335,41 +451,115 @@ 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);
 }
 
+/*
+ * Read the author-script file into an environment block, ready for use in
+ * run_command(), that can be free()d afterwards.
+ */
+static char **read_author_script(void)
+{
+       struct strbuf script = STRBUF_INIT;
+       int i, count = 0;
+       char *p, *p2, **env;
+       size_t env_size;
+
+       if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0)
+               return NULL;
+
+       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++;
+               }
+
+       env_size = (count + 1) * sizeof(*env);
+       strbuf_grow(&script, env_size);
+       memmove(script.buf + env_size, script.buf, script.len);
+       p = script.buf + env_size;
+       env = (char **)strbuf_detach(&script, NULL);
+
+       for (i = 0; i < count; i++) {
+               env[i] = p;
+               p += strlen(p) + 1;
+       }
+       env[count] = NULL;
+
+       return env;
+}
+
+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");
+
 /*
  * 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)
+                         int allow_empty, int edit, int amend,
+                         int cleanup_commit_message)
 {
+       char **env = NULL;
        struct argv_array array;
        int rc;
        const char *value;
 
+       if (is_rebase_i(opts)) {
+               env = read_author_script();
+               if (!env) {
+                       const char *gpg_opt = gpg_sign_opt_quoted(opts);
+
+                       return error(_(staged_changes_advice),
+                                    gpg_opt, gpg_opt);
+               }
+       }
+
        argv_array_init(&array);
        argv_array_push(&array, "commit");
        argv_array_push(&array, "-n");
 
+       if (amend)
+               argv_array_push(&array, "--amend");
        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 (defmsg)
+               argv_array_pushl(&array, "-F", defmsg, NULL);
+       if (cleanup_commit_message)
+               argv_array_push(&array, "--cleanup=strip");
+       if (edit)
+               argv_array_push(&array, "-e");
+       else if (!cleanup_commit_message &&
+                !opts->signoff && !opts->record_origin &&
+                git_config_get_value("commit.cleanup", &value))
+               argv_array_push(&array, "--cleanup=verbatim");
 
        if (allow_empty)
                argv_array_push(&array, "--allow-empty");
@@ -377,8 +567,11 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
        if (opts->allow_empty_message)
                argv_array_push(&array, "--allow-empty-message");
 
-       rc = run_command_v_opt(array.argv, RUN_GIT_CMD);
+       rc = run_command_v_opt_cd_env(array.argv, RUN_GIT_CMD, NULL,
+                       (const char *const *)env);
        argv_array_clear(&array);
+       free(env);
+
        return rc;
 }
 
@@ -387,12 +580,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 {
@@ -440,7 +633,26 @@ 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)
+enum todo_command {
+       TODO_PICK = 0,
+       TODO_REVERT
+};
+
+static const char *todo_command_strings[] = {
+       "pick",
+       "revert"
+};
+
+static const char *command_to_string(const enum todo_command command)
+{
+       if ((size_t)command < ARRAY_SIZE(todo_command_strings))
+               return todo_command_strings[command];
+       die("Unknown command: %d", command);
+}
+
+
+static int do_pick_commit(enum todo_command command, struct commit *commit,
+               struct replay_opts *opts)
 {
        unsigned char head[20];
        struct commit *base, *next, *parent;
@@ -457,12 +669,12 @@ 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();
@@ -476,7 +688,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                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;
@@ -484,11 +696,11 @@ 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;
@@ -499,13 +711,14 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                return fast_forward_to(commit->object.oid.hash, head, unborn, opts);
 
        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));
+                       command_to_string(command),
+                       oid_to_hex(&parent->object.oid));
 
        if (get_message(commit, &msg) != 0)
-               return error(_("Cannot get commit message for %s"),
+               return error(_("cannot get commit message for %s"),
                        oid_to_hex(&commit->object.oid));
 
        /*
@@ -515,7 +728,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;
@@ -544,10 +757,8 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                 * information followed by "\n\n".
                 */
                p = strstr(msg.message, "\n\n");
-               if (p) {
-                       p += 2;
-                       strbuf_addstr(&msgbuf, p);
-               }
+               if (p)
+                       strbuf_addstr(&msgbuf, skip_blank_lines(p + 2));
 
                if (opts->record_origin) {
                        if (!has_conforming_footer(&msgbuf, NULL, 0))
@@ -558,23 +769,29 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                }
        }
 
-       if (!opts->strategy || !strcmp(opts->strategy, "recursive") || opts->action == REPLAY_REVERT) {
+       if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
                res = do_recursive_merge(base, next, base_label, next_label,
                                         head, &msgbuf, opts);
-               write_message(&msgbuf, git_path_merge_msg());
+               if (res < 0)
+                       return res;
+               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
@@ -582,19 +799,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;
@@ -606,15 +824,17 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                goto leave;
        }
        if (!opts->no_commit)
-               res = run_git_commit(git_path_merge_msg(), opts, allow);
+               res = run_git_commit(opts->edit ? NULL : git_path_merge_msg(),
+                                    opts, allow, opts->edit, 0, 0);
 
 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)
@@ -624,132 +844,175 @@ 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;
+};
+
+#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");
+
+       for (i = 0; i < ARRAY_SIZE(todo_command_strings); i++)
+               if (skip_prefix(bol, todo_command_strings[i], &bol)) {
+                       item->command = i;
+                       break;
+               }
+       if (i >= ARRAY_SIZE(todo_command_strings))
+               return -1;
 
        /* 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");
+       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) {
-               const char *action_str;
-               action_str = action == REPLAY_REVERT ? "revert" : "cherry-pick";
-               error(_("Cannot %s during a %s"), action_str, action_name(opts));
-               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;
 
-       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 = -1;
+               }
        }
-       if (!*todo_list)
-               return error(_("No commits parsed."));
-       return 0;
+       if (!todo_list->nr)
+               return error(_("no commits parsed."));
+       return res;
 }
 
-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;
+       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 = parse_insn_buffer(todo_list->buf.buf, todo_list);
        if (res)
-               die(_("Unusable instruction sheet: %s"), git_path_todo_file());
+               return error(_("unusable instruction sheet: '%s'"), todo_file);
+
+       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."));
+       }
+
+       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)
@@ -772,40 +1035,81 @@ 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 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);
+                       }
+               }
+               strbuf_release(&buf);
+
+               return 0;
+       }
+
        if (!file_exists(git_path_opts_file()))
-               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());
+               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_strings[command];
        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)
@@ -816,28 +1120,63 @@ static int create_seq_dir(void)
                return -1;
        }
        else if (mkdir(git_path_seq_dir(), 0777) < 0)
-               die_errno(_("Could not create sequencer directory %s"),
-                         git_path_seq_dir());
+               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);
@@ -859,7 +1198,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];
@@ -875,10 +1214,9 @@ static int sequencer_rollback(struct replay_opts *opts)
                return rollback_single_pick();
        }
        if (!f)
-               return error(_("cannot open %s: %s"), git_path_head_file(),
-                                               strerror(errno));
+               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;
@@ -889,83 +1227,96 @@ static int sequencer_rollback(struct replay_opts *opts)
                        git_path_head_file());
                goto fail;
        }
+       if (is_null_sha1(sha1)) {
+               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());
-       }
-       strbuf_release(&buf);
+       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);
+       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 pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
 {
-       struct commit_list *cur;
        int res;
 
        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;
 
-       for (cur = todo_list; cur; cur = cur->next) {
-               save_todo(cur, opts);
-               res = do_pick_commit(cur->item, opts);
+       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;
+               res = do_pick_commit(item->command, item->commit, opts);
+               todo_list->current++;
                if (res)
                        return res;
        }
@@ -974,8 +1325,7 @@ static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts)
         * 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)
@@ -988,58 +1338,55 @@ static int continue_single_pick(void)
        return run_command_v_opt(argv, RUN_GIT_CMD);
 }
 
-static int sequencer_continue(struct replay_opts *opts)
+int sequencer_continue(struct replay_opts *opts)
 {
-       struct commit_list *todo_list = NULL;
+       struct todo_list todo_list = TODO_LIST_INIT;
+       int res;
+
+       if (read_and_refresh_cache(opts))
+               return -1;
 
-       if (!file_exists(git_path_todo_file()))
+       if (!file_exists(get_todo_path(opts)))
                return continue_single_pick();
-       read_populate_opts(&opts);
-       read_populate_todo(&todo_list, opts);
+       if (read_populate_opts(opts))
+               return -1;
+       if ((res = read_populate_todo(&todo_list, opts)))
+               goto release_todo_list;
 
        /* 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;
+               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;
        }
-       if (index_differs_from("HEAD", 0))
-               return error_dirty_index(opts);
-       todo_list = todo_list->next;
-       return pick_commits(todo_list, opts);
+       todo_list.current++;
+       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);
 }
 
 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;
-
-       if (opts->subcommand == REPLAY_NONE)
-               assert(opts->revs);
-
-       read_and_refresh_cache(opts);
+       int i, res;
 
-       /*
-        * 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];
@@ -1052,10 +1399,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);
        }
 
        /*
@@ -1071,10 +1419,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);
        }
 
@@ -1084,17 +1432,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)) {
-               if (opts->action == REPLAY_REVERT)
-                       return error(_("Can't revert as initial commit"));
-               return error(_("Can't cherry-pick into empty head"));
-       }
-       save_head(sha1_to_hex(sha1));
-       save_opts(opts);
-       return pick_commits(todo_list, opts);
+       if (get_sha1("HEAD", sha1) && (opts->action == REPLAY_REVERT))
+               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)
index 5ed5cb1d97ced70a9ebffd1dad524a12e7f7810a..7a513c576bdccf8730828fdaa586ec9d0af4af6b 100644 (file)
@@ -1,10 +1,7 @@
 #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)
 
@@ -13,16 +10,8 @@ enum replay_action {
        REPLAY_PICK
 };
 
-enum replay_subcommand {
-       REPLAY_NONE,
-       REPLAY_REMOVE_STATE,
-       REPLAY_CONTINUE,
-       REPLAY_ROLLBACK
-};
-
 struct replay_opts {
        enum replay_action action;
-       enum replay_subcommand subcommand;
 
        /* Boolean options */
        int edit;
@@ -37,18 +26,22 @@ struct replay_opts {
 
        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 5a86e297b51261b5f1ae9fa6dad6fa7dc86cd4ba..7bc4e75d22ce099ca68aa1fac50c9123546ec5b7 100644 (file)
@@ -36,7 +36,7 @@ static int update_info_file(char *path, int (*generate)(FILE *))
 
 out:
        if (ret) {
-               error("unable to update %s: %s", path, strerror(errno));
+               error_errno("unable to update %s", path);
                if (fp)
                        fclose(fp);
                else if (fd >= 0)
@@ -229,7 +229,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 de1a2a7ea5973fef256328a26730117466c15172..fe572b82c355390e6101aea15d2d53ec5b3b1e15 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -5,7 +5,9 @@
 static int inside_git_dir = -1;
 static int inside_work_tree = -1;
 static int work_tree_config_is_bogus;
-static struct string_list unknown_extensions = STRING_LIST_INIT_DUP;
+
+static struct startup_info the_startup_info;
+struct startup_info *startup_info = &the_startup_info;
 
 /*
  * The input parameter must contain an absolute path, and it must already be
@@ -100,7 +102,7 @@ char *prefix_path_gently(const char *prefix, int len,
                        return NULL;
                }
        } else {
-               sanitized = xstrfmt("%.*s%s", len, prefix, path);
+               sanitized = xstrfmt("%.*s%s", len, len ? prefix : "", path);
                if (remaining_prefix)
                        *remaining_prefix = len;
                if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) {
@@ -155,8 +157,8 @@ static void NORETURN die_verify_filename(const char *prefix,
                                         int diagnose_misspelt_rev)
 {
        if (!diagnose_misspelt_rev)
-               die("%s: no such path in the working tree.\n"
-                   "Use 'git <command> -- <path>...' to specify paths that do not exist locally.",
+               die(_("%s: no such path in the working tree.\n"
+                     "Use 'git <command> -- <path>...' to specify paths that do not exist locally."),
                    arg);
        /*
         * Saying "'(icase)foo' does not exist in the index" when the
@@ -168,9 +170,9 @@ static void NORETURN die_verify_filename(const char *prefix,
                maybe_die_on_misspelt_object_name(arg, prefix);
 
        /* ... or fall back the most general message. */
-       die("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>...]'", arg);
+       die(_("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>...]'"), arg);
 
 }
 
@@ -218,9 +220,9 @@ void verify_non_filename(const char *prefix, const char *arg)
                return; /* flag */
        if (!check_filename(prefix, arg))
                return;
-       die("ambiguous argument '%s': both revision and filename\n"
-           "Use '--' to separate paths from revisions, like this:\n"
-           "'git <command> [<revision>...] -- [<file>...]'", arg);
+       die(_("ambiguous argument '%s': both revision and filename\n"
+             "Use '--' to separate paths from revisions, like this:\n"
+             "'git <command> [<revision>...] -- [<file>...]'"), arg);
 }
 
 int get_common_dir(struct strbuf *sb, const char *gitdir)
@@ -370,14 +372,13 @@ void setup_work_tree(void)
        initialized = 1;
 }
 
-static int check_repo_format(const char *var, const char *value, void *cb)
+static int check_repo_format(const char *var, const char *value, void *vdata)
 {
+       struct repository_format *data = vdata;
        const char *ext;
 
        if (strcmp(var, "core.repositoryformatversion") == 0)
-               repository_format_version = git_config_int(var, value);
-       else if (strcmp(var, "core.sharedrepository") == 0)
-               shared_repository = git_config_perm(var, value);
+               data->version = git_config_int(var, value);
        else if (skip_prefix(var, "extensions.", &ext)) {
                /*
                 * record any known extensions here; otherwise,
@@ -387,9 +388,15 @@ static int check_repo_format(const char *var, const char *value, void *cb)
                if (!strcmp(ext, "noop"))
                        ;
                else if (!strcmp(ext, "preciousobjects"))
-                       repository_format_precious_objects = git_config_bool(var, value);
+                       data->precious_objects = git_config_bool(var, value);
                else
-                       string_list_append(&unknown_extensions, ext);
+                       string_list_append(&data->unknown_extensions, ext);
+       } else if (strcmp(var, "core.bare") == 0) {
+               data->is_bare = git_config_bool(var, value);
+       } else if (strcmp(var, "core.worktree") == 0) {
+               if (!value)
+                       return config_error_nonbool(var);
+               data->work_tree = xstrdup(value);
        }
        return 0;
 }
@@ -397,56 +404,84 @@ static int check_repo_format(const char *var, const char *value, void *cb)
 static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
 {
        struct strbuf sb = STRBUF_INIT;
-       const char *repo_config;
-       config_fn_t fn;
-       int ret = 0;
-
-       string_list_clear(&unknown_extensions, 0);
+       struct strbuf err = STRBUF_INIT;
+       struct repository_format candidate;
+       int has_common;
 
-       if (get_common_dir(&sb, gitdir))
-               fn = check_repo_format;
-       else
-               fn = check_repository_format_version;
+       has_common = get_common_dir(&sb, gitdir);
        strbuf_addstr(&sb, "/config");
-       repo_config = sb.buf;
+       read_repository_format(&candidate, sb.buf);
+       strbuf_release(&sb);
 
        /*
-        * git_config() can't be used here because it calls git_pathdup()
-        * to get $GIT_CONFIG/config. That call will make setup_git_env()
-        * set git_dir to ".git".
-        *
-        * We are in gitdir setup, no git dir has been found useable yet.
-        * Use a gentler version of git_config() to check if this repo
-        * is a good one.
+        * For historical use of check_repository_format() in git-init,
+        * we treat a missing config as a silent "ok", even when nongit_ok
+        * is unset.
         */
-       git_config_early(fn, NULL, repo_config);
-       if (GIT_REPO_VERSION_READ < repository_format_version) {
-               if (!nongit_ok)
-                       die ("Expected git repo version <= %d, found %d",
-                            GIT_REPO_VERSION_READ, repository_format_version);
-               warning("Expected git repo version <= %d, found %d",
-                       GIT_REPO_VERSION_READ, repository_format_version);
-               warning("Please upgrade Git");
-               *nongit_ok = -1;
-               ret = -1;
+       if (candidate.version < 0)
+               return 0;
+
+       if (verify_repository_format(&candidate, &err) < 0) {
+               if (nongit_ok) {
+                       warning("%s", err.buf);
+                       strbuf_release(&err);
+                       *nongit_ok = -1;
+                       return -1;
+               }
+               die("%s", err.buf);
        }
 
-       if (repository_format_version >= 1 && unknown_extensions.nr) {
+       repository_format_precious_objects = candidate.precious_objects;
+       string_list_clear(&candidate.unknown_extensions, 0);
+       if (!has_common) {
+               if (candidate.is_bare != -1) {
+                       is_bare_repository_cfg = candidate.is_bare;
+                       if (is_bare_repository_cfg == 1)
+                               inside_work_tree = -1;
+               }
+               if (candidate.work_tree) {
+                       free(git_work_tree_cfg);
+                       git_work_tree_cfg = candidate.work_tree;
+                       inside_work_tree = -1;
+               }
+       } else {
+               free(candidate.work_tree);
+       }
+
+       return 0;
+}
+
+int read_repository_format(struct repository_format *format, const char *path)
+{
+       memset(format, 0, sizeof(*format));
+       format->version = -1;
+       format->is_bare = -1;
+       string_list_init(&format->unknown_extensions, 1);
+       git_config_from_file(check_repo_format, path, format);
+       return format->version;
+}
+
+int verify_repository_format(const struct repository_format *format,
+                            struct strbuf *err)
+{
+       if (GIT_REPO_VERSION_READ < format->version) {
+               strbuf_addf(err, _("Expected git repo version <= %d, found %d"),
+                           GIT_REPO_VERSION_READ, format->version);
+               return -1;
+       }
+
+       if (format->version >= 1 && format->unknown_extensions.nr) {
                int i;
 
-               if (!nongit_ok)
-                       die("unknown repository extension: %s",
-                           unknown_extensions.items[0].string);
+               strbuf_addstr(err, _("unknown repository extensions found:"));
 
-               for (i = 0; i < unknown_extensions.nr; i++)
-                       warning("unknown repository extension: %s",
-                               unknown_extensions.items[i].string);
-               *nongit_ok = -1;
-               ret = -1;
+               for (i = 0; i < format->unknown_extensions.nr; i++)
+                       strbuf_addf(err, "\n\t%s",
+                                   format->unknown_extensions.items[i].string);
+               return -1;
        }
 
-       strbuf_release(&sb);
-       return ret;
+       return 0;
 }
 
 /*
@@ -724,9 +759,9 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
 static const char *setup_nongit(const char *cwd, int *nongit_ok)
 {
        if (!nongit_ok)
-               die("Not a git repository (or any of the parent directories): %s", DEFAULT_GIT_DIR_ENVIRONMENT);
+               die(_("Not a git repository (or any of the parent directories): %s"), DEFAULT_GIT_DIR_ENVIRONMENT);
        if (chdir(cwd))
-               die_errno("Cannot come back to cwd");
+               die_errno(_("Cannot come back to cwd"));
        *nongit_ok = 1;
        return NULL;
 }
@@ -807,7 +842,7 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
                *nongit_ok = 0;
 
        if (strbuf_getcwd(&cwd))
-               die_errno("Unable to read current working directory");
+               die_errno(_("Unable to read current working directory"));
        offset = cwd.len;
 
        /*
@@ -877,19 +912,19 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
                        if (parent_device != current_device) {
                                if (nongit_ok) {
                                        if (chdir(cwd.buf))
-                                               die_errno("Cannot come back to cwd");
+                                               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).",
+                               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 (chdir("..")) {
                        strbuf_setlen(&cwd, offset);
-                       die_errno("Cannot change to '%s/..'", cwd.buf);
+                       die_errno(_("Cannot change to '%s/..'"), cwd.buf);
                }
                offset = offset_parent;
        }
@@ -905,10 +940,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
        else
                setenv(GIT_PREFIX_ENVIRONMENT, "", 1);
 
-       if (startup_info) {
-               startup_info->have_repository = !nongit_ok || !*nongit_ok;
-               startup_info->prefix = prefix;
-       }
+       startup_info->have_repository = !nongit_ok || !*nongit_ok;
+       startup_info->prefix = prefix;
+
        return prefix;
 }
 
@@ -952,9 +986,9 @@ int git_config_perm(const char *var, const char *value)
        /* A filemode value was given: 0xxx */
 
        if ((i & 0600) != 0600)
-               die("Problem with core.sharedRepository filemode value "
+               die(_("Problem with core.sharedRepository filemode value "
                    "(0%.3o).\nThe owner of files must always have "
-                   "read and write permissions.", i);
+                   "read and write permissions."), i);
 
        /*
         * Mask filemode value. Others can not get write permission.
@@ -963,28 +997,10 @@ int git_config_perm(const char *var, const char *value)
        return -(i & 0666);
 }
 
-int check_repository_format_version(const char *var, const char *value, void *cb)
-{
-       int ret = check_repo_format(var, value, cb);
-       if (ret)
-               return ret;
-       if (strcmp(var, "core.bare") == 0) {
-               is_bare_repository_cfg = git_config_bool(var, value);
-               if (is_bare_repository_cfg == 1)
-                       inside_work_tree = -1;
-       } else if (strcmp(var, "core.worktree") == 0) {
-               if (!value)
-                       return config_error_nonbool(var);
-               free(git_work_tree_cfg);
-               git_work_tree_cfg = xstrdup(value);
-               inside_work_tree = -1;
-       }
-       return 0;
-}
-
-int check_repository_format(void)
+void check_repository_format(void)
 {
-       return check_repository_format_gently(get_git_dir(), NULL);
+       check_repository_format_gently(get_git_dir(), NULL);
+       startup_info->have_repository = 1;
 }
 
 /*
index 2842a22d7fdda33d62d617d5ba9b826ad428c17e..c3a2b5ad17c74613811a0ce850586fa1b9e099bd 100644 (file)
@@ -64,7 +64,7 @@ static void note_variables (const char *string);
 static void subst_from_stdin (void);
 
 int
-main (int argc, char *argv[])
+cmd_main (int argc, const char *argv[])
 {
   /* Default values for command line options.  */
   /* unsigned short int show_variables = 0; */
@@ -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..c1cc25cd95da66aec1c695f4bba9680f5cb834f6 100644 (file)
@@ -16,7 +16,7 @@ static int void_hashcmp(const void *a, const void *b)
 
 static void sha1_array_sort(struct sha1_array *array)
 {
-       qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp);
+       QSORT(array->sha1, array->nr, void_hashcmp);
        array->sorted = 1;
 }
 
@@ -42,7 +42,7 @@ void sha1_array_clear(struct sha1_array *array)
        array->sorted = 0;
 }
 
-void sha1_array_for_each_unique(struct sha1_array *array,
+int sha1_array_for_each_unique(struct sha1_array *array,
                                for_each_sha1_fn fn,
                                void *data)
 {
@@ -52,8 +52,12 @@ void sha1_array_for_each_unique(struct sha1_array *array,
                sha1_array_sort(array);
 
        for (i = 0; i < array->nr; i++) {
+               int ret;
                if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
                        continue;
-               fn(array->sha1[i], data);
+               ret = fn(array->sha1[i], data);
+               if (ret)
+                       return ret;
        }
+       return 0;
 }
index 72bb33bec6c173633c2b5cd04db57b562fa23a9e..b3230be0dd6eedf871c5c337a79333a7ebf33cb7 100644 (file)
@@ -14,10 +14,10 @@ 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);
 
-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,
+typedef int (*for_each_sha1_fn)(const unsigned char sha1[20],
                                void *data);
+int sha1_array_for_each_unique(struct sha1_array *array,
+                              for_each_sha1_fn fn,
+                              void *data);
 
 #endif /* SHA1_ARRAY_H */
index d0f2aa029b14451d4ffe669d48602c55060b9f42..1173071859dae68f72cc72efb20f816152d3eabc 100644 (file)
 #include "bulk-checkin.h"
 #include "streaming.h"
 #include "dir.h"
+#include "mru.h"
+#include "list.h"
+#include "mergesort.h"
+#include "quote.h"
 
 #ifndef O_NOATIME
 #if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
@@ -37,6 +41,12 @@ 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
@@ -59,14 +69,6 @@ static struct cached_object empty_tree = {
        0
 };
 
-/*
- * A pointer to the last packed_git in which an object was found.
- * When an object is sought, we look in this packfile first, because
- * objects that are looked up at similar times are often in the same
- * packfile as one another.
- */
-static struct packed_git *last_found_pack;
-
 static struct cached_object *find_cached_object(const unsigned char *sha1)
 {
        int i;
@@ -171,36 +173,42 @@ enum scld_error safe_create_leading_directories_const(const char *path)
        return result;
 }
 
-static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
+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;
+}
+
+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;
 }
 
 /*
@@ -233,6 +241,35 @@ char *sha1_pack_index_name(const unsigned char *sha1)
 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.
  *
@@ -252,8 +289,6 @@ 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) {
@@ -262,49 +297,26 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        }
        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;
-
-       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;
+       while (pathbuf.len && pathbuf.buf[pathbuf.len - 1] == '/')
+               strbuf_setlen(&pathbuf, pathbuf.len - 1);
 
-       /* 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 (!strcmp_icase(ent->base, normalized_objdir)) {
-               free(ent);
-               return -1;
-       }
+       ent = alloc_alt_odb(pathbuf.buf);
 
        /* add the alternate entry */
        *alt_odb_tail = ent;
@@ -312,20 +324,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.",
@@ -334,23 +372,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);
 }
 
@@ -363,7 +395,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;
@@ -380,6 +412,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));
@@ -425,6 +469,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;
@@ -489,8 +620,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;
@@ -522,6 +653,9 @@ static size_t peak_pack_mapped;
 static size_t pack_mapped;
 struct packed_git *packed_git;
 
+static struct mru packed_git_mru_storage;
+struct mru *packed_git_mru = &packed_git_mru_storage;
+
 void pack_report(void)
 {
        fprintf(stderr,
@@ -554,7 +688,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)
@@ -795,7 +929,7 @@ void close_all_packs(void)
 
        for (p = packed_git; p; p = p->next)
                if (p->do_not_close)
-                       die("BUG! Want to close pack marked 'do-not-close'");
+                       die("BUG: want to close pack marked 'do-not-close'");
                else
                        close_pack(p);
 }
@@ -891,36 +1025,6 @@ void close_pack_index(struct packed_git *p)
        }
 }
 
-/*
- * This is used by git-repack in case a newly created pack happens to
- * contain the same set of objects as an existing one.  In that case
- * the resulting file might be different even if its name would be the
- * same.  It is best to close any reference to the old pack before it is
- * replaced on disk.  Of course no index pointers or windows for given pack
- * must subsist at this point.  If ever objects from this pack are requested
- * again, the new version of the pack will be reinitialized through
- * reprepare_packed_git().
- */
-void free_pack_by_name(const char *pack_name)
-{
-       struct packed_git *p, **pp = &packed_git;
-
-       while (*pp) {
-               p = *pp;
-               if (strcmp(pack_name, p->pack_name) == 0) {
-                       clear_delta_base_cache();
-                       close_pack(p);
-                       free(p->bad_object_sha1);
-                       *pp = p->next;
-                       if (last_found_pack == p)
-                               last_found_pack = NULL;
-                       free(p);
-                       return;
-               }
-               pp = &p->next;
-       }
-}
-
 static unsigned int get_max_fd_limit(void)
 {
 #ifdef RLIMIT_NOFILE
@@ -990,7 +1094,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++;
@@ -1107,9 +1211,8 @@ unsigned char *use_pack(struct packed_git *p,
                                PROT_READ, MAP_PRIVATE,
                                p->pack_fd, win->offset);
                        if (win->base == MAP_FAILED)
-                               die("packfile %s cannot be mapped: %s",
-                                       p->pack_name,
-                                       strerror(errno));
+                               die_errno("packfile %s cannot be mapped",
+                                         p->pack_name);
                        if (!win->offset && win->len == p->pack_size
                                && !p->do_not_close)
                                close_pack_fd(p);
@@ -1279,8 +1382,8 @@ static void prepare_packed_git_one(char *objdir, int local)
        dir = opendir(path.buf);
        if (!dir) {
                if (errno != ENOENT)
-                       error("unable to open object pack directory: %s: %s",
-                             path.buf, strerror(errno));
+                       error_errno("unable to open object pack directory: %s",
+                                   path.buf);
                strbuf_release(&path);
                return;
        }
@@ -1332,10 +1435,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;
 
        /*
@@ -1362,28 +1501,17 @@ 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);
+       packed_git = llist_mergesort(packed_git, get_next_packed_git,
+                                    set_next_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];
+static void prepare_packed_git_mru(void)
+{
+       struct packed_git *p;
 
-       free(ary);
+       mru_clear(packed_git_mru);
+       for (p = packed_git; p; p = p->next)
+               mru_append(packed_git_mru, p);
 }
 
 static int prepare_packed_git_run_once = 0;
@@ -1395,17 +1523,16 @@ 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;
 }
 
 void reprepare_packed_git(void)
 {
+       approximate_object_count_valid = 0;
        prepare_packed_git_run_once = 0;
        prepare_packed_git();
 }
@@ -1484,9 +1611,9 @@ 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(const char *name)
 {
-       static int sha1_file_open_flag = O_NOATIME;
+       static int sha1_file_open_flag = O_NOATIME | O_CLOEXEC;
 
        for (;;) {
                int fd;
@@ -1496,12 +1623,17 @@ int git_open_noatime(const char *name)
                if (fd >= 0)
                        return fd;
 
-               /* Might the failure be due to O_NOATIME? */
-               if (errno != ENOENT && sha1_file_open_flag) {
-                       sha1_file_open_flag = 0;
+               /* Try again w/o O_CLOEXEC: the kernel might not support it */
+               if ((sha1_file_open_flag & O_CLOEXEC) && errno == EINVAL) {
+                       sha1_file_open_flag &= ~O_CLOEXEC;
                        continue;
                }
 
+               /* Might the failure be due to O_NOATIME? */
+               if (errno != ENOENT && (sha1_file_open_flag & O_NOATIME)) {
+                       sha1_file_open_flag &= ~O_NOATIME;
+                       continue;
+               }
                return -1;
        }
 }
@@ -1516,8 +1648,8 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st)
        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))
+               const char *path = alt_sha1_path(alt, sha1);
+               if (!lstat(path, st))
                        return 0;
        }
 
@@ -1530,15 +1662,15 @@ static int open_sha1_file(const unsigned char *sha1)
        struct alternate_object_database *alt;
        int most_interesting_errno;
 
-       fd = git_open_noatime(sha1_file_name(sha1));
+       fd = git_open(sha1_file_name(sha1));
        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);
+               const char *path = alt_sha1_path(alt, sha1);
+               fd = git_open(path);
                if (fd >= 0)
                        return fd;
                if (most_interesting_errno == ENOENT)
@@ -1597,7 +1729,9 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf,
        return used;
 }
 
-int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz)
+static int unpack_sha1_short_header(git_zstream *stream,
+                                   unsigned char *map, unsigned long mapsize,
+                                   void *buffer, unsigned long bufsiz)
 {
        /* Get the data stream */
        memset(stream, 0, sizeof(*stream));
@@ -1610,13 +1744,31 @@ int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long ma
        return git_inflate(stream, 0);
 }
 
+int unpack_sha1_header(git_zstream *stream,
+                      unsigned char *map, unsigned long mapsize,
+                      void *buffer, unsigned long bufsiz)
+{
+       int status = unpack_sha1_short_header(stream, map, mapsize,
+                                             buffer, bufsiz);
+
+       if (status < Z_OK)
+               return status;
+
+       /* Make sure we have the terminating NUL */
+       if (!memchr(buffer, '\0', stream->next_out - (unsigned char *)buffer))
+               return -1;
+       return 0;
+}
+
 static int unpack_sha1_header_to_strbuf(git_zstream *stream, unsigned char *map,
                                        unsigned long mapsize, void *buffer,
                                        unsigned long bufsiz, struct strbuf *header)
 {
        int status;
 
-       status = unpack_sha1_header(stream, map, mapsize, buffer, bufsiz);
+       status = unpack_sha1_short_header(stream, map, mapsize, buffer, bufsiz);
+       if (status < Z_OK)
+               return -1;
 
        /*
         * Check if entire header is unpacked in the first iteration.
@@ -1707,6 +1859,8 @@ static int parse_sha1_header_extended(const char *hdr, struct object_info *oi,
         */
        for (;;) {
                char c = *hdr++;
+               if (!c)
+                       return -1;
                if (c == ' ')
                        break;
                type_len++;
@@ -1717,7 +1871,7 @@ static int parse_sha1_header_extended(const char *hdr, struct object_info *oi,
                strbuf_add(oi->typename, type_buf, type_len);
        /*
         * Set type to 0 if its an unknown object and
-        * we're obtaining the type using '--allow-unkown-type'
+        * we're obtaining the type using '--allow-unknown-type'
         * option.
         */
        if ((flags & LOOKUP_UNKNOWN_OBJECT) && (type < 0))
@@ -1755,11 +1909,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);
 }
 
@@ -1997,8 +2149,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;
@@ -2098,136 +2250,142 @@ 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 hashmap_iter iter;
+       struct delta_base_cache_entry *entry;
+       for (entry = hashmap_iter_first(&delta_base_cache, &iter);
+            entry;
+            entry = hashmap_iter_next(&iter)) {
+               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,
@@ -2271,18 +2429,18 @@ 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;
                }
 
                if (do_check_packed_object_crc && p->index_version > 1) {
                        struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
-                       unsigned long len = revidx[1].offset - obj_offset;
+                       off_t len = revidx[1].offset - obj_offset;
                        if (check_pack_crc(p, &w_curs, obj_offset, len, revidx->nr)) {
                                const unsigned char *sha1 =
                                        nth_packed_object_sha1(p, revidx->nr);
@@ -2331,7 +2489,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
        case OBJ_OFS_DELTA:
        case OBJ_REF_DELTA:
                if (data)
-                       die("BUG in unpack_entry: left loop at a valid delta");
+                       die("BUG: unpack_entry: left loop at a valid delta");
                break;
        case OBJ_COMMIT:
        case OBJ_TREE:
@@ -2605,21 +2763,15 @@ static int fill_pack_entry(const unsigned char *sha1,
  */
 static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
 {
-       struct packed_git *p;
+       struct mru_entry *p;
 
        prepare_packed_git();
        if (!packed_git)
                return 0;
 
-       if (last_found_pack && fill_pack_entry(sha1, e, last_found_pack))
-               return 1;
-
-       for (p = packed_git; p; p = p->next) {
-               if (p == last_found_pack)
-                       continue; /* we already checked this one */
-
-               if (fill_pack_entry(sha1, e, p)) {
-                       last_found_pack = p;
+       for (p = packed_git_mru->head; p; p = p->next) {
+               if (fill_pack_entry(sha1, e, p->item)) {
+                       mru_mark(packed_git_mru, p);
                        return 1;
                }
        }
@@ -2769,7 +2921,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;
@@ -2786,7 +2938,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
@@ -2984,7 +3136,7 @@ int finalize_object_file(const char *tmpfile, const char *filename)
        unlink_or_warn(tmpfile);
        if (ret) {
                if (ret != EEXIST) {
-                       return error("unable to write sha1 filename %s: %s", filename, strerror(ret));
+                       return error_errno("unable to write sha1 filename %s", filename);
                }
                /* FIXME!!! Collision check here ? */
        }
@@ -2998,7 +3150,7 @@ out:
 static int write_buffer(int fd, const void *buf, size_t len)
 {
        if (write_in_full(fd, buf, len) < 0)
-               return error("file write error (%s)", strerror(errno));
+               return error_errno("file write error");
        return 0;
 }
 
@@ -3081,7 +3233,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
                if (errno == EACCES)
                        return error("insufficient permission for adding an object to repository database %s", get_object_directory());
                else
-                       return error("unable to create temporary file: %s", strerror(errno));
+                       return error_errno("unable to create temporary file");
        }
 
        /* Set it up */
@@ -3126,8 +3278,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
                utb.actime = mtime;
                utb.modtime = mtime;
                if (utime(tmp_file.buf, &utb) < 0)
-                       warning("failed utime() on %s: %s",
-                               tmp_file.buf, strerror(errno));
+                       warning_errno("failed utime() on %s", tmp_file.buf);
        }
 
        return finalize_object_file(tmp_file.buf, filename);
@@ -3241,6 +3392,11 @@ int has_object_file(const struct object_id *oid)
        return has_sha1_file(oid->hash);
 }
 
+int has_object_file_with_flags(const struct object_id *oid, int flags)
+{
+       return has_sha1_file_with_flags(oid->hash, flags);
+}
+
 static void check_tree(const void *buf, size_t size)
 {
        struct tree_desc desc;
@@ -3360,7 +3516,7 @@ static int index_core(unsigned char *sha1, int fd, size_t size,
                if (size == read_in_full(fd, buf, size))
                        ret = index_mem(sha1, buf, size, type, path, flags);
                else
-                       ret = error("short read %s", strerror(errno));
+                       ret = error_errno("short read");
                free(buf);
        } else {
                void *buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
@@ -3425,18 +3581,14 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, unsigned
        case S_IFREG:
                fd = open(path, O_RDONLY);
                if (fd < 0)
-                       return error("open(\"%s\"): %s", path,
-                                    strerror(errno));
+                       return error_errno("open(\"%s\")", path);
                if (index_fd(sha1, fd, st, OBJ_BLOB, path, flags) < 0)
                        return error("%s: failed to insert into database",
                                     path);
                break;
        case S_IFLNK:
-               if (strbuf_readlink(&sb, path, st->st_size)) {
-                       char *errstr = strerror(errno);
-                       return error("readlink(\"%s\"): %s", path,
-                                    errstr);
-               }
+               if (strbuf_readlink(&sb, path, st->st_size))
+                       return error_errno("readlink(\"%s\")", path);
                if (!(flags & HASH_WRITE_OBJECT))
                        hash_sha1_file(sb.buf, sb.len, blob_type, sha1);
                else if (write_sha1_file(sb.buf, sb.len, blob_type, sha1))
@@ -3492,7 +3644,7 @@ static int for_each_file_in_obj_subdir(int subdir_nr,
        if (!dir) {
                if (errno == ENOENT)
                        return 0;
-               return error("unable to open %s: %s", path->buf, strerror(errno));
+               return error_errno("unable to open %s", path->buf);
        }
 
        while ((de = readdir(dir))) {
@@ -3584,8 +3736,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);
index 3acf221f92f7a0857f17c0210044cacc325c8ce0..73a915ff1b3278f08ef4f327a55fe61d238f720a 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 *);
 
 struct disambiguate_state {
+       int len; /* length of prefix in hex chars */
+       char hex_pfx[GIT_SHA1_HEXSZ + 1];
+       unsigned char bin_pfx[GIT_SHA1_RAWSZ];
+
        disambiguate_hint_fn fn;
        void *cb_data;
-       unsigned char candidate[20];
+       unsigned char candidate[GIT_SHA1_RAWSZ];
        unsigned candidate_exists:1;
        unsigned candidate_checked:1;
        unsigned candidate_ok:1;
@@ -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_SHA1_HEXSZ];
        static struct alternate_object_database *fakeent;
 
        if (!fakeent) {
@@ -86,25 +91,18 @@ 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;
 
@@ -113,7 +111,7 @@ static void find_short_object_filename(int len, const char *hex_pfx, struct disa
 
                        if (strlen(de->d_name) != 38)
                                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))
@@ -138,9 +136,7 @@ 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;
@@ -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, current);
                if (!cmp) {
                        first = mid;
                        break;
@@ -174,20 +170,19 @@ static void unique_in_pack(int len,
         */
        for (i = first; i < num && !ds->ambiguous; i++) {
                current = nth_packed_object_sha1(p, i);
-               if (!match_sha(len, bin_pfx, current))
+               if (!match_sha(ds->len, ds->bin_pfx, current))
                        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)
@@ -269,7 +264,7 @@ static int disambiguate_treeish_only(const unsigned char *sha1, void *cb_data_un
                return 0;
 
        /* We need to do this the hard way... */
-       obj = deref_tag(lookup_object(sha1), NULL, 0);
+       obj = deref_tag(parse_object(sha1), NULL, 0);
        if (obj && (obj->type == OBJ_TREE || obj->type == OBJ_COMMIT))
                return 1;
        return 0;
@@ -281,14 +276,46 @@ static int disambiguate_blob_only(const unsigned char *sha1, void *cb_data_unuse
        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 +329,47 @@ 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[i >> 1] |= val;
+       }
+
+       ds->len = len;
+       ds->hex_pfx[len] = '\0';
+       prepare_alt_odb();
+       return 0;
+}
+
+static int show_ambiguous_object(const unsigned char *sha1, void *data)
+{
+       const struct disambiguate_state *ds = data;
+       struct strbuf desc = STRBUF_INIT;
+       int type;
+
+       if (ds->fn && !ds->fn(sha1, ds->cb_data))
+               return 0;
+
+       type = sha1_object_info(sha1, NULL);
+       if (type == OBJ_COMMIT) {
+               struct commit *commit = lookup_commit(sha1);
+               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(sha1);
+               if (!parse_tag(tag) && tag->tag)
+                       strbuf_addf(&desc, " %s", tag->tag);
        }
+
+       advise("  %s %s%s",
+              find_unique_abbrev(sha1, DEFAULT_ABBREV),
+              typename(type) ? typename(type) : "unknown type",
+              desc.buf);
+
+       strbuf_release(&desc);
        return 0;
 }
 
@@ -314,19 +377,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 +396,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 unsigned char *sha1, void *data)
+{
+       sha1_array_append(data, sha1);
+       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 sha1_array collect = SHA1_ARRAY_INIT;
        struct disambiguate_state ds;
-       int len = strlen(prefix);
+       int ret;
 
-       if (len < MINIMUM_ABBREV || len > 40)
+       if (init_object_disambiguation(prefix, strlen(prefix), &ds) < 0)
                return -1;
-       if (prepare_prefixes(prefix, len, bin_pfx, hex_pfx) < 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);
 
-       find_short_object_filename(len, hex_pfx, &ds);
-       find_short_packed_object(len, bin_pfx, &ds);
-       return ds.ambiguous;
+       ret = sha1_array_for_each_unique(&collect, fn, cb_data);
+       sha1_array_clear(&collect);
+       return ret;
+}
+
+/*
+ * 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 +508,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_SHA1_HEXSZ + 1];
+       char *hex = hexbuffer[bufno];
+       bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
        find_unique_abbrev_r(hex, sha1, len);
        return hex;
 }
@@ -677,12 +793,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 +838,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 +943,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;
 
@@ -995,35 +1112,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 +1148,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;
@@ -1214,6 +1331,15 @@ int get_sha1(const char *name, unsigned char *sha1)
        return get_sha1_with_context(name, 0, sha1, &unused);
 }
 
+/*
+ * This is like "get_sha1()", but for struct object_id.
+ */
+int get_oid(const char *name, struct object_id *oid)
+{
+       return get_sha1(name, oid->hash);
+}
+
+
 /*
  * Many callers know that the user meant to name a commit-ish by
  * syntactical positions where the object name appears.  Calling this
@@ -1353,9 +1479,6 @@ static char *resolve_relative_path(const char *rel)
        if (!starts_with(rel, "./") && !starts_with(rel, "../"))
                return NULL;
 
-       if (!startup_info)
-               die("BUG: startup_info struct is not initialized.");
-
        if (!is_inside_work_tree())
                die("relative path syntax can't be used outside working tree.");
 
@@ -1376,6 +1499,9 @@ 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;
        ret = get_sha1_1(name, namelen, sha1, flags);
@@ -1429,7 +1555,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;
@@ -1452,7 +1578,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;
 
index 4d554caf8d751d7a7c8a3a4286a208e0959ab513..11f7dde9d910093dce6a767150bb4823bff80200 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)
@@ -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;
 }
 
@@ -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,19 @@ 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(bitmap_nr, sizeof(uint32_t));
+       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);
        if (!c)
                return;
        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 +512,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);
                }
        }
@@ -546,9 +625,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 +649,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]++;
 }
 
diff --git a/shell.c b/shell.c
index c5439a63e9678e1dc3dfa7d4e1f2a97c331e54d6..464ee1a201ff014c390ddfd653088f7dffd13a84 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -138,24 +138,13 @@ static struct commands {
        { NULL },
 };
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        char *prog;
        const char **user_argv;
        struct commands *cmd;
        int count;
 
-       git_setup_gettext();
-
-       git_extract_argv0_path(argv[0]);
-
-       /*
-        * Always open file descriptors 0/1/2 to avoid clobbering files
-        * in die().  It also avoids messing up when the pipes are dup'ed
-        * onto stdin/stdout/stderr in the child processes we spawn.
-        */
-       sanitize_stdfds();
-
        /*
         * Special hack to pretend to be a CVS server
         */
index de4f86fb970e15491f44dfe38b7d7d6fdc3be9ad..5a326c68602610d856ac543b8bd034542d83f64b 100644 (file)
@@ -17,6 +17,7 @@ struct shortlog {
        char *common_repo_prefix;
        int email;
        struct string_list mailmap;
+       FILE *file;
 };
 
 void shortlog_init(struct shortlog *log);
index acf8d5445ad96aacf6d2c3ccc2d77a3815291228..1ead41e21131fcb3facc71c8e1d96bf5b65dbe8d 100644 (file)
@@ -4,15 +4,13 @@
 static const char show_index_usage[] =
 "git show-index";
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        int i;
        unsigned nr;
        unsigned int version;
        static unsigned int top_index[256];
 
-       git_setup_gettext();
-
        if (argc != 1)
                usage(show_index_usage);
        if (fread(top_index, 2 * 4, 1, stdin) != 1)
index fde8adc000f3167bba7fdf2d7cb3a4e7db612af4..1e4d684d6c5dcdeee94f6eb64cfa6e2f17d44674 100644 (file)
  * the remote died unexpectedly.  A flush() concludes the stream.
  */
 
-#define PREFIX "remote:"
+#define PREFIX "remote: "
 
 #define ANSI_SUFFIX "\033[K"
 #define DUMB_SUFFIX "        "
 
-#define FIX_SIZE 10  /* large enough for any of the above */
-
 int recv_sideband(const char *me, int in_stream, int out)
 {
-       unsigned pf = strlen(PREFIX);
-       unsigned sf;
-       char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
-       char *suffix, *term;
-       int skip_pf = 0;
+       const char *term, *suffix;
+       char buf[LARGE_PACKET_MAX + 1];
+       struct strbuf outbuf = STRBUF_INIT;
+       int retval = 0;
 
-       memcpy(buf, PREFIX, pf);
        term = getenv("TERM");
        if (isatty(2) && term && strcmp(term, "dumb"))
                suffix = ANSI_SUFFIX;
        else
                suffix = DUMB_SUFFIX;
-       sf = strlen(suffix);
 
-       while (1) {
+       while (!retval) {
+               const char *b, *brk;
                int band, len;
-               len = packet_read(in_stream, NULL, NULL, buf + pf, LARGE_PACKET_MAX, 0);
+               len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX, 0);
                if (len == 0)
                        break;
                if (len < 1) {
-                       fprintf(stderr, "%s: protocol error: no band designator\n", me);
-                       return SIDEBAND_PROTOCOL_ERROR;
+                       strbuf_addf(&outbuf,
+                                   "%s%s: protocol error: no band designator",
+                                   outbuf.len ? "\n" : "", me);
+                       retval = SIDEBAND_PROTOCOL_ERROR;
+                       break;
                }
-               band = buf[pf] & 0xff;
+               band = buf[0] & 0xff;
+               buf[len] = '\0';
                len--;
                switch (band) {
                case 3:
-                       buf[pf] = ' ';
-                       buf[pf+1+len] = '\0';
-                       fprintf(stderr, "%s\n", buf);
-                       return SIDEBAND_REMOTE_ERROR;
+                       strbuf_addf(&outbuf, "%s%s%s", outbuf.len ? "\n" : "",
+                                   PREFIX, buf + 1);
+                       retval = SIDEBAND_REMOTE_ERROR;
+                       break;
                case 2:
-                       buf[pf] = ' ';
-                       do {
-                               char *b = buf;
-                               int brk = 0;
+                       b = buf + 1;
 
-                               /*
-                                * If the last buffer didn't end with a line
-                                * break then we should not print a prefix
-                                * this time around.
-                                */
-                               if (skip_pf) {
-                                       b += pf+1;
-                               } else {
-                                       len += pf+1;
-                                       brk += pf+1;
-                               }
-
-                               /* Look for a line break. */
-                               for (;;) {
-                                       brk++;
-                                       if (brk > len) {
-                                               brk = 0;
-                                               break;
-                                       }
-                                       if (b[brk-1] == '\n' ||
-                                           b[brk-1] == '\r')
-                                               break;
-                               }
+                       /*
+                        * Append a suffix to each nonempty line to clear the
+                        * end of the screen line.
+                        *
+                        * The output is accumulated in a buffer and
+                        * each line is printed to stderr using
+                        * write(2) to ensure inter-process atomicity.
+                        */
+                       while ((brk = strpbrk(b, "\n\r"))) {
+                               int linelen = brk - b;
 
-                               /*
-                                * Let's insert a suffix to clear the end
-                                * of the screen line if a line break was
-                                * found.  Also, if we don't skip the
-                                * prefix, then a non-empty string must be
-                                * present too.
-                                */
-                               if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
-                                       char save[FIX_SIZE];
-                                       memcpy(save, b + brk, sf);
-                                       b[brk + sf - 1] = b[brk - 1];
-                                       memcpy(b + brk - 1, suffix, sf);
-                                       fprintf(stderr, "%.*s", brk + sf, b);
-                                       memcpy(b + brk, save, sf);
-                                       len -= brk;
+                               if (!outbuf.len)
+                                       strbuf_addstr(&outbuf, PREFIX);
+                               if (linelen > 0) {
+                                       strbuf_addf(&outbuf, "%.*s%s%c",
+                                                   linelen, b, suffix, *brk);
                                } else {
-                                       int l = brk ? brk : len;
-                                       fprintf(stderr, "%.*s", l, b);
-                                       len -= l;
+                                       strbuf_addch(&outbuf, *brk);
                                }
+                               xwrite(2, outbuf.buf, outbuf.len);
+                               strbuf_reset(&outbuf);
 
-                               skip_pf = !brk;
-                               memmove(buf + pf+1, b + brk, len);
-                       } while (len);
-                       continue;
+                               b = brk + 1;
+                       }
+
+                       if (*b)
+                               strbuf_addf(&outbuf, "%s%s",
+                                           outbuf.len ? "" : PREFIX, b);
+                       break;
                case 1:
-                       write_or_die(out, buf + pf+1, len);
-                       continue;
+                       write_or_die(out, buf + 1, len);
+                       break;
                default:
-                       fprintf(stderr, "%s: protocol error: bad band #%d\n",
-                               me, band);
-                       return SIDEBAND_PROTOCOL_ERROR;
+                       strbuf_addf(&outbuf, "%s%s: protocol error: bad band #%d",
+                                   outbuf.len ? "\n" : "", me, band);
+                       retval = SIDEBAND_PROTOCOL_ERROR;
+                       break;
                }
        }
-       return 0;
+
+       if (outbuf.len) {
+               strbuf_addch(&outbuf, '\n');
+               xwrite(2, outbuf.buf, outbuf.len);
+       }
+       strbuf_release(&outbuf);
+       return retval;
 }
 
 /*
  * fd is connected to the remote side; send the sideband data
  * over multiplexed packet stream.
  */
-ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max)
+void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max)
 {
-       ssize_t ssz = sz;
        const char *p = data;
 
        while (sz) {
@@ -148,5 +131,4 @@ ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet
                p += n;
                sz -= n;
        }
-       return ssz;
 }
index e46bed0b0158c0253bacb2a3db028770ad221666..7a8146f161b7b460d29baea82230c0b6c11c5322 100644 (file)
@@ -5,6 +5,6 @@
 #define SIDEBAND_REMOTE_ERROR -1
 
 int recv_sideband(const char *me, int in_stream, int out);
-ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
+void send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
 
 #endif
index 968b780a06d1f17b190395f06f78fc3124fcf445..615f4cac05f7d381b3c31831b6fd9e8a72e1f982 100644 (file)
@@ -60,7 +60,7 @@ static void mark_base_index_entries(struct index_state *base)
         * To keep track of the shared entries between
         * istate->base->cache[] and istate->cache[], base entry
         * position is stored in each base entry. All positions start
-        * from 1 instead of 0, which is resrved to say "this is a new
+        * from 1 instead of 0, which is reserved to say "this is a new
         * entry".
         */
        for (i = 0; i < base->cache_nr; i++)
@@ -83,8 +83,7 @@ void move_cache_to_base_index(struct index_state *istate)
        si->base->timestamp = istate->timestamp;
        ALLOC_GROW(si->base->cache, istate->cache_nr, si->base->cache_alloc);
        si->base->cache_nr = istate->cache_nr;
-       memcpy(si->base->cache, istate->cache,
-              sizeof(*istate->cache) * istate->cache_nr);
+       COPY_ARRAY(si->base->cache, istate->cache, istate->cache_nr);
        mark_base_index_entries(si->base);
        for (i = 0; i < si->base->cache_nr; i++)
                si->base->cache[i]->ce_flags &= ~CE_UPDATE_IN_BASE;
@@ -141,8 +140,7 @@ void merge_base_index(struct index_state *istate)
        istate->cache       = NULL;
        istate->cache_alloc = 0;
        ALLOC_GROW(istate->cache, istate->cache_nr, istate->cache_alloc);
-       memcpy(istate->cache, si->base->cache,
-              sizeof(*istate->cache) * istate->cache_nr);
+       COPY_ARRAY(istate->cache, si->base->cache, istate->cache_nr);
 
        si->nr_deletions = 0;
        si->nr_replacements = 0;
@@ -189,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.
                 */
index f60e2ee72ba86cbd6c66622366af4a7faf25e1a0..8fec6579f70cae4bc6b330e4e0ca3e7cc595f366 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -187,7 +187,7 @@ void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len)
 
 void strbuf_remove(struct strbuf *sb, size_t pos, size_t len)
 {
-       strbuf_splice(sb, pos, len, NULL, 0);
+       strbuf_splice(sb, pos, len, "", 0);
 }
 
 void strbuf_add(struct strbuf *sb, const void *data, size_t len)
@@ -197,6 +197,13 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
        strbuf_setlen(sb, sb->len + len);
 }
 
+void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
+{
+       strbuf_grow(sb, sb2->len);
+       memcpy(sb->buf + sb->len, sb2->buf, sb2->len);
+       strbuf_setlen(sb, sb->len + sb2->len);
+}
+
 void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len)
 {
        strbuf_grow(sb, len);
@@ -395,6 +402,12 @@ ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint)
        return cnt;
 }
 
+ssize_t strbuf_write(struct strbuf *sb, FILE *f)
+{
+       return sb->len ? fwrite(sb->buf, 1, sb->len, f) : 0;
+}
+
+
 #define STRBUF_MAXLINK (2*PATH_MAX)
 
 int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
@@ -481,9 +494,15 @@ int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
        if (errno == ENOMEM)
                die("Out of memory, getdelim failed");
 
-       /* Restore slopbuf that we moved out of the way before */
+       /*
+        * Restore strbuf invariants; if getdelim left us with a NULL pointer,
+        * we can just re-init, but otherwise we should make sure that our
+        * length is empty, and that the result is NUL-terminated.
+        */
        if (!sb->buf)
                strbuf_init(sb, 0);
+       else
+               strbuf_reset(sb);
        return EOF;
 }
 #else
@@ -851,3 +870,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 f72fd14c2eaded0399b779150ea1565edd7bf47a..2262b12683b5d91d536baa0b71094098872200d1 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -263,11 +263,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s)
 /**
  * Copy the contents of another buffer at the end of the current one.
  */
-static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
-{
-       strbuf_grow(sb, sb2->len);
-       strbuf_add(sb, sb2->buf, sb2->len);
-}
+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
@@ -377,6 +373,8 @@ extern ssize_t strbuf_read_once(struct strbuf *, int fd, size_t hint);
 /**
  * Read the contents of a file, specified by its path. The third argument
  * can be used to give a hint about the file size, to avoid reallocs.
+ * Return the number of bytes read or a negative value if some error
+ * occurred while opening or reading the file.
  */
 extern ssize_t strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
 
@@ -386,6 +384,12 @@ extern ssize_t strbuf_read_file(struct strbuf *sb, const char *path, size_t hint
  */
 extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
 
+/**
+ * Write the whole content of the strbuf to the stream not stopping at
+ * NUL bytes.
+ */
+extern ssize_t strbuf_write(struct strbuf *sb, FILE *stream);
+
 /**
  * Read a line from a FILE *, overwriting the existing contents of
  * the strbuf.  The strbuf_getline*() family of functions share
@@ -439,6 +443,14 @@ extern int strbuf_getcwd(struct strbuf *sb);
  */
 extern void strbuf_add_absolute_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.
index 811fcc24d2a8ba56c233ae4e37b7acac29a4a0d8..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);
 
@@ -337,17 +337,17 @@ static open_method_decl(loose)
        st->u.loose.mapped = map_sha1_file(sha1, &st->u.loose.mapsize);
        if (!st->u.loose.mapped)
                return -1;
-       if (unpack_sha1_header(&st->z,
-                              st->u.loose.mapped,
-                              st->u.loose.mapsize,
-                              st->u.loose.hdr,
-                              sizeof(st->u.loose.hdr)) < 0) {
+       if ((unpack_sha1_header(&st->z,
+                               st->u.loose.mapped,
+                               st->u.loose.mapsize,
+                               st->u.loose.hdr,
+                               sizeof(st->u.loose.hdr)) < 0) ||
+           (parse_sha1_header(st->u.loose.hdr, &st->size) < 0)) {
                git_inflate_end(&st->z);
                munmap(st->u.loose.mapped, st->u.loose.mapsize);
                return -1;
        }
 
-       parse_sha1_header(st->u.loose.hdr, &st->size);
        st->u.loose.hdr_used = strlen(st->u.loose.hdr) + 1;
        st->u.loose.hdr_avail = st->z.total_out;
        st->z_state = z_used;
@@ -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 2a32a3f1f5d250d7ea2a1b4a65998eeddb44962e..8c83cac189e94c327327e47cfaadfd621d59b6b9 100644 (file)
@@ -225,18 +225,18 @@ static int cmp_items(const void *a, const void *b)
 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(list->items, list->nr, cmp_items);
 }
 
 struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
                                                     const char *string)
 {
-       int i;
+       struct string_list_item *item;
        compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
 
-       for (i = 0; i < list->nr; i++)
-               if (!cmp(string, list->items[i].string))
-                       return list->items + i;
+       for_each_string_list_item(item, list)
+               if (!cmp(string, item->string))
+                       return item;
        return NULL;
 }
 
index 92502b594d055bbf99fd203175d7dffaf8dfb732..098085be69b97687b0febfe9e29c6dc0c64569a1 100644 (file)
@@ -30,7 +30,7 @@ enum lookup_type {
        lookup_path
 };
 
-static struct submodule_cache cache;
+static struct submodule_cache the_submodule_cache;
 static int is_cache_init;
 
 static int config_path_cmp(const struct submodule_entry *a,
@@ -59,6 +59,8 @@ static void free_one_config(struct submodule_entry *entry)
 {
        free((void *) entry->config->path);
        free((void *) entry->config->name);
+       free((void *) entry->config->branch);
+       free((void *) entry->config->update_strategy.command);
        free(entry->config);
 }
 
@@ -194,8 +196,12 @@ static struct submodule *lookup_or_create_by_name(struct submodule_cache *cache,
 
        submodule->path = NULL;
        submodule->url = NULL;
+       submodule->update_strategy.type = SM_UPDATE_UNSPECIFIED;
+       submodule->update_strategy.command = NULL;
        submodule->fetch_recurse = RECURSE_SUBMODULES_NONE;
        submodule->ignore = NULL;
+       submodule->branch = NULL;
+       submodule->recommend_shallow = -1;
 
        hashcpy(submodule->gitmodules_sha1, gitmodules_sha1);
 
@@ -293,7 +299,7 @@ static int parse_config(const char *var, const char *value, void *data)
        if (!strcmp(item.buf, "path")) {
                if (!value)
                        ret = config_error_nonbool(var);
-               else if (!me->overwrite && submodule->path != NULL)
+               else if (!me->overwrite && submodule->path)
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "path");
                else {
@@ -317,7 +323,7 @@ static int parse_config(const char *var, const char *value, void *data)
        } else if (!strcmp(item.buf, "ignore")) {
                if (!value)
                        ret = config_error_nonbool(var);
-               else if (!me->overwrite && submodule->ignore != NULL)
+               else if (!me->overwrite && submodule->ignore)
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "ignore");
                else if (strcmp(value, "untracked") &&
@@ -333,13 +339,38 @@ static int parse_config(const char *var, const char *value, void *data)
        } else if (!strcmp(item.buf, "url")) {
                if (!value) {
                        ret = config_error_nonbool(var);
-               } else if (!me->overwrite && submodule->url != NULL) {
+               } else if (!me->overwrite && submodule->url) {
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "url");
                } else {
                        free((void *) submodule->url);
                        submodule->url = xstrdup(value);
                }
+       } else if (!strcmp(item.buf, "update")) {
+               if (!value)
+                       ret = config_error_nonbool(var);
+               else if (!me->overwrite &&
+                        submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
+                       warn_multiple_config(me->commit_sha1, 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,
+                                            "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,
+                                            "branch");
+               else {
+                       free((void *)submodule->branch);
+                       submodule->branch = xstrdup(value);
+               }
        }
 
        strbuf_release(&name);
@@ -349,21 +380,20 @@ static int parse_config(const char *var, const char *value, void *data)
 }
 
 static int gitmodule_sha1_from_commit(const unsigned char *commit_sha1,
-                                     unsigned char *gitmodules_sha1)
+                                     unsigned char *gitmodules_sha1,
+                                     struct strbuf *rev)
 {
-       struct strbuf rev = STRBUF_INIT;
        int ret = 0;
 
        if (is_null_sha1(commit_sha1)) {
-               hashcpy(gitmodules_sha1, null_sha1);
+               hashclr(gitmodules_sha1);
                return 1;
        }
 
-       strbuf_addf(&rev, "%s:.gitmodules", sha1_to_hex(commit_sha1));
-       if (get_sha1(rev.buf, gitmodules_sha1) >= 0)
+       strbuf_addf(rev, "%s:.gitmodules", sha1_to_hex(commit_sha1));
+       if (get_sha1(rev->buf, gitmodules_sha1) >= 0)
                ret = 1;
 
-       strbuf_release(&rev);
        return ret;
 }
 
@@ -377,7 +407,7 @@ static const struct submodule *config_from(struct submodule_cache *cache,
 {
        struct strbuf rev = STRBUF_INIT;
        unsigned long config_size;
-       char *config;
+       char *config = NULL;
        unsigned char sha1[20];
        enum object_type type;
        const struct submodule *submodule = NULL;
@@ -392,15 +422,14 @@ static const struct submodule *config_from(struct submodule_cache *cache,
                struct hashmap_iter iter;
                struct submodule_entry *entry;
 
-               hashmap_iter_init(&cache->for_name, &iter);
-               entry = hashmap_iter_next(&iter);
+               entry = hashmap_iter_first(&cache->for_name, &iter);
                if (!entry)
                        return NULL;
                return entry->config;
        }
 
-       if (!gitmodule_sha1_from_commit(commit_sha1, sha1))
-               return NULL;
+       if (!gitmodule_sha1_from_commit(commit_sha1, sha1, &rev))
+               goto out;
 
        switch (lookup_type) {
        case lookup_name:
@@ -411,24 +440,20 @@ static const struct submodule *config_from(struct submodule_cache *cache,
                break;
        }
        if (submodule)
-               return submodule;
+               goto out;
 
        config = read_sha1_file(sha1, &type, &config_size);
-       if (!config)
-               return NULL;
-
-       if (type != OBJ_BLOB) {
-               free(config);
-               return NULL;
-       }
+       if (!config || type != OBJ_BLOB)
+               goto out;
 
        /* fill the submodule config into the cache */
        parameter.cache = cache;
        parameter.commit_sha1 = commit_sha1;
        parameter.gitmodules_sha1 = sha1;
        parameter.overwrite = 0;
-       git_config_from_mem(parse_config, "submodule-blob", rev.buf,
+       git_config_from_mem(parse_config, CONFIG_ORIGIN_SUBMODULE_BLOB, rev.buf,
                        config, config_size, &parameter);
+       strbuf_release(&rev);
        free(config);
 
        switch (lookup_type) {
@@ -439,6 +464,11 @@ static const struct submodule *config_from(struct submodule_cache *cache,
        default:
                return NULL;
        }
+
+out:
+       strbuf_release(&rev);
+       free(config);
+       return submodule;
 }
 
 static const struct submodule *config_from_path(struct submodule_cache *cache,
@@ -458,14 +488,14 @@ static void ensure_cache_init(void)
        if (is_cache_init)
                return;
 
-       cache_init(&cache);
+       cache_init(&the_submodule_cache);
        is_cache_init = 1;
 }
 
 int parse_submodule_config_option(const char *var, const char *value)
 {
        struct parse_config_parameter parameter;
-       parameter.cache = &cache;
+       parameter.cache = &the_submodule_cache;
        parameter.commit_sha1 = NULL;
        parameter.gitmodules_sha1 = null_sha1;
        parameter.overwrite = 1;
@@ -478,18 +508,18 @@ const struct submodule *submodule_from_name(const unsigned char *commit_sha1,
                const char *name)
 {
        ensure_cache_init();
-       return config_from_name(&cache, commit_sha1, name);
+       return config_from_name(&the_submodule_cache, commit_sha1, name);
 }
 
 const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
                const char *path)
 {
        ensure_cache_init();
-       return config_from_path(&cache, commit_sha1, path);
+       return config_from_path(&the_submodule_cache, commit_sha1, path);
 }
 
 void submodule_free(void)
 {
-       cache_free(&cache);
+       cache_free(&the_submodule_cache);
        is_cache_init = 0;
 }
index 9bfa65af034fd39cb5bda1cdc1460f6d9b7394df..d05c542d2cdace181ea72055c0f71db6b1afda42 100644 (file)
@@ -2,6 +2,7 @@
 #define SUBMODULE_CONFIG_CACHE_H
 
 #include "hashmap.h"
+#include "submodule.h"
 #include "strbuf.h"
 
 /*
@@ -14,8 +15,11 @@ struct submodule {
        const char *url;
        int fetch_recurse;
        const char *ignore;
+       const char *branch;
+       struct submodule_update_strategy update_strategy;
        /* the sha1 blob id of the responsible .gitmodules file */
        unsigned char gitmodules_sha1[20];
+       int recommend_shallow;
 };
 
 int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
index 62c4356c50d4a41381336559f4e9af27e520ad0d..ece17315d671cf182f21c261d879c58f193cde09 100644 (file)
 #include "argv-array.h"
 #include "blob.h"
 #include "thread-utils.h"
+#include "quote.h"
 
 static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
-static struct string_list changed_submodule_paths;
+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;
@@ -121,35 +123,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;
@@ -169,7 +152,12 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
 
 int submodule_config(const char *var, const char *value, void *cb)
 {
-       if (starts_with(var, "submodule."))
+       if (!strcmp(var, "submodule.fetchjobs")) {
+               parallel_jobs = git_config_int(var, value);
+               if (parallel_jobs < 0)
+                       die(_("negative values not allowed for submodule.fetchJobs"));
+               return 0;
+       } else if (starts_with(var, "submodule."))
                return parse_submodule_config_option(var, value);
        else if (!strcmp(var, "fetch.recursesubmodules")) {
                config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value);
@@ -210,6 +198,48 @@ void gitmodules_config(void)
        }
 }
 
+int parse_submodule_update_strategy(const char *value,
+               struct submodule_update_strategy *dst)
+{
+       free((void*)dst->command);
+       dst->command = NULL;
+       if (!strcmp(value, "none"))
+               dst->type = SM_UPDATE_NONE;
+       else if (!strcmp(value, "checkout"))
+               dst->type = SM_UPDATE_CHECKOUT;
+       else if (!strcmp(value, "rebase"))
+               dst->type = SM_UPDATE_REBASE;
+       else if (!strcmp(value, "merge"))
+               dst->type = SM_UPDATE_MERGE;
+       else if (skip_prefix(value, "!", &value)) {
+               dst->type = SM_UPDATE_COMMAND;
+               dst->command = xstrdup(value);
+       } else
+               return -1;
+       return 0;
+}
+
+const char *submodule_strategy_to_string(const struct submodule_update_strategy *s)
+{
+       struct strbuf sb = STRBUF_INIT;
+       switch (s->type) {
+       case SM_UPDATE_CHECKOUT:
+               return "checkout";
+       case SM_UPDATE_MERGE:
+               return "merge";
+       case SM_UPDATE_REBASE:
+               return "rebase";
+       case SM_UPDATE_NONE:
+               return "none";
+       case SM_UPDATE_UNSPECIFIED:
+               return NULL;
+       case SM_UPDATE_COMMAND:
+               strbuf_addf(&sb, "!%s", s->command);
+               return strbuf_detach(&sb, NULL);
+       }
+       return NULL;
+}
+
 void handle_ignore_submodules_arg(struct diff_options *diffopt,
                                  const char *arg)
 {
@@ -229,9 +259,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);
@@ -240,13 +270,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,
@@ -284,31 +307,23 @@ static void print_submodule_summary(struct rev_info *rev, FILE *f,
        strbuf_release(&sb);
 }
 
-void show_submodule_summary(FILE *f, const char *path,
+/* 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);
@@ -316,30 +331,162 @@ 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;
        }
 
-       strbuf_addf(&sb, "%s%sSubmodule %s %s..", line_prefix, meta, path,
-                       find_unique_abbrev(one, DEFAULT_ABBREV));
-       if (!fast_backward && !fast_forward)
-               strbuf_addch(&sb, '.');
-       strbuf_addf(&sb, "%s", find_unique_abbrev(two, DEFAULT_ABBREV));
+output_header:
+       strbuf_addf(&sb, "%s%sSubmodule %s ", line_prefix, meta, path);
+       strbuf_add_unique_abbrev(&sb, one->hash, DEFAULT_ABBREV);
+       strbuf_addstr(&sb, (fast_backward || fast_forward) ? ".." : "...");
+       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));
+
+       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)
@@ -353,27 +500,67 @@ static int has_remote(const char *refname, const struct object_id *oid,
        return 1;
 }
 
-static int submodule_needs_pushing(const char *path, const unsigned char sha1[20])
+static int append_sha1_to_argv(const unsigned char sha1[20], void *data)
+{
+       struct argv_array *argv = data;
+       argv_array_push(argv, sha1_to_hex(sha1));
+       return 0;
+}
+
+static int check_has_commit(const unsigned char sha1[20], void *data)
+{
+       int *has_commit = data;
+
+       if (!lookup_commit_reference(sha1))
+               *has_commit = 0;
+
+       return 0;
+}
+
+static int submodule_has_commits(const char *path, struct sha1_array *commits)
+{
+       int has_commit = 1;
+
+       if (add_submodule_odb(path))
+               return 0;
+
+       sha1_array_for_each_unique(commits, check_has_commit, &has_commit);
+       return has_commit;
+}
+
+static int submodule_needs_pushing(const char *path, struct sha1_array *commits)
 {
-       if (add_submodule_odb(path) || !lookup_commit_reference(sha1))
+       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;
-               cp.env = local_repo_env;
+               argv_array_push(&cp.args, "rev-list");
+               sha1_array_for_each_unique(commits, append_sha1_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);
@@ -385,19 +572,34 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
        return 0;
 }
 
+static struct sha1_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 sha1_array *) item->util;
+
+       /* NEEDSWORK: should we have sha1_array_init()? */
+       item->util = xcalloc(1, sizeof(struct sha1_array));
+       return (struct sha1_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 sha1_array *commits;
                if (!S_ISGITLINK(p->two->mode))
                        continue;
-               if (submodule_needs_pushing(p->two->path, p->two->sha1))
-                       string_list_insert(needs_pushing, p->two->path);
+               commits = submodule_commits(submodules, p->two->path);
+               sha1_array_append(commits, p->two->oid.hash);
        }
 }
 
@@ -413,47 +615,64 @@ 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)
+               sha1_array_clear((struct sha1_array *) item->util);
+       string_list_clear(submodules, 1);
+}
+
+int find_unpushed_submodules(struct sha1_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");
+       sha1_array_for_each_unique(commits, append_sha1_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 sha1_array *commits = (struct sha1_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, 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");
 
-               cp.argv = argv;
-               cp.env = local_repo_env;
+               prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
                cp.dir = path;
@@ -465,18 +684,20 @@ static int push_submodule(const char *path)
        return 1;
 }
 
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name)
+int push_unpushed_submodules(struct sha1_array *commits,
+                            const char *remotes_name,
+                            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, remotes_name, &needs_pushing))
                return 1;
 
        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, dry_run)) {
                        fprintf(stderr, "Unable to push submodule '%s'\n", path);
                        ret = 0;
                }
@@ -499,7 +720,7 @@ static int is_submodule_commit_present(const char *path, unsigned char sha1[20])
 
                argv[3] = sha1_to_hex(sha1);
                cp.argv = argv;
-               cp.env = local_repo_env;
+               prepare_submodule_repo_env(&cp.env_array);
                cp.git_cmd = 1;
                cp.no_stdin = 1;
                cp.dir = path;
@@ -528,7 +749,7 @@ static void submodule_collect_changed_cb(struct diff_queue_struct *q,
                         * being moved around. */
                        struct string_list_item *path;
                        path = unsorted_string_list_lookup(&changed_submodule_paths, p->two->path);
-                       if (!path && !is_submodule_commit_present(p->two->path, p->two->sha1))
+                       if (!path && !is_submodule_commit_present(p->two->path, p->two->oid.hash))
                                string_list_append(&changed_submodule_paths, xstrdup(p->two->path));
                } else {
                        /* Submodule is new or was moved here */
@@ -559,9 +780,10 @@ void check_for_new_submodule_commits(unsigned char new_sha1[20])
        sha1_array_append(&ref_tips_after_fetch, new_sha1);
 }
 
-static void add_sha1_to_argv(const unsigned char sha1[20], void *data)
+static int add_sha1_to_argv(const unsigned char sha1[20], void *data)
 {
        argv_array_push(data, sha1_to_hex(sha1));
+       return 0;
 }
 
 static void calculate_changed_submodule_paths(void)
@@ -682,7 +904,7 @@ static int get_next_submodule(struct child_process *cp,
                if (is_directory(git_dir)) {
                        child_process_init(cp);
                        cp->dir = strbuf_detach(&submodule_path, NULL);
-                       cp->env = local_repo_env;
+                       prepare_submodule_repo_env(&cp->env_array);
                        cp->git_cmd = 1;
                        if (!spf->quiet)
                                strbuf_addf(err, "Fetching submodule %s%s\n",
@@ -750,6 +972,9 @@ int fetch_populated_submodules(const struct argv_array *options,
        argv_array_push(&spf.args, "--recurse-submodules-default");
        /* default value, "--submodule-prefix" and its value are added later */
 
+       if (max_parallel_jobs < 0)
+               max_parallel_jobs = parallel_jobs;
+
        calculate_changed_submodule_paths();
        run_processes_parallel(max_parallel_jobs,
                               get_next_submodule,
@@ -794,7 +1019,7 @@ unsigned is_submodule_modified(const char *path, int ignore_untracked)
                argv[2] = "-uno";
 
        cp.argv = argv;
-       cp.env = local_repo_env;
+       prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
@@ -855,7 +1080,7 @@ int submodule_uses_gitfile(const char *path)
 
        /* Now test that all nested submodules use a gitfile too */
        cp.argv = argv;
-       cp.env = local_repo_env;
+       prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.no_stderr = 1;
@@ -888,7 +1113,7 @@ int ok_to_remove_submodule(const char *path)
                return 0;
 
        cp.argv = argv;
-       cp.env = local_repo_env;
+       prepare_submodule_repo_env(&cp.env_array);
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
@@ -1094,3 +1319,19 @@ void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
        strbuf_release(&rel_path);
        free((void *)real_work_tree);
 }
+
+int parallel_submodules(void)
+{
+       return parallel_jobs;
+}
+
+void prepare_submodule_repo_env(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);
+       }
+       argv_array_push(out, "GIT_DIR=.git");
+}
index e06eaa5ebb30e825fd0721c76e7d194b0b854706..23d76682b1ea123d040a29f6f9613c3e1794f87d 100644 (file)
@@ -3,6 +3,7 @@
 
 struct diff_options;
 struct argv_array;
+struct sha1_array;
 
 enum {
        RECURSE_SUBMODULES_CHECK = -4,
@@ -14,6 +15,21 @@ enum {
        RECURSE_SUBMODULES_ON = 2
 };
 
+enum submodule_update_type {
+       SM_UPDATE_UNSPECIFIED = 0,
+       SM_UPDATE_CHECKOUT,
+       SM_UPDATE_REBASE,
+       SM_UPDATE_MERGE,
+       SM_UPDATE_NONE,
+       SM_UPDATE_COMMAND
+};
+
+struct submodule_update_strategy {
+       enum submodule_update_type type;
+       const char *command;
+};
+#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);
@@ -22,12 +38,21 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
                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,
+               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,
                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 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);
 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,
@@ -38,9 +63,19 @@ 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,
+int find_unpushed_submodules(struct sha1_array *commits, const char *remotes_name,
                struct string_list *needs_pushing);
-int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
+extern int push_unpushed_submodules(struct sha1_array *commits,
+                                   const char *remotes_name,
+                                   int dry_run);
 void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
+int parallel_submodules(void);
+
+/*
+ * 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);
 
 #endif
index 18e2b28b263682a9eb6902b62535c228be1f36af..d613935f1455440843920e1f040b1e97ff3f27dd 100644 (file)
@@ -52,7 +52,8 @@ clean-except-prove-cache:
 clean: clean-except-prove-cache
        $(RM) .prove
 
-test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax
+test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \
+       test-lint-filenames
 
 test-lint-duplicates:
        @dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \
@@ -67,6 +68,14 @@ test-lint-executable:
 test-lint-shell-syntax:
        @'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS)
 
+test-lint-filenames:
+       @# We do *not* pass a glob to ls-files but use grep instead, to catch
+       @# non-ASCII characters (which are quoted within double-quotes)
+       @bad="$$(git -c core.quotepath=true ls-files 2>/dev/null | \
+                       grep '["*:<>?\\|]')"; \
+               test -z "$$bad" || { \
+               echo >&2 "non-portable file name(s): $$bad"; exit 1; }
+
 aggregate-results-and-cleanup: $(T)
        $(MAKE) aggregate-results
        $(MAKE) clean
index 1dc908e43a993502bed611023448aa76fc9da6ad..4982d1c5216c10b7d44e66eace34e40d49cb5b2f 100644 (file)
--- a/t/README
+++ b/t/README
@@ -84,9 +84,9 @@ appropriately before running "make".
 
 -x::
        Turn on shell tracing (i.e., `set -x`) during the tests
-       themselves. Implies `--verbose`. Note that this can cause
-       failures in some tests which redirect and test the
-       output of shell functions. Use with caution.
+       themselves. Implies `--verbose`. Note that in non-bash shells,
+       this can cause failures in some tests which redirect and test
+       the output of shell functions. Use with caution.
 
 -d::
 --debug::
@@ -153,6 +153,12 @@ appropriately before running "make".
        As the names depend on the tests' file names, it is safe to
        run the tests with this option in parallel.
 
+--verbose-log::
+       Write verbose output to the same logfile as `--tee`, but do
+       _not_ write it to stdout. Unlike `--tee --verbose`, this option
+       is safe to use when stdout is being consumed by a TAP parser
+       like `prove`. Implies `--tee` and `--verbose`.
+
 --with-dashes::
        By default tests are run without dashed forms of
        commands (like git-commit) in the PATH (it only uses
@@ -265,7 +271,7 @@ right, so this:
     $ sh ./t9200-git-cvsexport-commit.sh --run='1-4 !3'
 
 will run tests 1, 2, and 4.  Items that comes later have higher
-precendence.  It means that this:
+precedence.  It means that this:
 
     $ sh ./t9200-git-cvsexport-commit.sh --run='!3 1-4'
 
diff --git a/t/helper/.gitignore b/t/helper/.gitignore
new file mode 100644 (file)
index 0000000..d6e8b36
--- /dev/null
@@ -0,0 +1,33 @@
+/test-chmtime
+/test-ctype
+/test-config
+/test-date
+/test-delta
+/test-dump-cache-tree
+/test-dump-split-index
+/test-dump-untracked-cache
+/test-fake-ssh
+/test-scrap-cache-tree
+/test-genrandom
+/test-hashmap
+/test-index-version
+/test-line-buffer
+/test-match-trees
+/test-mergesort
+/test-mktemp
+/test-parse-options
+/test-path-utils
+/test-prio-queue
+/test-read-cache
+/test-regex
+/test-revision-walking
+/test-run-command
+/test-sha1
+/test-sha1-array
+/test-sigchain
+/test-string-list
+/test-submodule-config
+/test-subprocess
+/test-svn-fe
+/test-urlmatch-normalization
+/test-wildmatch
similarity index 98%
rename from test-chmtime.c
rename to t/helper/test-chmtime.c
index dfe8a83261b3623e64f99ddf8dc775616771ec4d..e760256406fa9c2fe0f9b2cde0ffb97ff11c6cab 100644 (file)
@@ -56,7 +56,7 @@ static int timespec_arg(const char *arg, long int *set_time, int *set_eq)
        return 1;
 }
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        static int verbose;
 
similarity index 80%
rename from test-config.c
rename to t/helper/test-config.c
index 6a775522105d9bfc5c1c60f36944bc43e64badef..83a4f2ab86999876ecfb78c7e6dd108eb09b04ae 100644 (file)
@@ -25,6 +25,9 @@
  *                             ascending order of priority from a config_set
  *                             constructed from files entered as arguments.
  *
+ * iterate -> iterate over all values using git_config(), and print some
+ *            data for each
+ *
  * Examples:
  *
  * To print the value with highest priority for key "foo.bAr Baz.rock":
  *
  */
 
+static const char *scope_name(enum config_scope scope)
+{
+       switch (scope) {
+       case CONFIG_SCOPE_SYSTEM:
+               return "system";
+       case CONFIG_SCOPE_GLOBAL:
+               return "global";
+       case CONFIG_SCOPE_REPO:
+               return "repo";
+       case CONFIG_SCOPE_CMDLINE:
+               return "cmdline";
+       default:
+               return "unknown";
+       }
+}
+static int iterate_cb(const char *var, const char *value, void *data)
+{
+       static int nr;
+
+       if (nr++)
+               putchar('\n');
 
-int main(int argc, char **argv)
+       printf("key=%s\n", var);
+       printf("value=%s\n", value ? value : "(null)");
+       printf("origin=%s\n", current_config_origin_type());
+       printf("name=%s\n", current_config_name());
+       printf("scope=%s\n", scope_name(current_config_scope()));
+
+       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;
+
+       setup_git_directory();
+
        git_configset_init(&cs);
 
        if (argc < 2) {
@@ -134,6 +170,9 @@ int main(int argc, char **argv)
                        printf("Value not found for \"%s\"\n", argv[2]);
                        goto exit1;
                }
+       } else if (!strcmp(argv[1], "iterate")) {
+               git_config(iterate_cb, NULL);
+               goto exit0;
        }
 
        die("%s: Please check the syntax and the function name", argv[0]);
similarity index 95%
rename from test-ctype.c
rename to t/helper/test-ctype.c
index 707a821f03d59b1b3685b380fa4f3e83535c5342..bb72c47df570d9c07ae4567fd6d31ea49fe49656 100644 (file)
@@ -28,7 +28,7 @@ static int is_in(const char *s, int ch)
 #define LOWER "abcdefghijklmnopqrstuvwxyz"
 #define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        TEST_CLASS(isdigit, DIGIT);
        TEST_CLASS(isspace, " \n\r\t");
similarity index 56%
rename from test-date.c
rename to t/helper/test-date.c
index 63f373557e7236d294fb580d38db9e6d331e53d3..506054bcd5dfbd76c8aec85382f35794514b9db9 100644 (file)
@@ -1,11 +1,12 @@
 #include "cache.h"
 
 static const char *usage_msg = "\n"
-"  test-date show [time_t]...\n"
+"  test-date relative [time_t]...\n"
+"  test-date show:<format> [time_t]...\n"
 "  test-date parse [date]...\n"
 "  test-date approxidate [date]...\n";
 
-static void show_dates(char **argv, struct timeval *now)
+static void show_relative_dates(const char **argv, struct timeval *now)
 {
        struct strbuf buf = STRBUF_INIT;
 
@@ -17,7 +18,30 @@ static void show_dates(char **argv, struct timeval *now)
        strbuf_release(&buf);
 }
 
-static void parse_dates(char **argv, struct timeval *now)
+static void show_dates(const char **argv, const char *format)
+{
+       struct date_mode mode;
+
+       parse_date_format(format, &mode);
+       for (; *argv; argv++) {
+               char *arg;
+               time_t t;
+               int tz;
+
+               /*
+                * Do not use our normal timestamp parsing here, as the point
+                * is to test the formatting code in isolation.
+                */
+               t = strtol(*argv, &arg, 10);
+               while (*arg == ' ')
+                       arg++;
+               tz = atoi(arg);
+
+               printf("%s -> %s\n", *argv, show_date(t, tz, &mode));
+       }
+}
+
+static void parse_dates(const char **argv, struct timeval *now)
 {
        struct strbuf result = STRBUF_INIT;
 
@@ -36,7 +60,7 @@ static void parse_dates(char **argv, struct timeval *now)
        strbuf_release(&result);
 }
 
-static void parse_approxidate(char **argv, struct timeval *now)
+static void parse_approxidate(const char **argv, struct timeval *now)
 {
        for (; *argv; argv++) {
                time_t t;
@@ -45,7 +69,7 @@ static void parse_approxidate(char **argv, struct timeval *now)
        }
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct timeval now;
        const char *x;
@@ -61,8 +85,10 @@ int main(int argc, char **argv)
        argv++;
        if (!*argv)
                usage(usage_msg);
-       if (!strcmp(*argv, "show"))
-               show_dates(argv+1, &now);
+       if (!strcmp(*argv, "relative"))
+               show_relative_dates(argv+1, &now);
+       else if (skip_prefix(*argv, "show:", &x))
+               show_dates(argv+1, x);
        else if (!strcmp(*argv, "parse"))
                parse_dates(argv+1, &now);
        else if (!strcmp(*argv, "approxidate"))
similarity index 97%
rename from test-delta.c
rename to t/helper/test-delta.c
index 4595cd6433f9fd543791ee5a8a59a9112b50c046..59937dc1be1c4f0b3d80e3ef3a86e09bff3703b6 100644 (file)
@@ -15,7 +15,7 @@
 static const char usage_str[] =
        "test-delta (-d|-p) <from_file> <data_file> <out_file>";
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        int fd;
        struct stat st;
similarity index 96%
rename from test-dump-cache-tree.c
rename to t/helper/test-dump-cache-tree.c
index bb53c0aa655c7a2df09638024b304a79e8b07fc6..7af116d49e04777b9321044e199254a2211aa4d4 100644 (file)
@@ -54,10 +54,11 @@ static int dump_cache_tree(struct cache_tree *it,
        return errs;
 }
 
-int main(int ac, char **av)
+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;
similarity index 89%
rename from test-dump-split-index.c
rename to t/helper/test-dump-split-index.c
index 861d28c9b6c1b4d95f74ffbd95bc279ea0d377eb..e44430b699db732252afa6fcb06686ec89b5811d 100644 (file)
@@ -7,7 +7,7 @@ static void show_bit(size_t pos, void *data)
        printf(" %d", (int)pos);
 }
 
-int main(int ac, char **av)
+int cmd_main(int ac, const char **av)
 {
        struct split_index *si;
        int i;
@@ -23,7 +23,7 @@ int main(int ac, 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)
similarity index 88%
rename from test-dump-untracked-cache.c
rename to t/helper/test-dump-untracked-cache.c
index 0a1c28524668f02d3aa4d073c0c6991652cbf850..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,
@@ -40,7 +38,7 @@ static void dump(struct untracked_cache_dir *ucd, struct strbuf *base)
        strbuf_setlen(base, len);
 }
 
-int main(int ac, char **av)
+int cmd_main(int ac, const char **av)
 {
        struct untracked_cache *uc;
        struct strbuf base = STRBUF_INIT;
similarity index 94%
rename from test-fake-ssh.c
rename to t/helper/test-fake-ssh.c
index 980de216e10990a6406cae6e0b023c5fee7de488..12beee99ad2f4e70e804b21895522d6d362929d2 100644 (file)
@@ -2,7 +2,7 @@
 #include "run-command.h"
 #include "strbuf.h"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        const char *trash_directory = getenv("TRASH_DIRECTORY");
        struct strbuf buf = STRBUF_INIT;
similarity index 94%
rename from test-genrandom.c
rename to t/helper/test-genrandom.c
index 54824d075421e792f337beb5cdce170a33b00e68..8d11d22d98649900b6d558cc174e2af1dbff9948 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "git-compat-util.h"
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        unsigned long count, next = 0;
        unsigned char *c;
similarity index 99%
rename from test-hashmap.c
rename to t/helper/test-hashmap.c
index cc2891dd971edfa70733eb327d12ccb66fd09f3e..7aa9440e274fb443a30b3f61a241f4fea1601f10 100644 (file)
@@ -138,7 +138,7 @@ static void perf_hashmap(unsigned int method, unsigned int rounds)
  *
  * perfhashmap method rounds -> test hashmap.[ch] performance
  */
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        char line[1024];
        struct hashmap map;
similarity index 84%
rename from test-index-version.c
rename to t/helper/test-index-version.c
index 05d4699c4a6cf32b2b6291e275dafa2744fe19d6..f569f6b7eff87227f82dbe6390fd31fb970a5fca 100644 (file)
@@ -1,6 +1,6 @@
 #include "cache.h"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct cache_header hdr;
        int version;
similarity index 98%
rename from test-line-buffer.c
rename to t/helper/test-line-buffer.c
index 1e58f0476f3465f9b8b361cc4776abf5c051430b..81575fe2ab91b550067ce8180650b003bdd939b7 100644 (file)
@@ -50,7 +50,7 @@ static void handle_line(const char *line, struct line_buffer *stdin_buf)
        handle_command(line, arg + 1, stdin_buf);
 }
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        struct line_buffer stdin_buf = LINE_BUFFER_INIT;
        struct line_buffer file_buf = LINE_BUFFER_INIT;
diff --git a/t/helper/test-match-trees.c b/t/helper/test-match-trees.c
new file mode 100644 (file)
index 0000000..e939502
--- /dev/null
@@ -0,0 +1,26 @@
+#include "cache.h"
+#include "tree.h"
+
+int cmd_main(int ac, const char **av)
+{
+       struct object_id hash1, hash2, shifted;
+       struct tree *one, *two;
+
+       setup_git_directory();
+
+       if (get_oid(av[1], &hash1))
+               die("cannot parse %s as an object name", av[1]);
+       if (get_oid(av[2], &hash2))
+               die("cannot parse %s as an object name", av[2]);
+       one = parse_tree_indirect(hash1.hash);
+       if (!one)
+               die("not a tree-ish %s", av[1]);
+       two = parse_tree_indirect(hash2.hash);
+       if (!two)
+               die("not a tree-ish %s", av[2]);
+
+       shift_tree(&one->object.oid, &two->object.oid, &shifted, -1);
+       printf("shifted: %s\n", oid_to_hex(&shifted));
+
+       exit(0);
+}
similarity index 95%
rename from test-mergesort.c
rename to t/helper/test-mergesort.c
index ea3b959e94ff6f53726d4fce955bca1181a3be07..335cf6b6264cdaf9563736fbcfa40e7a3006a432 100644 (file)
@@ -22,7 +22,7 @@ static int compare_strings(const void *a, const void *b)
        return strcmp(x->text, y->text);
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct line *line, *p = NULL, *lines = NULL;
        struct strbuf sb = STRBUF_INIT;
similarity index 84%
rename from test-mktemp.c
rename to t/helper/test-mktemp.c
index c8c54213a3916c4adffd7396a37ed83e88af34fb..89d9b2f7bee05ff5c9fde31ba6798651ccee2947 100644 (file)
@@ -3,7 +3,7 @@
  */
 #include "git-compat-util.h"
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        if (argc != 2)
                usage("Expected 1 parameter defining the temporary file template");
similarity index 51%
rename from test-parse-options.c
rename to t/helper/test-parse-options.c
index 2c8c8f18edb46378b39c170b4ae6f7250ec631f5..a01430c24bdb8c0e35147b71d6f9e898405b1c85 100644 (file)
@@ -7,16 +7,25 @@ static int integer = 0;
 static unsigned long magnitude = 0;
 static unsigned long timestamp;
 static int abbrev = 7;
-static int verbose = 0, dry_run = 0, quiet = 0;
+static int verbose = -1; /* unspecified */
+static int dry_run = 0, quiet = 0;
 static char *string = NULL;
 static char *file = NULL;
 static int ambiguous;
-static struct string_list list;
+static struct string_list list = STRING_LIST_INIT_NODUP;
+
+static struct {
+       int called;
+       const char *arg;
+       int unset;
+} length_cb;
 
 static int length_callback(const struct option *opt, const char *arg, int unset)
 {
-       printf("Callback: \"%s\", %d\n",
-               (arg ? arg : "not set"), unset);
+       length_cb.called = 1;
+       length_cb.arg = arg;
+       length_cb.unset = unset;
+
        if (unset)
                return 1; /* do not support unset */
 
@@ -30,13 +39,69 @@ static int number_callback(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
-int main(int argc, char **argv)
+static int collect_expect(const struct option *opt, const char *arg, int unset)
+{
+       struct string_list *expect;
+       struct string_list_item *item;
+       struct strbuf label = STRBUF_INIT;
+       const char *colon;
+
+       if (!arg || unset)
+               die("malformed --expect option");
+
+       expect = (struct string_list *)opt->value;
+       colon = strchr(arg, ':');
+       if (!colon)
+               die("malformed --expect option, lacking a colon");
+       strbuf_add(&label, arg, colon - arg);
+       item = string_list_insert(expect, strbuf_detach(&label, NULL));
+       if (item->util)
+               die("malformed --expect option, duplicate %s", label.buf);
+       item->util = (void *)arg;
+       return 0;
+}
+
+__attribute__((format (printf,3,4)))
+static void show(struct string_list *expect, int *status, const char *fmt, ...)
+{
+       struct string_list_item *item;
+       struct strbuf buf = STRBUF_INIT;
+       va_list args;
+
+       va_start(args, fmt);
+       strbuf_vaddf(&buf, fmt, args);
+       va_end(args);
+
+       if (!expect->nr)
+               printf("%s\n", buf.buf);
+       else {
+               char *colon = strchr(buf.buf, ':');
+               if (!colon)
+                       die("malformed output format, output lacking colon: %s", fmt);
+               *colon = '\0';
+               item = string_list_lookup(expect, buf.buf);
+               *colon = ':';
+               if (!item)
+                       ; /* not among entries being checked */
+               else {
+                       if (strcmp((const char *)item->util, buf.buf)) {
+                               printf("-%s\n", (char *)item->util);
+                               printf("+%s\n", buf.buf);
+                               *status = 1;
+                       }
+               }
+       }
+       strbuf_release(&buf);
+}
+
+int cmd_main(int argc, const char **argv)
 {
        const char *prefix = "prefix/";
        const char *usage[] = {
                "test-parse-options <options>",
                NULL
        };
+       struct string_list expect = STRING_LIST_INIT_NODUP;
        struct option options[] = {
                OPT_BOOL(0, "yes", &boolean, "get a boolean"),
                OPT_BOOL('D', "no-doubt", &boolean, "begins with 'no-'"),
@@ -77,28 +142,38 @@ int main(int argc, char **argv)
                OPT__VERBOSE(&verbose, "be verbose"),
                OPT__DRY_RUN(&dry_run, "dry run"),
                OPT__QUIET(&quiet, "be quiet"),
+               OPT_CALLBACK(0, "expect", &expect, "string",
+                            "expected output in the variable dump",
+                            collect_expect),
                OPT_END(),
        };
        int i;
+       int ret = 0;
 
        argc = parse_options(argc, (const char **)argv, prefix, options, usage, 0);
 
-       printf("boolean: %d\n", boolean);
-       printf("integer: %d\n", integer);
-       printf("magnitude: %lu\n", magnitude);
-       printf("timestamp: %lu\n", timestamp);
-       printf("string: %s\n", string ? string : "(not set)");
-       printf("abbrev: %d\n", abbrev);
-       printf("verbose: %d\n", verbose);
-       printf("quiet: %s\n", quiet ? "yes" : "no");
-       printf("dry run: %s\n", dry_run ? "yes" : "no");
-       printf("file: %s\n", file ? file : "(not set)");
+       if (length_cb.called) {
+               const char *arg = length_cb.arg;
+               int unset = length_cb.unset;
+               show(&expect, &ret, "Callback: \"%s\", %d",
+                    (arg ? arg : "not set"), unset);
+       }
+       show(&expect, &ret, "boolean: %d", boolean);
+       show(&expect, &ret, "integer: %d", integer);
+       show(&expect, &ret, "magnitude: %lu", magnitude);
+       show(&expect, &ret, "timestamp: %lu", timestamp);
+       show(&expect, &ret, "string: %s", string ? string : "(not set)");
+       show(&expect, &ret, "abbrev: %d", abbrev);
+       show(&expect, &ret, "verbose: %d", verbose);
+       show(&expect, &ret, "quiet: %d", quiet);
+       show(&expect, &ret, "dry run: %s", dry_run ? "yes" : "no");
+       show(&expect, &ret, "file: %s", file ? file : "(not set)");
 
        for (i = 0; i < list.nr; i++)
-               printf("list: %s\n", list.items[i].string);
+               show(&expect, &ret, "list: %s", list.items[i].string);
 
        for (i = 0; i < argc; i++)
-               printf("arg %02d: %s\n", i, argv[i]);
+               show(&expect, &ret, "arg %02d: %s", i, argv[i]);
 
-       return 0;
+       return ret;
 }
similarity index 98%
rename from test-path-utils.c
rename to t/helper/test-path-utils.c
index ba805b374c57a4e5ad2e6e4a4b9071a11c165afa..1ebe0f750c648cd4d92983c11ace9e8a86327dd1 100644 (file)
@@ -156,7 +156,7 @@ static struct test_data dirname_data[] = {
        { NULL,              NULL     }
 };
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
                char *buf = xmallocz(strlen(argv[2]));
@@ -213,7 +213,7 @@ int main(int argc, char **argv)
        }
 
        if (argc >= 4 && !strcmp(argv[1], "prefix_path")) {
-               char *prefix = argv[2];
+               const char *prefix = argv[2];
                int prefix_len = strlen(prefix);
                int nongit_ok;
                setup_git_directory_gently(&nongit_ok);
similarity index 93%
rename from test-prio-queue.c
rename to t/helper/test-prio-queue.c
index 7be72f0086ba4b80cecf9f324bd5152a8531cdbd..ae58fff35972a09c08a47d2bc0abb67c96ba20eb 100644 (file)
@@ -16,7 +16,7 @@ static void show(int *v)
        free(v);
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct prio_queue pq = { intcmp };
 
similarity index 80%
rename from test-read-cache.c
rename to t/helper/test-read-cache.c
index b25bcf139b2bf61292eb9910cb4f92d8ce7763bd..2a7990efc31d042121122a17890c623d7714c128 100644 (file)
@@ -1,6 +1,6 @@
 #include "cache.h"
 
-int main (int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        int i, cnt = 1;
        if (argc == 2)
diff --git a/t/helper/test-regex.c b/t/helper/test-regex.c
new file mode 100644 (file)
index 0000000..b5ea8a9
--- /dev/null
@@ -0,0 +1,75 @@
+#include "git-compat-util.h"
+#include "gettext.h"
+
+struct reg_flag {
+       const char *name;
+       int flag;
+};
+
+static struct reg_flag reg_flags[] = {
+       { "EXTENDED",    REG_EXTENDED   },
+       { "NEWLINE",     REG_NEWLINE    },
+       { "ICASE",       REG_ICASE      },
+       { "NOTBOL",      REG_NOTBOL     },
+#ifdef REG_STARTEND
+       { "STARTEND",    REG_STARTEND   },
+#endif
+       { NULL, 0 }
+};
+
+static int test_regex_bug(void)
+{
+       char *pat = "[^={} \t]+";
+       char *str = "={}\nfred";
+       regex_t r;
+       regmatch_t m[1];
+
+       if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
+               die("failed regcomp() for pattern '%s'", pat);
+       if (regexec(&r, str, 1, m, 0))
+               die("no match of pattern '%s' to string '%s'", pat, str);
+
+       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
+       if (m[0].rm_so == 3) /* matches '\n' when it should not */
+               die("regex bug confirmed: re-build git with NO_REGEX=1");
+
+       return 0;
+}
+
+int cmd_main(int argc, const char **argv)
+{
+       const char *pat;
+       const char *str;
+       int flags = 0;
+       regex_t r;
+       regmatch_t m[1];
+
+       if (argc == 2 && !strcmp(argv[1], "--bug"))
+               return test_regex_bug();
+       else if (argc < 3)
+               usage("test-regex --bug\n"
+                     "test-regex <pattern> <string> [<options>]");
+
+       argv++;
+       pat = *argv++;
+       str = *argv++;
+       while (*argv) {
+               struct reg_flag *rf;
+               for (rf = reg_flags; rf->name; rf++)
+                       if (!strcmp(*argv, rf->name)) {
+                               flags |= rf->flag;
+                               break;
+                       }
+               if (!rf->name)
+                       die("do not recognize %s", *argv);
+               argv++;
+       }
+       git_setup_gettext();
+
+       if (regcomp(&r, pat, flags))
+               die("failed regcomp() for pattern '%s'", pat);
+       if (regexec(&r, str, 1, m, 0))
+               return 1;
+
+       return 0;
+}
similarity index 95%
rename from test-revision-walking.c
rename to t/helper/test-revision-walking.c
index 285f06b7ff262378150be80f2a09b4162ae3a564..b8e6fe1d007449d30dd30ccd4319b26f151bbf23 100644 (file)
@@ -45,11 +45,13 @@ static int run_revision_walk(void)
        return got_revision;
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        if (argc < 2)
                return 1;
 
+       setup_git_directory();
+
        if (!strcmp(argv[1], "run-twice")) {
                printf("1st\n");
                if (!run_revision_walk())
similarity index 90%
rename from test-run-command.c
rename to t/helper/test-run-command.c
index 30a64a98dc8b53a3a2d7edfaa57a8ee51d5d63e7..d24d157379f30cafdeeb772e82bf5ee4c862272c 100644 (file)
@@ -26,7 +26,7 @@ static int parallel_next(struct child_process *cp,
                return 0;
 
        argv_array_pushv(&cp->args, d->argv);
-       strbuf_addf(err, "preloaded output of a child\n");
+       strbuf_addstr(err, "preloaded output of a child\n");
        number_callbacks++;
        return 1;
 }
@@ -36,7 +36,7 @@ static int no_job(struct child_process *cp,
                  void *cb,
                  void **task_cb)
 {
-       strbuf_addf(err, "no further jobs available\n");
+       strbuf_addstr(err, "no further jobs available\n");
        return 0;
 }
 
@@ -45,11 +45,11 @@ static int task_finished(int result,
                         void *pp_cb,
                         void *pp_task_cb)
 {
-       strbuf_addf(err, "asking for a quick stop\n");
+       strbuf_addstr(err, "asking for a quick stop\n");
        return 1;
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct child_process proc = CHILD_PROCESS_INIT;
        int jobs;
similarity index 85%
rename from test-scrap-cache-tree.c
rename to t/helper/test-scrap-cache-tree.c
index 6efee31a4867b4ff8493161376e5a9cfdd48fe44..27fe0405b887671ff0ca4cea1b258aa850e66c8c 100644 (file)
@@ -5,8 +5,9 @@
 
 static struct lock_file index_lock;
 
-int main(int ac, char **av)
+int cmd_main(int ac, const char **av)
 {
+       setup_git_directory();
        hold_locked_index(&index_lock, 1);
        if (read_cache() < 0)
                die("unable to read index file");
similarity index 87%
rename from test-sha1-array.c
rename to t/helper/test-sha1-array.c
index 60ea1d5f14e2572df5716da5815143ed26a5be4b..f7a53c4ad64c18903f53c5bd1d4766f54bc22e49 100644 (file)
@@ -1,12 +1,13 @@
 #include "cache.h"
 #include "sha1-array.h"
 
-static void print_sha1(const unsigned char sha1[20], void *data)
+static int print_sha1(const unsigned char sha1[20], void *data)
 {
        puts(sha1_to_hex(sha1));
+       return 0;
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct sha1_array array = SHA1_ARRAY_INIT;
        struct strbuf line = STRBUF_INIT;
similarity index 96%
rename from test-sha1.c
rename to t/helper/test-sha1.c
index e57eae10bf73baac79fd8b95ddb0ff1b4c8c0cd6..a1c13f54eca0db7d11a5df134d565171d70b8cce 100644 (file)
@@ -1,6 +1,6 @@
 #include "cache.h"
 
-int main(int ac, char **av)
+int cmd_main(int ac, const char **av)
 {
        git_SHA_CTX ctx;
        unsigned char sha1[20];
similarity index 96%
rename from test-sha1.sh
rename to t/helper/test-sha1.sh
index cef4bcc8664a1023de074d1355c358450dc4057e..750b95a0a1c39b4d761b7f2f861f6df4c85ecb65 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 dd if=/dev/zero bs=1048576 count=100 2>/dev/null |
-/usr/bin/time ./test-sha1 >/dev/null
+/usr/bin/time t/helper/test-sha1 >/dev/null
 
 while read expect cnt pfx
 do
@@ -11,7 +11,7 @@ do
                        test -z "$pfx" || echo "$pfx"
                        dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null |
                        perl -pe 'y/\000/g/'
-               } | ./test-sha1 $cnt
+               } | ./t/helper/test-sha1 $cnt
        )
        if test "$expect" = "$actual"
        then
similarity index 87%
rename from test-sigchain.c
rename to t/helper/test-sigchain.c
index e499fce60ff50069ace6174ef9fa3ca4aff0cdc8..b71edbd4429184b59b4bd1355d5cfb53970a1876 100644 (file)
@@ -13,7 +13,7 @@ X(two)
 X(three)
 #undef X
 
-int main(int argc, char **argv) {
+int cmd_main(int argc, const char **argv) {
        sigchain_push(SIGTERM, one);
        sigchain_push(SIGTERM, two);
        sigchain_push(SIGTERM, three);
similarity index 98%
rename from test-string-list.c
rename to t/helper/test-string-list.c
index 14bdf9d2153a98d0b2a5d03395c1adcc166f8a07..4a68967bd126e5ab74ec2b39113cce58e7c021bf 100644 (file)
@@ -41,7 +41,7 @@ static int prefix_cb(struct string_list_item *item, void *cb_data)
        return starts_with(item->string, prefix);
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        if (argc == 5 && !strcmp(argv[1], "split")) {
                struct string_list list = STRING_LIST_INIT_DUP;
similarity index 87%
rename from test-submodule-config.c
rename to t/helper/test-submodule-config.c
index dab8c27768160d4cfa61c41a95004eb7a8a336b6..2f144d539a4822619a9383ded2d3adb270484624 100644 (file)
@@ -2,7 +2,7 @@
 #include "submodule-config.h"
 #include "submodule.h"
 
-static void die_usage(int argc, char **argv, const char *msg)
+static void die_usage(int argc, const char **argv, const char *msg)
 {
        fprintf(stderr, "%s\n", msg);
        fprintf(stderr, "Usage: %s [<commit> <submodulepath>] ...\n", argv[0]);
@@ -14,16 +14,16 @@ static int git_test_config(const char *var, const char *value, void *cb)
        return parse_submodule_config_option(var, value);
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
-       char **arg = argv;
+       const char **arg = argv;
        int my_argc = argc;
        int output_url = 0;
        int lookup_name = 0;
 
        arg++;
        my_argc--;
-       while (starts_with(arg[0], "--")) {
+       while (arg[0] && starts_with(arg[0], "--")) {
                if (!strcmp(arg[0], "--url"))
                        output_url = 1;
                if (!strcmp(arg[0], "--name"))
@@ -49,7 +49,7 @@ int main(int argc, char **argv)
                path_or_name = arg[1];
 
                if (commit[0] == '\0')
-                       hashcpy(commit_sha1, null_sha1);
+                       hashclr(commit_sha1);
                else if (get_sha1(commit, commit_sha1) < 0)
                        die_usage(argc, argv, "Commit not found.");
 
similarity index 89%
rename from test-subprocess.c
rename to t/helper/test-subprocess.c
index 56881a032471752ca16880d98ea1510e16d38eed..30c5765bfc3590421c21bc2350eed882752de3a0 100644 (file)
@@ -1,7 +1,7 @@
 #include "cache.h"
 #include "run-command.h"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        struct child_process cp = CHILD_PROCESS_INIT;
        int nogit = 0;
similarity index 93%
rename from test-svn-fe.c
rename to t/helper/test-svn-fe.c
index 120ec96b0dbd94e7be9ffc81d0fb87ccbd30a7df..7667c0803f1231152190a1a5b4c61a2fb2677048 100644 (file)
@@ -11,7 +11,7 @@
 static const char test_svnfe_usage[] =
        "test-svn-fe (<dumpfile> | [-d] <preimage> <delta> <len>)";
 
-static int apply_delta(int argc, char *argv[])
+static int apply_delta(int argc, const char **argv)
 {
        struct line_buffer preimage = LINE_BUFFER_INIT;
        struct line_buffer delta = LINE_BUFFER_INIT;
@@ -35,7 +35,7 @@ static int apply_delta(int argc, char *argv[])
        return 0;
 }
 
-int main(int argc, char *argv[])
+int cmd_main(int argc, const char **argv)
 {
        if (argc == 2) {
                if (svndump_init(argv[1]))
similarity index 96%
rename from test-urlmatch-normalization.c
rename to t/helper/test-urlmatch-normalization.c
index 090bf219a7d499ae246f80c0d478eb37fdef8f8f..49b6e836be257c0689601bf17138439cff0d61a0 100644 (file)
@@ -1,7 +1,7 @@
 #include "git-compat-util.h"
 #include "urlmatch.h"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        const char usage[] = "test-urlmatch-normalization [-p | -l] <url1> | <url1> <url2>";
        char *url1, *url2;
similarity index 93%
rename from test-wildmatch.c
rename to t/helper/test-wildmatch.c
index 578b164fe603f11dfe67e25be36a6ab38aa6d645..52be876fed3bcc3bb5a1def5de8febe8b29c0ec4 100644 (file)
@@ -1,6 +1,6 @@
 #include "cache.h"
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
        int i;
        for (i = 2; i < argc; i++) {
index 340534c0644eb46782c0a95103bd2a3ef60da9f7..f9cbd4793194fbc38ec9a2bde0eafad748735044 100644 (file)
@@ -82,8 +82,7 @@ stop_git_daemon() {
        kill "$GIT_DAEMON_PID"
        wait "$GIT_DAEMON_PID" >&3 2>&4
        ret=$?
-       # expect exit with status 143 = 128+15 for signal TERM=15
-       if test $ret -ne 143
+       if test_match_signal 15 $?
        then
                error "git daemon exited with status: $ret"
        fi
index f9ae1d780dceb526fcfbce2684e3e7dc9b06f5eb..54fd5a6ca02757f77004d0f8babfcc6d616162c0 100644 (file)
@@ -33,7 +33,7 @@ fi
 # Older versions of perforce were available compiled natively for
 # cygwin.  Those do not accept native windows paths, so make sure
 # not to convert for them.
-native_path() {
+native_path () {
        path="$1" &&
        if test_have_prereq CYGWIN && ! p4 -V | grep -q CYGWIN
        then
@@ -49,8 +49,8 @@ native_path() {
 # Attention: This function is not safe again against time offset updates
 # at runtime (e.g. via NTP). The 'clock_gettime(CLOCK_MONOTONIC)'
 # function could fix that but it is not in Python until 3.3.
-time_in_seconds() {
-       python -c 'import time; print int(time.time())'
+time_in_seconds () {
+       (cd / && "$PYTHON_PATH" -c 'import time; print(int(time.time()))')
 }
 
 # Try to pick a unique port: guess a large number, then hope
@@ -75,7 +75,7 @@ git="$TRASH_DIRECTORY/git"
 pidfile="$TRASH_DIRECTORY/p4d.pid"
 
 # Sometimes "prove" seems to hang on exit because p4d is still running
-cleanup() {
+cleanup () {
        if test -f "$pidfile"
        then
                kill -9 $(cat "$pidfile") 2>/dev/null && exit 255
@@ -89,7 +89,7 @@ trap cleanup EXIT
 TMPDIR="$TRASH_DIRECTORY"
 export TMPDIR
 
-start_p4d() {
+start_p4d () {
        mkdir -p "$db" "$cli" "$git" &&
        rm -f "$pidfile" &&
        (
@@ -151,7 +151,7 @@ start_p4d() {
        return 0
 }
 
-p4_add_user() {
+p4_add_user () {
        name=$1 &&
        p4 user -f -i <<-EOF
        User: $name
@@ -160,7 +160,16 @@ p4_add_user() {
        EOF
 }
 
-retry_until_success() {
+p4_add_job () {
+       p4 job -f -i <<-EOF
+       Job: $1
+       Status: open
+       User: dummy
+       Description:
+       EOF
+}
+
+retry_until_success () {
        timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
        until "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
        do
@@ -168,7 +177,7 @@ retry_until_success() {
        done
 }
 
-retry_until_fail() {
+retry_until_fail () {
        timeout=$(($(time_in_seconds) + $RETRY_TIMEOUT))
        until ! "$@" 2>/dev/null || test $(time_in_seconds) -gt $timeout
        do
@@ -176,7 +185,7 @@ retry_until_fail() {
        done
 }
 
-kill_p4d() {
+kill_p4d () {
        pid=$(cat "$pidfile")
        retry_until_fail kill $pid
        retry_until_fail kill -9 $pid
@@ -186,21 +195,22 @@ kill_p4d() {
        retry_until_fail kill -9 $watchdog_pid
 }
 
-cleanup_git() {
+cleanup_git () {
        retry_until_success rm -r "$git"
        test_must_fail test -d "$git" &&
        retry_until_success mkdir "$git"
 }
 
-marshal_dump() {
+marshal_dump () {
        what=$1 &&
        line=${2:-1} &&
        cat >"$TRASH_DIRECTORY/marshal-dump.py" <<-EOF &&
        import marshal
        import sys
+       instream = getattr(sys.stdin, 'buffer', sys.stdin)
        for i in range($line):
-           d = marshal.load(sys.stdin)
-       print d['$what']
+           d = marshal.load(instream)
+       print(d[b'$what'].decode('utf-8'))
        EOF
        "$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py"
 }
@@ -208,7 +218,7 @@ marshal_dump() {
 #
 # Construct a client with this list of View lines
 #
-client_view() {
+client_view () {
        (
                cat <<-EOF &&
                Client: $P4CLIENT
@@ -222,7 +232,7 @@ client_view() {
        ) | p4 client -i
 }
 
-is_cli_file_writeable() {
+is_cli_file_writeable () {
        # cygwin version of p4 does not set read-only attr,
        # will be marked 444 but -w is true
        file="$1" &&
index 6a50b8793e4ff840e67d20c169159f474cb9d297..688313ed5cc40e22b2412c57f98df06e4f3ac0ea 100644 (file)
@@ -1,8 +1,5 @@
 . ./test-lib.sh
 
-remotes_git_svn=remotes/git""-svn
-git_svn_id=git""-svn-id
-
 if test -n "$NO_SVN_TESTS"
 then
        skip_all='skipping git svn tests, NO_SVN_TESTS defined'
@@ -68,81 +65,22 @@ svn_cmd () {
        svn "$orig_svncmd" --config-dir "$svnconf" "$@"
 }
 
-prepare_httpd () {
-       for d in \
-               "$SVN_HTTPD_PATH" \
-               /usr/sbin/apache2 \
-               /usr/sbin/httpd \
-       ; do
-               if test -f "$d"
-               then
-                       SVN_HTTPD_PATH="$d"
-                       break
-               fi
-       done
-       if test -z "$SVN_HTTPD_PATH"
-       then
-               echo >&2 '*** error: Apache not found'
-               return 1
-       fi
-       for d in \
-               "$SVN_HTTPD_MODULE_PATH" \
-               /usr/lib/apache2/modules \
-               /usr/libexec/apache2 \
-       ; do
-               if test -d "$d"
-               then
-                       SVN_HTTPD_MODULE_PATH="$d"
-                       break
-               fi
-       done
-       if test -z "$SVN_HTTPD_MODULE_PATH"
-       then
-               echo >&2 '*** error: Apache module dir not found'
-               return 1
-       fi
-       if test ! -f "$SVN_HTTPD_MODULE_PATH/mod_dav_svn.so"
-       then
-               echo >&2 '*** error: Apache module "mod_dav_svn" not found'
-               return 1
-       fi
-
-       repo_base_path="${1-svn}"
-       mkdir "$GIT_DIR"/logs
-
-       cat > "$GIT_DIR/httpd.conf" <<EOF
-ServerName "git svn test"
-ServerRoot "$GIT_DIR"
-DocumentRoot "$GIT_DIR"
-PidFile "$GIT_DIR/httpd.pid"
-LockFile logs/accept.lock
-Listen 127.0.0.1:$SVN_HTTPD_PORT
-LoadModule dav_module $SVN_HTTPD_MODULE_PATH/mod_dav.so
-LoadModule dav_svn_module $SVN_HTTPD_MODULE_PATH/mod_dav_svn.so
-<Location /$repo_base_path>
-       DAV svn
-       SVNPath "$rawsvnrepo"
-</Location>
-EOF
-}
-
-start_httpd () {
-       if test -z "$SVN_HTTPD_PORT"
-       then
-               echo >&2 'SVN_HTTPD_PORT is not defined!'
-               return
-       fi
-
-       prepare_httpd "$1" || return 1
-
-       "$SVN_HTTPD_PATH" -f "$GIT_DIR"/httpd.conf -k start
-       svnrepo="http://127.0.0.1:$SVN_HTTPD_PORT/$repo_base_path"
-}
-
-stop_httpd () {
-       test -z "$SVN_HTTPD_PORT" && return
-       test ! -f "$GIT_DIR/httpd.conf" && return
-       "$SVN_HTTPD_PATH" -f "$GIT_DIR"/httpd.conf -k stop
+maybe_start_httpd () {
+       loc=${1-svn}
+
+       test_tristate GIT_SVN_TEST_HTTPD
+       case $GIT_SVN_TEST_HTTPD in
+       true)
+               . "$TEST_DIRECTORY"/lib-httpd.sh
+               LIB_HTTPD_SVN="$loc"
+               start_httpd
+               ;;
+       *)
+               stop_httpd () {
+                       : noop
+               }
+               ;;
+       esac
 }
 
 convert_to_rev_db () {
index db2ef22e8f76a54c851424dd19c1232f6061392c..ec2aa8f6879d68078caeccaff25d89178b9fb902 100755 (executable)
@@ -1,9 +1,8 @@
 #!/bin/sh
 
 gpg_version=$(gpg --version 2>&1)
-if test $? = 127; then
-       say "You do not seem to have gpg installed"
-else
+if test $? != 127
+then
        # As said here: http://www.gnupg.org/documentation/faqs.html#q6.19
        # the gpg version 1.0.6 didn't parse trust packets correctly, so for
        # that version, creation of signed tags using the generated key fails.
index f9f3e5fd82e1b34d87993f750bd05e46e69bd82c..435a37465a702c35a5d53d8809f0ef700ae9ff83 100644 (file)
@@ -24,7 +24,7 @@
 #    LIB_HTTPD_MODULE_PATH       web server modules path
 #    LIB_HTTPD_PORT              listening port
 #    LIB_HTTPD_DAV               enable DAV
-#    LIB_HTTPD_SVN               enable SVN
+#    LIB_HTTPD_SVN               enable SVN at given location (e.g. "svn")
 #    LIB_HTTPD_SSL               enable SSL
 #
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
@@ -162,8 +162,10 @@ prepare_httpd() {
                if test -n "$LIB_HTTPD_SVN"
                then
                        HTTPD_PARA="$HTTPD_PARA -DSVN"
-                       rawsvnrepo="$HTTPD_ROOT_PATH/svnrepo"
-                       svnrepo="http://127.0.0.1:$LIB_HTTPD_PORT/svn"
+                       LIB_HTTPD_SVNPATH="$rawsvnrepo"
+                       svnrepo="http://127.0.0.1:$LIB_HTTPD_PORT/"
+                       svnrepo="$svnrepo$LIB_HTTPD_SVN"
+                       export LIB_HTTPD_SVN LIB_HTTPD_SVNPATH
                fi
        fi
 }
@@ -180,6 +182,7 @@ start_httpd() {
        if test $? -ne 0
        then
                trap 'die' EXIT
+               cat "$HTTPD_ROOT_PATH"/error.log >&4 2>/dev/null
                test_skip_or_die $GIT_TEST_HTTPD "web server setup failed"
        fi
 }
index f667e7ce2f33dba0c10764f2f62101685d74cf3d..69174c6e3110d5e214c048aceccf07232b813ce7 100644 (file)
@@ -74,6 +74,7 @@ PassEnv GIT_VALGRIND_OPTIONS
 PassEnv GNUPGHOME
 PassEnv ASAN_OPTIONS
 PassEnv GIT_TRACE
+PassEnv GIT_CONFIG_NOSYSTEM
 
 Alias /dumb/ www/
 Alias /auth/dumb/ www/auth/dumb/
@@ -101,6 +102,10 @@ Alias /auth/dumb/ www/auth/dumb/
        SetEnv GIT_HTTP_EXPORT_ALL
        Header set Set-Cookie name=value
 </LocationMatch>
+<LocationMatch /smart_headers/>
+       SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
+       SetEnv GIT_HTTP_EXPORT_ALL
+</LocationMatch>
 ScriptAliasMatch /smart_*[^/]*/(.*) ${GIT_EXEC_PATH}/git-http-backend/$1
 ScriptAlias /broken_smart/ broken-smart-http.sh/
 ScriptAlias /error/ error.sh/
@@ -118,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]
@@ -127,6 +133,31 @@ 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]
 
+# 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
+# pass by marking the RewriteRule as [L], "last rule, do not process
+# any other matching RewriteRules after this"), and then have another
+# RewriteRule that matches all other cases and lets them fail via '[F]',
+# "fail the request".
+RewriteCond %{HTTP:x-magic-one} =abra
+RewriteCond %{HTTP:x-magic-two} =cadabra
+RewriteRule ^/smart_headers/.* - [L]
+RewriteRule ^/smart_headers/.* - [F]
+
 <IfDefine SSL>
 LoadModule ssl_module modules/mod_ssl.so
 
@@ -191,8 +222,8 @@ RewriteRule ^/half-auth-complete/ - [E=AUTHREQUIRED:yes]
 <IfDefine SVN>
        LoadModule dav_svn_module modules/mod_dav_svn.so
 
-       <Location /svn>
+       <Location /${LIB_HTTPD_SVN}>
                DAV svn
-               SVNPath svnrepo
+               SVNPath "${LIB_HTTPD_SVNPATH}"
        </Location>
 </IfDefine>
index 9a96e1566d016e960f79875eb4edba2ffb7c5244..25a77ee5cb04088297b7d9fd93d04d76e1494875 100644 (file)
@@ -29,6 +29,7 @@ set_fake_editor () {
        */COMMIT_EDITMSG)
                test -z "$EXPECT_HEADER_COUNT" ||
                        test "$EXPECT_HEADER_COUNT" = "$(sed -n '1s/^# This is a combination of \(.*\) commits\./\1/p' < "$1")" ||
+                       test "# # GETTEXT POISON #" = "$(sed -n '1p' < "$1")" ||
                        exit
                test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1"
                test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1"
index 8848c1461909199a5c0bd587df8d9ef652c650ac..49ea4349bedfc53b5b565cf1102c74ccb93ab653 100644 (file)
@@ -115,8 +115,16 @@ After that you will want to use some of the following:
 
 At least one of the first two is required!
 
-You can use test_expect_success as usual.  For actual performance
-tests, use
+You can use test_expect_success as usual. In both test_expect_success
+and in test_perf, running "git" points to the version that is being
+perf-tested. The $MODERN_GIT variable points to the git wrapper for the
+currently checked-out version (i.e., the one that matches the t/perf
+scripts you are running).  This is useful if your setup uses commands
+that only work with newer versions of git than what you might want to
+test (but obviously your new commands must still create a state that can
+be used by the older version of git you are testing).
+
+For actual performance tests, use
 
        test_perf 'descriptive string' '
                command1 &&
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/p3400-rebase.sh b/t/perf/p3400-rebase.sh
new file mode 100755 (executable)
index 0000000..b3e7d52
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='Tests rebase performance'
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+test_expect_success 'setup' '
+       git checkout -f -b base &&
+       git checkout -b to-rebase &&
+       git checkout -b upstream &&
+       for i in $(seq 100)
+       do
+               # simulate huge diffs
+               echo change$i >unrelated-file$i &&
+               seq 1000 >>unrelated-file$i &&
+               git add unrelated-file$i &&
+               test_tick &&
+               git commit -m commit$i unrelated-file$i &&
+               echo change$i >unrelated-file$i &&
+               seq 1000 | tac >>unrelated-file$i &&
+               git add unrelated-file$i &&
+               test_tick &&
+               git commit -m commit$i-reverse unrelated-file$i ||
+               break
+       done &&
+       git checkout to-rebase &&
+       test_commit our-patch interesting-file
+'
+
+test_perf 'rebase on top of a lot of unrelated changes' '
+       git rebase --onto upstream HEAD^ &&
+       git rebase --onto base HEAD^
+'
+
+test_done
diff --git a/t/perf/p3404-rebase-interactive.sh b/t/perf/p3404-rebase-interactive.sh
new file mode 100755 (executable)
index 0000000..88f47de
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description='Tests rebase -i performance'
+. ./perf-lib.sh
+
+test_perf_default_repo
+
+# This commit merges a sufficiently long topic branch for reasonable
+# performance testing
+branch_merge=ba5312da19c6fdb6c6747d479f58932aae6e900c^{commit}
+export branch_merge
+
+git rev-parse --verify $branch_merge >/dev/null 2>&1 || {
+       skip_all='skipping because $branch_merge was not found'
+       test_done
+}
+
+write_script swap-first-two.sh <<\EOF
+case "$1" in
+*/COMMIT_EDITMSG)
+       mv "$1" "$1".bak &&
+       sed -e '1{h;d}' -e 2G <"$1".bak >"$1"
+       ;;
+esac
+EOF
+
+test_expect_success 'setup' '
+       git config core.editor "\"$PWD"/swap-first-two.sh\" &&
+       git checkout -f $branch_merge^2
+'
+
+test_perf 'rebase -i' '
+       git rebase -i $branch_merge^
+'
+
+test_done
index 3d074b0e413a0cb5b3df58296385cfdfbefbcaf7..b7ff68d4fa3de5559af672795191a0b81deaa4f8 100755 (executable)
@@ -23,11 +23,11 @@ test_perf 'git log --follow (baseline for -M)' '
        git log --oneline --follow -- "$file" >/dev/null
 '
 
-test_perf 'git log -L' '
-       git log -L 1:"$file" >/dev/null
+test_perf 'git log -L (renames off)' '
+       git log --no-renames -L 1:"$file" >/dev/null
 '
 
-test_perf 'git log -M -L' '
+test_perf 'git log -L (renames on)' '
        git log -M -L 1:"$file" >/dev/null
 '
 
diff --git a/t/perf/p5303-many-packs.sh b/t/perf/p5303-many-packs.sh
new file mode 100755 (executable)
index 0000000..3779851
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+test_description='performance with large numbers of packs'
+. ./perf-lib.sh
+
+test_perf_large_repo
+
+# A real many-pack situation would probably come from having a lot of pushes
+# over time. We don't know how big each push would be, but we can fake it by
+# just walking the first-parent chain and having every 5 commits be their own
+# "push". This isn't _entirely_ accurate, as real pushes would have some
+# duplicate objects due to thin-pack fixing, but it's a reasonable
+# approximation.
+#
+# And then all of the rest of the objects can go in a single packfile that
+# represents the state before any of those pushes (actually, we'll generate
+# that first because in such a setup it would be the oldest pack, and we sort
+# the packs by reverse mtime inside git).
+repack_into_n () {
+       rm -rf staging &&
+       mkdir staging &&
+
+       git rev-list --first-parent HEAD |
+       sed -n '1~5p' |
+       head -n "$1" |
+       perl -e 'print reverse <>' \
+       >pushes
+
+       # create base packfile
+       head -n 1 pushes |
+       git pack-objects --delta-base-offset --revs staging/pack
+
+       # and then incrementals between each pair of commits
+       last= &&
+       while read rev
+       do
+               if test -n "$last"; then
+                       {
+                               echo "$rev" &&
+                               echo "^$last"
+                       } |
+                       git pack-objects --delta-base-offset --revs \
+                               staging/pack || return 1
+               fi
+               last=$rev
+       done <pushes &&
+
+       # and install the whole thing
+       rm -f .git/objects/pack/* &&
+       mv staging/* .git/objects/pack/
+}
+
+# Pretend we just have a single branch and no reflogs, and that everything is
+# in objects/pack; that makes our fake pack-building via repack_into_n()
+# much simpler.
+test_expect_success 'simplify reachability' '
+       tip=$(git rev-parse --verify HEAD) &&
+       git for-each-ref --format="option no-deref%0adelete %(refname)" |
+       git update-ref --stdin &&
+       rm -rf .git/logs &&
+       git update-ref refs/heads/master $tip &&
+       git symbolic-ref HEAD refs/heads/master &&
+       git repack -ad
+'
+
+for nr_packs in 1 50 1000
+do
+       test_expect_success "create $nr_packs-pack scenario" '
+               repack_into_n $nr_packs
+       '
+
+       test_perf "rev-list ($nr_packs)" '
+               git rev-list --objects --all >/dev/null
+       '
+
+       # This simulates the interesting part of the repack, which is the
+       # actual pack generation, without smudging the on-disk setup
+       # between trials.
+       test_perf "repack ($nr_packs)" '
+               git pack-objects --keep-true-parents \
+                 --honor-pack-keep --non-empty --all \
+                 --reflog --indexed-objects --delta-base-offset \
+                 --stdout </dev/null >/dev/null
+       '
+done
+
+test_done
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
diff --git a/t/perf/p5550-fetch-tags.sh b/t/perf/p5550-fetch-tags.sh
new file mode 100755 (executable)
index 0000000..a5dc39f
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+test_description='performance of tag-following with many tags
+
+This tests a fairly pathological case, so rather than rely on a real-world
+case, we will construct our own repository. The situation is roughly as
+follows.
+
+The parent repository has a large number of tags which are disconnected from
+the rest of history. That makes them candidates for tag-following, but we never
+actually grab them (and thus they will impact each subsequent fetch).
+
+The child repository is a clone of parent, without the tags, and is at least
+one commit behind the parent (meaning that we will fetch one object and then
+examine the tags to see if they need followed). Furthermore, it has a large
+number of packs.
+
+The exact values of "large" here are somewhat arbitrary; I picked values that
+start to show a noticeable performance problem on my machine, but without
+taking too long to set up and run the tests.
+'
+. ./perf-lib.sh
+
+# make a long nonsense history on branch $1, consisting of $2 commits, each
+# with a unique file pointing to the blob at $2.
+create_history () {
+       perl -le '
+               my ($branch, $n, $blob) = @ARGV;
+               for (1..$n) {
+                       print "commit refs/heads/$branch";
+                       print "committer nobody <nobody@example.com> now";
+                       print "data 4";
+                       print "foo";
+                       print "M 100644 $blob $_";
+               }
+       ' "$@" |
+       git fast-import --date-format=now
+}
+
+# make a series of tags, one per commit in the revision range given by $@
+create_tags () {
+       git rev-list "$@" |
+       perl -lne 'print "create refs/tags/$. $_"' |
+       git update-ref --stdin
+}
+
+# create $1 nonsense packs, each with a single blob
+create_packs () {
+       perl -le '
+               my ($n) = @ARGV;
+               for (1..$n) {
+                       print "blob";
+                       print "data <<EOF";
+                       print "$_";
+                       print "EOF";
+               }
+       ' "$@" |
+       git fast-import &&
+
+       git cat-file --batch-all-objects --batch-check='%(objectname)' |
+       while read sha1
+       do
+               echo $sha1 | git pack-objects .git/objects/pack/pack
+       done
+}
+
+test_expect_success 'create parent and child' '
+       git init parent &&
+       git -C parent commit --allow-empty -m base &&
+       git clone parent child &&
+       git -C parent commit --allow-empty -m trigger-fetch
+'
+
+test_expect_success 'populate parent tags' '
+       (
+               cd parent &&
+               blob=$(echo content | git hash-object -w --stdin) &&
+               create_history cruft 3000 $blob &&
+               create_tags cruft &&
+               git branch -D cruft
+       )
+'
+
+test_expect_success 'create child packs' '
+       (
+               cd child &&
+               git config gc.auto 0 &&
+               git config gc.autopacklimit 0 &&
+               create_packs 500
+       )
+'
+
+test_perf 'fetch' '
+       # make sure there is something to fetch on each iteration
+       git -C child update-ref -d refs/remotes/origin/master &&
+       git -C child fetch
+'
+
+test_done
index 5cf74eddec7552140c5bef14f23fc637a2ad9818..46f08ee0870ffd2b1e0eb7d159b159d25ef61ffb 100644 (file)
@@ -52,6 +52,9 @@ TEST_NO_MALLOC_CHECK=t
 # need to export them for test_perf subshells
 export TEST_DIRECTORY TRASH_DIRECTORY GIT_BUILD_DIR GIT_TEST_CMP
 
+MODERN_GIT=$GIT_BUILD_DIR/bin-wrappers/git
+export MODERN_GIT
+
 perf_results_dir=$TEST_OUTPUT_DIRECTORY/test-results
 mkdir -p "$perf_results_dir"
 rm -f "$perf_results_dir"/$(basename "$0" .sh).subtests
@@ -80,23 +83,29 @@ test_perf_create_repo_from () {
        error "bug in the test script: not 2 parameters to test-create-repo"
        repo="$1"
        source="$2"
-       source_git=$source/$(cd "$source" && git rev-parse --git-dir)
+       source_git="$(git -C "$source" rev-parse --git-dir)"
+       objects_dir="$("$MODERN_GIT" -C "$source" rev-parse --git-path objects)"
        mkdir -p "$repo/.git"
        (
-               cd "$repo/.git" &&
-               { cp -Rl "$source_git/objects" . 2>/dev/null ||
-                       cp -R "$source_git/objects" .; } &&
+               cd "$source" &&
+               { cp -Rl "$objects_dir" "$repo/.git/" 2>/dev/null ||
+                       cp -R "$objects_dir" "$repo/.git/"; } &&
                for stuff in "$source_git"/*; do
                        case "$stuff" in
-                               */objects|*/hooks|*/config)
+                               */objects|*/hooks|*/config|*/commondir)
                                        ;;
                                *)
-                                       cp -R "$stuff" . || exit 1
+                                       cp -R "$stuff" "$repo/.git/" || exit 1
                                        ;;
                        esac
-               done &&
-               cd .. &&
-               git init -q &&
+               done
+       ) &&
+       (
+               cd "$repo" &&
+               git init -q && {
+                       test_have_prereq SYMLINKS ||
+                       git config core.symlinks false
+               } &&
                mv .git/hooks .git/hooks-disabled 2>/dev/null
        ) || error "failed to copy repository '$source' to '$repo'"
 }
@@ -121,11 +130,15 @@ test_checkout_worktree () {
 # Performance tests should never fail.  If they do, stop immediately
 immediate=t
 
+# Perf tests require GNU time
+case "$(uname -s)" in Darwin) GTIME="${GTIME:-gtime}";; esac
+GTIME="${GTIME:-/usr/bin/time}"
+
 test_run_perf_ () {
        test_cleanup=:
        test_export_="test_cleanup"
        export test_cleanup test_export_
-       /usr/bin/time -f "%E %U %S" -o test_time.$i "$SHELL" -c '
+       "$GTIME" -f "%E %U %S" -o test_time.$i "$SHELL" -c '
 . '"$TEST_DIRECTORY"/test-lib-functions.sh'
 test_export () {
        [ $# != 0 ] || return 0
index cfd70129bb70f7ed88d999421f3bc432119233c1..e8adedadfdca8549b3c4f8f8a19d383a7611f4ad 100755 (executable)
@@ -30,7 +30,13 @@ unpack_git_rev () {
 }
 build_git_rev () {
        rev=$1
-       cp ../../config.mak build/$rev/config.mak
+       for config in config.mak config.mak.autogen config.status
+       do
+               if test -e "../../$config"
+               then
+                       cp "../../$config" "build/$rev/"
+               fi
+       done
        (cd build/$rev && make $GIT_PERF_MAKE_OPTS) ||
        die "failed to build revision '$mydir'"
 }
index 79b9074172ce00771c92a8f3cda35ebf4ac24d89..1aa5093f36ea61a75cb11de5a65ed11b2b3b4e65 100755 (executable)
@@ -98,7 +98,7 @@ check_sub_test_lib_test () {
 }
 
 check_sub_test_lib_test_err () {
-       name="$1" # stdin is the expected output output from the test
+       name="$1" # stdin is the expected output from the test
        # expected error output is in descriptior 3
        (
                cd "$name" &&
@@ -834,7 +834,7 @@ test_expect_success 'git write-tree should be able to write an empty tree' '
 '
 
 test_expect_success 'validate object ID of a known tree' '
-       test "$tree" = 4b825dc642cb6eb9a060e54bf8d69288fbee4904
+       test "$tree" = $EMPTY_TREE
 '
 
 # Various types of objects
index a5b9e7a4c7e85a2f09718ee7618ae6fb48c600fe..b8fc588b1922760ade8502fda3dc465f6ebf2887 100755 (executable)
@@ -354,4 +354,60 @@ test_expect_success SYMLINKS 're-init to move gitdir symlink' '
        test_path_is_dir realgitdir/refs
 '
 
+# Tests for the hidden file attribute on windows
+is_hidden () {
+       # Use the output of `attrib`, ignore the absolute path
+       case "$(attrib "$1")" in *H*?:*) return 0;; esac
+       return 1
+}
+
+test_expect_success MINGW '.git hidden' '
+       rm -rf newdir &&
+       (
+               unset GIT_DIR GIT_WORK_TREE
+               mkdir newdir &&
+               cd newdir &&
+               git init &&
+               is_hidden .git
+       ) &&
+       check_config newdir/.git false unset
+'
+
+test_expect_success MINGW 'bare git dir not hidden' '
+       rm -rf newdir &&
+       (
+               unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+               mkdir newdir &&
+               cd newdir &&
+               git --bare init
+       ) &&
+       ! 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 e7f27ebbc1748df28b6e686b5732c8af18cea7c9..46042f1f1338f628d5256f0e932a4037e98b34ab 100755 (executable)
@@ -11,12 +11,13 @@ EOF
 
 test_expect_success 'sigchain works' '
        { test-sigchain >actual; ret=$?; } &&
-       case "$ret" in
-       143) true ;; # POSIX w/ SIGTERM=15
-       271) true ;; # ksh w/ SIGTERM=15
-         3) true ;; # Windows
-         *) false ;;
-       esac &&
+       {
+               # Signal death by raise() on Windows acts like exit(3),
+               # regardless of the signal number. So we must allow that
+               # as well as the normal signal check.
+               test_match_signal 15 "$ret" ||
+               test "$ret" = 3
+       } &&
        test_cmp expect actual
 '
 
@@ -41,12 +42,12 @@ test_expect_success 'create blob' '
 
 test_expect_success !MINGW 'a constipated git dies with SIGPIPE' '
        OUT=$( ((large_git; echo $? 1>&3) | :) 3>&1 ) &&
-       test "$OUT" -eq 141
+       test_match_signal 13 "$OUT"
 '
 
 test_expect_success !MINGW 'a constipated git dies with SIGPIPE even if parent ignores it' '
        OUT=$( ((trap "" PIPE; large_git; echo $? 1>&3) | :) 3>&1 ) &&
-       test "$OUT" -eq 141
+       test_match_signal 13 "$OUT"
 '
 
 test_done
index fac0986134fefa5c61763f4c56873da8ba28072a..c0c910867d75368832ce8b297e9dd82ee984a85a 100755 (executable)
@@ -6,26 +6,55 @@ test_description='test date parsing and printing'
 # arbitrary reference time: 2009-08-30 19:20:00
 TEST_DATE_NOW=1251660000; export TEST_DATE_NOW
 
-check_show() {
+check_relative() {
        t=$(($TEST_DATE_NOW - $1))
        echo "$t -> $2" >expect
        test_expect_${3:-success} "relative date ($2)" "
-       test-date show $t >actual &&
+       test-date relative $t >actual &&
        test_i18ncmp expect actual
        "
 }
 
-check_show 5 '5 seconds ago'
-check_show 300 '5 minutes ago'
-check_show 18000 '5 hours ago'
-check_show 432000 '5 days ago'
-check_show 1728000 '3 weeks ago'
-check_show 13000000 '5 months ago'
-check_show 37500000 '1 year, 2 months ago'
-check_show 55188000 '1 year, 9 months ago'
-check_show 630000000 '20 years ago'
-check_show 31449600 '12 months ago'
-check_show 62985600 '2 years ago'
+check_relative 5 '5 seconds ago'
+check_relative 300 '5 minutes ago'
+check_relative 18000 '5 hours ago'
+check_relative 432000 '5 days ago'
+check_relative 1728000 '3 weeks ago'
+check_relative 13000000 '5 months ago'
+check_relative 37500000 '1 year, 2 months ago'
+check_relative 55188000 '1 year, 9 months ago'
+check_relative 630000000 '20 years ago'
+check_relative 31449600 '12 months ago'
+check_relative 62985600 '2 years ago'
+
+check_show () {
+       format=$1
+       time=$2
+       expect=$3
+       test_expect_success $4 "show date ($format:$time)" '
+               echo "$time -> $expect" >expect &&
+               test-date show:$format "$time" >actual &&
+               test_cmp expect actual
+       '
+}
+
+# arbitrary but sensible time for examples
+TIME='1466000000 +0200'
+check_show iso8601 "$TIME" '2016-06-15 16:13:20 +0200'
+check_show iso8601-strict "$TIME" '2016-06-15T16:13:20+02:00'
+check_show rfc2822 "$TIME" 'Wed, 15 Jun 2016 16:13:20 +0200'
+check_show short "$TIME" '2016-06-15'
+check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
+check_show raw "$TIME" '1466000000 +0200'
+check_show unix "$TIME" '1466000000'
+check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000'
+check_show raw-local "$TIME" '1466000000 +0000'
+check_show unix-local "$TIME" '1466000000'
+
+# arbitrary time absurdly far in the future
+FUTURE="5758122296 -0400"
+check_show iso       "$FUTURE" "2152-06-19 18:24:56 -0400" LONG_IS_64BIT
+check_show iso-local "$FUTURE" "2152-06-19 22:24:56 +0000" LONG_IS_64BIT
 
 check_parse() {
        echo "$1 -> $2" >expect
index 89544dd8332793af7c792a45e6566f207ef57e38..d27f438bf410d06f37ec76a6ce040316218a8138 100755 (executable)
@@ -34,7 +34,7 @@ expect_from_stdin () {
 test_stderr () {
        expected="$1"
        expect_in stderr "$1" &&
-       test_cmp "$HOME/expected-stderr" "$HOME/stderr"
+       test_i18ncmp "$HOME/expected-stderr" "$HOME/stderr"
 }
 
 broken_c_unquote () {
@@ -47,7 +47,7 @@ broken_c_unquote_verbose () {
 
 stderr_contains () {
        regexp="$1"
-       if grep "$regexp" "$HOME/stderr"
+       if test_i18ngrep "$regexp" "$HOME/stderr"
        then
                return 0
        else
@@ -605,7 +605,7 @@ cat <<-EOF >expected-verbose
        a/b/.gitignore:8:!on*   a/b/one
        a/b/.gitignore:8:!on*   a/b/one one
        a/b/.gitignore:8:!on*   a/b/one two
-       a/b/.gitignore:8:!on*   "a/b/one\"three"
+       a/b/.gitignore:8:!on*   "a/b/one\\"three"
        a/b/.gitignore:9:!two   a/b/two
        a/.gitignore:1:two*     a/b/twooo
        $global_excludes:2:!globaltwo   globaltwo
@@ -686,7 +686,7 @@ cat <<-EOF >expected-all
        a/b/.gitignore:8:!on*   b/one
        a/b/.gitignore:8:!on*   b/one one
        a/b/.gitignore:8:!on*   b/one two
-       a/b/.gitignore:8:!on*   "b/one\"three"
+       a/b/.gitignore:8:!on*   "b/one\\"three"
        a/b/.gitignore:9:!two   b/two
        ::      b/not-ignored
        a/.gitignore:1:two*     b/twooo
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
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 7bac2bcf260794bbfeb795b210ed0c9eceb45937..34891c4b1ad1c53ebc78b18484c7c146659ce68d 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 &&
@@ -268,4 +330,390 @@ test_expect_success 'disable filter with empty override' '
        test_must_be_empty err
 '
 
+test_expect_success 'diff does not reuse worktree files that need cleaning' '
+       test_config filter.counter.clean "echo . >>count; sed s/^/clean:/" &&
+       echo "file filter=counter" >.gitattributes &&
+       test_commit one file &&
+       test_commit two file &&
+
+       >count &&
+       git diff-tree -p HEAD &&
+       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 &&
+
+               filter_git commit -m "test commit 2" &&
+               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]
+                       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 &&
+
+               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..4d5697e
--- /dev/null
@@ -0,0 +1,192 @@
+#
+# 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();
+
+       # 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();
+       }
+}
index c164b4662a06d26bc23b58287f88023ed0a588a2..d0bee08b2e2add3caa82967e120157e7112385a4 100755 (executable)
@@ -114,7 +114,7 @@ test_expect_success 'autocrlf=true does not normalize CRLF files' '
        test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
-test_expect_success 'text=auto, autocrlf=true _does_ normalize CRLF files' '
+test_expect_success 'text=auto, autocrlf=true does not normalize CRLF files' '
 
        rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
        git config core.autocrlf true &&
@@ -126,7 +126,7 @@ test_expect_success 'text=auto, autocrlf=true _does_ normalize CRLF files' '
        LFonlydiff=$(git diff LFonly) &&
        CRLFonlydiff=$(git diff CRLFonly) &&
        LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFonlydiff" -a -n "$CRLFonlydiff" -a -z "$LFwithNULdiff"
+       test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
 test_expect_success 'text=auto, autocrlf=true does not normalize binary files' '
index f33962b178238126d4cbe88cfbda7dd7bb747490..90db54c9f976c3c7b1d1d1a55bc3be6e557f2aa2 100755 (executable)
@@ -12,7 +12,7 @@ fi
 
 compare_files () {
        tr '\015\000' QN <"$1" >"$1".expect &&
-       tr '\015\000' QN <"$2" >"$2".actual &&
+       tr '\015\000' QN <"$2" | tr -d 'Z' >"$2".actual &&
        test_cmp "$1".expect "$2".actual &&
        rm "$1".expect "$2".actual
 }
@@ -52,14 +52,17 @@ create_gitattributes () {
 create_NNO_files () {
        for crlf in false true input
        do
-               for attr in "" auto text -text lf crlf
+               for attr in "" auto text -text
                do
-                       pfx=NNO_${crlf}_attr_${attr} &&
-                       cp CRLF_mix_LF ${pfx}_LF.txt &&
-                       cp CRLF_mix_LF ${pfx}_CRLF.txt &&
-                       cp CRLF_mix_LF ${pfx}_CRLF_mix_LF.txt &&
-                       cp CRLF_mix_LF ${pfx}_LF_mix_CR.txt &&
-                       cp CRLF_mix_LF ${pfx}_CRLF_nul.txt
+                       for aeol in "" lf crlf
+                       do
+                               pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
+                               cp CRLF_mix_LF ${pfx}_LF.txt &&
+                               cp CRLF_mix_LF ${pfx}_CRLF.txt &&
+                               cp CRLF_mix_LF ${pfx}_CRLF_mix_LF.txt &&
+                               cp CRLF_mix_LF ${pfx}_LF_mix_CR.txt &&
+                               cp CRLF_mix_LF ${pfx}_CRLF_nul.txt
+                       done
                done
        done
 }
@@ -100,40 +103,41 @@ commit_check_warn () {
 }
 
 commit_chk_wrnNNO () {
-       crlf=$1
-       attr=$2
-       lfwarn=$3
-       crlfwarn=$4
-       lfmixcrlf=$5
-       lfmixcr=$6
-       crlfnul=$7
-       pfx=NNO_${crlf}_attr_${attr}
+       attr=$1 ; shift
+       aeol=$1 ; shift
+       crlf=$1 ; shift
+       lfwarn=$1 ; shift
+       crlfwarn=$1 ; shift
+       lfmixcrlf=$1 ; shift
+       lfmixcr=$1 ; shift
+       crlfnul=$1 ; shift
+       pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
        #Commit files on top of existing file
-       create_gitattributes "$attr" &&
+       create_gitattributes "$attr" $aeol &&
        for f in LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
        do
                fname=${pfx}_$f.txt &&
                cp $f $fname &&
-               git -c core.autocrlf=$crlf add $fname 2>/dev/null &&
-               git -c core.autocrlf=$crlf commit -m "commit_$fname" $fname >"${pfx}_$f.err" 2>&1
+               printf Z >>"$fname" &&
+               git -c core.autocrlf=$crlf add $fname 2>"${pfx}_$f.err"
        done
 
        test_expect_success "commit NNO files crlf=$crlf attr=$attr LF" '
                check_warning "$lfwarn" ${pfx}_LF.err
        '
-       test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF" '
+       test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF" '
                check_warning "$crlfwarn" ${pfx}_CRLF.err
        '
 
-       test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF_mix_LF" '
+       test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_mix_LF" '
                check_warning "$lfmixcrlf" ${pfx}_CRLF_mix_LF.err
        '
 
-       test_expect_success "commit NNO files crlf=$crlf attr=$attr LF_mix_cr" '
+       test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf LF_mix_cr" '
                check_warning "$lfmixcr" ${pfx}_LF_mix_CR.err
        '
 
-       test_expect_success "commit NNO files crlf=$crlf attr=$attr CRLF_nul" '
+       test_expect_success "commit NNO files attr=$attr aeol=$aeol crlf=$crlf CRLF_nul" '
                check_warning "$crlfnul" ${pfx}_CRLF_nul.err
        '
 }
@@ -162,6 +166,7 @@ stats_ascii () {
 
 # contruct the attr/ returned by git ls-files --eol
 # Take none (=empty), one or two args
+# convert.c: eol=XX overrides text=auto
 attr_ascii () {
        case $1,$2 in
        -text,*)   echo "-text" ;;
@@ -195,28 +200,29 @@ check_files_in_repo () {
 }
 
 check_in_repo_NNO () {
-       crlf=$1
-       attr=$2
-       lfname=$3
-       crlfname=$4
-       lfmixcrlf=$5
-       lfmixcr=$6
-       crlfnul=$7
-       pfx=NNO_${crlf}_attr_${attr}_
-       test_expect_success "compare_files $lfname ${pfx}LF.txt" '
-               compare_files $lfname ${pfx}LF.txt
+       attr=$1 ; shift
+       aeol=$1 ; shift
+       crlf=$1 ; shift
+       lfname=$1 ; shift
+       crlfname=$1 ; shift
+       lfmixcrlf=$1 ; shift
+       lfmixcr=$1 ; shift
+       crlfnul=$1 ; shift
+       pfx=NNO_attr_${attr}_aeol_${aeol}_${crlf}
+       test_expect_success "compare_files $lfname ${pfx}_LF.txt" '
+               compare_files $lfname ${pfx}_LF.txt
        '
-       test_expect_success "compare_files $crlfname ${pfx}CRLF.txt" '
-               compare_files $crlfname ${pfx}CRLF.txt
+       test_expect_success "compare_files $crlfname ${pfx}_CRLF.txt" '
+               compare_files $crlfname ${pfx}_CRLF.txt
        '
-       test_expect_success "compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt" '
-               compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt
+       test_expect_success "compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt" '
+               compare_files $lfmixcrlf ${pfx}_CRLF_mix_LF.txt
        '
-       test_expect_success "compare_files $lfmixcr ${pfx}LF_mix_CR.txt" '
-               compare_files $lfmixcr ${pfx}LF_mix_CR.txt
+       test_expect_success "compare_files $lfmixcr ${pfx}_LF_mix_CR.txt" '
+               compare_files $lfmixcr ${pfx}_LF_mix_CR.txt
        '
-       test_expect_success "compare_files $crlfnul ${pfx}CRLF_nul.txt" '
-               compare_files $crlfnul ${pfx}CRLF_nul.txt
+       test_expect_success "compare_files $crlfnul ${pfx}_CRLF_nul.txt" '
+               compare_files $crlfnul ${pfx}_CRLF_nul.txt
        '
 }
 
@@ -231,7 +237,7 @@ checkout_files () {
        lfmixcrlf=$1 ; shift
        lfmixcr=$1 ; shift
        crlfnul=$1 ; shift
-       create_gitattributes "$attr" "$ident" &&
+       create_gitattributes "$attr" $ident $aeol &&
        git config core.autocrlf $crlf &&
        pfx=eol_${ceol}_crlf_${crlf}_attr_${attr}_ &&
        for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul
@@ -244,7 +250,7 @@ checkout_files () {
                fi
        done
 
-       test_expect_success "ls-files --eol attr=$attr $ident $aeol core.autocrlf=$crlf core.eol=$ceol" '
+       test_expect_success "ls-files --eol attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol" '
                test_when_finished "rm expect actual" &&
                sort <<-EOF >expect &&
                i/crlf w/$(stats_ascii $crlfname) attr/$(attr_ascii $attr $aeol) crlf_false_attr__CRLF.txt
@@ -259,19 +265,19 @@ checkout_files () {
                sort >actual &&
                test_cmp expect actual
        '
-       test_expect_success "checkout $ident $attr $aeol core.autocrlf=$crlf core.eol=$ceol file=LF" "
+       test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF" "
                compare_ws_file $pfx $lfname    crlf_false_attr__LF.txt
        "
-       test_expect_success "checkout $ident $attr $aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF" "
+       test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF" "
                compare_ws_file $pfx $crlfname  crlf_false_attr__CRLF.txt
        "
-       test_expect_success "checkout $ident $attr $aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF_mix_LF" "
+       test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=CRLF_mix_LF" "
                compare_ws_file $pfx $lfmixcrlf crlf_false_attr__CRLF_mix_LF.txt
        "
-       test_expect_success "checkout $ident $attr $aeol core.autocrlf=$crlf core.eol=$ceol file=LF_mix_CR" "
+       test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_mix_CR" "
                compare_ws_file $pfx $lfmixcr   crlf_false_attr__LF_mix_CR.txt
        "
-       test_expect_success "checkout $ident $attr $aeol core.autocrlf=$crlf core.eol=$ceol file=LF_nul" "
+       test_expect_success "checkout attr=$attr $ident aeol=$aeol core.autocrlf=$crlf core.eol=$ceol file=LF_nul" "
                compare_ws_file $pfx $crlfnul   crlf_false_attr__LF_nul.txt
        "
 }
@@ -385,33 +391,33 @@ test_expect_success 'commit files attr=crlf' '
        commit_check_warn input "crlf" "LF_CRLF" ""        "LF_CRLF" "LF_CRLF" ""
 '
 
-#                       attr   LF        CRLF      CRLFmixLF    LF_mix_CR   CRLFNUL
-commit_chk_wrnNNO false ""     ""        ""        ""           ""              ""
-commit_chk_wrnNNO true  ""     "LF_CRLF" ""        ""           ""              ""
-commit_chk_wrnNNO input ""     ""        ""        ""           ""              ""
-
+#                 attr                    LF        CRLF      CRLFmixLF   LF_mix_CR   CRLFNUL
+commit_chk_wrnNNO ""      ""      false   ""        ""        ""          ""          ""
+commit_chk_wrnNNO ""      ""      true    LF_CRLF   ""        ""          ""          ""
+commit_chk_wrnNNO ""      ""      input   ""        ""        ""          ""          ""
 
-commit_chk_wrnNNO false "auto" "$WILC"   "$WICL"   "$WAMIX"     ""              ""
-commit_chk_wrnNNO true  "auto" "LF_CRLF" ""        "LF_CRLF"    ""              ""
-commit_chk_wrnNNO input "auto" ""        "CRLF_LF" "CRLF_LF"    ""              ""
-
-commit_chk_wrnNNO false "text" "$WILC"   "$WICL"   "$WAMIX"     "$WILC"         "$WICL"
-commit_chk_wrnNNO true  "text" "LF_CRLF" ""        "LF_CRLF"    "LF_CRLF"       ""
-commit_chk_wrnNNO input "text" ""        "CRLF_LF" "CRLF_LF"    ""              "CRLF_LF"
-
-commit_chk_wrnNNO false "-text" ""       ""        ""           ""              ""
-commit_chk_wrnNNO true  "-text" ""       ""        ""           ""              ""
-commit_chk_wrnNNO input "-text" ""       ""        ""           ""              ""
-
-commit_chk_wrnNNO false "lf"    ""       "CRLF_LF" "CRLF_LF"     ""             "CRLF_LF"
-commit_chk_wrnNNO true  "lf"    ""       "CRLF_LF" "CRLF_LF"     ""             "CRLF_LF"
-commit_chk_wrnNNO input "lf"    ""       "CRLF_LF" "CRLF_LF"     ""             "CRLF_LF"
+commit_chk_wrnNNO "auto"  ""      false   "$WILC"   ""        ""          ""          ""
+commit_chk_wrnNNO "auto"  ""      true    LF_CRLF   ""        ""          ""          ""
+commit_chk_wrnNNO "auto"  ""      input   ""        ""        ""          ""          ""
+for crlf in true false input
+do
+       commit_chk_wrnNNO -text ""      $crlf   ""        ""        ""          ""          ""
+       commit_chk_wrnNNO -text lf      $crlf   ""        ""        ""          ""          ""
+       commit_chk_wrnNNO -text crlf    $crlf   ""        ""        ""          ""          ""
+       commit_chk_wrnNNO ""    lf      $crlf   ""       CRLF_LF    CRLF_LF      ""         CRLF_LF
+       commit_chk_wrnNNO ""    crlf    $crlf   LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
+       commit_chk_wrnNNO auto  lf      $crlf   ""        ""        ""          ""          ""
+       commit_chk_wrnNNO auto  crlf    $crlf   LF_CRLF   ""        ""          ""          ""
+       commit_chk_wrnNNO text  lf      $crlf   ""       CRLF_LF    CRLF_LF     ""          CRLF_LF
+       commit_chk_wrnNNO text  crlf    $crlf   LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
+done
 
-commit_chk_wrnNNO false "crlf" "LF_CRLF" ""        "LF_CRLF"    "LF_CRLF"       ""
-commit_chk_wrnNNO true  "crlf" "LF_CRLF" ""        "LF_CRLF"    "LF_CRLF"       ""
-commit_chk_wrnNNO input "crlf" "LF_CRLF" ""        "LF_CRLF"    "LF_CRLF"       ""
+commit_chk_wrnNNO "text"  ""      false   "$WILC"   "$WICL"   "$WAMIX"    "$WILC"     "$WICL"
+commit_chk_wrnNNO "text"  ""      true    LF_CRLF   ""        LF_CRLF     LF_CRLF     ""
+commit_chk_wrnNNO "text"  ""      input   ""        CRLF_LF   CRLF_LF     ""          CRLF_LF
 
-test_expect_success 'create files cleanup' '
+test_expect_success 'commit NNO and cleanup' '
+       git commit -m "commit files on top of NNO" &&
        rm -f *.txt &&
        git -c core.autocrlf=false reset --hard
 '
@@ -440,24 +446,20 @@ test_expect_success 'commit -text' '
        check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
 '
 
-#                       attr    LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLFNUL
-check_in_repo_NNO false ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-check_in_repo_NNO true  ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-check_in_repo_NNO input ""      LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-
-check_in_repo_NNO false "auto"  LF        LF        LF           LF_mix_CR     CRLF_nul
-check_in_repo_NNO true  "auto"  LF        LF        LF           LF_mix_CR     CRLF_nul
-check_in_repo_NNO input "auto"  LF        LF        LF           LF_mix_CR     CRLF_nul
-
-check_in_repo_NNO false "text"  LF        LF        LF           LF_mix_CR     LF_nul
-check_in_repo_NNO true  "text"  LF        LF        LF           LF_mix_CR     LF_nul
-check_in_repo_NNO input "text"  LF        LF        LF           LF_mix_CR     LF_nul
-
-check_in_repo_NNO false "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-check_in_repo_NNO true  "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-check_in_repo_NNO input "-text" LF        CRLF      CRLF_mix_LF  LF_mix_CR     CRLF_nul
-
-
+for crlf in true false input
+do
+       #                 attr  aeol           LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLFNUL
+       check_in_repo_NNO ""    ""     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO -text ""     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO -text lf     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO -text crlf   $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO auto  ""     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO auto  lf     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO auto  crlf   $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR  CRLF_nul
+       check_in_repo_NNO text  ""     $crlf   LF  LF    LF           LF_mix_CR  LF_nul
+       check_in_repo_NNO text  lf     $crlf   LF  LF    LF           LF_mix_CR  LF_nul
+       check_in_repo_NNO text  crlf   $crlf   LF  LF    LF           LF_mix_CR  LF_nul
+done
 ################################################################################
 # Check how files in the repo are changed when they are checked out
 # How to read the table below:
@@ -489,89 +491,47 @@ LFNUL=LF_nul
 fi
 export CRLF_MIX_LF_CR MIX NL
 
-checkout_files ""      ""       ""    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    false  crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    false  native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    true   crlf     CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    true   lf       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ""       ""    true   native   CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    false  crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    false  native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    true   ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    true   crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    true   lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files ""      ident ""    true   native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    false  ""       $NL   CRLF  $MIX_CRLF_LF LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    false  crlf     CRLF  CRLF  CRLF         LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    false  native   $NL   CRLF  $MIX_CRLF_LF LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    true   ""       CRLF  CRLF  CRLF         LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    true   crlf     CRLF  CRLF  CRLF         LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    true   lf       CRLF  CRLF  CRLF         LF_mix_CR    LF_nul
-checkout_files "auto"  ""       ""    true   native   CRLF  CRLF  CRLF         LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    false  crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    false  native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    true   ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    true   crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    true   lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-checkout_files "auto"  ident ""    true   native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-
-for id in "" ident;
+# Same handling with and without ident
+for id in "" ident
 do
-       checkout_files "crlf"  "$id" ""    false  ""       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    false  crlf     CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    false  lf       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    false  native   CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    input  ""       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    input  lf       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    true   ""       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    true   crlf     CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    true   lf       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "crlf"  "$id" ""    true   native   CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "lf"    "$id" ""    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    false  crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    false  native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    true   ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    true   crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    true   lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "lf"    "$id" ""    true   native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "text"  "$id" ""    false  ""       $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   $LFNUL
-       checkout_files "text"  "$id" ""    false  crlf     CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "text"  "$id" ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "text"  "$id" ""    false  native   $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   $LFNUL
-       checkout_files "text"  "$id" ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "text"  "$id" ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "text"  "$id" ""    true   ""       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "text"  "$id" ""    true   crlf     CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "text"  "$id" ""    true   lf       CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "text"  "$id" ""    true   native   CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
-       checkout_files "-text" "$id" ""    false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    false  crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    false  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    false  native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    input  lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    true   ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    true   crlf     LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    true   lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-       checkout_files "-text" "$id" ""    true   native   LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+       for ceol in lf crlf native
+       do
+               for crlf in true false input
+               do
+                       # -text overrides core.autocrlf and core.eol
+                       # text and eol=crlf or eol=lf override core.autocrlf and core.eol
+                       checkout_files -text "$id" ""     "$crlf" "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files -text "$id" "lf"   "$crlf" "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files -text "$id" "crlf" "$crlf" "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       # text
+                       checkout_files text  "$id" "lf"   "$crlf" "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files text  "$id" "crlf" "$crlf" "$ceol"  CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+                       # currently the same as text, eol=XXX
+                       checkout_files auto  "$id" "lf"   "$crlf" "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files auto  "$id" "crlf" "$crlf" "$ceol"  CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               done
+
+               # core.autocrlf false, different core.eol
+               checkout_files   ""    "$id" ""     false   "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               # core.autocrlf true
+               checkout_files   ""    "$id" ""     true    "$ceol"  CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               # text: core.autocrlf = true overrides core.eol
+               checkout_files   auto  "$id" ""     true    "$ceol"  CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files   text  "$id" ""     true    "$ceol"  CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+               # text: core.autocrlf = input overrides core.eol
+               checkout_files   text  "$id" ""     input   "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files   auto  "$id" ""     input   "$ceol"  LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+               # text=auto + eol=XXX
+       done
+       # text: core.autocrlf=false uses core.eol
+       checkout_files     text  "$id" ""     false   crlf     CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+       checkout_files     text  "$id" ""     false   lf       LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+       # text: core.autocrlf=false and core.eol unset(or native) uses native eol
+       checkout_files     text  "$id" ""     false   ""       $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   $LFNUL
+       checkout_files     text  "$id" ""     false   native   $NL   CRLF  $MIX_CRLF_LF $MIX_LF_CR   $LFNUL
+       # auto: core.autocrlf=false and core.eol unset(or native) uses native eol
+       checkout_files     auto  "$id" ""     false   ""       $NL   CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+       checkout_files     auto  "$id" ""     false   native   $NL   CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
 done
 
 # Should be the last test case: remove some files from the worktree
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 9be6411104999959ff93276ec2bbfb065bfa71e7..74d2cd76fe56bf6d6fab5d44834999b55d3220de 100755 (executable)
@@ -7,7 +7,7 @@ test_description='our own option parser'
 
 . ./test-lib.sh
 
-cat > expect << EOF
+cat >expect <<\EOF
 usage: test-parse-options <options>
 
     --yes                 get a boolean
@@ -45,63 +45,24 @@ Standard options
     -v, --verbose         be verbose
     -n, --dry-run         dry run
     -q, --quiet           be quiet
+    --expect <string>     expected output in the variable dump
 
 EOF
 
 test_expect_success 'test help' '
-       test_must_fail test-parse-options -h > output 2> output.err &&
+       test_must_fail test-parse-options -h >output 2>output.err &&
        test_must_be_empty output.err &&
        test_i18ncmp expect output
 '
 
 mv expect expect.err
 
-cat >expect.template <<EOF
-boolean: 0
-integer: 0
-magnitude: 0
-timestamp: 0
-string: (not set)
-abbrev: 7
-verbose: 0
-quiet: no
-dry run: no
-file: (not set)
-EOF
-
-check() {
-       what="$1" &&
-       shift &&
-       expect="$1" &&
-       shift &&
-       sed "s/^$what .*/$what $expect/" <expect.template >expect &&
-       test-parse-options $* >output 2>output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
-}
-
-check_i18n() {
+check () {
        what="$1" &&
        shift &&
        expect="$1" &&
        shift &&
-       sed "s/^$what .*/$what $expect/" <expect.template >expect &&
-       test-parse-options $* >output 2>output.err &&
-       test_must_be_empty output.err &&
-       test_i18ncmp expect output
-}
-
-check_unknown() {
-       case "$1" in
-       --*)
-               echo error: unknown option \`${1#--}\' >expect ;;
-       -*)
-               echo error: unknown switch \`${1#-}\' >expect ;;
-       esac &&
-       cat expect.err >>expect &&
-       test_must_fail test-parse-options $* >output 2>output.err &&
-       test_must_be_empty output &&
-       test_cmp expect output.err
+       test-parse-options --expect="$what $expect" "$@"
 }
 
 check_unknown_i18n() {
@@ -156,7 +117,7 @@ test_expect_success 'OPT_MAGNITUDE() 3giga' '
        check magnitude: 3221225472 -m 3g
 '
 
-cat > expect << EOF
+cat >expect <<\EOF
 boolean: 2
 integer: 1729
 magnitude: 16384
@@ -164,7 +125,7 @@ timestamp: 0
 string: 123
 abbrev: 7
 verbose: 2
-quiet: no
+quiet: 0
 dry run: yes
 file: prefix/my.file
 EOF
@@ -176,7 +137,7 @@ test_expect_success 'short options' '
        test_must_be_empty output.err
 '
 
-cat > expect << EOF
+cat >expect <<\EOF
 boolean: 2
 integer: 1729
 magnitude: 16384
@@ -184,7 +145,7 @@ timestamp: 0
 string: 321
 abbrev: 10
 verbose: 2
-quiet: no
+quiet: 0
 dry run: no
 file: prefix/fi.le
 EOF
@@ -204,15 +165,15 @@ test_expect_success 'missing required value' '
        test_expect_code 129 test-parse-options --file
 '
 
-cat > expect << EOF
+cat >expect <<\EOF
 boolean: 1
 integer: 13
 magnitude: 0
 timestamp: 0
 string: 123
 abbrev: 7
-verbose: 0
-quiet: no
+verbose: -1
+quiet: 0
 dry run: no
 file: (not set)
 arg 00: a1
@@ -222,108 +183,75 @@ EOF
 
 test_expect_success 'intermingled arguments' '
        test-parse-options a1 --string 123 b1 --boolean -j 13 -- --boolean \
-               > output 2> output.err &&
+               >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
-cat > expect << EOF
+cat >expect <<\EOF
 boolean: 0
 integer: 2
 magnitude: 0
 timestamp: 0
 string: (not set)
 abbrev: 7
-verbose: 0
-quiet: no
+verbose: -1
+quiet: 0
 dry run: no
 file: (not set)
 EOF
 
 test_expect_success 'unambiguously abbreviated option' '
-       test-parse-options --int 2 --boolean --no-bo > output 2> output.err &&
+       test-parse-options --int 2 --boolean --no-bo >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
 test_expect_success 'unambiguously abbreviated option with "="' '
-       test-parse-options --int=2 > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="integer: 2" --int=2
 '
 
 test_expect_success 'ambiguously abbreviated option' '
        test_expect_code 129 test-parse-options --strin 123
 '
 
-cat > expect << EOF
-boolean: 0
-integer: 0
-magnitude: 0
-timestamp: 0
-string: 123
-abbrev: 7
-verbose: 0
-quiet: no
-dry run: no
-file: (not set)
-EOF
-
 test_expect_success 'non ambiguous option (after two options it abbreviates)' '
-       test-parse-options --st 123 > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="string: 123" --st 123
 '
 
-cat > typo.err << EOF
-error: did you mean \`--boolean\` (with two dashes ?)
+cat >typo.err <<\EOF
+error: did you mean `--boolean` (with two dashes ?)
 EOF
 
 test_expect_success 'detect possible typos' '
-       test_must_fail test-parse-options -boolean > output 2> output.err &&
+       test_must_fail test-parse-options -boolean >output 2>output.err &&
        test_must_be_empty output &&
        test_cmp typo.err output.err
 '
 
-cat > typo.err << EOF
-error: did you mean \`--ambiguous\` (with two dashes ?)
+cat >typo.err <<\EOF
+error: did you mean `--ambiguous` (with two dashes ?)
 EOF
 
 test_expect_success 'detect possible typos' '
-       test_must_fail test-parse-options -ambiguous > output 2> output.err &&
+       test_must_fail test-parse-options -ambiguous >output 2>output.err &&
        test_must_be_empty output &&
        test_cmp typo.err output.err
 '
 
-cat > expect <<EOF
-boolean: 0
-integer: 0
-magnitude: 0
-timestamp: 0
-string: (not set)
-abbrev: 7
-verbose: 0
-quiet: no
-dry run: no
-file: (not set)
-arg 00: --quux
-EOF
-
 test_expect_success 'keep some options as arguments' '
-       test-parse-options --quux > output 2> output.err &&
-       test_must_be_empty output.err &&
-        test_cmp expect output
+       test-parse-options --expect="arg 00: --quux" --quux
 '
 
-cat > expect <<EOF
+cat >expect <<\EOF
 boolean: 0
 integer: 0
 magnitude: 0
 timestamp: 1
 string: (not set)
 abbrev: 7
-verbose: 0
-quiet: yes
+verbose: -1
+quiet: 1
 dry run: no
 file: (not set)
 arg 00: foo
@@ -331,12 +259,12 @@ EOF
 
 test_expect_success 'OPT_DATE() works' '
        test-parse-options -t "1970-01-01 00:00:01 +0000" \
-               foo -q > output 2> output.err &&
+               foo -q >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
-cat > expect <<EOF
+cat >expect <<\EOF
 Callback: "four", 0
 boolean: 5
 integer: 4
@@ -344,112 +272,76 @@ magnitude: 0
 timestamp: 0
 string: (not set)
 abbrev: 7
-verbose: 0
-quiet: no
+verbose: -1
+quiet: 0
 dry run: no
 file: (not set)
 EOF
 
 test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
-       test-parse-options --length=four -b -4 > output 2> output.err &&
+       test-parse-options --length=four -b -4 >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
-cat > expect <<EOF
-Callback: "not set", 1
-EOF
+>expect
 
 test_expect_success 'OPT_CALLBACK() and callback errors work' '
-       test_must_fail test-parse-options --no-length > output 2> output.err &&
+       test_must_fail test-parse-options --no-length >output 2>output.err &&
        test_i18ncmp expect output &&
        test_i18ncmp expect.err output.err
 '
 
-cat > expect <<EOF
+cat >expect <<\EOF
 boolean: 1
 integer: 23
 magnitude: 0
 timestamp: 0
 string: (not set)
 abbrev: 7
-verbose: 0
-quiet: no
+verbose: -1
+quiet: 0
 dry run: no
 file: (not set)
 EOF
 
 test_expect_success 'OPT_BIT() and OPT_SET_INT() work' '
-       test-parse-options --set23 -bbbbb --no-or4 > output 2> output.err &&
+       test-parse-options --set23 -bbbbb --no-or4 >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
 test_expect_success 'OPT_NEGBIT() and OPT_SET_INT() work' '
-       test-parse-options --set23 -bbbbb --neg-or4 > output 2> output.err &&
+       test-parse-options --set23 -bbbbb --neg-or4 >output 2>output.err &&
        test_must_be_empty output.err &&
        test_cmp expect output
 '
 
-cat > expect <<EOF
-boolean: 6
-integer: 0
-magnitude: 0
-timestamp: 0
-string: (not set)
-abbrev: 7
-verbose: 0
-quiet: no
-dry run: no
-file: (not set)
-EOF
-
 test_expect_success 'OPT_BIT() works' '
-       test-parse-options -bb --or4 > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="boolean: 6" -bb --or4
 '
 
 test_expect_success 'OPT_NEGBIT() works' '
-       test-parse-options -bb --no-neg-or4 > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="boolean: 6" -bb --no-neg-or4
 '
 
 test_expect_success 'OPT_COUNTUP() with PARSE_OPT_NODASH works' '
-       test-parse-options + + + + + + > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="boolean: 6" + + + + + +
 '
 
-cat > expect <<EOF
-boolean: 0
-integer: 12345
-magnitude: 0
-timestamp: 0
-string: (not set)
-abbrev: 7
-verbose: 0
-quiet: no
-dry run: no
-file: (not set)
-EOF
-
 test_expect_success 'OPT_NUMBER_CALLBACK() works' '
-       test-parse-options -12345 > output 2> output.err &&
-       test_must_be_empty output.err &&
-       test_cmp expect output
+       test-parse-options --expect="integer: 12345" -12345
 '
 
-cat >expect <<EOF
+cat >expect <<\EOF
 boolean: 0
 integer: 0
 magnitude: 0
 timestamp: 0
 string: (not set)
 abbrev: 7
-verbose: 0
-quiet: no
+verbose: -1
+quiet: 0
 dry run: no
 file: (not set)
 EOF
@@ -460,7 +352,7 @@ test_expect_success 'negation of OPT_NONEG flags is not ambiguous' '
        test_cmp expect output
 '
 
-cat >>expect <<'EOF'
+cat >>expect <<\EOF
 list: foo
 list: bar
 list: baz
@@ -476,4 +368,28 @@ test_expect_success '--no-list resets list' '
        test_cmp expect output
 '
 
+test_expect_success 'multiple quiet levels' '
+       test-parse-options --expect="quiet: 3" -q -q -q
+'
+
+test_expect_success 'multiple verbose levels' '
+       test-parse-options --expect="verbose: 3" -v -v -v
+'
+
+test_expect_success '--no-quiet sets --quiet to 0' '
+       test-parse-options --expect="quiet: 0" --no-quiet
+'
+
+test_expect_success '--no-quiet resets multiple -q to 0' '
+       test-parse-options --expect="quiet: 0" -q -q -q --no-quiet
+'
+
+test_expect_success '--no-verbose sets verbose to 0' '
+       test-parse-options --expect="verbose: 0" --no-verbose
+'
+
+test_expect_success '--no-verbose resets multiple verbose to 0' '
+       test-parse-options --expect="verbose: 0" -v -v -v --no-verbose
+'
+
 test_done
index 8532a028e7c814057fe0bb7fd87addbd5dc90392..444b5a4df801975cf4f96f8193cb04ac91af3e4d 100755 (executable)
@@ -19,6 +19,13 @@ relative_path() {
        "test \"\$(test-path-utils relative_path '$1' '$2')\" = '$expected'"
 }
 
+test_submodule_relative_url() {
+       test_expect_success "test_submodule_relative_url: $1 $2 $3 => $4" "
+               actual=\$(git submodule--helper resolve-relative-url-test '$1' '$2' '$3') &&
+               test \"\$actual\" = '$4'
+       "
+}
+
 test_git_path() {
        test_expect_success "git-path $1 $2 => $3" "
                $1 git rev-parse --git-path $2 >actual &&
@@ -298,4 +305,46 @@ 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, $(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"
+test_submodule_relative_url "../" "../foo/submodule" "../submodule" "../../foo/submodule"
+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 "../" "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)" "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"
+test_submodule_relative_url "(null)" "helper:://hostname/repo" "../subrepo" "helper:://hostname/subrepo"
+test_submodule_relative_url "(null)" "ssh://hostname/repo" "../subrepo" "ssh://hostname/subrepo"
+test_submodule_relative_url "(null)" "ssh://hostname:22/repo" "../subrepo" "ssh://hostname:22/subrepo"
+test_submodule_relative_url "(null)" "user@host:path/to/repo" "../subrepo" "user@host:path/to/subrepo"
+test_submodule_relative_url "(null)" "user@host:repo" "../subrepo" "user@host:subrepo"
+
 test_done
index 5ed69a6f566bf3a7944b41bace4cfbe26d015040..991ed2a48dbf15fb4cb794a587ad900071391e11 100755 (executable)
@@ -31,7 +31,7 @@ test_expect_success 'git_mkstemps_mode does not fail if fd 0 is not open' '
 
 test_expect_success 'check for a bug in the regex routines' '
        # if this test fails, re-build git with NO_REGEX=1
-       test-regex
+       test-regex --bug
 '
 
 test_done
index d7ef44b4a261a588874df3b8359d809655286a43..03bd31e9f22a1964551cb07d76c45ce90a3cd17e 100755 (executable)
@@ -298,4 +298,15 @@ test_expect_success 'helpers can abort the process' '
        test_cmp expect stdout
 '
 
+test_expect_success 'empty helper spec resets helper list' '
+       test_config credential.helper "verbatim file file" &&
+       check fill "" "verbatim cmdline cmdline" <<-\EOF
+       --
+       username=cmdline
+       password=cmdline
+       --
+       verbatim: get
+       EOF
+'
+
 test_done
index 4f38078ff36f5a877defc360feaf6fdba804ccc1..b19f3326946203409fe0e428b9fc73d34134d756 100755 (executable)
@@ -231,7 +231,7 @@ $tag_content
        | git cat-file --batch)"
 '
 
-test_expect_success "--batch-check for an emtpy line" '
+test_expect_success "--batch-check for an empty line" '
     test " missing" = "$(echo | git cat-file --batch-check)"
 '
 
index 7d2baa15bbd0bbbe8c12631ad2d24b77e90b8775..c5245c5cb4c1c086b6fe7205f34b9b5ca53e2e59 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,30 @@ 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 '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 +183,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 0c74beedd22600e8dfe852393a5a9a36350cfeb5..c167f606ca7b8c1628ac8d00507d50f032278730 100755 (executable)
@@ -15,11 +15,11 @@ test_description='sparse checkout tests
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
 test_expect_success 'setup' '
-       cat >expected <<-\EOF &&
+       cat >expected <<-EOF &&
        100644 77f0ba1734ed79d12881f81b36ee134de6a3327b 0       init.t
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       sub/added
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       sub/addedtoo
-       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       subsub/added
+       100644 $EMPTY_BLOB 0    sub/added
+       100644 $EMPTY_BLOB 0    sub/addedtoo
+       100644 $EMPTY_BLOB 0    subsub/added
        EOF
        cat >expected.swt <<-\EOF &&
        H init.t
@@ -244,10 +244,10 @@ test_expect_success 'print errors when failed to update worktree' '
 error: The following untracked working tree files would be overwritten by checkout:
        sub/added
        sub/addedtoo
-Please move or remove them before you can switch branches.
+Please move or remove them before you switch branches.
 Aborting
 EOF
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_expect_success 'checkout without --ignore-skip-worktree-bits' '
index 8e22b03cdd132bd54f9db44d362c15d129415651..df3183ea1ab36a46b914333e834093bd50847265 100755 (executable)
@@ -141,13 +141,13 @@ test_expect_success 'GIT_PREFIX for !alias' '
 test_expect_success 'GIT_PREFIX for built-ins' '
        # Use GIT_EXTERNAL_DIFF to test that the "diff" built-in
        # receives the GIT_PREFIX variable.
-       printf "dir/" >expect &&
-       printf "#!/bin/sh\n" >diff &&
-       printf "printf \"\$GIT_PREFIX\"" >>diff &&
-       chmod +x diff &&
+       echo "dir/" >expect &&
+       write_script diff <<-\EOF &&
+       printf "%s\n" "$GIT_PREFIX"
+       EOF
        (
                cd dir &&
-               printf "change" >two &&
+               echo "change" >two &&
                GIT_EXTERNAL_DIFF=./diff git diff >../actual
                git checkout -- two
        ) &&
index f9f3d1391ff496da38e0ed25780d1fdae173c91d..096dbffecc3d51478b643bd2f4dee92f507e1c1a 100755 (executable)
@@ -177,10 +177,9 @@ test_expect_success 'zip achiving, deflate' '
        git archive --format=zip HEAD >/dev/null
 '
 
-test_expect_success 'fsck' '
-       test_must_fail git fsck 2>err &&
-       n=$(grep "error: attempting to allocate .* over limit" err | wc -l) &&
-       test "$n" -gt 1
+test_expect_success 'fsck large blobs' '
+       git fsck 2>err &&
+       test_must_be_empty err
 '
 
 test_done
index b7e9b4fc5b365897d80501d1c49d70ad47740acc..ae66ba5babf347f12f2c4cb213b0de72ea980da2 100755 (executable)
@@ -15,7 +15,7 @@ Also make sure that command line parser understands the normal
 . ./test-lib.sh
 
 cat >expected <<EOF
-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
+tree $EMPTY_TREE
 author Author Name <author@email> 1117148400 +0000
 committer Committer Name <committer@email> 1117150200 +0000
 
index 6767da87cba9589222b033c80b605b832f708baf..923bfc5a2606588f30bebbcfd4c34788976c354c 100755 (executable)
@@ -886,7 +886,7 @@ test_expect_success !MINGW 'get --path copes with unset $HOME' '
                git config --get --path path.normal >>result &&
                git config --get --path path.trailingtilde >>result
        ) &&
-       grep "[Ff]ailed to expand.*~/" msg &&
+       test_i18ngrep "[Ff]ailed to expand.*~/" msg &&
        test_cmp expect result
 '
 
@@ -1087,6 +1087,20 @@ test_expect_success 'git -c complains about empty key and value' '
        test_must_fail git -c "" rev-parse
 '
 
+test_expect_success 'multiple git -c appends config' '
+       test_config alias.x "!git -c x.two=2 config --get-regexp ^x\.*" &&
+       cat >expect <<-\EOF &&
+       x.one 1
+       x.two 2
+       EOF
+       git -c x.one=1 x >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'git -c is not confused by empty environment' '
+       GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
+'
+
 test_expect_success 'git config --edit works' '
        git config -f tmp test.value no &&
        echo test.value=yes >expect &&
@@ -1112,7 +1126,7 @@ test_expect_success 'barf on syntax error' '
        key garbage
        EOF
        test_must_fail git config --get section.key >actual 2>error &&
-       grep " line 3 " error
+       test_i18ngrep " line 3 " error
 '
 
 test_expect_success 'barf on incomplete section header' '
@@ -1122,7 +1136,7 @@ test_expect_success 'barf on incomplete section header' '
        key = value
        EOF
        test_must_fail git config --get section.key >actual 2>error &&
-       grep " line 2 " error
+       test_i18ngrep " line 2 " error
 '
 
 test_expect_success 'barf on incomplete string' '
@@ -1132,7 +1146,7 @@ test_expect_success 'barf on incomplete string' '
        key = "value string
        EOF
        test_must_fail git config --get section.key >actual 2>error &&
-       grep " line 3 " error
+       test_i18ngrep " line 3 " error
 '
 
 test_expect_success 'urlmatch' '
@@ -1144,6 +1158,9 @@ test_expect_success 'urlmatch' '
                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://good.example.com >actual &&
        test_cmp expect actual &&
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 3c6791e6be705bc823ff180cd481fef3dc939734..eed31ffa30eebaa994b2fee569eb753e2a6a1477 100755 (executable)
@@ -61,10 +61,7 @@ test_expect_success 'parse errors in blobs are properly attributed' '
        git commit -m broken &&
 
        test_must_fail git config --blob=HEAD:config some.value 2>err &&
-
-       # just grep for our token as the exact error message is likely to
-       # change or be internationalized
-       grep "HEAD:config" err
+       test_i18ngrep "HEAD:config" err
 '
 
 test_expect_success 'can parse blob ending with CR' '
index 005d66dbef6c361363752b37087bbbc6a3098833..ff50960ccaed9953c5738c9bbf602bf0d326e15a 100755 (executable)
@@ -197,14 +197,14 @@ test_expect_success 'proper error on error in default config files' '
        echo "[" >>.git/config &&
        echo "fatal: bad config line 34 in file .git/config" >expect &&
        test_expect_code 128 test-config get_value foo.bar 2>actual &&
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 test_expect_success 'proper error on error in custom config files' '
        echo "[" >>syntax-error &&
        echo "fatal: bad config line 1 in file syntax-error" >expect &&
        test_expect_code 128 test-config configset_get_value foo.bar syntax-error 2>actual &&
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 test_expect_success 'check line errors for malformed values' '
@@ -219,14 +219,43 @@ test_expect_success 'check line errors for malformed values' '
 '
 
 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'"
+test_expect_success 'iteration shows correct origins' '
+       echo "[foo]bar = from-repo" >.git/config &&
+       echo "[foo]bar = from-home" >.gitconfig &&
+       if test_have_prereq MINGW
+       then
+               # Use Windows path (i.e. *not* $HOME)
+               HOME_GITCONFIG=$(pwd)/.gitconfig
+       else
+               # Do not get fooled by symbolic links, i.e. $HOME != $(pwd)
+               HOME_GITCONFIG=$HOME/.gitconfig
+       fi &&
+       cat >expect <<-EOF &&
+       key=foo.bar
+       value=from-home
+       origin=file
+       name=$HOME_GITCONFIG
+       scope=global
+
+       key=foo.bar
+       value=from-repo
+       origin=file
+       name=.git/config
+       scope=repo
+
+       key=foo.bar
+       value=from-cmdline
+       origin=command line
+       name=
+       scope=cmdline
+       EOF
+       GIT_CONFIG_PARAMETERS=$cmdline_config test-config iterate >actual &&
+       test_cmp expect actual
 '
 
 test_done
diff --git a/t/t1350-config-hooks-path.sh b/t/t1350-config-hooks-path.sh
new file mode 100755 (executable)
index 0000000..f1f9aee
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+test_description='Test the core.hooksPath configuration variable'
+
+. ./test-lib.sh
+
+test_expect_success 'set up a pre-commit hook in core.hooksPath' '
+       mkdir -p .git/custom-hooks .git/hooks &&
+       write_script .git/custom-hooks/pre-commit <<-\EOF &&
+       echo CUSTOM >>actual
+       EOF
+       write_script .git/hooks/pre-commit <<-\EOF
+       echo NORMAL >>actual
+       EOF
+'
+
+test_expect_success 'Check that various forms of specifying core.hooksPath work' '
+       test_commit no_custom_hook &&
+       git config core.hooksPath .git/custom-hooks &&
+       test_commit have_custom_hook &&
+       git config core.hooksPath .git/custom-hooks/ &&
+       test_commit have_custom_hook_trailing_slash &&
+       git config core.hooksPath "$PWD/.git/custom-hooks" &&
+       test_commit have_custom_hook_abs_path &&
+       git config core.hooksPath "$PWD/.git/custom-hooks/" &&
+       test_commit have_custom_hook_abs_path_trailing_slash &&
+       cat >expect <<-\EOF &&
+       NORMAL
+       CUSTOM
+       CUSTOM
+       CUSTOM
+       CUSTOM
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success 'git rev-parse --git-path hooks' '
+       git config core.hooksPath .git/custom-hooks &&
+       git rev-parse --git-path hooks/abc >actual &&
+       test .git/custom-hooks/abc = "$(cat actual)"
+'
+
+test_done
index af1b20dd5c6763e58eccd3f93722987f5f9ce233..d4fb9770600df75d3162ffbc6c567b1ae152fccd 100755 (executable)
@@ -23,7 +23,7 @@ test_expect_success setup '
 m=refs/heads/master
 n_dir=refs/heads/gu
 n=$n_dir/fixes
-outside=foo
+outside=refs/foo
 
 test_expect_success \
        "create $m" \
@@ -361,7 +361,7 @@ test_expect_success 'stdin test setup' '
 
 test_expect_success '-z fails without --stdin' '
        test_must_fail git update-ref -z $m $m $m 2>err &&
-       grep "usage: git update-ref" err
+       test_i18ngrep "usage: git update-ref" err
 '
 
 test_expect_success 'stdin works with no input' '
@@ -479,7 +479,7 @@ test_expect_success 'stdin fails with duplicate refs' '
        create $a $m
        EOF
        test_must_fail git update-ref --stdin <stdin 2>err &&
-       grep "fatal: Multiple updates for ref '"'"'$a'"'"' not allowed." err
+       grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
 '
 
 test_expect_success 'stdin create ref works' '
@@ -880,7 +880,7 @@ test_expect_success 'stdin -z fails option with unknown name' '
 test_expect_success 'stdin -z fails with duplicate refs' '
        printf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin &&
        test_must_fail git update-ref -z --stdin <stdin 2>err &&
-       grep "fatal: Multiple updates for ref '"'"'$a'"'"' not allowed." err
+       grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
 '
 
 test_expect_success 'stdin -z create ref works' '
@@ -1102,6 +1102,41 @@ test_expect_success 'stdin -z delete refs works with packed and loose refs' '
        test_must_fail git rev-parse --verify -q $c
 '
 
+test_expect_success 'fails with duplicate HEAD update' '
+       git branch target1 $A &&
+       git checkout target1 &&
+       cat >stdin <<-EOF &&
+       update refs/heads/target1 $C
+       option no-deref
+       update HEAD $B
+       EOF
+       test_must_fail git update-ref --stdin <stdin 2>err &&
+       grep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err &&
+       echo "refs/heads/target1" >expect &&
+       git symbolic-ref HEAD >actual &&
+       test_cmp expect actual &&
+       echo "$A" >expect &&
+       git rev-parse refs/heads/target1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'fails with duplicate ref update via symref' '
+       git branch target2 $A &&
+       git symbolic-ref refs/heads/symref2 refs/heads/target2 &&
+       cat >stdin <<-EOF &&
+       update refs/heads/target2 $C
+       update refs/heads/symref2 $B
+       EOF
+       test_must_fail git update-ref --stdin <stdin 2>err &&
+       grep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err &&
+       echo "refs/heads/target2" >expect &&
+       git symbolic-ref refs/heads/symref2 >actual &&
+       test_cmp expect actual &&
+       echo "$A" >expect &&
+       git rev-parse refs/heads/target2 >actual &&
+       test_cmp expect actual
+'
+
 run_with_limited_open_files () {
        (ulimit -n 32 && "$@")
 }
index 417eecc3af2a30c3544ddd2f83b7ccecc540eaf1..eec3e90f9c04e9b88ebb8c2ee6f12b96b75bac2b 100755 (executable)
@@ -33,18 +33,25 @@ test_expect_success 'symbolic-ref refuses bare sha1' '
 '
 reset_to_sane
 
-test_expect_success 'symbolic-ref deletes HEAD' '
-       git symbolic-ref -d HEAD &&
+test_expect_success 'HEAD cannot be removed' '
+       test_must_fail git symbolic-ref -d HEAD
+'
+
+reset_to_sane
+
+test_expect_success 'symbolic-ref can be deleted' '
+       git symbolic-ref NOTHEAD refs/heads/foo &&
+       git symbolic-ref -d NOTHEAD &&
        test_path_is_file .git/refs/heads/foo &&
-       test_path_is_missing .git/HEAD
+       test_path_is_missing .git/NOTHEAD
 '
 reset_to_sane
 
-test_expect_success 'symbolic-ref deletes dangling HEAD' '
-       git symbolic-ref HEAD refs/heads/missing &&
-       git symbolic-ref -d HEAD &&
+test_expect_success 'symbolic-ref can delete dangling symref' '
+       git symbolic-ref NOTHEAD refs/heads/missing &&
+       git symbolic-ref -d NOTHEAD &&
        test_path_is_missing .git/refs/heads/missing &&
-       test_path_is_missing .git/HEAD
+       test_path_is_missing .git/NOTHEAD
 '
 reset_to_sane
 
@@ -110,7 +117,7 @@ test_expect_success 'symbolic-ref writes reflog entry' '
        update
        create
        EOF
-       git log --format=%gs -g >actual &&
+       git log --format=%gs -g -2 >actual &&
        test_cmp expect actual
 '
 
diff --git a/t/t1404-update-ref-df-conflicts.sh b/t/t1404-update-ref-df-conflicts.sh
deleted file mode 100755 (executable)
index 66bafb5..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/bin/sh
-
-test_description='Test git update-ref with D/F conflicts'
-. ./test-lib.sh
-
-test_update_rejected () {
-       prefix="$1" &&
-       before="$2" &&
-       pack="$3" &&
-       create="$4" &&
-       error="$5" &&
-       printf "create $prefix/%s $C\n" $before |
-       git update-ref --stdin &&
-       git for-each-ref $prefix >unchanged &&
-       if $pack
-       then
-               git pack-refs --all
-       fi &&
-       printf "create $prefix/%s $C\n" $create >input &&
-       test_must_fail git update-ref --stdin <input 2>output.err &&
-       grep -F "$error" output.err &&
-       git for-each-ref $prefix >actual &&
-       test_cmp unchanged actual
-}
-
-Q="'"
-
-test_expect_success 'setup' '
-
-       git commit --allow-empty -m Initial &&
-       C=$(git rev-parse HEAD)
-
-'
-
-test_expect_success 'existing loose ref is a simple prefix of new' '
-
-       prefix=refs/1l &&
-       test_update_rejected $prefix "a c e" false "b c/x d" \
-               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
-
-'
-
-test_expect_success 'existing packed ref is a simple prefix of new' '
-
-       prefix=refs/1p &&
-       test_update_rejected $prefix "a c e" true "b c/x d" \
-               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
-
-'
-
-test_expect_success 'existing loose ref is a deeper prefix of new' '
-
-       prefix=refs/2l &&
-       test_update_rejected $prefix "a c e" false "b c/x/y d" \
-               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
-
-'
-
-test_expect_success 'existing packed ref is a deeper prefix of new' '
-
-       prefix=refs/2p &&
-       test_update_rejected $prefix "a c e" true "b c/x/y d" \
-               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
-
-'
-
-test_expect_success 'new ref is a simple prefix of existing loose' '
-
-       prefix=refs/3l &&
-       test_update_rejected $prefix "a c/x e" false "b c d" \
-               "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
-
-'
-
-test_expect_success 'new ref is a simple prefix of existing packed' '
-
-       prefix=refs/3p &&
-       test_update_rejected $prefix "a c/x e" true "b c d" \
-               "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
-
-'
-
-test_expect_success 'new ref is a deeper prefix of existing loose' '
-
-       prefix=refs/4l &&
-       test_update_rejected $prefix "a c/x/y e" false "b c d" \
-               "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
-
-'
-
-test_expect_success 'new ref is a deeper prefix of existing packed' '
-
-       prefix=refs/4p &&
-       test_update_rejected $prefix "a c/x/y e" true "b c d" \
-               "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
-
-'
-
-test_expect_success 'one new ref is a simple prefix of another' '
-
-       prefix=refs/5 &&
-       test_update_rejected $prefix "a e" false "b c c/x d" \
-               "cannot process $Q$prefix/c$Q and $Q$prefix/c/x$Q at the same time"
-
-'
-
-test_done
diff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh
new file mode 100755 (executable)
index 0000000..c34ece4
--- /dev/null
@@ -0,0 +1,407 @@
+#!/bin/sh
+
+test_description='Test git update-ref error handling'
+. ./test-lib.sh
+
+# Create some references, perhaps run pack-refs --all, then try to
+# create some more references. Ensure that the second creation fails
+# with the correct error message.
+# Usage: test_update_rejected <before> <pack> <create> <error>
+#   <before> is a ws-separated list of refs to create before the test
+#   <pack> (true or false) tells whether to pack the refs before the test
+#   <create> is a list of variables to attempt creating
+#   <error> is a string to look for in the stderr of update-ref.
+# All references are created in the namespace specified by the current
+# value of $prefix.
+test_update_rejected () {
+       before="$1" &&
+       pack="$2" &&
+       create="$3" &&
+       error="$4" &&
+       printf "create $prefix/%s $C\n" $before |
+       git update-ref --stdin &&
+       git for-each-ref $prefix >unchanged &&
+       if $pack
+       then
+               git pack-refs --all
+       fi &&
+       printf "create $prefix/%s $C\n" $create >input &&
+       test_must_fail git update-ref --stdin <input 2>output.err &&
+       grep -F "$error" output.err &&
+       git for-each-ref $prefix >actual &&
+       test_cmp unchanged actual
+}
+
+Q="'"
+
+test_expect_success 'setup' '
+
+       git commit --allow-empty -m Initial &&
+       C=$(git rev-parse HEAD) &&
+       git commit --allow-empty -m Second &&
+       D=$(git rev-parse HEAD) &&
+       git commit --allow-empty -m Third &&
+       E=$(git rev-parse HEAD)
+'
+
+test_expect_success 'existing loose ref is a simple prefix of new' '
+
+       prefix=refs/1l &&
+       test_update_rejected "a c e" false "b c/x d" \
+               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
+
+'
+
+test_expect_success 'existing packed ref is a simple prefix of new' '
+
+       prefix=refs/1p &&
+       test_update_rejected "a c e" true "b c/x d" \
+               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x$Q"
+
+'
+
+test_expect_success 'existing loose ref is a deeper prefix of new' '
+
+       prefix=refs/2l &&
+       test_update_rejected "a c e" false "b c/x/y d" \
+               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
+
+'
+
+test_expect_success 'existing packed ref is a deeper prefix of new' '
+
+       prefix=refs/2p &&
+       test_update_rejected "a c e" true "b c/x/y d" \
+               "$Q$prefix/c$Q exists; cannot create $Q$prefix/c/x/y$Q"
+
+'
+
+test_expect_success 'new ref is a simple prefix of existing loose' '
+
+       prefix=refs/3l &&
+       test_update_rejected "a c/x e" false "b c d" \
+               "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a simple prefix of existing packed' '
+
+       prefix=refs/3p &&
+       test_update_rejected "a c/x e" true "b c d" \
+               "$Q$prefix/c/x$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a deeper prefix of existing loose' '
+
+       prefix=refs/4l &&
+       test_update_rejected "a c/x/y e" false "b c d" \
+               "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'new ref is a deeper prefix of existing packed' '
+
+       prefix=refs/4p &&
+       test_update_rejected "a c/x/y e" true "b c d" \
+               "$Q$prefix/c/x/y$Q exists; cannot create $Q$prefix/c$Q"
+
+'
+
+test_expect_success 'one new ref is a simple prefix of another' '
+
+       prefix=refs/5 &&
+       test_update_rejected "a e" false "b c c/x d" \
+               "cannot process $Q$prefix/c$Q and $Q$prefix/c/x$Q at the same time"
+
+'
+
+test_expect_success 'empty directory should not fool rev-parse' '
+       prefix=refs/e-rev-parse &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       echo "$C" >expected &&
+       git rev-parse $prefix/foo >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'empty directory should not fool for-each-ref' '
+       prefix=refs/e-for-each-ref &&
+       git update-ref $prefix/foo $C &&
+       git for-each-ref $prefix >expected &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       git for-each-ref $prefix >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'empty directory should not fool create' '
+       prefix=refs/e-create &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "create %s $C\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+test_expect_success 'empty directory should not fool verify' '
+       prefix=refs/e-verify &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "verify %s $C\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+test_expect_success 'empty directory should not fool 1-arg update' '
+       prefix=refs/e-update-1 &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "update %s $D\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+test_expect_success 'empty directory should not fool 2-arg update' '
+       prefix=refs/e-update-2 &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "update %s $D $C\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+test_expect_success 'empty directory should not fool 0-arg delete' '
+       prefix=refs/e-delete-0 &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "delete %s\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+test_expect_success 'empty directory should not fool 1-arg delete' '
+       prefix=refs/e-delete-1 &&
+       git update-ref $prefix/foo $C &&
+       git pack-refs --all &&
+       mkdir -p .git/$prefix/foo/bar/baz &&
+       printf "delete %s $C\n" $prefix/foo |
+       git update-ref --stdin
+'
+
+# Test various errors when reading the old values of references...
+
+test_expect_success 'missing old value blocks update' '
+       prefix=refs/missing-update &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/foo $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks update' '
+       prefix=refs/incorrect-update &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "update $prefix/foo $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'existing old value blocks create' '
+       prefix=refs/existing-create &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: reference already exists
+       EOF
+       printf "%s\n" "create $prefix/foo $E" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks delete' '
+       prefix=refs/incorrect-delete &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "delete $prefix/foo $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'missing old value blocks indirect update' '
+       prefix=refs/missing-indirect-update &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: unable to resolve reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/symref $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks indirect update' '
+       prefix=refs/incorrect-indirect-update &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "update $prefix/symref $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'existing old value blocks indirect create' '
+       prefix=refs/existing-indirect-create &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: reference already exists
+       EOF
+       printf "%s\n" "create $prefix/symref $E" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks indirect delete' '
+       prefix=refs/incorrect-indirect-delete &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "delete $prefix/symref $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'missing old value blocks indirect no-deref update' '
+       prefix=refs/missing-noderef-update &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: reference is missing but expected $D
+       EOF
+       printf "%s\n" "option no-deref" "update $prefix/symref $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks indirect no-deref update' '
+       prefix=refs/incorrect-noderef-update &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "option no-deref" "update $prefix/symref $E $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'existing old value blocks indirect no-deref create' '
+       prefix=refs/existing-noderef-create &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: reference already exists
+       EOF
+       printf "%s\n" "option no-deref" "create $prefix/symref $E" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'incorrect old value blocks indirect no-deref delete' '
+       prefix=refs/incorrect-noderef-delete &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       git update-ref $prefix/foo $C &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: is at $C but expected $D
+       EOF
+       printf "%s\n" "option no-deref" "delete $prefix/symref $D" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'non-empty directory blocks create' '
+       prefix=refs/ne-create &&
+       mkdir -p .git/$prefix/foo/bar &&
+       : >.git/$prefix/foo/bar/baz.lock &&
+       test_when_finished "rm -f .git/$prefix/foo/bar/baz.lock" &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: there is a non-empty directory $Q.git/$prefix/foo$Q blocking reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/foo $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/foo $D $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'broken reference blocks create' '
+       prefix=refs/broken-create &&
+       mkdir -p .git/$prefix &&
+       echo "gobbledigook" >.git/$prefix/foo &&
+       test_when_finished "rm -f .git/$prefix/foo" &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
+       EOF
+       printf "%s\n" "update $prefix/foo $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/foo$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
+       EOF
+       printf "%s\n" "update $prefix/foo $D $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'non-empty directory blocks indirect create' '
+       prefix=refs/ne-indirect-create &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       mkdir -p .git/$prefix/foo/bar &&
+       : >.git/$prefix/foo/bar/baz.lock &&
+       test_when_finished "rm -f .git/$prefix/foo/bar/baz.lock" &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: there is a non-empty directory $Q.git/$prefix/foo$Q blocking reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/symref $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: unable to resolve reference $Q$prefix/foo$Q
+       EOF
+       printf "%s\n" "update $prefix/symref $D $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_expect_success 'broken reference blocks indirect create' '
+       prefix=refs/broken-indirect-create &&
+       git symbolic-ref $prefix/symref $prefix/foo &&
+       echo "gobbledigook" >.git/$prefix/foo &&
+       test_when_finished "rm -f .git/$prefix/foo" &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
+       EOF
+       printf "%s\n" "update $prefix/symref $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err &&
+       cat >expected <<-EOF &&
+       fatal: cannot lock ref $Q$prefix/symref$Q: unable to resolve reference $Q$prefix/foo$Q: reference broken
+       EOF
+       printf "%s\n" "update $prefix/symref $D $C" |
+       test_must_fail git update-ref --stdin 2>output.err &&
+       test_cmp expected output.err
+'
+
+test_done
index c623824b4d0c2bfde08a69c242e4c5340b97abd3..553e26d9ceb83fc6529beb95ff71ffa0a899a166 100755 (executable)
@@ -338,4 +338,35 @@ test_expect_failure 'reflog with non-commit entries displays all entries' '
        test_line_count = 3 actual
 '
 
+test_expect_success 'reflog expire operates on symref not referrent' '
+       git branch -l the_symref &&
+       git branch -l referrent &&
+       git update-ref referrent HEAD &&
+       git symbolic-ref refs/heads/the_symref refs/heads/referrent &&
+       test_when_finished "rm -f .git/refs/heads/referrent.lock" &&
+       touch .git/refs/heads/referrent.lock &&
+       git reflog expire --expire=all the_symref
+'
+
+test_expect_success 'continue walking past root commits' '
+       git init orphanage &&
+       (
+               cd orphanage &&
+               cat >expect <<-\EOF &&
+               HEAD@{0} commit (initial): orphan2-1
+               HEAD@{1} commit: orphan1-2
+               HEAD@{2} commit (initial): orphan1-1
+               HEAD@{3} commit (initial): initial
+               EOF
+               test_commit initial &&
+               git checkout --orphan orphan1 &&
+               test_commit orphan1-1 &&
+               test_commit orphan1-2 &&
+               git checkout --orphan orphan2 &&
+               test_commit orphan2-1 &&
+               git log -g --format="%gd %gs" >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_done
index c465abe8e34936db135c136a6831975b2763e623..8937e25e4955b79d72952289e7485652309def3a 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'git branch shows badly named ref as warning' '
        cp .git/refs/heads/master .git/refs/heads/broken...ref &&
        test_when_finished "rm -f .git/refs/heads/broken...ref" &&
        git branch >output 2>error &&
-       grep -e "broken\.\.\.ref" error &&
+       test_i18ngrep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
        ! grep -e "broken\.\.\.ref" output
 '
 
@@ -147,35 +147,145 @@ test_expect_success 'rev-parse skips symref pointing to broken name' '
        test_when_finished "rm -f .git/refs/heads/broken...ref" &&
        git branch shadow one &&
        cp .git/refs/heads/master .git/refs/heads/broken...ref &&
-       git symbolic-ref refs/tags/shadow refs/heads/broken...ref &&
-
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/tags/shadow &&
+       test_when_finished "rm -f .git/refs/tags/shadow" &&
        git rev-parse --verify one >expect &&
        git rev-parse --verify shadow >actual 2>err &&
        test_cmp expect actual &&
-       test_i18ngrep "ignoring.*refs/tags/shadow" err
+       test_i18ngrep "ignoring dangling symref refs/tags/shadow" err
 '
 
-test_expect_success 'update-ref --no-deref -d can delete reference to broken name' '
-       git symbolic-ref refs/heads/badname refs/heads/broken...ref &&
+test_expect_success 'for-each-ref emits warnings for broken names' '
+       cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+       test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
        test_when_finished "rm -f .git/refs/heads/badname" &&
-       test_path_is_file .git/refs/heads/badname &&
-       git update-ref --no-deref -d refs/heads/badname &&
-       test_path_is_missing .git/refs/heads/badname
+       printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref &&
+       test_when_finished "rm -f .git/refs/heads/broken...symref" &&
+       git for-each-ref >output 2>error &&
+       ! grep -e "broken\.\.\.ref" output &&
+       ! grep -e "badname" output &&
+       ! grep -e "broken\.\.\.symref" output &&
+       test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error &&
+       test_i18ngrep "ignoring broken ref refs/heads/badname" error &&
+       test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error
 '
 
 test_expect_success 'update-ref -d can delete broken name' '
        cp .git/refs/heads/master .git/refs/heads/broken...ref &&
        test_when_finished "rm -f .git/refs/heads/broken...ref" &&
-       git update-ref -d refs/heads/broken...ref &&
+       git update-ref -d refs/heads/broken...ref >output 2>error &&
+       test_must_be_empty output &&
+       test_must_be_empty error &&
+       git branch >output 2>error &&
+       ! grep -e "broken\.\.\.ref" error &&
+       ! grep -e "broken\.\.\.ref" output
+'
+
+test_expect_success 'branch -d can delete broken name' '
+       cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+       test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+       git branch -d broken...ref >output 2>error &&
+       test_i18ngrep "Deleted branch broken...ref (was broken)" output &&
+       test_must_be_empty error &&
        git branch >output 2>error &&
        ! grep -e "broken\.\.\.ref" error &&
        ! grep -e "broken\.\.\.ref" output
 '
 
+test_expect_success 'update-ref --no-deref -d can delete symref to broken name' '
+       cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+       test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
+       test_when_finished "rm -f .git/refs/heads/badname" &&
+       git update-ref --no-deref -d refs/heads/badname >output 2>error &&
+       test_path_is_missing .git/refs/heads/badname &&
+       test_must_be_empty output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'branch -d can delete symref to broken name' '
+       cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+       test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
+       test_when_finished "rm -f .git/refs/heads/badname" &&
+       git branch -d badname >output 2>error &&
+       test_path_is_missing .git/refs/heads/badname &&
+       test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'update-ref --no-deref -d can delete dangling symref to broken name' '
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
+       test_when_finished "rm -f .git/refs/heads/badname" &&
+       git update-ref --no-deref -d refs/heads/badname >output 2>error &&
+       test_path_is_missing .git/refs/heads/badname &&
+       test_must_be_empty output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'branch -d can delete dangling symref to broken name' '
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
+       test_when_finished "rm -f .git/refs/heads/badname" &&
+       git branch -d badname >output 2>error &&
+       test_path_is_missing .git/refs/heads/badname &&
+       test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'update-ref -d can delete broken name through symref' '
+       cp .git/refs/heads/master .git/refs/heads/broken...ref &&
+       test_when_finished "rm -f .git/refs/heads/broken...ref" &&
+       printf "ref: refs/heads/broken...ref\n" >.git/refs/heads/badname &&
+       test_when_finished "rm -f .git/refs/heads/badname" &&
+       git update-ref -d refs/heads/badname >output 2>error &&
+       test_path_is_missing .git/refs/heads/broken...ref &&
+       test_must_be_empty output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'update-ref --no-deref -d can delete symref with broken name' '
+       printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref &&
+       test_when_finished "rm -f .git/refs/heads/broken...symref" &&
+       git update-ref --no-deref -d refs/heads/broken...symref >output 2>error &&
+       test_path_is_missing .git/refs/heads/broken...symref &&
+       test_must_be_empty output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'branch -d can delete symref with broken name' '
+       printf "ref: refs/heads/master\n" >.git/refs/heads/broken...symref &&
+       test_when_finished "rm -f .git/refs/heads/broken...symref" &&
+       git branch -d broken...symref >output 2>error &&
+       test_path_is_missing .git/refs/heads/broken...symref &&
+       test_i18ngrep "Deleted branch broken...symref (was refs/heads/master)" output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'update-ref --no-deref -d can delete dangling symref with broken name' '
+       printf "ref: refs/heads/idonotexist\n" >.git/refs/heads/broken...symref &&
+       test_when_finished "rm -f .git/refs/heads/broken...symref" &&
+       git update-ref --no-deref -d refs/heads/broken...symref >output 2>error &&
+       test_path_is_missing .git/refs/heads/broken...symref &&
+       test_must_be_empty output &&
+       test_must_be_empty error
+'
+
+test_expect_success 'branch -d can delete dangling symref with broken name' '
+       printf "ref: refs/heads/idonotexist\n" >.git/refs/heads/broken...symref &&
+       test_when_finished "rm -f .git/refs/heads/broken...symref" &&
+       git branch -d broken...symref >output 2>error &&
+       test_path_is_missing .git/refs/heads/broken...symref &&
+       test_i18ngrep "Deleted branch broken...symref (was refs/heads/idonotexist)" output &&
+       test_must_be_empty error
+'
+
 test_expect_success 'update-ref -d cannot delete non-ref in .git dir' '
        echo precious >.git/my-private-file &&
        echo precious >expect &&
-       test_must_fail git update-ref -d my-private-file &&
+       test_must_fail git update-ref -d my-private-file >output 2>error &&
+       test_must_be_empty output &&
+       test_i18ngrep -e "refusing to update ref with bad name" error &&
        test_cmp expect .git/my-private-file
 '
 
index e66b7cb697bc8a4ef7268e5d8d29f0b69a8ac213..ee7d4736db5ac67e7facfee77ffca54fde340d31 100755 (executable)
@@ -188,8 +188,7 @@ 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_expect_success 'tree object with duplicate entries' '
        test_when_finished "remove_object \$T" &&
        T=$(
                GIT_INDEX_FILE=test-index &&
@@ -208,6 +207,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
@@ -427,6 +439,24 @@ test_expect_success 'fsck allows .Ňit' '
        )
 '
 
+test_expect_success 'NUL in commit' '
+       rm -fr nul-in-commit &&
+       git init nul-in-commit &&
+       (
+               cd nul-in-commit &&
+               git commit --allow-empty -m "initial commitQNUL after message" &&
+               git cat-file commit HEAD >original &&
+               q_to_nul <original >munged &&
+               git hash-object -w -t commit --stdin <munged >name &&
+               git branch bad $(cat name) &&
+
+               test_must_fail git -c fsck.nulInCommit=error fsck 2>warn.1 &&
+               grep nulInCommit warn.1 &&
+               git fsck 2>warn.2 &&
+               grep nulInCommit warn.2
+       )
+'
+
 # create a static test repo which is broken by omitting
 # one particular object ($1, which is looked up via rev-parse
 # in the new repository).
@@ -505,4 +535,26 @@ 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 --name-objects' '
+       rm -rf name-objects &&
+       git init name-objects &&
+       (
+               cd name-objects &&
+               test_commit julius caesar.t &&
+               test_commit augustus &&
+               test_commit caesar &&
+               remove_loose_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_done
index 48ee07779d64147c3eb8325a3b3f9579f8ec41d8..038e24c401451d61e9c93fb5c233d132a3d51acd 100755 (executable)
@@ -3,85 +3,88 @@
 test_description='test git rev-parse'
 . ./test-lib.sh
 
-test_rev_parse() {
-       name=$1
-       shift
-
-       test_expect_success "$name: is-bare-repository" \
-       "test '$1' = \"\$(git rev-parse --is-bare-repository)\""
-       shift
-       [ $# -eq 0 ] && return
-
-       test_expect_success "$name: is-inside-git-dir" \
-       "test '$1' = \"\$(git rev-parse --is-inside-git-dir)\""
-       shift
-       [ $# -eq 0 ] && return
+# usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir
+test_rev_parse () {
+       d=
+       bare=
+       gitdir=
+       while :
+       do
+               case "$1" in
+               -C) d="$2"; shift; shift ;;
+               -b) case "$2" in
+                   [tfu]*) bare="$2"; shift; shift ;;
+                   *) error "test_rev_parse: bogus core.bare value '$2'" ;;
+                   esac ;;
+               -g) gitdir="$2"; shift; shift ;;
+               -*) error "test_rev_parse: unrecognized option '$1'" ;;
+               *) break ;;
+               esac
+       done
 
-       test_expect_success "$name: is-inside-work-tree" \
-       "test '$1' = \"\$(git rev-parse --is-inside-work-tree)\""
-       shift
-       [ $# -eq 0 ] && return
-
-       test_expect_success "$name: prefix" \
-       "test '$1' = \"\$(git rev-parse --show-prefix)\""
+       name=$1
        shift
-       [ $# -eq 0 ] && return
 
-       test_expect_success "$name: git-dir" \
-       "test '$1' = \"\$(git rev-parse --git-dir)\""
-       shift
-       [ $# -eq 0 ] && return
+       for o in --is-bare-repository \
+                --is-inside-git-dir \
+                --is-inside-work-tree \
+                --show-prefix \
+                --git-dir
+       do
+               test $# -eq 0 && break
+               expect="$1"
+               test_expect_success "$name: $o" '
+                       if test -n "$gitdir"
+                       then
+                               test_when_finished "unset GIT_DIR" &&
+                               GIT_DIR="$gitdir" &&
+                               export GIT_DIR
+                       fi &&
+
+                       case "$bare" in
+                       t*) test_config ${d:+-C} ${d:+"$d"} core.bare true ;;
+                       f*) test_config ${d:+-C} ${d:+"$d"} core.bare false ;;
+                       u*) test_unconfig ${d:+-C} ${d:+"$d"} core.bare ;;
+                       esac &&
+
+                       echo "$expect" >expect &&
+                       git ${d:+-C} ${d:+"$d"} rev-parse $o >actual &&
+                       test_cmp expect actual
+               '
+               shift
+       done
 }
 
-# label is-bare is-inside-git is-inside-work prefix git-dir
-
 ROOT=$(pwd)
 
+test_expect_success 'setup' '
+       mkdir -p sub/dir work &&
+       cp -R .git repo.git
+'
+
 test_rev_parse toplevel false false true '' .git
 
-cd .git || exit 1
-test_rev_parse .git/ false true false '' .
-cd objects || exit 1
-test_rev_parse .git/objects/ false true false '' "$ROOT/.git"
-cd ../.. || exit 1
+test_rev_parse -C .git .git/ false true false '' .
+test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git"
 
-mkdir -p sub/dir || exit 1
-cd sub/dir || exit 1
-test_rev_parse subdirectory false false true sub/dir/ "$ROOT/.git"
-cd ../.. || exit 1
+test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git"
 
-git config core.bare true
-test_rev_parse 'core.bare = true' true false false
+test_rev_parse -b t 'core.bare = true' true false false
 
-git config --unset core.bare
-test_rev_parse 'core.bare undefined' false false true
+test_rev_parse -b u 'core.bare undefined' false false true
 
-mkdir work || exit 1
-cd work || exit 1
-GIT_DIR=../.git
-GIT_CONFIG="$(pwd)"/../.git/config
-export GIT_DIR GIT_CONFIG
 
-git config core.bare false
-test_rev_parse '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 config core.bare true
-test_rev_parse 'GIT_DIR=../.git, core.bare = true' true false false ''
+test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false ''
 
-git config --unset core.bare
-test_rev_parse 'GIT_DIR=../.git, core.bare undefined' false false true ''
+test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true ''
 
-mv ../.git ../repo.git || exit 1
-GIT_DIR=../repo.git
-GIT_CONFIG="$(pwd)"/../repo.git/config
 
-git config core.bare false
-test_rev_parse '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 ''
 
-git config core.bare true
-test_rev_parse 'GIT_DIR=../repo.git, core.bare = true' true false false ''
+test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false ''
 
-git config --unset core.bare
-test_rev_parse 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
+test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true ''
 
 test_done
index ab27d0db5c5577a23e1053b58eefa63015526d0c..492edffa9cfb626b4747ead04251fc33b0502ac9 100755 (executable)
@@ -139,4 +139,9 @@ test_expect_success 'master@{n} for various n' '
        test_must_fail git rev-parse --verify master@{$Np1}
 '
 
+test_expect_success SYMLINKS 'ref resolution not confused by broken symlinks' '
+       ln -s does-not-exist .git/refs/heads/broken &&
+       test_must_fail git rev-parse --verify broken
+'
+
 test_done
index 613d9bfe1bbb153d1c2e647aee26a60e07a6af86..79a0251efa6e049be4fffa41004e73b9950d2bd7 100755 (executable)
@@ -106,7 +106,7 @@ test_expect_success 'incorrect revision id' '
        test_must_fail git rev-parse foobar:file.txt 2>error &&
        grep "Invalid object name '"'"'foobar'"'"'." error &&
        test_must_fail git rev-parse foobar 2> error &&
-       grep "unknown revision or path not in the working tree." error
+       test_i18ngrep "unknown revision or path not in the working tree." error
 '
 
 test_expect_success 'incorrect file in sha1:path' '
@@ -166,11 +166,6 @@ test_expect_success 'relative path when cwd is outside worktree' '
        grep "relative path syntax can.t be used outside working tree." error
 '
 
-test_expect_success 'relative path when startup_info is NULL' '
-       test_must_fail test-match-trees HEAD:./file.txt HEAD:./file.txt 2>error &&
-       grep "BUG: startup_info struct is not initialized." error
-'
-
 test_expect_success '<commit>:file correctly diagnosed after a pathname' '
        test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error &&
        test_i18ngrep ! "exists on disk" error &&
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
diff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh
new file mode 100755 (executable)
index 0000000..3ec2971
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+test_description='check that certain rev-parse options work outside repo'
+. ./test-lib.sh
+
+test_expect_success 'set up non-repo directory' '
+       GIT_CEILING_DIRECTORIES=$(pwd) &&
+       export GIT_CEILING_DIRECTORIES &&
+       mkdir non-repo &&
+       cd non-repo &&
+       # confirm that git does not find a repo
+       test_must_fail git rev-parse --git-dir
+'
+
+# Rather than directly test the output of sq-quote directly,
+# make sure the shell can read back a tricky case, since
+# that's what we really care about anyway.
+tricky="really tricky with \\ and \" and '"
+dump_args () {
+       for i in "$@"; do
+               echo "arg: $i"
+       done
+}
+test_expect_success 'rev-parse --sq-quote' '
+       dump_args "$tricky" easy >expect &&
+       eval "dump_args $(git rev-parse --sq-quote "$tricky" easy)" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-parse --local-env-vars' '
+       git rev-parse --local-env-vars >actual &&
+       # we do not want to depend on the complete list here,
+       # so just look for something plausible
+       grep ^GIT_DIR actual
+'
+
+test_expect_success 'rev-parse --resolve-git-dir' '
+       git init --separate-git-dir repo dir &&
+       test_must_fail git rev-parse --resolve-git-dir . &&
+       echo "$(pwd)/repo" >expect &&
+       git rev-parse --resolve-git-dir dir/.git >actual &&
+       test_cmp expect actual
+'
+
+test_done
index 8aef49f23624305a62047da4bc2fd66e6a03b0e5..292a0720fccb0becca47fad2945634cbffeb89d6 100755 (executable)
@@ -33,14 +33,14 @@ test_expect_success 'add one file' '
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<EOF &&
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+100644 $EMPTY_BLOB 0   one
 replacements:
 deletions:
 EOF
@@ -51,7 +51,7 @@ 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+100644 $EMPTY_BLOB 0   one
 EOF
        test_cmp ls-files.expect ls-files.actual &&
 
@@ -67,7 +67,7 @@ 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+100644 $EMPTY_BLOB 0   one
 EOF
        test_cmp ls-files.expect ls-files.actual &&
 
@@ -105,7 +105,7 @@ test_expect_success 'add another file, which stays index' '
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<EOF &&
 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0      one
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      two
+100644 $EMPTY_BLOB 0   two
 EOF
        test_cmp ls-files.expect ls-files.actual &&
 
@@ -113,7 +113,7 @@ EOF
        q_to_tab >expect <<EOF &&
 $BASE
 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      two
+100644 $EMPTY_BLOB 0   two
 replacements: 0
 deletions:
 EOF
@@ -159,14 +159,14 @@ test_expect_success 'add original file back' '
        git update-index --add one &&
        git ls-files --stage >ls-files.actual &&
        cat >ls-files.expect <<EOF &&
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
+100644 $EMPTY_BLOB 0   one
 replacements:
 deletions: 0
 EOF
@@ -178,8 +178,8 @@ test_expect_success 'add new file' '
        git update-index --add two &&
        git ls-files --stage >actual &&
        cat >expect <<EOF &&
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      two
+100644 $EMPTY_BLOB 0   one
+100644 $EMPTY_BLOB 0   two
 EOF
        test_cmp expect actual
 '
@@ -188,8 +188,8 @@ 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      one
-100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0      two
+100644 $EMPTY_BLOB 0   one
+100644 $EMPTY_BLOB 0   two
 EOF
        test_cmp ls-files.expect ls-files.actual &&
 
index 87bdf9c96bfacf4ac921ad9b195db46d9c3b079a..2e47fe01cfaf565777c9359e7c2675ef051c33e3 100755 (executable)
@@ -41,6 +41,15 @@ test_expect_success 'check ambiguity' '
        test_must_fail git checkout world all
 '
 
+test_expect_success 'check ambiguity in subdir' '
+       mkdir sub &&
+       # not ambiguous because sub/world does not exist
+       git -C sub checkout world ../all &&
+       echo hello >sub/world &&
+       # ambiguous because sub/world does exist
+       test_must_fail git -C sub checkout world ../all
+'
+
 test_expect_success 'disambiguate checking out from a tree-ish' '
        echo bye > world &&
        git checkout world -- world &&
@@ -49,7 +58,7 @@ test_expect_success 'disambiguate checking out from a tree-ish' '
 
 test_expect_success 'accurate error message with more than one ref' '
        test_must_fail git checkout HEAD master -- 2>actual &&
-       grep 2 actual &&
+       test_i18ngrep 2 actual &&
        test_i18ngrep "one reference expected, 2 given" actual
 '
 
index 2741262369e40a05cdc6732e4c9e6f04acb63bba..2131fb2a5682c50faf64e6066f03080702168b94 100755 (executable)
@@ -124,7 +124,7 @@ test_expect_success 'checkout -b to @{-1} fails with the right branch name' '
        git checkout branch2 &&
        echo  >expect "fatal: A branch named '\''branch1'\'' already exists." &&
        test_must_fail git checkout -b @{-1} 2>actual &&
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 test_expect_success 'checkout -B to an existing branch resets branch to HEAD' '
index 5d68729d7a65abde09d1293e8569b730d2ba9a40..fbb4ee9bb42dbcfdfcdb79511523a8fa2ac8b5d9 100755 (executable)
@@ -163,4 +163,27 @@ test_expect_success 'tracking count is accurate after orphan check' '
        test_i18ncmp expect stdout
 '
 
+test_expect_success 'no advice given for explicit detached head state' '
+       # baseline
+       test_config advice.detachedHead true &&
+       git checkout child && git checkout HEAD^0 >expect.advice 2>&1 &&
+       test_config advice.detachedHead false &&
+       git checkout child && git checkout HEAD^0 >expect.no-advice 2>&1 &&
+       test_unconfig advice.detachedHead &&
+       # without configuration, the advice.* variables default to true
+       git checkout child && git checkout HEAD^0 >actual 2>&1 &&
+       test_cmp expect.advice actual &&
+
+       # with explicit --detach
+       # no configuration
+       test_unconfig advice.detachedHead &&
+       git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
+       test_cmp expect.no-advice actual &&
+
+       # explicitly decline advice
+       test_config advice.detachedHead false &&
+       git checkout child && git checkout --detach HEAD^0 >actual 2>&1 &&
+       test_cmp expect.no-advice actual
+'
+
 test_done
index 468a000e4bbb113d004ee8df8ef0db9b8260fdb5..3e5ac81bd29bf6aded0d0fa643dca448a281d481 100755 (executable)
@@ -174,6 +174,18 @@ test_expect_success 'checkout of branch with a file having the same name fails'
        test_branch master
 '
 
+test_expect_success 'checkout of branch with a file in subdir having the same name fails' '
+       git checkout -B master &&
+       test_might_fail git branch -D spam &&
+
+       >spam &&
+       mkdir sub &&
+       mv spam sub/spam &&
+       test_must_fail git -C sub checkout spam &&
+       test_must_fail git rev-parse --verify refs/heads/spam &&
+       test_branch master
+'
+
 test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' '
        git checkout -B master &&
        test_might_fail git branch -D spam &&
index cbfa41ec61b9f893b4df441e0289a5313ccaf413..b618d6be21ff8926cb0d9dff1881c6e5e9eeb35a 100755 (executable)
@@ -4,6 +4,8 @@ test_description='test git worktree add'
 
 . ./test-lib.sh
 
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
 test_expect_success 'setup' '
        test_commit init
 '
@@ -18,6 +20,22 @@ test_expect_success '"add" an existing empty worktree' '
        git worktree add --detach existing_empty master
 '
 
+test_expect_success '"add" using shorthand - fails when no previous branch' '
+       test_must_fail git worktree add existing_short -
+'
+
+test_expect_success '"add" using - shorthand' '
+       git checkout -b newbranch &&
+       echo hello >myworld &&
+       git add myworld &&
+       git commit -m myworld &&
+       git checkout master &&
+       git worktree add short-hand - &&
+       echo refs/heads/newbranch >expect &&
+       git -C short-hand rev-parse --symbolic-full-name HEAD >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success '"add" refuses to checkout locked branch' '
        test_must_fail git worktree add zere master &&
        ! test -d zere &&
@@ -120,6 +138,14 @@ test_expect_success 'checkout from a bare repo without "add"' '
        )
 '
 
+test_expect_success '"add" default branch of a bare repo' '
+       (
+               git clone --bare . bare2 &&
+               cd bare2 &&
+               git worktree add ../there3 master
+       )
+'
+
 test_expect_success 'checkout with grafts' '
        test_when_finished rm .git/info/grafts &&
        test_commit abc &&
@@ -213,4 +239,73 @@ test_expect_success 'local clone from linked checkout' '
        ( cd here-clone && git fsck )
 '
 
+test_expect_success '"add" worktree with --no-checkout' '
+       git worktree add --no-checkout -b swamp swamp &&
+       ! test -e swamp/init.t &&
+       git -C swamp reset --hard &&
+       test_cmp init.t swamp/init.t
+'
+
+test_expect_success '"add" worktree with --checkout' '
+       git worktree add --checkout -b swmap2 swamp2 &&
+       test_cmp init.t swamp2/init.t
+'
+
+test_expect_success 'put a worktree under rebase' '
+       git worktree add under-rebase &&
+       (
+               cd under-rebase &&
+               set_fake_editor &&
+               FAKE_LINES="edit 1" git rebase -i HEAD^ &&
+               git worktree list | grep "under-rebase.*detached HEAD"
+       )
+'
+
+test_expect_success 'add a worktree, checking out a rebased branch' '
+       test_must_fail git worktree add new-rebase under-rebase &&
+       ! test -d new-rebase
+'
+
+test_expect_success 'checking out a rebased branch from another worktree' '
+       git worktree add new-place &&
+       test_must_fail git -C new-place checkout under-rebase
+'
+
+test_expect_success 'not allow to delete a branch under rebase' '
+       (
+               cd under-rebase &&
+               test_must_fail git branch -D under-rebase
+       )
+'
+
+test_expect_success 'rename a branch under rebase not allowed' '
+       test_must_fail git branch -M under-rebase rebase-with-new-name
+'
+
+test_expect_success 'check out from current worktree branch ok' '
+       (
+               cd under-rebase &&
+               git checkout under-rebase &&
+               git checkout - &&
+               git rebase --abort
+       )
+'
+
+test_expect_success 'checkout a branch under bisect' '
+       git worktree add under-bisect &&
+       (
+               cd under-bisect &&
+               git bisect start &&
+               git bisect bad &&
+               git bisect good HEAD~2 &&
+               git worktree list | grep "under-bisect.*detached HEAD" &&
+               test_must_fail git worktree add new-bisect under-bisect &&
+               ! test -d new-bisect
+       )
+'
+
+test_expect_success 'rename a branch under bisect not allowed' '
+       test_must_fail git branch -M under-bisect bisect-with-new-name
+'
+
 test_done
index 1b1b65a6b0fc7ace4e18e8642a6c47631d7e6a43..465eeeacd3de1971c7256c84583377b3b47d520b 100755 (executable)
@@ -96,4 +96,44 @@ 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 | head -n 3 >actual &&
+               test_cmp ../expected actual &&
+               git worktree list | head -n 1 >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 | grep ^worktree >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
diff --git a/t/t2028-worktree-move.sh b/t/t2028-worktree-move.sh
new file mode 100755 (executable)
index 0000000..8298aaf
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+test_description='test git worktree move, remove, lock and unlock'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       test_commit init &&
+       git worktree add source &&
+       git worktree list --porcelain | grep "^worktree" >actual &&
+       cat <<-EOF >expected &&
+       worktree $(pwd)
+       worktree $(pwd)/source
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'lock main worktree' '
+       test_must_fail git worktree lock .
+'
+
+test_expect_success 'lock linked worktree' '
+       git worktree lock --reason hahaha source &&
+       echo hahaha >expected &&
+       test_cmp expected .git/worktrees/source/locked
+'
+
+test_expect_success 'lock linked worktree from another worktree' '
+       rm .git/worktrees/source/locked &&
+       git worktree add elsewhere &&
+       git -C elsewhere worktree lock --reason hahaha ../source &&
+       echo hahaha >expected &&
+       test_cmp expected .git/worktrees/source/locked
+'
+
+test_expect_success 'lock worktree twice' '
+       test_must_fail git worktree lock source &&
+       echo hahaha >expected &&
+       test_cmp expected .git/worktrees/source/locked
+'
+
+test_expect_success 'lock worktree twice (from the locked worktree)' '
+       test_must_fail git -C source worktree lock . &&
+       echo hahaha >expected &&
+       test_cmp expected .git/worktrees/source/locked
+'
+
+test_expect_success 'unlock main worktree' '
+       test_must_fail git worktree unlock .
+'
+
+test_expect_success 'unlock linked worktree' '
+       git worktree unlock source &&
+       test_path_is_missing .git/worktrees/source/locked
+'
+
+test_expect_success 'unlock worktree twice' '
+       test_must_fail git worktree unlock source &&
+       test_path_is_missing .git/worktrees/source/locked
+'
+
+test_done
index dfe02f48183ad77a93d72c0f5e952380b63a9229..32ac6e09bdc81acfb8de5cf887302794d20c8ece 100755 (executable)
@@ -80,4 +80,17 @@ test_expect_success '.lock files cleaned up' '
        )
 '
 
+test_expect_success '--chmod=+x and chmod=-x in the same argument list' '
+       >A &&
+       >B &&
+       git add A B &&
+       git update-index --chmod=+x A --chmod=-x B &&
+       cat >expect <<-\EOF &&
+       100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       A
+       100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       B
+       EOF
+       git ls-files --stage A B >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 2a4a749b4fa3b07963a18b645d29ef774c01bbd1..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' '
@@ -82,5 +98,57 @@ test_expect_success 'cache-tree invalidates i-t-a paths' '
        test_cmp expect actual
 '
 
+test_expect_success 'cache-tree does not ignore dir that has i-t-a entries' '
+       git init ita-in-dir &&
+       (
+               cd ita-in-dir &&
+               mkdir 2 &&
+               for f in 1 2/1 2/2 3
+               do
+                       echo "$f" >"$f"
+               done &&
+               git add 1 2/2 3 &&
+               git add -N 2/1 &&
+               git commit -m committed &&
+               git ls-tree -r HEAD >actual &&
+               grep 2/2 actual
+       )
+'
+
+test_expect_success 'cache-tree does skip dir that becomes empty' '
+       rm -fr ita-in-dir &&
+       git init ita-in-dir &&
+       (
+               cd ita-in-dir &&
+               mkdir -p 1/2/3 &&
+               echo 4 >1/2/3/4 &&
+               git add -N 1/2/3/4 &&
+               git write-tree >actual &&
+               echo $EMPTY_TREE >expected &&
+               test_cmp expected actual
+       )
+'
+
+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
 
index 9965bc5c92445160895ae3ea426c5caf1b3458b3..c8de6d8a1902209ef98ec0832296ed9060310429 100755 (executable)
@@ -4,11 +4,20 @@ test_description='cd_to_toplevel'
 
 . ./test-lib.sh
 
+EXEC_PATH="$(git --exec-path)"
+test_have_prereq !MINGW ||
+case "$EXEC_PATH" in
+[A-Za-z]:/*)
+       EXEC_PATH="/${EXEC_PATH%%:*}${EXEC_PATH#?:}"
+       ;;
+esac
+
 test_cd_to_toplevel () {
        test_expect_success $3 "$2" '
                (
                        cd '"'$1'"' &&
-                       . "$(git --exec-path)"/git-sh-setup &&
+                       PATH="$EXEC_PATH:$PATH" &&
+                       . git-sh-setup &&
                        cd_to_toplevel &&
                        [ "$(pwd -P)" = "$TOPLEVEL" ]
                )
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..a542617
--- /dev/null
@@ -0,0 +1,210 @@
+#!/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 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 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
index f7b0e599f1124c332a106a3b8df6f304382c2fa4..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 &&
        (
@@ -660,4 +660,22 @@ test_expect_success 'merging with triple rename across D/F conflict' '
        git merge other
 '
 
+test_expect_success 'merge-recursive remembers the names of all base trees' '
+       git reset --hard HEAD &&
+
+       # more trees than static slots used by oid_to_hex()
+       for commit in $c0 $c2 $c4 $c5 $c6 $c7
+       do
+               git rev-parse "$commit^{tree}"
+       done >trees &&
+
+       # ignore the return code -- it only fails because the input is weird
+       test_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out &&
+
+       # merge-recursive prints in reverse order, but we do not care
+       sort <trees >expect &&
+       sed -n "s/^virtual //p" out | sort >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 46aadc410bc470d9279ed1fd3ee72583d0963d30..d314599428129d5759e3df5e991e5a1bb90960db 100755 (executable)
@@ -19,6 +19,8 @@ test_expect_success setup '
        test_commit three &&
        git checkout right &&
        test_commit four &&
+       git checkout --orphan newroot &&
+       test_commit five &&
        git checkout master
 '
 
@@ -133,4 +135,18 @@ test_expect_success 'merge FETCH_HEAD octopus non-fast-forward' '
        test_cmp expect actual
 '
 
+# two-project merge
+test_expect_success 'refuse two-project merge by default' '
+       t3033_reset &&
+       git reset --hard four &&
+       test_must_fail git merge five
+'
+
+test_expect_success 'two-project merge with --allow-unrelated-histories' '
+       t3033_reset &&
+       git reset --hard four &&
+       git merge --allow-unrelated-histories five &&
+       git diff --exit-code five
+'
+
 test_done
index 425d858938f51bdb8745b28e92c74246e618ef07..327ded4000b47cf3f4da42515fb803c47c0bd742 100755 (executable)
@@ -16,7 +16,7 @@ This test runs git ls-tree with the following in a tree.
     path3/1.txt        - a file in a directory
     path3/2.txt        - a file in a directory
 
-Test the handling of mulitple directories which have matching file
+Test the handling of multiple directories which have matching file
 entries.  Also test odd filename and missing entries handling.
 '
 . ./test-lib.sh
index 4d4b02e760d322586eb496d72d0fd6c6b6946a02..e804377f1cbf4f2c82c1aae3d902014d634a2cdc 100755 (executable)
@@ -12,16 +12,16 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'ls-tree a[a] matches literally' '
-       cat >expect <<-\EOF &&
-       100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a[a]/three
+       cat >expect <<-EOF &&
+       100644 blob $EMPTY_BLOB a[a]/three
        EOF
        git ls-tree -r HEAD "a[a]" >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'ls-tree outside prefix' '
-       cat >expect <<-\EOF &&
-       100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    ../a[a]/three
+       cat >expect <<-EOF &&
+       100644 blob $EMPTY_BLOB ../a[a]/three
        EOF
        ( cd aa && git ls-tree -r HEAD "../a[a]"; ) >actual &&
        test_cmp expect actual
index a897248490650ebef1a33a60a1aa9cf4431f06ff..8a833f354e331966f5f927ae94ac8686dd6d166f 100755 (executable)
@@ -79,6 +79,15 @@ test_expect_success 'git branch -m dumps usage' '
        test_i18ngrep "branch name required" err
 '
 
+test_expect_success 'git branch -m m broken_symref should work' '
+       test_when_finished "git branch -D broken_symref" &&
+       git branch -l m &&
+       git symbolic-ref refs/heads/broken_symref refs/heads/i_am_broken &&
+       git branch -m m broken_symref &&
+       git reflog exists refs/heads/broken_symref &&
+       test_must_fail git reflog exists refs/heads/i_am_broken
+'
+
 test_expect_success 'git branch -m m m/m should work' '
        git branch -l m &&
        git branch -m m m/m &&
@@ -126,7 +135,28 @@ test_expect_success 'git branch -M foo bar should fail when bar is checked out'
 test_expect_success 'git branch -M baz bam should succeed when baz is checked out' '
        git checkout -b baz &&
        git branch bam &&
-       git branch -M baz bam
+       git branch -M baz bam &&
+       test $(git rev-parse --abbrev-ref HEAD) = bam
+'
+
+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 &&
+       git worktree add -f bazdir2 baz &&
+       git branch -M baz bam &&
+       test $(git -C bazdir rev-parse --abbrev-ref HEAD) = bam &&
+       test $(git -C bazdir2 rev-parse --abbrev-ref HEAD) = bam
+'
+
+test_expect_success 'git branch -M baz bam should succeed within a worktree in which baz is checked out' '
+       git checkout -b baz &&
+       git worktree add -f bazdir3 baz &&
+       (
+               cd bazdir3 &&
+               git branch -M baz bam &&
+               test $(git rev-parse --abbrev-ref HEAD) = bam
+       ) &&
+       test $(git rev-parse --abbrev-ref HEAD) = bam
 '
 
 test_expect_success 'git branch -M master should work when master is checked out' '
@@ -403,6 +433,12 @@ test_expect_success 'test deleting branch without config' '
        test_i18ncmp expect actual
 '
 
+test_expect_success 'deleting currently checked out branch fails' '
+       git worktree add -b my7 my7 &&
+       test_must_fail git -C my7 branch -d my7 &&
+       test_must_fail git branch -d my7
+'
+
 test_expect_success 'test --track without .fetch entries' '
        git branch --track my8 &&
        test "$(git config branch.my8.remote)" &&
@@ -523,7 +559,7 @@ If you wanted to make '"'master'"' track '"'origin/master'"', do this:
     git branch -d origin/master
     git branch --set-upstream-to origin/master
 EOF
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_expect_success '--set-upstream with two args only shows the deprecation message' '
@@ -532,7 +568,7 @@ test_expect_success '--set-upstream with two args only shows the deprecation mes
        cat >expected <<EOF &&
 The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
 EOF
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_expect_success '--set-upstream with one arg only shows the deprecation message if the branch existed' '
@@ -541,7 +577,7 @@ test_expect_success '--set-upstream with one arg only shows the deprecation mess
        cat >expected <<EOF &&
 The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
 EOF
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_expect_success '--set-upstream-to notices an error to set branch as own upstream' '
index 912a6635a808cbb6ae78dec545441d363bdeb0d0..7f3ec47241cd6af7a1c107cba114decaa87df108 100755 (executable)
@@ -156,7 +156,7 @@ test_expect_success 'branch --merged with --verbose' '
        * topic  2c939f4 [ahead 1] foo
          zzz    c77a0a9 second on master
        EOF
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 test_done
index 4261403cf62542e82d40487e47733f586e106a75..c6a3ccba1b992cff7412bcf8139da7557981de94 100755 (executable)
@@ -184,4 +184,16 @@ test_expect_success 'ambiguous branch/tag not marked' '
        test_cmp expect actual
 '
 
+test_expect_success 'local-branch symrefs shortened properly' '
+       git symbolic-ref refs/heads/ref-to-branch refs/heads/branch-one &&
+       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
+       EOF
+       git branch >actual.raw &&
+       grep ref-to <actual.raw >actual &&
+       test_cmp expect actual
+'
+
 test_done
index d5572121da69a90ffb1010b6136c3c1fa9fe07f2..baef2d692431169d83e0bc3aed11d9030ea4a24a 100755 (executable)
@@ -178,7 +178,7 @@ test_expect_success 'merge z into m (== y) with default ("manual") resolver => C
        git config core.notesRef refs/notes/m &&
        test_must_fail git notes merge z >output &&
        # Output should point to where to resolve conflicts
-       grep -q "\\.git/NOTES_MERGE_WORKTREE" output &&
+       test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
        # Inspect merge conflicts
        ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
        test_cmp expect_conflicts output_conflicts &&
@@ -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
@@ -381,7 +381,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol
        git config core.notesRef refs/notes/m &&
        test_must_fail git notes merge z >output &&
        # Output should point to where to resolve conflicts
-       grep -q "\\.git/NOTES_MERGE_WORKTREE" output &&
+       test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
        # Inspect merge conflicts
        ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
        test_cmp expect_conflicts output_conflicts &&
@@ -415,7 +415,7 @@ git rev-parse refs/notes/z > pre_merge_z
 test_expect_success 'redo merge of z into m (== y) with default ("manual") resolver => Conflicting 3-way merge' '
        test_must_fail git notes merge z >output &&
        # Output should point to where to resolve conflicts
-       grep -q "\\.git/NOTES_MERGE_WORKTREE" output &&
+       test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
        # Inspect merge conflicts
        ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
        test_cmp expect_conflicts output_conflicts &&
@@ -496,7 +496,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol
        git update-ref refs/notes/m refs/notes/y &&
        test_must_fail git notes merge z >output &&
        # Output should point to where to resolve conflicts
-       grep -q "\\.git/NOTES_MERGE_WORKTREE" output &&
+       test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output &&
        # Inspect merge conflicts
        ls .git/NOTES_MERGE_WORKTREE >output_conflicts &&
        test_cmp expect_conflicts output_conflicts &&
index 1f71d589f5f2fc6ed690bce7202bece04d8b0279..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 &&
-               grep "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
 '
@@ -62,7 +62,7 @@ test_expect_success 'merge z into x while mid-merge on y succeeds' '
                cd worktree2 &&
                git config core.notesRef refs/notes/x &&
                test_must_fail git notes merge z 2>&1 >out &&
-               grep "Automatic notes merge failed" out &&
+               test_i18ngrep "Automatic notes merge failed" out &&
                grep -v "A notes merge into refs/notes/x is already in-progress in" out
        ) &&
        echo "ref: refs/notes/x" >expect &&
index 47b5682662a6ed2e6734f9f9f101a5ddabcc22ff..f5fd15e55994bafc0f0a2c91b0d00455df13d18d 100755 (executable)
@@ -136,8 +136,8 @@ test_expect_success 'setup: recover' '
 test_expect_success 'Show verbose error when HEAD could not be detached' '
        >B &&
        test_must_fail git rebase topic 2>output.err >output.out &&
-       grep "The following untracked working tree files would be overwritten by checkout:" output.err &&
-       grep B output.err
+       test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" output.err &&
+       test_i18ngrep B output.err
 '
 rm -f B
 
index 8f64505e4f94432de6cc287f4ab2f3129703536a..488945e0071b1ba4ae988848b5cb42df72737d2b 100755 (executable)
@@ -85,6 +85,15 @@ test_expect_success 'rebase -Xtheirs' '
        ! grep 11 original
 '
 
+test_expect_success 'rebase -Xtheirs from orphan' '
+       git checkout --orphan orphan-conflicting master~2 &&
+       echo "AB $T" >> original &&
+       git commit -morphan-conflicting original &&
+       git rebase -Xtheirs master &&
+       grep AB original &&
+       ! grep 11 original
+'
+
 test_expect_success 'merge and rebase should match' '
        git diff-tree -r test-rebase test-merge >difference &&
        if test -s difference
index 544f9ad50831e29095a9f143bf414e08fed46d9e..c896a4c1067fc80378130a09705bef58370f01be 100755 (executable)
@@ -60,9 +60,9 @@ test_expect_success 'setup' '
        test_commit P fileP
 '
 
-# "exec" commands are ran with the user shell by default, but this may
+# "exec" commands are run with the user shell by default, but this may
 # be non-POSIX. For example, if SHELL=zsh then ">file" doesn't work
-# to create a file. Unseting SHELL avoids such non-portable behavior
+# to create a file. Unsetting SHELL avoids such non-portable behavior
 # in tests. It must be exported for it to take effect where needed.
 SHELL=
 export SHELL
@@ -219,9 +219,9 @@ test_expect_success 'abort with error when new base cannot be checked out' '
        git commit -m "remove file in base" &&
        set_fake_editor &&
        test_must_fail git rebase -i master > output 2>&1 &&
-       grep "The following untracked working tree files would be overwritten by checkout:" \
+       test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" \
                output &&
-       grep "file1" output &&
+       test_i18ngrep "file1" output &&
        test_path_is_missing .git/rebase-merge &&
        git reset --hard HEAD^
 '
@@ -540,7 +540,7 @@ test_expect_success 'clean error after failed "exec"' '
        echo "edited again" > file7 &&
        git add file7 &&
        test_must_fail git rebase --continue 2>error &&
-       grep "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' '
@@ -555,10 +555,9 @@ test_expect_success 'rebase a detached HEAD' '
 test_expect_success 'rebase a commit violating pre-commit' '
 
        mkdir -p .git/hooks &&
-       PRE_COMMIT=.git/hooks/pre-commit &&
-       echo "#!/bin/sh" > $PRE_COMMIT &&
-       echo "test -z \"\$(git diff --cached --check)\"" >> $PRE_COMMIT &&
-       chmod a+x $PRE_COMMIT &&
+       write_script .git/hooks/pre-commit <<-\EOF &&
+       test -z "$(git diff --cached --check)"
+       EOF
        echo "monde! " >> file1 &&
        test_tick &&
        test_must_fail git commit -m doesnt-verify file1 &&
@@ -771,7 +770,6 @@ test_expect_success 'rebase-i history with funny messages' '
        test_cmp expect actual
 '
 
-
 test_expect_success 'prepare for rebase -i --exec' '
        git checkout master &&
        git checkout -b execute &&
@@ -780,7 +778,6 @@ test_expect_success 'prepare for rebase -i --exec' '
        test_commit three_exec main.txt three_exec
 '
 
-
 test_expect_success 'running "git rebase -i --exec git show HEAD"' '
        set_fake_editor &&
        git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
@@ -793,7 +790,6 @@ test_expect_success 'running "git rebase -i --exec git show HEAD"' '
        test_cmp expected actual
 '
 
-
 test_expect_success 'running "git rebase --exec git show HEAD -i"' '
        git reset --hard execute &&
        set_fake_editor &&
@@ -807,7 +803,6 @@ test_expect_success 'running "git rebase --exec git show HEAD -i"' '
        test_cmp expected actual
 '
 
-
 test_expect_success 'running "git rebase -ix git show HEAD"' '
        git reset --hard execute &&
        set_fake_editor &&
@@ -835,7 +830,6 @@ test_expect_success 'rebase -ix with several <CMD>' '
        test_cmp expected actual
 '
 
-
 test_expect_success 'rebase -ix with several instances of --exec' '
        git reset --hard execute &&
        set_fake_editor &&
@@ -850,7 +844,6 @@ test_expect_success 'rebase -ix with several instances of --exec' '
        test_cmp expected actual
 '
 
-
 test_expect_success 'rebase -ix with --autosquash' '
        git reset --hard execute &&
        git checkout -b autosquash &&
@@ -876,16 +869,15 @@ test_expect_success 'rebase -ix with --autosquash' '
        test_cmp expected actual
 '
 
-
-test_expect_success 'rebase --exec without -i shows error message' '
+test_expect_success 'rebase --exec works without -i ' '
        git reset --hard execute &&
-       set_fake_editor &&
-       test_must_fail git rebase --exec "git show HEAD" HEAD~2 2>actual &&
-       echo "The --exec option must be used with the --interactive option" >expected &&
-       test_i18ncmp expected actual
+       rm -rf exec_output &&
+       EDITOR="echo >invoked_editor" git rebase --exec "echo a line >>exec_output"  HEAD~2 2>actual &&
+       test_i18ngrep  "Successfully rebased and updated" actual &&
+       test_line_count = 2 exec_output &&
+       test_path_is_missing invoked_editor
 '
 
-
 test_expect_success 'rebase -i --exec without <CMD>' '
        git reset --hard execute &&
        set_fake_editor &&
@@ -984,6 +976,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 &&
@@ -1068,7 +1071,7 @@ test_expect_success 'todo count' '
        EOF
        test_set_editor "$(pwd)/dump-raw.sh" &&
        git rebase -i HEAD~4 >actual &&
-       grep "^# Rebase ..* onto ..* ([0-9]" actual
+       test_i18ngrep "^# Rebase ..* onto ..* ([0-9]" actual
 '
 
 test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
@@ -1168,7 +1171,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = ignore' '
        FAKE_LINES="1 2 3 4" \
                git rebase -i --root 2>actual &&
        test D = $(git cat-file commit HEAD | sed -ne \$p) &&
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 cat >expect <<EOF
@@ -1189,7 +1192,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = warn' '
        set_fake_editor &&
        FAKE_LINES="1 2 3 4" \
                git rebase -i --root 2>actual &&
-       test_cmp expect actual &&
+       test_i18ncmp expect actual &&
        test D = $(git cat-file commit HEAD | sed -ne \$p)
 '
 
@@ -1203,7 +1206,7 @@ To avoid this message, use "drop" to explicitly remove a commit.
 Use 'git config rebase.missingCommitsCheck' to change the level of warnings.
 The possible behaviours are: ignore, warn, error.
 
-You can fix this with 'git rebase --edit-todo'.
+You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
 Or you can abort the rebase with 'git rebase --abort'.
 EOF
 
@@ -1213,7 +1216,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = error' '
        set_fake_editor &&
        test_must_fail env FAKE_LINES="1 2 4" \
                git rebase -i --root 2>actual &&
-       test_cmp expect actual &&
+       test_i18ncmp expect actual &&
        cp .git/rebase-merge/git-rebase-todo.backup \
                .git/rebase-merge/git-rebase-todo &&
        FAKE_LINES="1 2 drop 3 4 drop 5" \
@@ -1227,7 +1230,7 @@ cat >expect <<EOF
 Warning: the command isn't recognized in the following line:
  - badcmd $(git rev-list --oneline -1 master~1)
 
-You can fix this with 'git rebase --edit-todo'.
+You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
 Or you can abort the rebase with 'git rebase --abort'.
 EOF
 
@@ -1236,7 +1239,7 @@ test_expect_success 'static check of bad command' '
        set_fake_editor &&
        test_must_fail env FAKE_LINES="1 2 3 bad 4 5" \
                git rebase -i --root 2>actual &&
-       test_cmp expect actual &&
+       test_i18ncmp expect actual &&
        FAKE_LINES="1 2 3 drop 4 5" git rebase --edit-todo &&
        git rebase --continue &&
        test E = $(git cat-file commit HEAD | sed -ne \$p) &&
@@ -1262,7 +1265,7 @@ cat >expect <<EOF
 Warning: the SHA-1 is missing or isn't a commit in the following line:
  - edit XXXXXXX False commit
 
-You can fix this with 'git rebase --edit-todo'.
+You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
 Or you can abort the rebase with 'git rebase --abort'.
 EOF
 
@@ -1271,7 +1274,7 @@ test_expect_success 'static check of bad SHA-1' '
        set_fake_editor &&
        test_must_fail env FAKE_LINES="1 2 edit fakesha 3 4 5 #" \
                git rebase -i --root 2>actual &&
-       test_cmp expect actual &&
+       test_i18ncmp expect actual &&
        FAKE_LINES="1 2 4 5 6" git rebase --edit-todo &&
        git rebase --continue &&
        test E = $(git cat-file commit HEAD | sed -ne \$p)
@@ -1289,4 +1292,12 @@ test_expect_success 'editor saves as CR/LF' '
        )
 '
 
+SQ="'"
+test_expect_success 'rebase -i --gpg-sign=<key-id>' '
+       set_fake_editor &&
+       FAKE_LINES="edit 1" git rebase -i --gpg-sign="\"S I Gner\"" HEAD^ \
+               >out 2>err &&
+       test_i18ngrep "$SQ-S\"S I Gner\"$SQ" err
+'
+
 test_done
index 0b521057283bf106da8ce55f25f61c7ec7e3ad35..73a39f2923aa7536ce65ea3ee514805122be79b1 100755 (executable)
@@ -133,7 +133,7 @@ test_expect_success 'set up second root and merge' '
        rm A B C &&
        test_commit 6 D &&
        git checkout other &&
-       git merge third
+       git merge --allow-unrelated-histories third
 '
 
 cat > expect-third <<'EOF'
index 8f53e54ce4176fd0697e8af60a105d40dc161a12..48346f1cc0c12883029349e4999d7e6697b35adb 100755 (executable)
@@ -271,4 +271,37 @@ test_expect_success 'autosquash with custom inst format' '
        test 2 = $(git cat-file commit HEAD^ | grep squash | wc -l)
 '
 
+set_backup_editor () {
+       write_script backup-editor.sh <<-\EOF
+       cp "$1" .git/backup-"$(basename "$1")"
+       EOF
+       test_set_editor "$PWD/backup-editor.sh"
+}
+
+test_expect_failure 'autosquash with multiple empty patches' '
+       test_tick &&
+       git commit --allow-empty -m "empty" &&
+       test_tick &&
+       git commit --allow-empty -m "empty2" &&
+       test_tick &&
+       >fixup &&
+       git add fixup &&
+       git commit --fixup HEAD^^ &&
+       (
+               set_backup_editor &&
+               GIT_USE_REBASE_HELPER=false \
+               git rebase -i --force-rebase --autosquash HEAD~4 &&
+               grep empty2 .git/backup-git-rebase-todo
+       )
+'
+
+test_expect_success 'extra spaces after fixup!' '
+       base=$(git rev-parse HEAD) &&
+       test_commit to-fixup &&
+       git commit --allow-empty -m "fixup!  to-fixup" &&
+       git rebase -i --autosquash --keep-empty HEAD~2 &&
+       parent=$(git rev-parse HEAD^) &&
+       test $base = $parent
+'
+
 test_done
index 217dd79b2e4b5c02ee27f3b913c37c489ec585f2..49f548cdb93d53d88723adcd1f414a4db4c14a73 100755 (executable)
@@ -73,17 +73,17 @@ do_tests () {
                run git format-patch --stdout --ignore-if-in-upstream master
        "
 
-       test_expect_success $pr 'detect upstream patch' "
+       test_expect_success $pr 'detect upstream patch' '
                git checkout -q master &&
                scramble file &&
                git add file &&
-               git commit -q -m 'change big file again' &&
+               git commit -q -m "change big file again" &&
                git checkout -q other^{} &&
                git rebase master &&
-               test_must_fail test -n \"\$(git rev-list master...HEAD~)\"
-       "
+               test_must_fail test -n "$(git rev-list master...HEAD~)"
+       '
 
-       test_expect_success $pr 'do not drop patch' "
+       test_expect_success $pr 'do not drop patch' '
                git branch -f squashed master &&
                git checkout -q -f squashed &&
                git reset -q --soft HEAD~2 &&
@@ -91,7 +91,7 @@ do_tests () {
                git checkout -q other^{} &&
                test_must_fail git rebase squashed &&
                rm -rf .git/rebase-apply
-       "
+       '
 }
 
 do_tests 500
index 944154b2e0ad7da5ddacdde5c22847babf1909c9..ab8a63e8d6dc643b28eb0c74ba3f032b7532226f 100755 (executable)
@@ -179,7 +179,7 @@ testrebase " --interactive" .git/rebase-merge
 
 test_expect_success 'abort rebase -i with --autostash' '
        test_when_finished "git reset --hard" &&
-       echo uncommited-content >file0 &&
+       echo uncommitted-content >file0 &&
        (
                write_script abort-editor.sh <<-\EOF &&
                        echo >"$1"
@@ -188,7 +188,38 @@ test_expect_success 'abort rebase -i with --autostash' '
                test_must_fail git rebase -i --autostash HEAD^ &&
                rm -f abort-editor.sh
        ) &&
-       echo uncommited-content >expected &&
+       echo uncommitted-content >expected &&
+       test_cmp expected file0
+'
+
+test_expect_success 'restore autostash on editor failure' '
+       test_when_finished "git reset --hard" &&
+       echo uncommitted-content >file0 &&
+       (
+               test_set_editor "false" &&
+               test_must_fail git rebase -i --autostash HEAD^
+       ) &&
+       echo uncommitted-content >expected &&
+       test_cmp expected file0
+'
+
+test_expect_success 'autostash is saved on editor failure with conflict' '
+       test_when_finished "git reset --hard" &&
+       echo uncommitted-content >file0 &&
+       (
+               write_script abort-editor.sh <<-\EOF &&
+                       echo conflicting-content >file0
+                       exit 1
+               EOF
+               test_set_editor "$(pwd)/abort-editor.sh" &&
+               test_must_fail git rebase -i --autostash HEAD^ &&
+               rm -f abort-editor.sh
+       ) &&
+       echo conflicting-content >expected &&
+       test_cmp expected file0 &&
+       git checkout file0 &&
+       git stash pop &&
+       echo uncommitted-content >expected &&
        test_cmp expected file0
 '
 
index 9c55cba198e4ed4cbc01ffce79abeb39504bf544..68fe2003ef5f74073cafa4741bee31ade85cf5c0 100755 (executable)
@@ -253,7 +253,7 @@ test_run_rebase () {
        "
 }
 test_run_rebase success ''
-test_run_rebase failure -m
+test_run_rebase success -m
 test_run_rebase success -i
 test_run_rebase success -p
 
@@ -268,7 +268,7 @@ test_run_rebase () {
        "
 }
 test_run_rebase success ''
-test_run_rebase failure -m
+test_run_rebase success -m
 test_run_rebase success -i
 test_run_rebase failure -p
 
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/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh
new file mode 100755 (executable)
index 0000000..3780877
--- /dev/null
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+test_description='git rebase tests for -Xsubtree
+
+This test runs git rebase and tests the subtree strategy.
+'
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
+commit_message() {
+       git log --pretty=format:%s -1 "$1"
+}
+
+test_expect_success 'setup' '
+       test_commit README &&
+       mkdir files &&
+       (
+               cd files &&
+               git init &&
+               test_commit master1 &&
+               test_commit master2 &&
+               test_commit master3
+       ) &&
+       git fetch files master &&
+       git branch files-master FETCH_HEAD &&
+       git read-tree --prefix=files_subtree files-master &&
+       git checkout -- files_subtree &&
+       tree=$(git write-tree) &&
+       head=$(git rev-parse HEAD) &&
+       rev=$(git rev-parse --verify files-master^0) &&
+       commit=$(git commit-tree -p $head -p $rev -m "Add subproject master" $tree) &&
+       git update-ref HEAD $commit &&
+       (
+               cd files_subtree &&
+               test_commit master4
+       ) &&
+       test_commit files_subtree/master5
+'
+
+# FAILURE: Does not preserve master4.
+test_expect_failure 'Rebase -Xsubtree --preserve-merges --onto commit 4' '
+       reset_rebase &&
+       git checkout -b rebase-preserve-merges-4 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master &&
+       verbose test "$(commit_message HEAD~)" = "files_subtree/master4"
+'
+
+# FAILURE: Does not preserve master5.
+test_expect_failure 'Rebase -Xsubtree --preserve-merges --onto commit 5' '
+       reset_rebase &&
+       git checkout -b rebase-preserve-merges-5 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --preserve-merges --onto files-master master &&
+       verbose test "$(commit_message HEAD)" = "files_subtree/master5"
+'
+
+# FAILURE: Does not preserve master4.
+test_expect_failure 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 4' '
+       reset_rebase &&
+       git checkout -b rebase-keep-empty-4 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
+       verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
+'
+
+# FAILURE: Does not preserve master5.
+test_expect_failure 'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 5' '
+       reset_rebase &&
+       git checkout -b rebase-keep-empty-5 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
+       verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
+'
+
+# FAILURE: Does not preserve Empty.
+test_expect_failure 'Rebase -Xsubtree --keep-empty --preserve-merges --onto empty commit' '
+       reset_rebase &&
+       git checkout -b rebase-keep-empty-empty master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges --onto files-master master &&
+       verbose test "$(commit_message HEAD)" = "Empty commit"
+'
+
+# FAILURE: fatal: Could not parse object
+test_expect_failure 'Rebase -Xsubtree --onto commit 4' '
+       reset_rebase &&
+       git checkout -b rebase-onto-4 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --onto files-master master &&
+       verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
+'
+
+# FAILURE: fatal: Could not parse object
+test_expect_failure 'Rebase -Xsubtree --onto commit 5' '
+       reset_rebase &&
+       git checkout -b rebase-onto-5 master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --onto files-master master &&
+       verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
+'
+# FAILURE: fatal: Could not parse object
+test_expect_failure 'Rebase -Xsubtree --onto empty commit' '
+       reset_rebase &&
+       git checkout -b rebase-onto-empty master &&
+       git filter-branch --prune-empty -f --subdirectory-filter files_subtree &&
+       git commit -m "Empty commit" --allow-empty &&
+       git rebase -Xsubtree=files_subtree --onto files-master master &&
+       verbose test "$(commit_message HEAD)" = "Empty commit"
+'
+
+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 7b7a89dbd5ce578e0a722345a00f247e383689ef..372307c21b983437b870ac65ff4f91d2c36fab30 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 &&
index a1c4e0216ff7421082a957e5b7789f3cc9a13181..db9378142a93338d2988f40e2748bc476490bcd5 100755 (executable)
@@ -14,11 +14,11 @@ test_description='revert can handle submodules'
 git_revert () {
        git status -su >expect &&
        ls -1pR * >>expect &&
-       tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+       tar cf "$TRASH_DIRECTORY/tmp.tar" * &&
        git checkout "$1" &&
        git revert HEAD &&
        rm -rf * &&
-       tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+       tar xf "$TRASH_DIRECTORY/tmp.tar" &&
        git status -su >actual &&
        ls -1pR * >>actual &&
        test_cmp expect actual &&
index d046d98aec61748ad936515807f28f77600f630e..14f0edca2b6f67e6ae98379702b5566e4083d8e0 100755 (executable)
@@ -881,4 +881,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 f14a6653565cede5ad9d43e47e71eaf98f58839f..f3a4b4a913f344ce140344ec7b70482a6d36bcbe 100755 (executable)
@@ -7,6 +7,20 @@ test_description='Test of git add, including the -- option.'
 
 . ./test-lib.sh
 
+# Test the file mode "$1" of the file "$2" in the index.
+test_mode_in_index () {
+       case "$(git ls-files -s "$2")" in
+       "$1 "*" $2")
+               echo pass
+               ;;
+       *)
+               echo fail
+               git ls-files -s "$2"
+               return 1
+               ;;
+       esac
+}
+
 test_expect_success \
     'Test of git add' \
     'touch foo && git add foo'
@@ -25,18 +39,12 @@ test_expect_success \
         echo foo >xfoo1 &&
         chmod 755 xfoo1 &&
         git add xfoo1 &&
-        case "$(git ls-files --stage xfoo1)" in
-        100644" "*xfoo1) echo pass;;
-        *) echo fail; git ls-files --stage xfoo1; (exit 1);;
-        esac'
+        test_mode_in_index 100644 xfoo1'
 
 test_expect_success 'git add: filemode=0 should not get confused by symlink' '
        rm -f xfoo1 &&
        test_ln_s_add foo xfoo1 &&
-       case "$(git ls-files --stage xfoo1)" in
-       120000" "*xfoo1) echo pass;;
-       *) echo fail; git ls-files --stage xfoo1; (exit 1);;
-       esac
+       test_mode_in_index 120000 xfoo1
 '
 
 test_expect_success \
@@ -45,28 +53,19 @@ test_expect_success \
         echo foo >xfoo2 &&
         chmod 755 xfoo2 &&
         git update-index --add xfoo2 &&
-        case "$(git ls-files --stage xfoo2)" in
-        100644" "*xfoo2) echo pass;;
-        *) echo fail; git ls-files --stage xfoo2; (exit 1);;
-        esac'
+        test_mode_in_index 100644 xfoo2'
 
 test_expect_success 'git add: filemode=0 should not get confused by symlink' '
        rm -f xfoo2 &&
        test_ln_s_add foo xfoo2 &&
-       case "$(git ls-files --stage xfoo2)" in
-       120000" "*xfoo2) echo pass;;
-       *) echo fail; git ls-files --stage xfoo2; (exit 1);;
-       esac
+       test_mode_in_index 120000 xfoo2
 '
 
 test_expect_success \
        'git update-index --add: Test that executable bit is not used...' \
        'git config core.filemode 0 &&
         test_ln_s_add xfoo2 xfoo3 &&   # runs git update-index --add
-        case "$(git ls-files --stage xfoo3)" in
-        120000" "*xfoo3) echo pass;;
-        *) echo fail; git ls-files --stage xfoo3; (exit 1);;
-        esac'
+        test_mode_in_index 120000 xfoo3'
 
 test_expect_success '.gitignore test setup' '
        echo "*.ig" >.gitignore &&
@@ -332,4 +331,76 @@ 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 &&
+       git add --chmod=+x foo1 &&
+       test_mode_in_index 100755 foo1 &&
+       git add --chmod=-x foo1 &&
+       test_mode_in_index 100644 foo1
+'
+
+test_expect_success POSIXPERM,SYMLINKS 'git add --chmod=+x with symlinks' '
+       git config core.filemode 1 &&
+       git config core.symlinks 1 &&
+       rm -f foo2 &&
+       echo foo >foo2 &&
+       git add --chmod=+x foo2 &&
+       test_mode_in_index 100755 foo2
+'
+
+test_expect_success 'git add --chmod=[+-]x changes index with already added file' '
+       rm -f foo3 xfoo3 &&
+       echo foo >foo3 &&
+       git add foo3 &&
+       git add --chmod=+x foo3 &&
+       test_mode_in_index 100755 foo3 &&
+       echo foo >xfoo3 &&
+       chmod 755 xfoo3 &&
+       git add xfoo3 &&
+       git add --chmod=-x xfoo3 &&
+       test_mode_in_index 100644 xfoo3
+'
+
+test_expect_success POSIXPERM 'git add --chmod=[+-]x does not change the working tree' '
+       echo foo >foo4 &&
+       git add foo4 &&
+       git add --chmod=+x foo4 &&
+       ! test -x foo4
+'
+
+test_expect_success 'no file status change if no pathspec is given' '
+       >foo5 &&
+       >foo6 &&
+       git add foo5 foo6 &&
+       git add --chmod=+x &&
+       test_mode_in_index 100644 foo5 &&
+       test_mode_in_index 100644 foo6
+'
+
+test_expect_success 'no file status change if no pathspec is given in subdir' '
+       mkdir -p sub &&
+       (
+               cd sub &&
+               >sub-foo1 &&
+               >sub-foo2 &&
+               git add . &&
+               git add --chmod=+x &&
+               test_mode_in_index 100644 sub-foo1 &&
+               test_mode_in_index 100644 sub-foo2
+       )
+'
+
+test_expect_success 'all statuses changed in folder if . is given' '
+       git add --chmod=+x . &&
+       test $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 &&
+       git add --chmod=-x . &&
+       test $(git ls-files --stage | grep ^100755 | wc -l) -eq 0
+'
+
 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..f663d567c8ac89e59236df79a632cbd2609910f5 100755 (executable)
@@ -295,7 +295,7 @@ test_expect_success 'am --no-utf8 (U/L)' '
 
        # 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
 '
index 2142c1fa92017bc47cfc4ccb1f25e16fc0eec1a4..2de3e18ce68a94111c8dfcca858b8515ea8919c1 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 &&
@@ -604,6 +624,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 &&
@@ -731,4 +766,13 @@ 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_done
index 831935665e012c04bbe4c57feee92c0310df5c04..26dd5b7f78a7f7e65ddda24c4686d2ae26fc30de 100755 (executable)
@@ -49,12 +49,54 @@ test_expect_success "setup" '
 test_expect_success "setup case mac" '
        git checkout -b mac_os
 '
+# This will test nfd2nfc in git diff
+test_expect_success "git diff f.Adiar" '
+       touch f.$Adiarnfc &&
+       git add f.$Adiarnfc &&
+       echo f.Adiarnfc >f.$Adiarnfc &&
+       git diff f.$Adiarnfd >expect &&
+       git diff f.$Adiarnfc >actual &&
+       test_cmp expect actual &&
+       git reset HEAD f.Adiarnfc &&
+       rm f.$Adiarnfc expect actual
+'
+# This will test nfd2nfc in git diff-files
+test_expect_success "git diff-files f.Adiar" '
+       touch f.$Adiarnfc &&
+       git add f.$Adiarnfc &&
+       echo f.Adiarnfc >f.$Adiarnfc &&
+       git diff-files f.$Adiarnfd >expect &&
+       git diff-files f.$Adiarnfc >actual &&
+       test_cmp expect actual &&
+       git reset HEAD f.Adiarnfc &&
+       rm f.$Adiarnfc expect actual
+'
+# This will test nfd2nfc in git diff-index
+test_expect_success "git diff-index f.Adiar" '
+       touch f.$Adiarnfc &&
+       git add f.$Adiarnfc &&
+       echo f.Adiarnfc >f.$Adiarnfc &&
+       git diff-index HEAD f.$Adiarnfd >expect &&
+       git diff-index HEAD f.$Adiarnfc >actual &&
+       test_cmp expect actual &&
+       git reset HEAD f.Adiarnfc &&
+       rm f.$Adiarnfc expect actual
+'
 # This will test nfd2nfc in readdir()
 test_expect_success "add file Adiarnfc" '
        echo f.Adiarnfc >f.$Adiarnfc &&
        git add f.$Adiarnfc &&
        git commit -m "add f.$Adiarnfc"
 '
+# This will test nfd2nfc in git diff-tree
+test_expect_success "git diff-tree f.Adiar" '
+       echo f.Adiarnfc >>f.$Adiarnfc &&
+       git diff-tree HEAD f.$Adiarnfd >expect &&
+       git diff-tree HEAD f.$Adiarnfc >actual &&
+       test_cmp expect actual &&
+       git checkout f.$Adiarnfc &&
+       rm expect actual
+'
 # This will test nfd2nfc in git stage()
 test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" '
        mkdir d.$Adiarnfd &&
index 2f327b749588af7eda57187cba4d365233a25ef9..0d1fa45d25e59ea100864a76b105b149c6dfcb85 100755 (executable)
@@ -9,21 +9,84 @@ test_description='Test rename detection in diff engine.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh
 
-echo >path0 'Line 1
-Line 2
-Line 3
-Line 4
-Line 5
-Line 6
-Line 7
-Line 8
-Line 9
-Line 10
-line 11
-Line 12
-Line 13
-Line 14
-Line 15
+test_expect_success 'setup' '
+       cat >path0 <<-\EOF &&
+       Line 1
+       Line 2
+       Line 3
+       Line 4
+       Line 5
+       Line 6
+       Line 7
+       Line 8
+       Line 9
+       Line 10
+       line 11
+       Line 12
+       Line 13
+       Line 14
+       Line 15
+       EOF
+       cat >expected <<-\EOF &&
+       diff --git a/path0 b/path1
+       rename from path0
+       rename to path1
+       --- a/path0
+       +++ b/path1
+       @@ -8,7 +8,7 @@ Line 7
+        Line 8
+        Line 9
+        Line 10
+       -line 11
+       +Line 11
+        Line 12
+        Line 13
+        Line 14
+       EOF
+       cat >no-rename <<-\EOF
+       diff --git a/path0 b/path0
+       deleted file mode 100644
+       index fdbec44..0000000
+       --- a/path0
+       +++ /dev/null
+       @@ -1,15 +0,0 @@
+       -Line 1
+       -Line 2
+       -Line 3
+       -Line 4
+       -Line 5
+       -Line 6
+       -Line 7
+       -Line 8
+       -Line 9
+       -Line 10
+       -line 11
+       -Line 12
+       -Line 13
+       -Line 14
+       -Line 15
+       diff --git a/path1 b/path1
+       new file mode 100644
+       index 0000000..752c50e
+       --- /dev/null
+       +++ b/path1
+       @@ -0,0 +1,15 @@
+       +Line 1
+       +Line 2
+       +Line 3
+       +Line 4
+       +Line 5
+       +Line 6
+       +Line 7
+       +Line 8
+       +Line 9
+       +Line 10
+       +Line 11
+       +Line 12
+       +Line 13
+       +Line 14
+       +Line 15
+       EOF
 '
 
 test_expect_success \
@@ -43,27 +106,27 @@ test_expect_success \
 test_expect_success \
     'git diff-index -p -M after rename and editing.' \
     'git diff-index -p -M $tree >current'
-cat >expected <<\EOF
-diff --git a/path0 b/path1
-rename from path0
-rename to path1
---- a/path0
-+++ b/path1
-@@ -8,7 +8,7 @@ Line 7
- Line 8
- Line 9
- Line 10
--line 11
-+Line 11
- Line 12
- Line 13
- Line 14
-EOF
+
 
 test_expect_success \
     'validate the output.' \
     'compare_diff_patch current expected'
 
+test_expect_success 'test diff.renames=true' '
+       git -c diff.renames=true diff --cached $tree >current &&
+       compare_diff_patch current expected
+'
+
+test_expect_success 'test diff.renames=false' '
+       git -c diff.renames=false diff --cached $tree >current &&
+       compare_diff_patch current no-rename
+'
+
+test_expect_success 'test diff.renames unset' '
+       git diff --cached $tree >current &&
+       compare_diff_patch current expected
+'
+
 test_expect_success 'favour same basenames over different ones' '
        cp path1 another-path &&
        git add another-path &&
@@ -77,6 +140,17 @@ test_expect_success 'favour same basenames even with minor differences' '
        git show HEAD:path1 | sed "s/15/16/" > subdir/path1 &&
        git status | test_i18ngrep "renamed: .*path1 -> subdir/path1"'
 
+test_expect_success 'two files with same basename and same content' '
+       git reset --hard &&
+       mkdir -p dir/A dir/B &&
+       cp path1 dir/A/file &&
+       cp path1 dir/B/file &&
+       git add dir &&
+       git commit -m 2 &&
+       git mv dir other-dir &&
+       git status | test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file"
+'
+
 test_expect_success 'setup for many rename source candidates' '
        git reset --hard &&
        for i in 0 1 2 3 4 5 6 7 8 9;
index 43c488b545e6acc02bab9d496e33c37b99f49c7a..35b35a81c8ce38b3fe29f33412d2e7c9ff1bf68d 100755 (executable)
@@ -78,8 +78,6 @@ test_expect_success 'diff-tree pathspec' '
        test_cmp expected current
 '
 
-EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-
 test_expect_success 'diff-tree with wildcard shows dir also matches' '
        git diff-tree --name-only $EMPTY_TREE $tree -- "f*" >result &&
        echo file0 >expected &&
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 6ec607211803d2685b109b7fc0d926d206bbf1d4..d09acfe48e81b2567fd7408d7cb6345c73d99754 100755 (executable)
@@ -90,6 +90,8 @@ test_expect_success setup '
        git commit -m "Rearranged lines in dir/sub" &&
        git checkout master &&
 
+       git config diff.renames false &&
+
        git show-branch
 '
 
@@ -304,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' '
@@ -323,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 3b99434e3e6f534efe44850fef3d1d77c04f5856..ba4902df2b605f89ec2abcac50abefc2f23fc9bf 100755 (executable)
@@ -229,6 +229,46 @@ check_patch () {
        grep -e "^Subject:" "$1"
 }
 
+test_expect_success 'format.from=false' '
+
+       git -c format.from=false format-patch --stdout master..side |
+       sed -e "/^\$/q" >patch &&
+       check_patch patch &&
+       ! grep "^From: C O Mitter <committer@example.com>\$" patch
+'
+
+test_expect_success 'format.from=true' '
+
+       git -c format.from=true format-patch --stdout master..side |
+       sed -e "/^\$/q" >patch &&
+       check_patch patch &&
+       grep "^From: C O Mitter <committer@example.com>\$" patch
+'
+
+test_expect_success 'format.from with address' '
+
+       git -c format.from="F R Om <from@example.com>" format-patch --stdout master..side |
+       sed -e "/^\$/q" >patch &&
+       check_patch patch &&
+       grep "^From: F R Om <from@example.com>\$" patch
+'
+
+test_expect_success '--no-from overrides format.from' '
+
+       git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout master..side |
+       sed -e "/^\$/q" >patch &&
+       check_patch patch &&
+       ! grep "^From: F R Om <from@example.com>\$" patch
+'
+
+test_expect_success '--from overrides format.from' '
+
+       git -c format.from="F R Om <from@example.com>" format-patch --from --stdout master..side |
+       sed -e "/^\$/q" >patch &&
+       check_patch patch &&
+       ! grep "^From: F R Om <from@example.com>\$" patch
+'
+
 test_expect_success '--no-to overrides config.to' '
 
        git config --replace-all format.to \
@@ -549,7 +589,7 @@ test_expect_success 'cover-letter inherits diff options' '
 
        git mv file foo &&
        git commit -m foo &&
-       git format-patch --cover-letter -1 &&
+       git format-patch --no-renames --cover-letter -1 &&
        check_patch 0000-cover-letter.patch &&
        ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
        git format-patch --cover-letter -1 -M &&
@@ -703,7 +743,7 @@ test_expect_success 'options no longer allowed for format-patch' '
 
 test_expect_success 'format-patch --numstat should produce a patch' '
        git format-patch --numstat --stdout master..side > output &&
-       test 6 = $(grep "^diff --git a/" output | wc -l)'
+       test 5 = $(grep "^diff --git a/" output | wc -l)'
 
 test_expect_success 'format-patch -- <path>' '
        git format-patch master..side -- file 2>error &&
@@ -714,9 +754,22 @@ test_expect_success 'format-patch --ignore-if-in-upstream HEAD' '
        git format-patch --ignore-if-in-upstream HEAD
 '
 
+git_version="$(git --version | sed "s/.* //")"
+
+signature() {
+       printf "%s\n%s\n\n" "-- " "${1:-$git_version}"
+}
+
+test_expect_success 'format-patch default signature' '
+       git format-patch --stdout -1 | tail -n 3 >output &&
+       signature >expect &&
+       test_cmp expect output
+'
+
 test_expect_success 'format-patch --signature' '
-       git format-patch --stdout --signature="my sig" -1 >output &&
-       grep "my sig" output
+       git format-patch --stdout --signature="my sig" -1 | tail -n 3 >output &&
+       signature "my sig" >expect &&
+       test_cmp expect output
 '
 
 test_expect_success 'format-patch with format.signature config' '
@@ -1033,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
 '
@@ -1072,7 +1134,7 @@ test_expect_success '--from omits redundant in-body header' '
 '
 
 test_expect_success 'in-body headers trigger content encoding' '
-       GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
+       test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
        test_when_finished "git reset --hard HEAD^" &&
        git format-patch -1 --stdout --from >patch &&
        cat >expect <<-\EOF &&
@@ -1460,4 +1522,158 @@ test_expect_success 'format-patch -o overrides format.outputDirectory' '
        test_path_is_dir patchset
 '
 
+test_expect_success 'format-patch --base' '
+       git checkout side &&
+       git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual &&
+       echo >expected &&
+       echo "base-commit: $(git rev-parse HEAD~3)" >>expected &&
+       echo "prerequisite-patch-id: $(git show --patch HEAD~2 | git patch-id --stable | awk "{print \$1}")" >>expected &&
+       echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --stable | awk "{print \$1}")" >>expected &&
+       signature >> expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch --base errors out when base commit is in revision list' '
+       test_must_fail git format-patch --base=HEAD -2 &&
+       test_must_fail git format-patch --base=HEAD~1 -2 &&
+       git format-patch --stdout --base=HEAD~2 -2 >patch &&
+       grep "^base-commit:" patch >actual &&
+       echo "base-commit: $(git rev-parse HEAD~2)" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch --base errors out when base commit is not ancestor of revision list' '
+       # For history as below:
+       #
+       #    ---Q---P---Z---Y---*---X
+       #        \             /
+       #         ------------W
+       #
+       # If "format-patch Z..X" is given, P and Z can not be specified as the base commit
+       git checkout -b topic1 master &&
+       git rev-parse HEAD >commit-id-base &&
+       test_commit P &&
+       git rev-parse HEAD >commit-id-P &&
+       test_commit Z &&
+       git rev-parse HEAD >commit-id-Z &&
+       test_commit Y &&
+       git checkout -b topic2 master &&
+       test_commit W &&
+       git merge topic1 &&
+       test_commit X &&
+       test_must_fail git format-patch --base=$(cat commit-id-P) -3 &&
+       test_must_fail git format-patch --base=$(cat commit-id-Z) -3 &&
+       git format-patch --stdout --base=$(cat commit-id-base) -3 >patch &&
+       grep "^base-commit:" patch >actual &&
+       echo "base-commit: $(cat commit-id-base)" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch --base=auto' '
+       git checkout -b upstream master &&
+       git checkout -b local upstream &&
+       git branch --set-upstream-to=upstream &&
+       test_commit N1 &&
+       test_commit N2 &&
+       git format-patch --stdout --base=auto -2 >patch &&
+       grep "^base-commit:" patch >actual &&
+       echo "base-commit: $(git rev-parse upstream)" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch errors out when history involves criss-cross' '
+       # setup criss-cross history
+       #
+       #   B---M1---D
+       #  / \ /
+       # A   X
+       #  \ / \
+       #   C---M2---E
+       #
+       git checkout master &&
+       test_commit A &&
+       git checkout -b xb master &&
+       test_commit B &&
+       git checkout -b xc master &&
+       test_commit C &&
+       git checkout -b xbc xb -- &&
+       git merge xc &&
+       git checkout -b xcb xc -- &&
+       git branch --set-upstream-to=xbc &&
+       git merge xb &&
+       git checkout xbc &&
+       test_commit D &&
+       git checkout xcb &&
+       test_commit E &&
+       test_must_fail  git format-patch --base=auto -1
+'
+
+test_expect_success 'format-patch format.useAutoBaseoption' '
+       test_when_finished "git config --unset format.useAutoBase" &&
+       git checkout local &&
+       git config format.useAutoBase true &&
+       git format-patch --stdout -1 >patch &&
+       grep "^base-commit:" patch >actual &&
+       echo "base-commit: $(git rev-parse upstream)" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch --base overrides format.useAutoBase' '
+       test_when_finished "git config --unset format.useAutoBase" &&
+       git config format.useAutoBase true &&
+       git format-patch --stdout --base=HEAD~1 -1 >patch &&
+       grep "^base-commit:" patch >actual &&
+       echo "base-commit: $(git rev-parse HEAD~1)" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'format-patch --base with --attach' '
+       git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch &&
+       sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \
+               patch >actual &&
+       test_write_lines 1 2 >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'format-patch --pretty=mboxrd' '
+       sp=" " &&
+       cat >msg <<-INPUT_END &&
+       mboxrd should escape the body
+
+       From could trip up a loose mbox parser
+       >From extra escape for reversibility
+       >>From extra escape for reversibility 2
+       from lower case not escaped
+       Fromm bad speling not escaped
+        From with leading space not escaped
+
+       F
+       From
+       From$sp
+       From    $sp
+       From    $sp
+       INPUT_END
+
+       cat >expect <<-INPUT_END &&
+       >From could trip up a loose mbox parser
+       >>From extra escape for reversibility
+       >>>From extra escape for reversibility 2
+       from lower case not escaped
+       Fromm bad speling not escaped
+        From with leading space not escaped
+
+       F
+       From
+       From
+       From
+       From
+       INPUT_END
+
+       C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) &&
+       git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >patch &&
+       git grep -h --no-index -A11 \
+               "^>From could trip up a loose mbox parser" patch >actual &&
+       test_cmp expect actual
+'
+
 test_done
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 67373dc44ef18ae4c58f237ed9f5c7610ec6413c..1795ffc3aaf3008f3ef3adc566803a66603975dd 100755 (executable)
@@ -30,6 +30,7 @@ diffpatterns="
        bibtex
        cpp
        csharp
+       css
        fortran
        fountain
        html
diff --git a/t/t4018/css-brace-in-col-1 b/t/t4018/css-brace-in-col-1
new file mode 100644 (file)
index 0000000..7831577
--- /dev/null
@@ -0,0 +1,5 @@
+RIGHT label.control-label
+{
+    margin-top: 10px!important;
+    border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-colon-eol b/t/t4018/css-colon-eol
new file mode 100644 (file)
index 0000000..5a30553
--- /dev/null
@@ -0,0 +1,4 @@
+RIGHT h1 {
+color:
+ChangeMe;
+}
diff --git a/t/t4018/css-colon-selector b/t/t4018/css-colon-selector
new file mode 100644 (file)
index 0000000..c6d71fb
--- /dev/null
@@ -0,0 +1,5 @@
+RIGHT a:hover {
+    margin-top:
+    10px!important;
+    border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-common b/t/t4018/css-common
new file mode 100644 (file)
index 0000000..84ed754
--- /dev/null
@@ -0,0 +1,4 @@
+RIGHT label.control-label {
+    margin-top: 10px!important;
+    border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-long-selector-list b/t/t4018/css-long-selector-list
new file mode 100644 (file)
index 0000000..7ccd25d
--- /dev/null
@@ -0,0 +1,6 @@
+p.header,
+label.control-label,
+div ul#RIGHT {
+    margin-top: 10px!important;
+    border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-prop-sans-indent b/t/t4018/css-prop-sans-indent
new file mode 100644 (file)
index 0000000..a9e3c86
--- /dev/null
@@ -0,0 +1,5 @@
+RIGHT, label.control-label {
+margin-top: 10px!important;
+padding: 0;
+border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-short-selector-list b/t/t4018/css-short-selector-list
new file mode 100644 (file)
index 0000000..6a0bdee
--- /dev/null
@@ -0,0 +1,4 @@
+label.control, div ul#RIGHT {
+    margin-top: 10px!important;
+    border : 10px ChangeMe #C6C6C6;
+}
diff --git a/t/t4018/css-trailing-space b/t/t4018/css-trailing-space
new file mode 100644 (file)
index 0000000..32b5606
--- /dev/null
@@ -0,0 +1,5 @@
+RIGHT label.control-label {
+    margin:10px;   
+    padding:10px;
+    border : 10px ChangeMe #C6C6C6;
+}
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 2b32c4fbe67d9dc0a43fc7858ddd3ac400b6171f..ec78c5e3ac5661977b30582df9bec95265e1c613 100755 (executable)
@@ -50,14 +50,19 @@ test_expect_success 'attr negation' '
        color "nobold nodim noul noblink noreverse" "[22;24;25;27m"
 '
 
+test_expect_success '"no-" variant of negation' '
+       color "no-bold no-blink" "[22;25m"
+'
+
 test_expect_success 'long color specification' '
        color "254 255 bold dim ul blink reverse" "[1;2;4;5;7;38;5;254;48;5;255m"
 '
 
 test_expect_success 'absurdly long color specification' '
        color \
-         "#ffffff #ffffff bold nobold dim nodim ul noul blink noblink reverse noreverse" \
-         "[1;2;4;5;7;22;24;25;27;38;2;255;255;255;48;2;255;255;255m"
+         "#ffffff #ffffff bold nobold dim nodim italic noitalic
+          ul noul blink noblink reverse noreverse strike nostrike" \
+         "[1;2;3;4;5;7;9;22;23;24;25;27;29;38;2;255;255;255;48;2;255;255;255m"
 '
 
 test_expect_success '0-7 are aliases for basic ANSI color names' '
index 3c9932edf3f3dd44eaef98c0509a6cbe4b0091f5..113304dc596034ff9bfaac65b2ff896b6a181dca 100755 (executable)
@@ -5,6 +5,14 @@ test_description='patience diff algorithm'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff-alternative.sh
 
+test_expect_success '--ignore-space-at-eol with a single appended character' '
+       printf "a\nb\nc\n" >pre &&
+       printf "a\nbX\nc\n" >post &&
+       test_must_fail git diff --no-index \
+               --patience --ignore-space-at-eol pre post >diff &&
+       grep "^+.*X" diff
+'
+
 test_diff_frobnitz "patience"
 
 test_diff_unique "patience"
index f2f55fc51ccd294194300d4bbf66307ac73f9ac6..912df91226f2a018016129a6634b837faee19869 100755 (executable)
@@ -302,6 +302,7 @@ test_language_driver ada
 test_language_driver bibtex
 test_language_driver cpp
 test_language_driver csharp
+test_language_driver css
 test_language_driver fortran
 test_language_driver html
 test_language_driver java
diff --git a/t/t4034/css/expect b/t/t4034/css/expect
new file mode 100644 (file)
index 0000000..ed10393
--- /dev/null
@@ -0,0 +1,16 @@
+<BOLD>diff --git a/pre b/post<RESET>
+<BOLD>index b8ae0bb..fe500b7 100644<RESET>
+<BOLD>--- a/pre<RESET>
+<BOLD>+++ b/post<RESET>
+<CYAN>@@ -1,10 +1,10 @@<RESET>
+.<RED>class-form<RESET><GREEN>other-form<RESET> label.control-label {
+    margin-top: <RED>10<RESET><GREEN>15<RESET>px!important;
+    border : 10px <RED>dashed<RESET><GREEN>dotted<RESET> #C6C6C6;
+}<RESET>
+<RED>#CCCCCC<RESET><GREEN>#CCCCCB<RESET>
+10em<RESET>
+<RED>padding-bottom<RESET><GREEN>margin-left<RESET>
+150<RED>px<RESET><GREEN>em<RESET>
+10px
+<RED>!important<RESET>
+<RED>div<RESET><GREEN>li<RESET>.class#id
diff --git a/t/t4034/css/post b/t/t4034/css/post
new file mode 100644 (file)
index 0000000..fe500b7
--- /dev/null
@@ -0,0 +1,10 @@
+.other-form label.control-label {
+    margin-top: 15px!important;
+    border : 10px dotted #C6C6C6;
+}
+#CCCCCB
+10em
+margin-left
+150em
+10px
+li.class#id
diff --git a/t/t4034/css/pre b/t/t4034/css/pre
new file mode 100644 (file)
index 0000000..b8ae0bb
--- /dev/null
@@ -0,0 +1,10 @@
+.class-form label.control-label {
+    margin-top: 10px!important;
+    border : 10px dashed #C6C6C6;
+}
+#CCCCCC
+10em
+padding-bottom
+150px
+10px!important
+div.class#id
index 3b8b7921d60c75c7fa8670cef7049564d92c77b6..447a8ffa3a111dcc6ddec8b6081097f4127d2e59 100755 (executable)
@@ -248,7 +248,8 @@ EOF
        git rm -r src/move/unchanged &&
        git rm -r src/move/changed &&
        git rm -r src/move/rearranged &&
-       git commit -m "changes"
+       git commit -m "changes" &&
+       git config diff.renames false
 '
 
 cat <<EOF >expect_diff_stat
index 001d678e09bfa6d3e1c7197c27925bb12a71b492..6154acb4569eb452f4e19a40ba40e19703ecca88 100755 (executable)
 test_description='diff function context'
 
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/diff-lib.sh
 
+dir="$TEST_DIRECTORY/t4051"
 
-cat <<\EOF >hello.c
-#include <stdio.h>
-
-static int a(void)
-{
-       /*
-        * Dummy.
-        */
+commit_and_tag () {
+       tag=$1 &&
+       shift &&
+       git add "$@" &&
+       test_tick &&
+       git commit -m "$tag" &&
+       git tag "$tag"
 }
 
-static int hello_world(void)
-{
-       /* Classic. */
-       printf("Hello world.\n");
-
-       /* Success! */
-       return 0;
+first_context_line () {
+       awk '
+               found {print; exit}
+               /^@@/ {found = 1}
+       '
 }
-static int b(void)
-{
-       /*
-        * Dummy, too.
-        */
+
+last_context_line () {
+       sed -ne \$p
 }
 
-int main(int argc, char **argv)
-{
-       a();
-       b();
-       return hello_world();
+check_diff () {
+       name=$1
+       desc=$2
+       options="-W $3"
+
+       test_expect_success "$desc" '
+               git diff $options "$name^" "$name" >"$name.diff"
+       '
+
+       test_expect_success ' diff applies' '
+               test_when_finished "git reset --hard" &&
+               git checkout --detach "$name^" &&
+               git apply --index "$name.diff" &&
+               git diff --exit-code "$name"
+       '
 }
-EOF
 
 test_expect_success 'setup' '
-       git add hello.c &&
-       test_tick &&
-       git commit -m initial &&
-
-       grep -v Classic <hello.c >hello.c.new &&
-       mv hello.c.new hello.c
-'
-
-cat <<\EOF >expected
-diff --git a/hello.c b/hello.c
---- a/hello.c
-+++ b/hello.c
-@@ -10,8 +10,7 @@ static int a(void)
- static int hello_world(void)
- {
--      /* Classic. */
-       printf("Hello world.\n");
-       /* Success! */
-       return 0;
- }
-EOF
-
-test_expect_success 'diff -U0 -W' '
-       git diff -U0 -W >actual &&
-       compare_diff_patch actual expected
-'
-
-cat <<\EOF >expected
-diff --git a/hello.c b/hello.c
---- a/hello.c
-+++ b/hello.c
-@@ -9,9 +9,8 @@ static int a(void)
- static int hello_world(void)
- {
--      /* Classic. */
-       printf("Hello world.\n");
-       /* Success! */
-       return 0;
- }
-EOF
-
-test_expect_success 'diff -W' '
-       git diff -W >actual &&
-       compare_diff_patch actual expected
+       cat "$dir/includes.c" "$dir/dummy.c" "$dir/dummy.c" "$dir/hello.c" \
+               "$dir/dummy.c" "$dir/dummy.c" >file.c &&
+       commit_and_tag initial file.c &&
+
+       grep -v "delete me from hello" <file.c >file.c.new &&
+       mv file.c.new file.c &&
+       commit_and_tag changed_hello file.c &&
+
+       grep -v "delete me from includes" <file.c >file.c.new &&
+       mv file.c.new file.c &&
+       commit_and_tag changed_includes file.c &&
+
+       cat "$dir/appended1.c" >>file.c &&
+       commit_and_tag appended file.c &&
+
+       cat "$dir/appended2.c" >>file.c &&
+       commit_and_tag extended file.c &&
+
+       grep -v "Begin of second part" <file.c >file.c.new &&
+       mv file.c.new file.c &&
+       commit_and_tag long_common_tail file.c &&
+
+       git checkout initial &&
+       cat "$dir/hello.c" "$dir/dummy.c" >file.c &&
+       commit_and_tag hello_dummy file.c &&
+
+       # overlap function context of 1st change and -u context of 2nd change
+       grep -v "delete me from hello" <"$dir/hello.c" >file.c &&
+       sed 2p <"$dir/dummy.c" >>file.c &&
+       commit_and_tag changed_hello_dummy file.c &&
+
+       git checkout initial &&
+       grep -v "delete me from hello" <file.c >file.c.new &&
+       mv file.c.new file.c &&
+       cat "$dir/appended1.c" >>file.c &&
+       commit_and_tag changed_hello_appended file.c
+'
+
+check_diff changed_hello 'changed function'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of hello" changed_hello.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End of hello" changed_hello.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" changed_hello.diff) -le 1
+'
+
+test_expect_success ' context does not include preceding empty lines' '
+       test "$(first_context_line <changed_hello.diff)" != " "
+'
+
+test_expect_success ' context does not include trailing empty lines' '
+       test "$(last_context_line <changed_hello.diff)" != " "
+'
+
+check_diff changed_includes 'changed includes'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin.h" changed_includes.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End.h" changed_includes.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" changed_includes.diff) -le 1
+'
+
+test_expect_success ' context does not include trailing empty lines' '
+       test "$(last_context_line <changed_includes.diff)" != " "
+'
+
+check_diff appended 'appended function'
+
+test_expect_success ' context includes begin' '
+       grep "^[+].*Begin of first part" appended.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^[+].*End of first part" appended.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" appended.diff) -le 1
+'
+
+check_diff extended 'appended function part'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of first part" extended.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^[+].*End of second part" extended.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" extended.diff) -le 2
+'
+
+test_expect_success ' context does not include preceding empty lines' '
+       test "$(first_context_line <extended.diff)" != " "
+'
+
+check_diff long_common_tail 'change with long common tail and no context' -U0
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of first part" long_common_tail.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End of second part" long_common_tail.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" long_common_tail.diff) -le 2
+'
+
+test_expect_success ' context does not include preceding empty lines' '
+       test "$(first_context_line <long_common_tail.diff.diff)" != " "
+'
+
+check_diff changed_hello_appended 'changed function plus appended function'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of hello" changed_hello_appended.diff &&
+       grep "^[+].*Begin of first part" changed_hello_appended.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End of hello" changed_hello_appended.diff &&
+       grep "^[+].*End of first part" changed_hello_appended.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2
+'
+
+check_diff changed_hello_dummy 'changed two consecutive functions'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of hello" changed_hello_dummy.diff &&
+       grep "^ .*Begin of dummy" changed_hello_dummy.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End of hello" changed_hello_dummy.diff &&
+       grep "^ .*End of dummy" changed_hello_dummy.diff
+'
+
+test_expect_success ' overlapping hunks are merged' '
+       test $(grep -c "^@@" changed_hello_dummy.diff) -eq 1
 '
 
 test_done
diff --git a/t/t4051/appended1.c b/t/t4051/appended1.c
new file mode 100644 (file)
index 0000000..a9f56f1
--- /dev/null
@@ -0,0 +1,15 @@
+
+int appended(void) // Begin of first part
+{
+       int i;
+       char *s = "a string";
+
+       printf("%s\n", s);
+
+       for (i = 99;
+            i >= 0;
+            i--) {
+               printf("%d bottles of beer on the wall\n", i);
+       }
+
+       printf("End of first part\n");
diff --git a/t/t4051/appended2.c b/t/t4051/appended2.c
new file mode 100644 (file)
index 0000000..e651f71
--- /dev/null
@@ -0,0 +1,35 @@
+       printf("Begin of second part\n");
+
+       /*
+        * Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
+        * sed diam nonumy eirmod tempor invidunt ut labore et dolore
+        * magna aliquyam erat, sed diam voluptua. At vero eos et
+        * accusam et justo duo dolores et ea rebum. Stet clita kasd
+        * gubergren, no sea takimata sanctus est Lorem ipsum dolor
+        * sit amet.
+        *
+        * Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
+        * sed diam nonumy eirmod tempor invidunt ut labore et dolore
+        * magna aliquyam erat, sed diam voluptua. At vero eos et
+        * accusam et justo duo dolores et ea rebum. Stet clita kasd
+        * gubergren, no sea takimata sanctus est Lorem ipsum dolor
+        * sit amet.
+        *
+        * Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
+        * sed diam nonumy eirmod tempor invidunt ut labore et dolore
+        * magna aliquyam erat, sed diam voluptua. At vero eos et
+        * accusam et justo duo dolores et ea rebum. Stet clita kasd
+        * gubergren, no sea takimata sanctus est Lorem ipsum dolor
+        * sit amet.
+        *
+        * Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
+        * sed diam nonumy eirmod tempor invidunt ut labore et dolore
+        * magna aliquyam erat, sed diam voluptua. At vero eos et
+        * accusam et justo duo dolores et ea rebum. Stet clita kasd
+        * gubergren, no sea takimata sanctus est Lorem ipsum dolor
+        * sit amet.
+        *
+        */
+
+       return 0;
+}      // End of second part
diff --git a/t/t4051/dummy.c b/t/t4051/dummy.c
new file mode 100644 (file)
index 0000000..a43016e
--- /dev/null
@@ -0,0 +1,7 @@
+
+static int dummy(void) // Begin of dummy
+{
+       int rc = 0;
+
+       return rc;
+}      // End of dummy
diff --git a/t/t4051/hello.c b/t/t4051/hello.c
new file mode 100644 (file)
index 0000000..63b1a1e
--- /dev/null
@@ -0,0 +1,21 @@
+
+static void hello(void)        // Begin of hello
+{
+       /*
+        * Classic.
+        */
+       putchar('H');
+       putchar('e');
+       putchar('l');
+       putchar('l');
+       putchar('o');
+       putchar(' ');
+       /* delete me from hello */
+       putchar('w');
+       putchar('o');
+       putchar('r');
+       putchar('l');
+       putchar('d');
+       putchar('.');
+       putchar('\n');
+}      // End of hello
diff --git a/t/t4051/includes.c b/t/t4051/includes.c
new file mode 100644 (file)
index 0000000..efc68f8
--- /dev/null
@@ -0,0 +1,20 @@
+#include <Begin.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdarg.h>
+/* delete me from includes */
+#include <string.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/time.h>
+#include <time.h>
+#include <signal.h>
+#include <assert.h>
+#include <regex.h>
+#include <utime.h>
+#include <syslog.h>
+#include <End.h>
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
index 1d6efab3c53f673298c4e1911fd1cb4756be59f6..18f42c5fff9a6e3ccb56f9e3122c6c0469ad81a9 100755 (executable)
@@ -3,8 +3,6 @@
 test_description='test diff with a bogus tree containing the null sha1'
 . ./test-lib.sh
 
-empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
-
 test_expect_success 'create bogus tree' '
        bogus_tree=$(
                printf "100644 fooQQQQQQQQQQQQQQQQQQQQQ" |
@@ -22,13 +20,13 @@ test_expect_success 'create tree with matching file' '
 
 test_expect_success 'raw diff shows null sha1 (addition)' '
        echo ":000000 100644 $_z40 $_z40 A      foo" >expect &&
-       git diff-tree $empty_tree $bogus_tree >actual &&
+       git diff-tree $EMPTY_TREE $bogus_tree >actual &&
        test_cmp expect actual
 '
 
 test_expect_success 'raw diff shows null sha1 (removal)' '
        echo ":100644 000000 $_z40 $_z40 D      foo" >expect &&
-       git diff-tree $bogus_tree $empty_tree >actual &&
+       git diff-tree $bogus_tree $EMPTY_TREE >actual &&
        test_cmp expect actual
 '
 
@@ -57,11 +55,11 @@ test_expect_success 'raw diff shows null sha1 (index)' '
 '
 
 test_expect_success 'patch fails due to bogus sha1 (addition)' '
-       test_must_fail git diff-tree -p $empty_tree $bogus_tree
+       test_must_fail git diff-tree -p $EMPTY_TREE $bogus_tree
 '
 
 test_expect_success 'patch fails due to bogus sha1 (removal)' '
-       test_must_fail git diff-tree -p $bogus_tree $empty_tree
+       test_must_fail git diff-tree -p $bogus_tree $EMPTY_TREE
 '
 
 test_expect_success 'patch fails due to bogus sha1 (modification)' '
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..7e23b55
--- /dev/null
@@ -0,0 +1,749 @@
+#!/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_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
diff --git a/t/t4062-diff-pickaxe.sh b/t/t4062-diff-pickaxe.sh
new file mode 100755 (executable)
index 0000000..f0bf50b
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (c) 2016 Johannes Schindelin
+#
+
+test_description='Pickaxe options'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+       test_commit initial &&
+       printf "%04096d" 0 >4096-zeroes.txt &&
+       git add 4096-zeroes.txt &&
+       test_tick &&
+       git commit -m "A 4k file"
+'
+test_expect_success '-G matches' '
+       git diff --name-only -G "^0{4096}$" HEAD^ >out &&
+       test 4096-zeroes.txt = "$(cat out)"
+'
+
+test_done
index d173acde0f2c44031003144fda9770f4b1e726b4..f8a313bcb98c6e2b98982295773bdc8ac7e13256 100755 (executable)
@@ -13,9 +13,13 @@ create_file() {
 }
 
 test_expect_success 'setup' '
-       create_file file1 "File1 contents" &&
-       create_file file2 "File2 contents" &&
-       create_file file3 "File3 contents" &&
+       # Ensure that file sizes are different, because on Windows
+       # lstat() does not discover inode numbers, and we need
+       # other properties to discover swapped files
+       # (mtime is not always different, either).
+       create_file file1 "some content" &&
+       create_file file2 "some other content" &&
+       create_file file3 "again something else" &&
        git add file1 file2 file3 &&
        git commit -m 1
 '
index b41bd17264f93d54d5aa280fbc305cebb18950a0..89a5bacac5ad069ec10b16bfdf3dbde7217cf4de 100755 (executable)
@@ -957,4 +957,47 @@ test_expect_success 'am -s unexpected trailer block' '
        test_cmp expect actual
 '
 
+test_expect_success 'am --patch-format=mboxrd handles mboxrd' '
+       rm -fr .git/rebase-apply &&
+       git checkout -f first &&
+       echo mboxrd >>file &&
+       git add file &&
+       cat >msg <<-\INPUT_END &&
+       mboxrd should escape the body
+
+       From could trip up a loose mbox parser
+       >From extra escape for reversibility
+       INPUT_END
+       git commit -F msg &&
+       git format-patch --pretty=mboxrd --stdout -1 >mboxrd1 &&
+       grep "^>From could trip up a loose mbox parser" mboxrd1 &&
+       git checkout -f first &&
+       git am --patch-format=mboxrd mboxrd1 &&
+       git cat-file commit HEAD | tail -n4 >out &&
+       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" --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 ea5ace99a14f7f31b63dfd9cf25123725a525519..9473c2779ef0df109f6943a949583676ea5ceabf 100755 (executable)
@@ -82,7 +82,7 @@ test_expect_success 'am -3 --abort removes otherfile-4' '
        test 4 = "$(cat otherfile-4)" &&
        git am --abort &&
        test_cmp_rev initial HEAD &&
-       test -z $(git ls-files -u) &&
+       test -z "$(git ls-files -u)" &&
        test_path_is_missing otherfile-4
 '
 
index 7c013d84d5978edf3760c48e0125c3527c8e09f9..8ea22d1bcbb8340d32fe87f299a77c98362c3797 100755 (executable)
@@ -53,7 +53,7 @@ test_expect_success '--no-quiet overrides --quiet' '
        # Applying side1 will be quiet.
        test_must_fail git am --quiet side[123].eml >out &&
        test_path_is_dir .git/rebase-apply &&
-       ! test_i18ngrep "^Applying: " out &&
+       test_i18ngrep ! "^Applying: " out &&
        echo side1 >file &&
        git add file &&
 
index ed9c91e25b584c2241c238f9c6ffad9a3a327d2c..1a080e782371e2d7ad489c706a54fce1553b9579 100755 (executable)
@@ -184,12 +184,27 @@ test_expect_success 'rerere updates postimage timestamp' '
 '
 
 test_expect_success 'rerere clear' '
-       rm $rr/postimage &&
+       mv $rr/postimage .git/post-saved &&
        echo "$sha1     a1" | perl -pe "y/\012/\000/" >.git/MERGE_RR &&
        git rerere clear &&
        ! test -d $rr
 '
 
+test_expect_success 'leftover directory' '
+       git reset --hard &&
+       mkdir -p $rr &&
+       test_must_fail git merge first &&
+       test -f $rr/preimage
+'
+
+test_expect_success 'missing preimage' '
+       git reset --hard &&
+       mkdir -p $rr &&
+       cp .git/post-saved $rr/postimage &&
+       test_must_fail git merge first &&
+       test -f $rr/preimage
+'
+
 test_expect_success 'set up for garbage collection tests' '
        mkdir -p $rr &&
        echo Hello >$rr/preimage &&
@@ -391,4 +406,157 @@ test_expect_success 'rerere -h' '
        test_i18ngrep [Uu]sage help
 '
 
+concat_insert () {
+       last=$1
+       shift
+       cat early && printf "%s\n" "$@" && cat late "$last"
+}
+
+count_pre_post () {
+       find .git/rr-cache/ -type f -name "preimage*" >actual &&
+       test_line_count = "$1" actual &&
+       find .git/rr-cache/ -type f -name "postimage*" >actual &&
+       test_line_count = "$2" actual
+}
+
+test_expect_success 'rerere gc' '
+       find .git/rr-cache -type f >original &&
+       xargs test-chmtime -172800 <original &&
+
+       git -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&
+       find .git/rr-cache -type f >actual &&
+       test_cmp original actual &&
+
+       git -c gc.rerereresolved=5 -c gc.rerereunresolved=0 rerere gc &&
+       find .git/rr-cache -type f >actual &&
+       test_cmp original actual &&
+
+       git -c gc.rerereresolved=0 -c gc.rerereunresolved=0 rerere gc &&
+       find .git/rr-cache -type f >actual &&
+       >expect &&
+       test_cmp expect actual
+'
+
+merge_conflict_resolve () {
+       git reset --hard &&
+       test_must_fail git merge six.1 &&
+       # Resolution is to replace 7 with 6.1 and 6.2 (i.e. take both)
+       concat_insert short 6.1 6.2 >file1 &&
+       concat_insert long 6.1 6.2 >file2
+}
+
+test_expect_success 'multiple identical conflicts' '
+       git reset --hard &&
+
+       test_seq 1 6 >early &&
+       >late &&
+       test_seq 11 15 >short &&
+       test_seq 111 120 >long &&
+       concat_insert short >file1 &&
+       concat_insert long >file2 &&
+       git add file1 file2 &&
+       git commit -m base &&
+       git tag base &&
+       git checkout -b six.1 &&
+       concat_insert short 6.1 >file1 &&
+       concat_insert long 6.1 >file2 &&
+       git add file1 file2 &&
+       git commit -m 6.1 &&
+       git checkout -b six.2 HEAD^ &&
+       concat_insert short 6.2 >file1 &&
+       concat_insert long 6.2 >file2 &&
+       git add file1 file2 &&
+       git commit -m 6.2 &&
+
+       # At this point, six.1 and six.2
+       # - derive from common ancestor that has two files
+       #   1...6 7 11..15 (file1) and 1...6 7 111..120 (file2)
+       # - six.1 replaces these 7s with 6.1
+       # - six.2 replaces these 7s with 6.2
+
+       merge_conflict_resolve &&
+
+       # Check that rerere knows that file1 and file2 have conflicts
+
+       printf "%s\n" file1 file2 >expect &&
+       git ls-files -u | sed -e "s/^.* //" | sort -u >actual &&
+       test_cmp expect actual &&
+
+       git rerere status | sort >actual &&
+       test_cmp expect actual &&
+
+       git rerere remaining >actual &&
+       test_cmp expect actual &&
+
+       count_pre_post 2 0 &&
+
+       # Pretend that the conflicts were made quite some time ago
+       find .git/rr-cache/ -type f | xargs test-chmtime -172800 &&
+
+       # Unresolved entries have not expired yet
+       git -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&
+       count_pre_post 2 0 &&
+
+       # Unresolved entries have expired
+       git -c gc.rerereresolved=5 -c gc.rerereunresolved=1 rerere gc &&
+       count_pre_post 0 0 &&
+
+       # Recreate the conflicted state
+       merge_conflict_resolve &&
+       count_pre_post 2 0 &&
+
+       # Clear it
+       git rerere clear &&
+       count_pre_post 0 0 &&
+
+       # Recreate the conflicted state
+       merge_conflict_resolve &&
+       count_pre_post 2 0 &&
+
+       # We resolved file1 and file2
+       git rerere &&
+       >expect &&
+       git rerere remaining >actual &&
+       test_cmp expect actual &&
+
+       # We must have recorded both of them
+       count_pre_post 2 2 &&
+
+       # Now we should be able to resolve them both
+       git reset --hard &&
+       test_must_fail git merge six.1 &&
+       git rerere &&
+
+       >expect &&
+       git rerere remaining >actual &&
+       test_cmp expect actual &&
+
+       concat_insert short 6.1 6.2 >file1.expect &&
+       concat_insert long 6.1 6.2 >file2.expect &&
+       test_cmp file1.expect file1 &&
+       test_cmp file2.expect file2 &&
+
+       # Forget resolution for file2
+       git rerere forget file2 &&
+       echo file2 >expect &&
+       git rerere status >actual &&
+       test_cmp expect actual &&
+       count_pre_post 2 1 &&
+
+       # file2 already has correct resolution, so record it again
+       git rerere &&
+
+       # Pretend that the resolutions are old again
+       find .git/rr-cache/ -type f | xargs test-chmtime -172800 &&
+
+       # Resolved entries have not expired yet
+       git -c gc.rerereresolved=5 -c gc.rerereunresolved=5 rerere gc &&
+
+       count_pre_post 2 2 &&
+
+       # Resolved entries have expired
+       git -c gc.rerereresolved=1 -c gc.rerereunresolved=5 rerere gc &&
+       count_pre_post 0 0
+'
+
 test_done
index f5e63670faa0c5acc38adc17d32ae66b59d66b64..ae08b57712e382a4cba7f7a51a499b4621a38c84 100755 (executable)
@@ -115,7 +115,7 @@ EOF
 '
 
 test_expect_success !MINGW 'shortlog from non-git directory' '
-       git log HEAD >log &&
+       git log --no-expand-tabs HEAD >log &&
        GIT_DIR=non-existing git shortlog -w <log >out &&
        test_cmp expect out
 '
@@ -184,4 +184,10 @@ test_expect_success 'shortlog with revision pseudo options' '
        git shortlog --exclude=refs/heads/m* --all
 '
 
+test_expect_success 'shortlog with --output=<file>' '
+       git shortlog --output=shortlog -1 master >output &&
+       test ! -s output &&
+       test_line_count = 3 shortlog
+'
+
 test_done
index cb82eb7e66b4feb24086407019a812f46b715a34..1ccbd5948a735f692469e181933c97e8632404b4 100755 (executable)
@@ -101,8 +101,8 @@ test_expect_success 'oneline' '
 
 test_expect_success 'diff-filter=A' '
 
-       git log --pretty="format:%s" --diff-filter=A HEAD > actual &&
-       git log --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
+       git log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&
+       git log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&
        printf "fifth\nfourth\nthird\ninitial" > expect &&
        test_cmp expect actual &&
        test_cmp expect actual-separate
@@ -119,7 +119,7 @@ test_expect_success 'diff-filter=M' '
 
 test_expect_success 'diff-filter=D' '
 
-       actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
+       actual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&
        expect=$(echo sixth ; echo third) &&
        verbose test "$actual" = "$expect"
 
@@ -187,6 +187,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
@@ -255,6 +265,20 @@ test_expect_success 'log -F -E --grep=<ere> uses ere' '
        test_cmp expect actual
 '
 
+test_expect_success 'log with grep.patternType configuration' '
+       >expect &&
+       git -c grep.patterntype=fixed \
+       log -1 --pretty=tformat:%s --grep=s.c.nd >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'log with grep.patternType configuration and command line' '
+       echo second >expect &&
+       git -c grep.patterntype=fixed \
+       log -1 --pretty=tformat:%s --basic-regexp --grep=s.c.nd >actual &&
+       test_cmp expect actual
+'
+
 cat > expect <<EOF
 * Second
 * sixth
@@ -270,6 +294,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 &&
@@ -299,6 +338,27 @@ 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
+'
+
 test_expect_success 'log --raw --graph -m with merge' '
        git log --raw --graph --oneline -m master | head -n 500 >actual &&
        grep "initial" actual
@@ -848,7 +908,284 @@ sanitize_output () {
 }
 
 test_expect_success 'log --graph with diff and stats' '
-       git log --graph --pretty=short --stat -p >actual &&
+       git log --no-renames --graph --pretty=short --stat -p >actual &&
+       sanitize_output >actual.sanitized <actual &&
+       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
 '
@@ -860,12 +1197,15 @@ test_expect_success 'dotdot is a parent directory' '
        test_cmp expect actual
 '
 
-test_expect_success GPG 'log --graph --show-signature' '
+test_expect_success GPG 'setup signed branch' '
        test_when_finished "git reset --hard && git checkout master" &&
        git checkout -b signed master &&
        echo foo >foo &&
        git add foo &&
-       git commit -S -m signed_commit &&
+       git commit -S -m signed_commit
+'
+
+test_expect_success GPG 'log --graph --show-signature' '
        git log --graph --show-signature -n1 signed >actual &&
        grep "^| gpg: Signature made" actual &&
        grep "^| gpg: Good signature" actual
@@ -890,6 +1230,31 @@ test_expect_success GPG 'log --graph --show-signature for merged tag' '
        grep "^| | gpg: Good signature" actual
 '
 
+test_expect_success GPG '--no-show-signature overrides --show-signature' '
+       git log -1 --show-signature --no-show-signature signed >actual &&
+       ! grep "^gpg:" actual
+'
+
+test_expect_success GPG 'log.showsignature=true behaves like --show-signature' '
+       test_config log.showsignature true &&
+       git log -1 signed >actual &&
+       grep "gpg: Signature made" actual &&
+       grep "gpg: Good signature" actual
+'
+
+test_expect_success GPG '--no-show-signature overrides log.showsignature=true' '
+       test_config log.showsignature true &&
+       git log -1 --no-show-signature signed >actual &&
+       ! grep "^gpg:" actual
+'
+
+test_expect_success GPG '--show-signature overrides log.showsignature=false' '
+       test_config log.showsignature false &&
+       git log -1 --show-signature signed >actual &&
+       grep "gpg: Signature made" actual &&
+       grep "gpg: Good signature" actual
+'
+
 test_expect_success 'log --graph --no-walk is forbidden' '
        test_must_fail git log --graph --no-walk
 '
index baa9d3c82e8a54dc7501d90bc9da0527f2a72b2e..0288c17ec60b803d2815fb1b704c35f74e4a7753 100755 (executable)
@@ -30,11 +30,11 @@ test_expect_success 'patch-id output is well-formed' '
 
 #calculate patch id. Make sure output is not empty.
 calc_patch_id () {
-       name="$1"
+       patch_name="$1"
        shift
        git patch-id "$@" |
-       sed "s/ .*//" >patch-id_"$name" &&
-       test_line_count -gt 0 patch-id_"$name"
+       sed "s/ .*//" >patch-id_"$patch_name" &&
+       test_line_count -gt 0 patch-id_"$patch_name"
 }
 
 get_top_diff () {
@@ -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 7398605e7b894259548f257aaf3e92d9481534eb..f5435fd250baf7415fb6a205f4497cb5c118de65 100755 (executable)
@@ -145,253 +145,310 @@ test_expect_success 'setup more commits' '
 
 test_expect_success 'left alignment formatting' '
        git log --pretty="tformat:%<(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-message two                            Z
-message one                            Z
-add bar                                Z
-$(commit_msg)                    Z
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       message two                            Z
+       message one                            Z
+       add bar                                Z
+       $(commit_msg)                    Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-message two                            Z
-message one                            Z
-add bar                                Z
-$(commit_msg)                    Z
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       message two                            Z
+       message one                            Z
+       add bar                                Z
+       $(commit_msg)                    Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting at the nth column' '
        git log --pretty="tformat:%h %<|(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-$head1 message two                    Z
-$head2 message one                    Z
-$head3 add bar                        Z
-$head4 $(commit_msg)            Z
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       $head1 message two                    Z
+       $head2 message one                    Z
+       $head3 add bar                        Z
+       $head4 $(commit_msg)            Z
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'left alignment formatting at the nth column' '
+       COLUMNS=50 git log --pretty="tformat:%h %<|(-10)%s" >actual &&
+       qz_to_tab_space <<-EOF >expected &&
+       $head1 message two                    Z
+       $head2 message one                    Z
+       $head3 add bar                        Z
+       $head4 $(commit_msg)            Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting at the nth column. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %<|(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-$head1 message two                    Z
-$head2 message one                    Z
-$head3 add bar                        Z
-$head4 $(commit_msg)            Z
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       $head1 message two                    Z
+       $head2 message one                    Z
+       $head3 add bar                        Z
+       $head4 $(commit_msg)            Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with no padding' '
        git log --pretty="tformat:%<(1)%s" >actual &&
-       cat <<EOF >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with no padding. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(1)%s" >actual &&
-       cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with trunc' '
        git log --pretty="tformat:%<(10,trunc)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-message ..
-message ..
-add bar  Z
-initial...
-EOF
+       qz_to_tab_space <<-\EOF >expected &&
+       message ..
+       message ..
+       add bar  Z
+       initial...
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with trunc. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-message ..
-message ..
-add bar  Z
-initial...
-EOF
+       qz_to_tab_space <<-\EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       message ..
+       message ..
+       add bar  Z
+       initial...
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with ltrunc' '
        git log --pretty="tformat:%<(10,ltrunc)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-..sage two
-..sage one
-add bar  Z
-..${sample_utf8_part}lich
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       ..sage two
+       ..sage one
+       add bar  Z
+       ..${sample_utf8_part}lich
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with ltrunc. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,ltrunc)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-..sage two
-..sage one
-add bar  Z
-..${sample_utf8_part}lich
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       ..sage two
+       ..sage one
+       add bar  Z
+       ..${sample_utf8_part}lich
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with mtrunc' '
        git log --pretty="tformat:%<(10,mtrunc)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-mess.. two
-mess.. one
-add bar  Z
-init..lich
-EOF
+       qz_to_tab_space <<-\EOF >expected &&
+       mess.. two
+       mess.. one
+       add bar  Z
+       init..lich
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left alignment formatting with mtrunc. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,mtrunc)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-mess.. two
-mess.. one
-add bar  Z
-init..lich
-EOF
+       qz_to_tab_space <<-\EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       mess.. two
+       mess.. one
+       add bar  Z
+       init..lich
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting' '
        git log --pretty="tformat:%>(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-Z                            message two
-Z                            message one
-Z                                add bar
-Z                    $(commit_msg)
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       Z                            message two
+       Z                            message one
+       Z                                add bar
+       Z                    $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%>(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-Z                            message two
-Z                            message one
-Z                                add bar
-Z                    $(commit_msg)
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       Z                            message two
+       Z                            message one
+       Z                                add bar
+       Z                    $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting at the nth column' '
        git log --pretty="tformat:%h %>|(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-$head1                      message two
-$head2                      message one
-$head3                          add bar
-$head4              $(commit_msg)
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       $head1                      message two
+       $head2                      message one
+       $head3                          add bar
+       $head4              $(commit_msg)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'right alignment formatting at the nth column' '
+       COLUMNS=50 git log --pretty="tformat:%h %>|(-10)%s" >actual &&
+       qz_to_tab_space <<-EOF >expected &&
+       $head1                      message two
+       $head2                      message one
+       $head3                          add bar
+       $head4              $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting at the nth column. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %>|(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-$head1                      message two
-$head2                      message one
-$head3                          add bar
-$head4              $(commit_msg)
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       $head1                      message two
+       $head2                      message one
+       $head3                          add bar
+       $head4              $(commit_msg)
+       EOF
+       test_cmp expected actual
+'
+
+# Note: Space between 'message' and 'two' should be in the same column
+# as in previous test.
+test_expect_success 'right alignment formatting at the nth column with --graph. i18n.logOutputEncoding' '
+       git -c i18n.logOutputEncoding=$test_encoding log --graph --pretty="tformat:%h %>|(40)%s" >actual &&
+       iconv -f utf-8 -t $test_encoding >expected <<-EOF &&
+       * $head1                    message two
+       * $head2                    message one
+       * $head3                        add bar
+       * $head4            $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting with no padding' '
        git log --pretty="tformat:%>(1)%s" >actual &&
-       cat <<EOF >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'right alignment formatting with no padding and with --graph' '
+       git log --graph --pretty="tformat:%>(1)%s" >actual &&
+       cat <<-EOF >expected &&
+       * message two
+       * message one
+       * add bar
+       * $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'right alignment formatting with no padding. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%>(1)%s" >actual &&
-       cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'center alignment formatting' '
        git log --pretty="tformat:%><(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-Z             message two              Z
-Z             message one              Z
-Z               add bar                Z
-Z         $(commit_msg)          Z
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       Z             message two              Z
+       Z             message one              Z
+       Z               add bar                Z
+       Z         $(commit_msg)          Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'center alignment formatting. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%><(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-Z             message two              Z
-Z             message one              Z
-Z               add bar                Z
-Z         $(commit_msg)          Z
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       Z             message two              Z
+       Z             message one              Z
+       Z               add bar                Z
+       Z         $(commit_msg)          Z
+       EOF
        test_cmp expected actual
 '
 test_expect_success 'center alignment formatting at the nth column' '
        git log --pretty="tformat:%h %><|(40)%s" >actual &&
-       qz_to_tab_space <<EOF >expected &&
-$head1           message two          Z
-$head2           message one          Z
-$head3             add bar            Z
-$head4       $(commit_msg)      Z
-EOF
+       qz_to_tab_space <<-EOF >expected &&
+       $head1           message two          Z
+       $head2           message one          Z
+       $head3             add bar            Z
+       $head4       $(commit_msg)      Z
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'center alignment formatting at the nth column' '
+       COLUMNS=70 git log --pretty="tformat:%h %><|(-30)%s" >actual &&
+       qz_to_tab_space <<-EOF >expected &&
+       $head1           message two          Z
+       $head2           message one          Z
+       $head3             add bar            Z
+       $head4       $(commit_msg)      Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'center alignment formatting at the nth column. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %><|(40)%s" >actual &&
-       qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-$head1           message two          Z
-$head2           message one          Z
-$head3             add bar            Z
-$head4       $(commit_msg)      Z
-EOF
+       qz_to_tab_space <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       $head1           message two          Z
+       $head2           message one          Z
+       $head3             add bar            Z
+       $head4       $(commit_msg)      Z
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'center alignment formatting with no padding' '
        git log --pretty="tformat:%><(1)%s" >actual &&
-       cat <<EOF >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
@@ -400,34 +457,34 @@ EOF
 old_head1=$(git rev-parse --verify HEAD~0)
 test_expect_success 'center alignment formatting with no padding. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%><(1)%s" >actual &&
-       cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-message two
-message one
-add bar
-$(commit_msg)
-EOF
+       cat <<-EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       message two
+       message one
+       add bar
+       $(commit_msg)
+       EOF
        test_cmp expected actual
 '
 
 test_expect_success 'left/right alignment formatting with stealing' '
        git commit --amend -m short --author "long long long <long@me.com>" &&
        git log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
-       cat <<EOF >expected &&
-short long  long long
-message ..   A U Thor
-add bar      A U Thor
-initial...   A U Thor
-EOF
+       cat <<-\EOF >expected &&
+       short long  long long
+       message ..   A U Thor
+       add bar      A U Thor
+       initial...   A U Thor
+       EOF
        test_cmp expected actual
 '
 test_expect_success 'left/right alignment formatting with stealing. i18n.logOutputEncoding' '
        git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
-       cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
-short long  long long
-message ..   A U Thor
-add bar      A U Thor
-initial...   A U Thor
-EOF
+       cat <<-\EOF | iconv -f utf-8 -t $test_encoding >expected &&
+       short long  long long
+       message ..   A U Thor
+       add bar      A U Thor
+       initial...   A U Thor
+       EOF
        test_cmp expected actual
 '
 
@@ -447,8 +504,10 @@ test_expect_success 'ISO and ISO-strict date formats display the same values' '
 '
 
 # get new digests (with no abbreviations)
-head1=$(git rev-parse --verify HEAD~0) &&
-head2=$(git rev-parse --verify HEAD~1) &&
+test_expect_success 'set up log decoration tests' '
+       head1=$(git rev-parse --verify HEAD~0) &&
+       head2=$(git rev-parse --verify HEAD~1)
+'
 
 test_expect_success 'log decoration properly follows tag chain' '
        git tag -a tag1 -m tag1 &&
@@ -456,22 +515,22 @@ test_expect_success 'log decoration properly follows tag chain' '
        git tag -d tag1 &&
        git commit --amend -m shorter &&
        git log --no-walk --tags --pretty="%H %d" --decorate=full >actual &&
-       cat <<EOF >expected &&
-$head1  (tag: refs/tags/tag2)
-$head2  (tag: refs/tags/message-one)
-$old_head1  (tag: refs/tags/message-two)
-EOF
+       cat <<-EOF >expected &&
+       $head1  (tag: refs/tags/tag2)
+       $head2  (tag: refs/tags/message-one)
+       $old_head1  (tag: refs/tags/message-two)
+       EOF
        sort actual >actual1 &&
        test_cmp expected actual1
 '
 
 test_expect_success 'clean log decoration' '
        git log --no-walk --tags --pretty="%H %D" --decorate=full >actual &&
-       cat >expected <<EOF &&
-$head1 tag: refs/tags/tag2
-$head2 tag: refs/tags/message-one
-$old_head1 tag: refs/tags/message-two
-EOF
+       cat >expected <<-EOF &&
+       $head1 tag: refs/tags/tag2
+       $head2 tag: refs/tags/message-one
+       $old_head1 tag: refs/tags/message-two
+       EOF
        sort actual >actual1 &&
        test_cmp expected actual1
 '
index f8008b6a3d2a5fc200665998288d121d1c35dd25..b972296f0634144defe5a7a083c5607893a7ca10 100755 (executable)
@@ -44,7 +44,7 @@ test_expect_success setup '
 '
 
 cat >expected <<EOF
-${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}${c_commit} ->\
+${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD ->\
  ${c_reset}${c_branch}master${c_reset}${c_commit},\
  ${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit},\
  ${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B
index d8f23f488e00dad97eeb5d22f5f0db01bcab8021..001343e2fc2722506172e702266f5bab6278d1e8 100755 (executable)
@@ -18,7 +18,7 @@ test_expect_success '"git log :/" should not be ambiguous' '
 test_expect_success '"git log :/a" should be ambiguous (applied both rev and worktree)' '
        : >a &&
        test_must_fail git log :/a 2>error &&
-       grep ambiguous error
+       test_i18ngrep ambiguous error
 '
 
 test_expect_success '"git log :/a -- " should not be ambiguous' '
@@ -31,7 +31,7 @@ test_expect_success '"git log -- :/a" should not be ambiguous' '
 
 test_expect_success '"git log :" should be ambiguous' '
        test_must_fail git log : 2>error &&
-       grep ambiguous error
+       test_i18ngrep ambiguous error
 '
 
 test_expect_success 'git log -- :' '
index 4451127eb24051dcc3d2aebd443d10619c525e27..9d87777b5994910dda971b57fd67b733ee9b5398 100755 (executable)
@@ -99,4 +99,11 @@ test_expect_success '-L with --first-parent and a merge' '
        git log --first-parent -L 1,1:b.c
 '
 
+test_expect_success '-L with --output' '
+       git checkout parallel-change &&
+       git log --output=log -L :main:b.c >output &&
+       test ! -s output &&
+       test_line_count = 70 log
+'
+
 test_done
diff --git a/t/t4213-log-tabexpand.sh b/t/t4213-log-tabexpand.sh
new file mode 100755 (executable)
index 0000000..e01a8f6
--- /dev/null
@@ -0,0 +1,105 @@
+#!/bin/sh
+
+test_description='log/show --expand-tabs'
+
+. ./test-lib.sh
+
+HT="   "
+title='tab indent at the beginning of the title line'
+body='tab indent on a line in the body'
+
+# usage: count_expand $indent $numSP $numHT @format_args
+count_expand ()
+{
+       expect=
+       count=$(( $1 + $2 )) ;# expected spaces
+       while test $count -gt 0
+       do
+               expect="$expect "
+               count=$(( $count - 1 ))
+       done
+       shift 2
+       count=$1 ;# expected tabs
+       while test $count -gt 0
+       do
+               expect="$expect$HT"
+               count=$(( $count - 1 ))
+       done
+       shift
+
+       # The remainder of the command line is "git show -s" options
+       case " $* " in
+       *' --pretty=short '*)
+               line=$title ;;
+       *)
+               line=$body ;;
+       esac
+
+       # Prefix the output with the command line arguments, and
+       # replace SP with a dot both in the expecte and actual output
+       # so that test_cmp would show the differene together with the
+       # breakage in a way easier to consume by the debugging user.
+       {
+               echo "git show -s $*"
+               echo "$expect$line"
+       } | sed -e 's/ /./g' >expect
+
+       {
+               echo "git show -s $*"
+               git show -s "$@" |
+               sed -n -e "/$line\$/p"
+       } | sed -e 's/ /./g' >actual
+
+       test_cmp expect actual
+}
+
+test_expand ()
+{
+       fmt=$1
+       case "$fmt" in
+       *=raw | *=short | *=email)
+               default="0 1" ;;
+       *)
+               default="8 0" ;;
+       esac
+       case "$fmt" in
+       *=email)
+               in=0 ;;
+       *)
+               in=4 ;;
+       esac
+       test_expect_success "expand/no-expand${fmt:+ for $fmt}" '
+               count_expand $in $default $fmt &&
+               count_expand $in 8 0 $fmt --expand-tabs &&
+               count_expand $in 8 0 --expand-tabs $fmt &&
+               count_expand $in 8 0 $fmt --expand-tabs=8 &&
+               count_expand $in 8 0 --expand-tabs=8 $fmt &&
+               count_expand $in 0 1 $fmt --no-expand-tabs &&
+               count_expand $in 0 1 --no-expand-tabs $fmt &&
+               count_expand $in 0 1 $fmt --expand-tabs=0 &&
+               count_expand $in 0 1 --expand-tabs=0 $fmt &&
+               count_expand $in 4 0 $fmt --expand-tabs=4 &&
+               count_expand $in 4 0 --expand-tabs=4 $fmt
+       '
+}
+
+test_expect_success 'setup' '
+       test_tick &&
+       sed -e "s/Q/$HT/g" <<-EOF >msg &&
+       Q$title
+
+       Q$body
+       EOF
+       git commit --allow-empty -F msg
+'
+
+test_expand ""
+test_expand --pretty
+test_expand --pretty=short
+test_expand --pretty=medium
+test_expand --pretty=full
+test_expand --pretty=fuller
+test_expand --pretty=raw
+test_expand --pretty=email
+
+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 4b68bbafbe9016d66ce4f96f2058ac67640ed147..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 &&
@@ -319,4 +334,78 @@ test_expect_success 'catch non-matching pathspec' '
        test_must_fail git archive -v HEAD -- "*.abc" >/dev/null
 '
 
+# Pull the size and date of each entry in a tarfile using the system tar.
+#
+# We'll pull out only the year from the date; that avoids any question of
+# timezones impacting the result (as long as we keep our test times away from a
+# year boundary; our reference times are all in August).
+#
+# The output of tar_info is expected to be "<size> <year>", both in decimal. It
+# ignores the return value of tar. We have to do this, because some of our test
+# input is only partial (the real data is 64GB in some cases).
+tar_info () {
+       "$TAR" tvf "$1" |
+       awk '{
+               split($4, date, "-")
+               print $3 " " date[1]
+       }'
+}
+
+# See if our system tar can handle a tar file with huge sizes and dates far in
+# the future, and that we can actually parse its output.
+#
+# The reference file was generated by GNU tar, and the magic time and size are
+# both octal 01000000000001, which overflows normal ustar fields.
+test_lazy_prereq TAR_HUGE '
+       echo "68719476737 4147" >expect &&
+       tar_info "$TEST_DIRECTORY"/t5000/huge-and-future.tar >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success LONG_IS_64BIT 'set up repository with huge blob' '
+       obj_d=19 &&
+       obj_f=f9c8273ec45a8938e6999cb59b3ff66739902a &&
+       obj=${obj_d}${obj_f} &&
+       mkdir -p .git/objects/$obj_d &&
+       cp "$TEST_DIRECTORY"/t5000/$obj .git/objects/$obj_d/$obj_f &&
+       rm -f .git/index &&
+       git update-index --add --cacheinfo 100644,$obj,huge &&
+       git commit -m huge
+'
+
+# We expect git to die with SIGPIPE here (otherwise we
+# would generate the whole 64GB).
+test_expect_success LONG_IS_64BIT 'generate tar with huge size' '
+       {
+               git archive HEAD
+               echo $? >exit-code
+       } | test_copy_bytes 4096 >huge.tar &&
+       echo 141 >expect &&
+       test_cmp expect exit-code
+'
+
+test_expect_success TAR_HUGE,LONG_IS_64BIT 'system tar can read our huge size' '
+       echo 68719476737 >expect &&
+       tar_info huge.tar | cut -d" " -f1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success LONG_IS_64BIT 'set up repository with far-future commit' '
+       rm -f .git/index &&
+       echo content >file &&
+       git add file &&
+       GIT_COMMITTER_DATE="@68719476737 +0000" \
+               git commit -m "tempori parendum"
+'
+
+test_expect_success LONG_IS_64BIT 'generate tar with future mtime' '
+       git archive HEAD >future.tar
+'
+
+test_expect_success TAR_HUGE,LONG_IS_64BIT 'system tar can read our future mtime' '
+       echo 4147 >expect &&
+       tar_info future.tar | cut -d" " -f2 >actual &&
+       test_cmp expect actual
+'
+
 test_done
diff --git a/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a b/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a
new file mode 100644 (file)
index 0000000..5cbe9ec
Binary files /dev/null and b/t/t5000/19f9c8273ec45a8938e6999cb59b3ff66739902a differ
diff --git a/t/t5000/huge-and-future.tar b/t/t5000/huge-and-future.tar
new file mode 100644 (file)
index 0000000..63155e1
Binary files /dev/null and b/t/t5000/huge-and-future.tar differ
index 85b3df5e339b668688873c27244c458443bb6e6a..7171f67539bfafcb17d2d2fcb2f4ba4856c1131c 100755 (executable)
@@ -7,37 +7,39 @@ test_description='git mailinfo and git mailsplit test'
 
 . ./test-lib.sh
 
+DATA="$TEST_DIRECTORY/t5100"
+
 test_expect_success 'split sample box' \
-       'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last &&
+       '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
        mo="$mail$opt"
-       git mailinfo -u $opt msg$mo patch$mo <$mail >info$mo &&
-       test_cmp "$TEST_DIRECTORY"/t5100/msg$mo msg$mo &&
-       test_cmp "$TEST_DIRECTORY"/t5100/patch$mo patch$mo &&
-       test_cmp "$TEST_DIRECTORY"/t5100/info$mo info$mo
+       git mailinfo -u $opt "msg$mo" "patch$mo" <"$mail" >"info$mo" &&
+       test_cmp "$DATA/msg$mo" "msg$mo" &&
+       test_cmp "$DATA/patch$mo" "patch$mo" &&
+       test_cmp "$DATA/info$mo" "info$mo"
 }
 
 
 for mail in 00*
 do
        test_expect_success "mailinfo $mail" '
-               check_mailinfo $mail "" &&
-               if test -f "$TEST_DIRECTORY"/t5100/msg$mail--scissors
+               check_mailinfo "$mail" "" &&
+               if test -f "$DATA/msg$mail--scissors"
                then
-                       check_mailinfo $mail --scissors
+                       check_mailinfo "$mail" --scissors
                fi &&
-               if test -f "$TEST_DIRECTORY"/t5100/msg$mail--no-inbody-headers
+               if test -f "$DATA/msg$mail--no-inbody-headers"
                then
-                       check_mailinfo $mail --no-inbody-headers
+                       check_mailinfo "$mail" --no-inbody-headers
                fi &&
-               if test -f "$TEST_DIRECTORY"/t5100/msg$mail--message-id
+               if test -f "$DATA/msg$mail--message-id"
                then
-                       check_mailinfo $mail --message-id
+                       check_mailinfo "$mail" --message-id
                fi
        '
 done
@@ -45,7 +47,7 @@ done
 
 test_expect_success 'split box with rfc2047 samples' \
        'mkdir rfc2047 &&
-       git mailsplit -orfc2047 "$TEST_DIRECTORY"/t5100/rfc2047-samples.mbox \
+       git mailsplit -orfc2047 "$DATA/rfc2047-samples.mbox" \
          >rfc2047/last &&
        last=$(cat rfc2047/last) &&
        echo total is $last &&
@@ -54,20 +56,20 @@ test_expect_success 'split box with rfc2047 samples' \
 for mail in rfc2047/00*
 do
        test_expect_success "mailinfo $mail" '
-               git mailinfo -u $mail-msg $mail-patch <$mail >$mail-info &&
+               git mailinfo -u "$mail-msg" "$mail-patch" <"$mail" >"$mail-info" &&
                echo msg &&
-               test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-msg &&
+               test_cmp "$DATA/empty" "$mail-msg" &&
                echo patch &&
-               test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-patch &&
+               test_cmp "$DATA/empty" "$mail-patch" &&
                echo info &&
-               test_cmp "$TEST_DIRECTORY"/t5100/rfc2047-info-$(basename $mail) $mail-info
+               test_cmp "$DATA/rfc2047-info-$(basename $mail)" "$mail-info"
        '
 done
 
 test_expect_success 'respect NULs' '
 
-       git mailsplit -d3 -o. "$TEST_DIRECTORY"/t5100/nul-plain &&
-       test_cmp "$TEST_DIRECTORY"/t5100/nul-plain 001 &&
+       git mailsplit -d3 -o. "$DATA/nul-plain" &&
+       test_cmp "$DATA/nul-plain" 001 &&
        (cat 001 | git mailinfo msg patch) &&
        test_line_count = 4 patch
 
@@ -75,40 +77,98 @@ test_expect_success 'respect NULs' '
 
 test_expect_success 'Preserve NULs out of MIME encoded message' '
 
-       git mailsplit -d5 -o. "$TEST_DIRECTORY"/t5100/nul-b64.in &&
-       test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.in 00001 &&
+       git mailsplit -d5 -o. "$DATA/nul-b64.in" &&
+       test_cmp "$DATA/nul-b64.in" 00001 &&
        git mailinfo msg patch <00001 &&
-       test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.expect patch
+       test_cmp "$DATA/nul-b64.expect" patch
 
 '
 
 test_expect_success 'mailinfo on from header without name works' '
 
        mkdir info-from &&
-       git mailsplit -oinfo-from "$TEST_DIRECTORY"/t5100/info-from.in &&
-       test_cmp "$TEST_DIRECTORY"/t5100/info-from.in info-from/0001 &&
+       git mailsplit -oinfo-from "$DATA/info-from.in" &&
+       test_cmp "$DATA/info-from.in" info-from/0001 &&
        git mailinfo info-from/msg info-from/patch \
          <info-from/0001 >info-from/out &&
-       test_cmp "$TEST_DIRECTORY"/t5100/info-from.expect info-from/out
+       test_cmp "$DATA/info-from.expect" info-from/out
 
 '
 
 test_expect_success 'mailinfo finds headers after embedded From line' '
        mkdir embed-from &&
-       git mailsplit -oembed-from "$TEST_DIRECTORY"/t5100/embed-from.in &&
-       test_cmp "$TEST_DIRECTORY"/t5100/embed-from.in embed-from/0001 &&
+       git mailsplit -oembed-from "$DATA/embed-from.in" &&
+       test_cmp "$DATA/embed-from.in" embed-from/0001 &&
        git mailinfo embed-from/msg embed-from/patch \
          <embed-from/0001 >embed-from/out &&
-       test_cmp "$TEST_DIRECTORY"/t5100/embed-from.expect embed-from/out
+       test_cmp "$DATA/embed-from.expect" embed-from/out
 '
 
 test_expect_success 'mailinfo on message with quoted >From' '
        mkdir quoted-from &&
-       git mailsplit -oquoted-from "$TEST_DIRECTORY"/t5100/quoted-from.in &&
-       test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.in quoted-from/0001 &&
+       git mailsplit -oquoted-from "$DATA/quoted-from.in" &&
+       test_cmp "$DATA/quoted-from.in" quoted-from/0001 &&
        git mailinfo quoted-from/msg quoted-from/patch \
          <quoted-from/0001 >quoted-from/out &&
-       test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.expect quoted-from/msg
+       test_cmp "$DATA/quoted-from.expect" quoted-from/msg
+'
+
+test_expect_success 'mailinfo unescapes with --mboxrd' '
+       mkdir mboxrd &&
+       git mailsplit -omboxrd --mboxrd \
+               "$DATA/sample.mboxrd" >last &&
+       test x"$(cat last)" = x2 &&
+       for i in 0001 0002
+       do
+               git mailinfo mboxrd/msg mboxrd/patch \
+                 <mboxrd/$i >mboxrd/out &&
+               test_cmp "$DATA/${i}mboxrd" mboxrd/msg
+       done &&
+       sp=" " &&
+       echo "From " >expect &&
+       echo "From " >>expect &&
+       echo >> expect &&
+       cat >sp <<-INPUT_END &&
+       From mboxrd Mon Sep 17 00:00:00 2001
+       From: trailing spacer <sp@example.com>
+       Subject: [PATCH] a commit with trailing space
+
+       From$sp
+       >From$sp
+
+       INPUT_END
+
+       git mailsplit -f2 -omboxrd --mboxrd <sp >last &&
+       test x"$(cat last)" = x1 &&
+       git mailinfo mboxrd/msg mboxrd/patch <mboxrd/0003 &&
+       test_cmp expect mboxrd/msg
+'
+
+test_expect_success 'mailinfo handles rfc2822 quoted-string' '
+       mkdir quoted-string &&
+       git mailinfo /dev/null /dev/null <"$DATA/quoted-string.in" \
+               >quoted-string/info &&
+       test_cmp "$DATA/quoted-string.expect" quoted-string/info
 '
 
+test_expect_success 'mailinfo handles rfc2822 comment' '
+       mkdir comment &&
+       git mailinfo /dev/null /dev/null <"$DATA/comment.in" \
+               >comment/info &&
+       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_done
diff --git a/t/t5100/0001mboxrd b/t/t5100/0001mboxrd
new file mode 100644 (file)
index 0000000..494ec55
--- /dev/null
@@ -0,0 +1,4 @@
+From the beginning, mbox should have been mboxrd
+>From escaped
+From not mangled but this line should have been escaped
+
diff --git a/t/t5100/0002mboxrd b/t/t5100/0002mboxrd
new file mode 100644 (file)
index 0000000..71343d4
--- /dev/null
@@ -0,0 +1,5 @@
+ >From unchanged
+ From also unchanged
+no trailing space, no escaping necessary and '>' was intended:
+>From
+
diff --git a/t/t5100/comment.expect b/t/t5100/comment.expect
new file mode 100644 (file)
index 0000000..7228177
--- /dev/null
@@ -0,0 +1,5 @@
+Author: A U Thor (this is (really) a comment (honestly))
+Email: somebody@example.com
+Subject: testing comments
+Date: Sun, 25 May 2008 00:38:18 -0700
+
diff --git a/t/t5100/comment.in b/t/t5100/comment.in
new file mode 100644 (file)
index 0000000..c53a192
--- /dev/null
@@ -0,0 +1,9 @@
+From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
+From: "A U Thor" <somebody@example.com> (this is \(really\) a comment (honestly))
+Date: Sun, 25 May 2008 00:38:18 -0700
+Subject: [PATCH] testing comments
+
+
+
+---
+patch
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
diff --git a/t/t5100/quoted-string.expect b/t/t5100/quoted-string.expect
new file mode 100644 (file)
index 0000000..cab1bce
--- /dev/null
@@ -0,0 +1,5 @@
+Author: Author "The Author" Name
+Email: somebody@example.com
+Subject: testing quoted-pair
+Date: Sun, 25 May 2008 00:38:18 -0700
+
diff --git a/t/t5100/quoted-string.in b/t/t5100/quoted-string.in
new file mode 100644 (file)
index 0000000..e2e627a
--- /dev/null
@@ -0,0 +1,9 @@
+From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001
+From: "Author \"The Author\" Name" <somebody@example.com>
+Date: Sun, 25 May 2008 00:38:18 -0700
+Subject: [PATCH] testing quoted-pair
+
+
+
+---
+patch
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
diff --git a/t/t5100/sample.mboxrd b/t/t5100/sample.mboxrd
new file mode 100644 (file)
index 0000000..79ad5ae
--- /dev/null
@@ -0,0 +1,19 @@
+From mboxrd Mon Sep 17 00:00:00 2001
+From: mboxrd writer <mboxrd@example.com>
+Date: Fri, 9 Jun 2006 00:44:16 -0700
+Subject: [PATCH] a commit with escaped From lines
+
+>From the beginning, mbox should have been mboxrd
+>>From escaped
+From not mangled but this line should have been escaped
+
+From mboxrd Mon Sep 17 00:00:00 2001
+From: mboxrd writer <mboxrd@example.com>
+Date: Fri, 9 Jun 2006 00:44:16 -0700
+Subject: [PATCH 2/2] another with fake From lines
+
+ >From unchanged
+ From also unchanged
+no trailing space, no escaping necessary and '>' was intended:
+>From
+
index fc2be63e02d85682cd24457ee646c8c626ca967a..43a672c3451146f800852a6d8688c10e497b47cf 100755 (executable)
@@ -284,6 +284,12 @@ test_expect_success \
      git index-pack test-3.pack &&
      cmp test-3.idx test-3-${packname_3}.idx &&
 
+     cat test-1-${packname_1}.pack >test-4.pack &&
+     rm -f test-4.keep &&
+     git index-pack --keep=why test-4.pack &&
+     cmp test-1-${packname_1}.idx test-4.idx &&
+     test -f test-4.keep &&
+
      :'
 
 test_expect_success 'unpacking with --strict' '
@@ -400,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 f314ad50791142b42c5f2807b5f086bbe9e1caad..a5eca210b8963c4881fd8be858d13b88401b9888 100755 (executable)
@@ -25,58 +25,94 @@ test_expect_success setup '
        } >obj-list
 '
 
-rm -rf clone.git
 test_expect_success 'pack without --include-tag' '
-       packname_1=$(git pack-objects \
+       packname=$(git pack-objects \
                --window=0 \
-               test-1 <obj-list)
+               test-no-include <obj-list)
 '
 
 test_expect_success 'unpack objects' '
-       (
-               GIT_DIR=clone.git &&
-               export GIT_DIR &&
-               git init &&
-               git unpack-objects -n <test-1-${packname_1}.pack &&
-               git unpack-objects <test-1-${packname_1}.pack
-       )
+       rm -rf clone.git &&
+       git init clone.git &&
+       git -C clone.git unpack-objects <test-no-include-${packname}.pack
 '
 
 test_expect_success 'check unpacked result (have commit, no tag)' '
        git rev-list --objects $commit >list.expect &&
-       (
-               test_must_fail env GIT_DIR=clone.git git cat-file -e $tag &&
-               git rev-list --objects $commit
-       ) >list.actual &&
+       test_must_fail git -C clone.git cat-file -e $tag &&
+       git -C clone.git rev-list --objects $commit >list.actual &&
        test_cmp list.expect list.actual
 '
 
-rm -rf clone.git
 test_expect_success 'pack with --include-tag' '
-       packname_1=$(git pack-objects \
+       packname=$(git pack-objects \
                --window=0 \
                --include-tag \
-               test-2 <obj-list)
+               test-include <obj-list)
 '
 
 test_expect_success 'unpack objects' '
-       (
-               GIT_DIR=clone.git &&
-               export GIT_DIR &&
-               git init &&
-               git unpack-objects -n <test-2-${packname_1}.pack &&
-               git unpack-objects <test-2-${packname_1}.pack
-       )
+       rm -rf clone.git &&
+       git init clone.git &&
+       git -C clone.git unpack-objects <test-include-${packname}.pack
 '
 
 test_expect_success 'check unpacked result (have commit, have tag)' '
        git rev-list --objects mytag >list.expect &&
-       (
-               GIT_DIR=clone.git &&
-               export GIT_DIR &&
-               git rev-list --objects $tag
-       ) >list.actual &&
+       git -C clone.git rev-list --objects $tag >list.actual &&
        test_cmp list.expect list.actual
 '
 
+# A tag of a tag, where the "inner" tag is not otherwise
+# reachable, and a full peel points to a commit reachable from HEAD.
+test_expect_success 'create hidden inner tag' '
+       test_commit commit &&
+       git tag -m inner inner HEAD &&
+       git tag -m outer outer inner &&
+       git tag -d inner
+'
+
+test_expect_success 'pack explicit outer tag' '
+       packname=$(
+               {
+                       echo HEAD &&
+                       echo outer
+               } |
+               git pack-objects --revs test-hidden-explicit
+       )
+'
+
+test_expect_success 'unpack objects' '
+       rm -rf clone.git &&
+       git init clone.git &&
+       git -C clone.git unpack-objects <test-hidden-explicit-${packname}.pack
+'
+
+test_expect_success 'check unpacked result (have all objects)' '
+       git -C clone.git rev-list --objects $(git rev-parse outer HEAD)
+'
+
+test_expect_success 'pack implied outer tag' '
+       packname=$(
+               echo HEAD |
+               git pack-objects --revs --include-tag test-hidden-implied
+       )
+'
+
+test_expect_success 'unpack objects' '
+       rm -rf clone.git &&
+       git init clone.git &&
+       git -C clone.git unpack-objects <test-hidden-implied-${packname}.pack
+'
+
+test_expect_success 'check unpacked result (have all objects)' '
+       git -C clone.git rev-list --objects $(git rev-parse outer HEAD)
+'
+
+test_expect_success 'single-branch clone can transfer tag' '
+       rm -rf clone.git &&
+       git clone --no-local --single-branch -b master . clone.git &&
+       git -C clone.git fsck
+'
+
 test_done
index d446706e94fb878b471e6deaebba4ec7abc76930..b4c7a6ff6b72d5d06ce9fb13bbd74590ff459a0b 100755 (executable)
@@ -7,6 +7,18 @@ 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
                test_commit $i
@@ -16,6 +28,7 @@ test_expect_success 'setup repo with moderate-sized history' '
                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 &&
@@ -47,6 +60,12 @@ rev_list_tests() {
                test_cmp expect actual
        '
 
+       test_expect_success "counting commits with limit ($state)" '
+               git rev-list --count -n 1 HEAD >expect &&
+               git rev-list --use-bitmap-index --count -n 1 HEAD >actual &&
+               test_cmp expect actual
+       '
+
        test_expect_success "counting non-linear history ($state)" '
                git rev-list --count other...master >expect &&
                git rev-list --use-bitmap-index --count other...master >actual &&
@@ -112,6 +131,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 &&
@@ -137,6 +233,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
@@ -152,10 +262,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 &&
        (
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
index 04cea97f87784bfb9a9a04fdb7341478e64fd5b6..305ca7a9308685c7d040ac254fd34cebbbc86cc8 100755 (executable)
@@ -128,6 +128,18 @@ test_expect_success 'denyNonFastforwards trumps --force' '
        test "$victim_orig" = "$victim_head"
 '
 
+test_expect_success 'send-pack --all sends all branches' '
+       # make sure we have at least 2 branches with different
+       # values, just to be thorough
+       git branch other-branch HEAD^ &&
+
+       git init --bare all.git &&
+       git send-pack --all all.git &&
+       git for-each-ref refs/heads >expect &&
+       git -C all.git for-each-ref refs/heads >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'push --all excludes remote-tracking hierarchy' '
        mkdir parent &&
        (
index e5f83bf5e412bc3304009408a58663d7b94dac02..505e1b4a7f421d377aa3798e94c90c14249bce91 100755 (executable)
@@ -259,7 +259,8 @@ test_expect_success 'clone shallow object count' '
 test_expect_success 'pull in shallow repo with missing merge base' '
        (
                cd shallow &&
-               test_must_fail git pull --depth 4 .. A
+               git fetch --depth 4 .. A
+               test_must_fail git merge --allow-unrelated-histories FETCH_HEAD
        )
 '
 
@@ -279,9 +280,10 @@ test_expect_success 'clone shallow depth count' '
 test_expect_success 'clone shallow object count' '
        (
                cd shallow &&
+               git prune &&
                git count-objects -v
        ) > count.shallow &&
-       grep "^count: 55" count.shallow
+       grep "^count: 54" count.shallow
 '
 
 test_expect_success 'fetch --no-shallow on full repo' '
@@ -531,6 +533,20 @@ test_expect_success 'shallow fetch with tags does not break the repository' '
                git fsck
        )
 '
+
+test_expect_success 'fetch-pack can fetch a raw sha1' '
+       git init hidden &&
+       (
+               cd hidden &&
+               test_commit 1 &&
+               test_commit 2 &&
+               git update-ref refs/hidden/one HEAD^ &&
+               git config transfer.hiderefs refs/hidden &&
+               git config uploadpack.allowtipsha1inwant true
+       ) &&
+       git fetch-pack hidden $(git -C hidden rev-parse refs/hidden/one)
+'
+
 check_prot_path () {
        cat >expected <<-EOF &&
        Diag: url=$1
@@ -542,7 +558,6 @@ check_prot_path () {
 }
 
 check_prot_host_port_path () {
-       local diagport
        case "$2" in
                *ssh*)
                pp=ssh
@@ -637,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 a3e12d295afedb170b3a917ce9d23122c1a0bc1d..9b19cff729381b3a8f81f113a5407ac9f9d97cda 100755 (executable)
@@ -100,11 +100,8 @@ test_expect_success 'push with receive.fsckobjects' '
                git config receive.fsckobjects true &&
                git config transfer.fsckobjects false
        ) &&
-       test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act &&
-       {
-               test_cmp exp act ||
-               ! test -s act
-       }
+       test_must_fail git push --porcelain dst master:refs/heads/test >act &&
+       test_cmp exp act
 '
 
 test_expect_success 'push with transfer.fsckobjects' '
@@ -114,11 +111,12 @@ test_expect_success 'push with transfer.fsckobjects' '
                cd dst &&
                git config transfer.fsckobjects true
        ) &&
-       test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act
+       test_must_fail git push --porcelain dst master:refs/heads/test >act &&
+       test_cmp exp act
 '
 
-cat >bogus-commit <<\EOF
-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
+cat >bogus-commit <<EOF
+tree $EMPTY_TREE
 author Bugs Bunny 1234567890 +0000
 committer Bugs Bunny <bugs@bun.ni> 1234567890 +0000
 
index dd2e6ce34e7dff0e59e917fd4e3aefa01181778c..8198d8eb05c5366c7d61a12351c333902a2265b6 100755 (executable)
@@ -1182,7 +1182,7 @@ test_expect_success 'extra args: setup' '
 test_extra_arg () {
        test_expect_success "extra args: $*" "
                test_must_fail git remote $* bogus_extra_arg 2>actual &&
-               grep '^usage:' actual
+               test_i18ngrep '^usage:' actual
        "
 }
 
index 38321d19efbee0da62a9327f5849521093fbe077..668c54be41eb4fda17e9b43000081c7b374990c2 100755 (executable)
@@ -644,7 +644,7 @@ test_expect_success 'fetch --prune prints the remotes url' '
                git fetch --prune origin 2>&1 | head -n1 >../actual
        ) &&
        echo "From ${D}/." >expect &&
-       test_cmp expect actual
+       test_i18ncmp expect actual
 '
 
 test_expect_success 'branchname D/F conflict resolved by --prune' '
@@ -682,9 +682,40 @@ test_expect_success 'fetching with auto-gc does not lock up' '
        (
                cd auto-gc &&
                git config gc.autoPackLimit 1 &&
+               git config gc.autoDetach false &&
                GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
                ! grep "Should I try again" fetch.out
        )
 '
 
+test_expect_success C_LOCALE_OUTPUT 'fetch aligned output' '
+       git clone . full-output &&
+       test_commit looooooooooooong-tag &&
+       (
+               cd full-output &&
+               git -c fetch.output=full fetch origin 2>&1 | \
+                       grep -e "->" | cut -c 22- >../actual
+       ) &&
+       cat >expect <<-\EOF &&
+       master               -> origin/master
+       looooooooooooong-tag -> looooooooooooong-tag
+       EOF
+       test_cmp expect actual
+'
+
+test_expect_success C_LOCALE_OUTPUT 'fetch compact output' '
+       git clone . compact &&
+       test_commit extraaa &&
+       (
+               cd compact &&
+               git -c fetch.output=compact fetch origin 2>&1 | \
+                       grep -e "->" | cut -c 22- >../actual
+       ) &&
+       cat >expect <<-\EOF &&
+       master     -> origin/*
+       extraaa    -> *
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 819b9ddd0f917a21e3edf7122f99cfb04f4b7a8f..55fc83fc0624fa9bf1a024c4bc4aede25999fae0 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,45 @@ 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_done
index c952d5ef5c4e4d4f3be8759f7aa326a70c36c421..17f4d0fe4e7244cb58eaedcf41bcaa9c7b157bb4 100755 (executable)
@@ -9,6 +9,24 @@ modify () {
        mv "$2.x" "$2"
 }
 
+test_pull_autostash () {
+       git reset --hard before-rebase &&
+       echo dirty >new_file &&
+       git add new_file &&
+       git pull "$@" . copy &&
+       test_cmp_rev HEAD^ copy &&
+       test "$(cat new_file)" = dirty &&
+       test "$(cat file)" = "modified again"
+}
+
+test_pull_autostash_fail () {
+       git reset --hard before-rebase &&
+       echo dirty >new_file &&
+       git add new_file &&
+       test_must_fail git pull "$@" . copy 2>err &&
+       test_i18ngrep "uncommitted changes." err
+}
+
 test_expect_success setup '
        echo file >file &&
        git add file &&
@@ -193,7 +211,7 @@ test_expect_success 'fail if the index has unresolved entries' '
        test -n "$(git ls-files -u)" &&
        cp file expected &&
        test_must_fail git pull . second 2>err &&
-       test_i18ngrep "Pull is not possible because you have unmerged files" err &&
+       test_i18ngrep "Pulling is not possible because you have unmerged files." err &&
        test_cmp expected file &&
        git add file &&
        test -z "$(git ls-files -u)" &&
@@ -237,6 +255,55 @@ 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 with conflicts shows advice' '
+       test_when_finished "git rebase --abort; git checkout -f to-rebase" &&
+       git checkout -b seq &&
+       test_seq 5 >seq.txt &&
+       git add seq.txt &&
+       test_tick &&
+       git commit -m "Add seq.txt" &&
+       echo 6 >>seq.txt &&
+       test_tick &&
+       git commit -m "Append to seq.txt" seq.txt &&
+       git checkout -b with-conflicts HEAD^ &&
+       echo conflicting >>seq.txt &&
+       test_tick &&
+       git commit -m "Create conflict" seq.txt &&
+       test_must_fail git pull --rebase . seq 2>err >out &&
+       test_i18ngrep "When you have resolved this problem" out
+'
+
+test_expect_success 'failed --rebase shows advice' '
+       test_when_finished "git rebase --abort; git checkout -f to-rebase" &&
+       git checkout -b diverging &&
+       test_commit attributes .gitattributes "* text=auto" attrs &&
+       sha1="$(printf "1\\r\\n" | git hash-object -w --stdin)" &&
+       git update-index --cacheinfo 0644 $sha1 file &&
+       git commit -m v1-with-cr &&
+       # force checkout because `git reset --hard` will not leave clean `file`
+       git checkout -f -b fails-to-rebase HEAD^ &&
+       test_commit v2-without-cr file "2" file2-lf &&
+       test_must_fail git pull --rebase . diverging 2>err >out &&
+       test_i18ngrep "When you have resolved this problem" out
+'
+
 test_expect_success '--rebase fails with multiple branches' '
        git reset --hard before-rebase &&
        test_must_fail git pull --rebase . copy master 2>err &&
@@ -247,15 +314,47 @@ test_expect_success '--rebase fails with multiple branches' '
 
 test_expect_success 'pull --rebase succeeds with dirty working directory and rebase.autostash set' '
        test_config rebase.autostash true &&
-       git reset --hard before-rebase &&
-       echo dirty >new_file &&
-       git add new_file &&
-       git pull --rebase . copy &&
-       test_cmp_rev HEAD^ copy &&
-       test "$(cat new_file)" = dirty &&
-       test "$(cat file)" = "modified again"
+       test_pull_autostash --rebase
+'
+
+test_expect_success 'pull --rebase --autostash & rebase.autostash=true' '
+       test_config rebase.autostash true &&
+       test_pull_autostash --rebase --autostash
+'
+
+test_expect_success 'pull --rebase --autostash & rebase.autostash=false' '
+       test_config rebase.autostash false &&
+       test_pull_autostash --rebase --autostash
+'
+
+test_expect_success 'pull --rebase --autostash & rebase.autostash unset' '
+       test_unconfig rebase.autostash &&
+       test_pull_autostash --rebase --autostash
+'
+
+test_expect_success 'pull --rebase --no-autostash & rebase.autostash=true' '
+       test_config rebase.autostash true &&
+       test_pull_autostash_fail --rebase --no-autostash
+'
+
+test_expect_success 'pull --rebase --no-autostash & rebase.autostash=false' '
+       test_config rebase.autostash false &&
+       test_pull_autostash_fail --rebase --no-autostash
+'
+
+test_expect_success 'pull --rebase --no-autostash & rebase.autostash unset' '
+       test_unconfig rebase.autostash &&
+       test_pull_autostash_fail --rebase --no-autostash
 '
 
+for i in --autostash --no-autostash
+do
+       test_expect_success "pull $i (without --rebase) is illegal" '
+               test_must_fail git pull $i . copy 2>err &&
+               test_i18ngrep "only valid with --rebase" err
+       '
+done
+
 test_expect_success 'pull.rebase' '
        git reset --hard before-rebase &&
        test_config pull.rebase true &&
@@ -264,6 +363,16 @@ test_expect_success 'pull.rebase' '
        test new = "$(git show HEAD:file2)"
 '
 
+test_expect_success 'pull --autostash & pull.rebase=true' '
+       test_config pull.rebase true &&
+       test_pull_autostash --autostash
+'
+
+test_expect_success 'pull --no-autostash & pull.rebase=true' '
+       test_config pull.rebase true &&
+       test_pull_autostash_fail --no-autostash
+'
+
 test_expect_success 'branch.to-rebase.rebase' '
        git reset --hard before-rebase &&
        test_config branch.to-rebase.rebase true &&
@@ -281,6 +390,22 @@ test_expect_success 'branch.to-rebase.rebase should override pull.rebase' '
        test new = "$(git show HEAD:file2)"
 '
 
+test_expect_success "pull --rebase warns on --verify-signatures" '
+       git reset --hard before-rebase &&
+       git pull --rebase --verify-signatures . copy 2>err &&
+       test "$(git rev-parse HEAD^)" = "$(git rev-parse copy)" &&
+       test new = "$(git show HEAD:file2)" &&
+       test_i18ngrep "ignoring --verify-signatures for rebase" err
+'
+
+test_expect_success "pull --rebase does not warn on --no-verify-signatures" '
+       git reset --hard before-rebase &&
+       git pull --rebase --no-verify-signatures . copy 2>err &&
+       test "$(git rev-parse HEAD^)" = "$(git rev-parse copy)" &&
+       test new = "$(git show HEAD:file2)" &&
+       test_i18ngrep ! "verify-signatures" err
+'
+
 # add a feature branch, keep-merge, that is merged into master, so the
 # test can try preserving the merge commit (or not) with various
 # --rebase flags/pull.rebase settings.
index 18372caa151a30ac0ec1f247e793164fe667358a..ded8f98dbed9764744799f7b4bed0c51fc57a158 100755 (executable)
@@ -144,4 +144,25 @@ test_expect_success 'git pull --all --dry-run' '
        )
 '
 
+test_expect_success 'git pull --allow-unrelated-histories' '
+       test_when_finished "rm -fr src dst" &&
+       git init src &&
+       (
+               cd src &&
+               test_commit one &&
+               test_commit two
+       ) &&
+       git clone src dst &&
+       (
+               cd src &&
+               git checkout --orphan side HEAD^ &&
+               test_commit three
+       ) &&
+       (
+               cd dst &&
+               test_must_fail git pull ../src side &&
+               git pull --allow-unrelated-histories ../src side
+       )
+'
+
 test_done
index 3683df13a6ae2208212bd3606187f9876e0562b5..d6981ba304b0b1f2da22d8ec14d4b472b54f3415 100755 (executable)
@@ -75,7 +75,7 @@ test_expect_success TTY 'progress messages go to tty' '
        ensure_fresh_upstream &&
 
        test_terminal git push -u upstream master >out 2>err &&
-       grep "Writing objects" err
+       test_i18ngrep "Writing objects" err
 '
 
 test_expect_success 'progress messages do not go to non-tty' '
@@ -83,7 +83,7 @@ test_expect_success 'progress messages do not go to non-tty' '
 
        # skip progress messages, since stderr is non-tty
        git push -u upstream master >out 2>err &&
-       ! grep "Writing objects" err
+       test_i18ngrep ! "Writing objects" err
 '
 
 test_expect_success 'progress messages go to non-tty (forced)' '
@@ -91,22 +91,22 @@ test_expect_success 'progress messages go to non-tty (forced)' '
 
        # force progress messages to stderr, even though it is non-tty
        git push -u --progress upstream master >out 2>err &&
-       grep "Writing objects" err
+       test_i18ngrep "Writing objects" err
 '
 
 test_expect_success TTY 'push -q suppresses progress' '
        ensure_fresh_upstream &&
 
        test_terminal git push -u -q upstream master >out 2>err &&
-       ! grep "Writing objects" err
+       test_i18ngrep ! "Writing objects" err
 '
 
 test_expect_success TTY 'push --no-progress suppresses progress' '
        ensure_fresh_upstream &&
 
        test_terminal git push -u --no-progress upstream master >out 2>err &&
-       ! grep "Unpacking objects" err &&
-       ! grep "Writing objects" err
+       test_i18ngrep ! "Unpacking objects" err &&
+       test_i18ngrep ! "Writing objects" err
 '
 
 test_expect_success TTY 'quiet push' '
index 1241146227aead97022ade343152347bc911444c..f3b0a8d30afcb472398bef8623a49ba6bac7dc24 100755 (executable)
@@ -471,4 +471,53 @@ test_expect_success "don't fetch submodule when newly recorded commits are alrea
        test_i18ncmp expect.err actual.err
 '
 
+test_expect_success 'fetching submodules respects parallel settings' '
+       git config fetch.recurseSubmodules true &&
+       (
+               cd downstream &&
+               GIT_TRACE=$(pwd)/trace.out git fetch --jobs 7 &&
+               grep "7 tasks" trace.out &&
+               git config submodule.fetchJobs 8 &&
+               GIT_TRACE=$(pwd)/trace.out git fetch &&
+               grep "8 tasks" trace.out &&
+               GIT_TRACE=$(pwd)/trace.out git fetch --jobs 9 &&
+               grep "9 tasks" trace.out
+       )
+'
+
+test_expect_success 'fetching submodule into a broken repository' '
+       # Prepare src and src/sub nested in it
+       git init src &&
+       (
+               cd src &&
+               git init sub &&
+               git -C sub commit --allow-empty -m "initial in sub" &&
+               git submodule add -- ./sub sub &&
+               git commit -m "initial in top"
+       ) &&
+
+       # Clone the old-fashoned way
+       git clone src dst &&
+       git -C dst clone ../src/sub sub &&
+
+       # Make sure that old-fashoned layout is still supported
+       git -C dst status &&
+
+       # "diff" would find no change
+       git -C dst diff --exit-code &&
+
+       # Recursive-fetch works fine
+       git -C dst fetch --recurse-submodules &&
+
+       # Break the receiving submodule
+       rm -f dst/sub/.git/HEAD &&
+
+       # NOTE: without the fix the following tests will recurse forever!
+       # They should terminate with an error.
+
+       test_must_fail git -C dst status &&
+       test_must_fail git -C dst diff &&
+       test_must_fail git -C dst fetch --recurse-submodules
+'
+
 test_done
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..1524ff5ba692d9c962ec51ef0c7948aca6ddf240 100755 (executable)
@@ -427,7 +427,31 @@ 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_done
index d75ef0ea2b6eb5596ee97b92529d9800411f543c..51c9669398a01bab0b59174ec6ec1be92c3f21fe 100755 (executable)
@@ -12,10 +12,8 @@ test_expect_success 'setup remote repo' '
        )
 '
 
-cat >proxy <<'EOF'
-#!/bin/sh
-echo >&2 "proxying for $*"
-cmd=$("$PERL_PATH" -e '
+test_expect_success 'setup proxy script' '
+       write_script proxy-get-cmd "$PERL_PATH" <<-\EOF &&
        read(STDIN, $buf, 4);
        my $n = hex($buf) - 4;
        read(STDIN, $buf, $n);
@@ -23,11 +21,16 @@ cmd=$("$PERL_PATH" -e '
        # drop absolute-path on repo name
        $cmd =~ s{ /}{ };
        print $cmd;
-')
-echo >&2 "Running '$cmd'"
-exec $cmd
-EOF
-chmod +x proxy
+       EOF
+
+       write_script proxy <<-\EOF
+       echo >&2 "proxying for $*"
+       cmd=$(./proxy-get-cmd)
+       echo >&2 "Running $cmd"
+       exec $cmd
+       EOF
+'
+
 test_expect_success 'setup local repo' '
        git remote add fake git://example.com/remote &&
        git config core.gitproxy ./proxy
index c7320121ecfa74dce8389d3790364501c8bb12b8..a2c9e7439f362d8f247c369ba515a55b26dee8ec 100755 (executable)
@@ -191,4 +191,42 @@ test_expect_success 'cover everything with default force-with-lease (allowed)' '
        test_cmp expect actual
 '
 
+test_expect_success 'new branch covered by force-with-lease' '
+       setup_srcdst_basic &&
+       (
+               cd dst &&
+               git branch branch master &&
+               git push --force-with-lease=branch origin branch
+       ) &&
+       git ls-remote dst refs/heads/branch >expect &&
+       git ls-remote src refs/heads/branch >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'new branch covered by force-with-lease (explicit)' '
+       setup_srcdst_basic &&
+       (
+               cd dst &&
+               git branch branch master &&
+               git push --force-with-lease=branch: origin branch
+       ) &&
+       git ls-remote dst refs/heads/branch >expect &&
+       git ls-remote src refs/heads/branch >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'new branch already exists' '
+       setup_srcdst_basic &&
+       (
+               cd src &&
+               git checkout -b branch master &&
+               test_commit F
+       ) &&
+       (
+               cd dst &&
+               git branch branch master &&
+               test_must_fail git push --force-with-lease=branch: origin branch
+       )
+'
+
 test_done
index 6c5d3a4ce0877b11bc7db530522447a65098979d..2e42cf331648a8ba57b3806443e70b94b09eb382 100755 (executable)
@@ -22,8 +22,8 @@ verify_stderr () {
        cat >expected &&
        # We're not interested in the error
        # "fatal: The remote end hung up unexpectedly":
-       grep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort &&
-       test_cmp expected actual
+       test_i18ngrep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort &&
+       test_i18ncmp expected actual
 }
 
 test_expect_success 'setup' '
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 fd7d06b9a23664d0e20cc32a03955ff8816cac7f..d38bf32470c592f89cbd31aa08a3c1de6fffe540 100755 (executable)
@@ -74,7 +74,7 @@ test_expect_success 'push to remote repository (standard)' '
        test_tick &&
        git commit -m path2 &&
        HEAD=$(git rev-parse --verify HEAD) &&
-       GIT_CURL_VERBOSE=1 git push -v -v 2>err &&
+       GIT_TRACE_CURL=true git push -v -v 2>err &&
        ! grep "Expect: 100-continue" err &&
        grep "POST git-receive-pack ([0-9]* bytes)" err &&
        (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&
@@ -119,7 +119,7 @@ test_expect_success 'rejected update prints status' '
        git commit -m dev2 &&
        test_must_fail git push origin dev2 2>act &&
        sed -e "/^remote: /s/ *$//" <act >cmp &&
-       test_cmp exp cmp
+       test_i18ncmp exp cmp
 '
 rm -f "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git/hooks/update"
 
@@ -219,7 +219,7 @@ test_expect_success TTY 'push shows progress when stderr is a tty' '
        cd "$ROOT_PATH"/test_repo_clone &&
        test_commit noisy &&
        test_terminal git push >output 2>&1 &&
-       grep "^Writing objects" output
+       test_i18ngrep "^Writing objects" output
 '
 
 test_expect_success TTY 'push --quiet silences status and progress' '
@@ -233,16 +233,16 @@ test_expect_success TTY 'push --no-progress silences progress but not status' '
        cd "$ROOT_PATH"/test_repo_clone &&
        test_commit no-progress &&
        test_terminal git push --no-progress >output 2>&1 &&
-       grep "^To http" output &&
-       ! grep "^Writing objects"
+       test_i18ngrep "^To http" output &&
+       test_i18ngrep ! "^Writing objects"
 '
 
 test_expect_success 'push --progress shows progress to non-tty' '
        cd "$ROOT_PATH"/test_repo_clone &&
        test_commit progress &&
        git push --progress >output 2>&1 &&
-       grep "^To http" output &&
-       grep "^Writing objects" output
+       test_i18ngrep "^To http" output &&
+       test_i18ngrep "^Writing objects" output
 '
 
 test_expect_success 'http push gives sane defaults to reflog' '
@@ -368,5 +368,14 @@ test_expect_success GPG 'push with post-receive to inspect certificate' '
        test_cmp expect "$HTTPD_DOCUMENT_ROOT_PATH/push-cert-status"
 '
 
+test_expect_success 'push status output scrubs password' '
+       cd "$ROOT_PATH/test_repo_clone" &&
+       git push --porcelain \
+               "$HTTPD_URL_USER_PASS/smart/test_repo.git" \
+               +HEAD:scrub >status &&
+       # should have been scrubbed down to vanilla URL
+       grep "^To $HTTPD_URL/smart/test_repo.git" status
+'
+
 stop_httpd
 test_done
diff --git a/t/t5544-pack-objects-hook.sh b/t/t5544-pack-objects-hook.sh
new file mode 100755 (executable)
index 0000000..4357af1
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+test_description='test custom script in place of pack-objects'
+. ./test-lib.sh
+
+test_expect_success 'create some history to fetch' '
+       test_commit one &&
+       test_commit two
+'
+
+test_expect_success 'create debugging hook script' '
+       write_script .git/hook <<-\EOF
+               echo >&2 "hook running"
+               echo "$*" >hook.args
+               cat >hook.stdin
+               "$@" <hook.stdin >hook.stdout
+               cat hook.stdout
+       EOF
+'
+
+clear_hook_results () {
+       rm -rf .git/hook.* dst.git
+}
+
+test_expect_success 'hook runs via global config' '
+       clear_hook_results &&
+       test_config_global uploadpack.packObjectsHook ./hook &&
+       git clone --no-local . dst.git 2>stderr &&
+       grep "hook running" stderr
+'
+
+test_expect_success 'hook outputs are sane' '
+       # check that we recorded a usable pack
+       git index-pack --stdin <.git/hook.stdout &&
+
+       # check that we recorded args and stdin. We do not check
+       # the full argument list or the exact pack contents, as it would make
+       # the test brittle. So just sanity check that we could replay
+       # the packing procedure.
+       grep "^git" .git/hook.args &&
+       $(cat .git/hook.args) <.git/hook.stdin >replay
+'
+
+test_expect_success 'hook runs from -c config' '
+       clear_hook_results &&
+       git clone --no-local \
+         -u "git -c uploadpack.packObjectsHook=./hook upload-pack" \
+         . dst.git 2>stderr &&
+       grep "hook running" stderr
+'
+
+test_expect_success 'hook does not run from repo config' '
+       clear_hook_results &&
+       test_config uploadpack.packObjectsHook "./hook" &&
+       git clone --no-local . dst.git 2>stderr &&
+       ! grep "hook running" stderr &&
+       test_path_is_missing .git/hook.args &&
+       test_path_is_missing .git/hook.stdin &&
+       test_path_is_missing .git/hook.stdout
+'
+
+test_done
diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh
new file mode 100755 (executable)
index 0000000..ea813b9
--- /dev/null
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+test_description='pushing to a repository using push options'
+
+. ./test-lib.sh
+
+mk_repo_pair () {
+       rm -rf workbench upstream &&
+       test_create_repo upstream &&
+       test_create_repo workbench &&
+       (
+               cd upstream &&
+               git config receive.denyCurrentBranch warn &&
+               mkdir -p .git/hooks &&
+               cat >.git/hooks/pre-receive <<-'EOF' &&
+               #!/bin/sh
+               if test -n "$GIT_PUSH_OPTION_COUNT"; then
+                       i=0
+                       >hooks/pre-receive.push_options
+                       while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do
+                               eval "value=\$GIT_PUSH_OPTION_$i"
+                               echo $value >>hooks/pre-receive.push_options
+                               i=$((i + 1))
+                       done
+               fi
+               EOF
+               chmod u+x .git/hooks/pre-receive
+
+               cat >.git/hooks/post-receive <<-'EOF' &&
+               #!/bin/sh
+               if test -n "$GIT_PUSH_OPTION_COUNT"; then
+                       i=0
+                       >hooks/post-receive.push_options
+                       while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do
+                               eval "value=\$GIT_PUSH_OPTION_$i"
+                               echo $value >>hooks/post-receive.push_options
+                               i=$((i + 1))
+                       done
+               fi
+               EOF
+               chmod u+x .git/hooks/post-receive
+       ) &&
+       (
+               cd workbench &&
+               git remote add up ../upstream
+       )
+}
+
+# Compare the ref ($1) in upstream with a ref value from workbench ($2)
+# i.e. test_refs second HEAD@{2}
+test_refs () {
+       test $# = 2 &&
+       git -C upstream rev-parse --verify "$1" >expect &&
+       git -C workbench rev-parse --verify "$2" >actual &&
+       test_cmp expect actual
+}
+
+test_expect_success 'one push option works for a single branch' '
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions true &&
+       (
+               cd workbench &&
+               test_commit one &&
+               git push --mirror up &&
+               test_commit two &&
+               git push --push-option=asdf up master
+       ) &&
+       test_refs master master &&
+       echo "asdf" >expect &&
+       test_cmp expect upstream/.git/hooks/pre-receive.push_options &&
+       test_cmp expect upstream/.git/hooks/post-receive.push_options
+'
+
+test_expect_success 'push option denied by remote' '
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions false &&
+       (
+               cd workbench &&
+               test_commit one &&
+               git push --mirror up &&
+               test_commit two &&
+               test_must_fail git push --push-option=asdf up master
+       ) &&
+       test_refs master HEAD@{1}
+'
+
+test_expect_success 'two push options work' '
+       mk_repo_pair &&
+       git -C upstream config receive.advertisePushOptions true &&
+       (
+               cd workbench &&
+               test_commit one &&
+               git push --mirror up &&
+               test_commit two &&
+               git push --push-option=asdf --push-option="more structured text" up master
+       ) &&
+       test_refs master master &&
+       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_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..af9fcd8
--- /dev/null
@@ -0,0 +1,61 @@
+#!/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_done
index 64146352ae20e9a5abdcda77be514d0f3264c3b8..264a1ab8b0ea794ce398d9d5c3a40adb31bd0ff9 100755 (executable)
@@ -91,6 +91,55 @@ test_expect_success 'configured username does not override URL' '
        expect_askpass pass user@host
 '
 
+test_expect_success 'set up repo with http submodules' '
+       git init super &&
+       set_askpass user@host pass@host &&
+       (
+               cd super &&
+               git submodule add "$HTTPD_URL/auth/dumb/repo.git" sub &&
+               git commit -m "add submodule"
+       )
+'
+
+test_expect_success 'cmdline credential config passes to submodule via clone' '
+       set_askpass wrong pass@host &&
+       test_must_fail git clone --recursive super super-clone &&
+       rm -rf super-clone &&
+
+       set_askpass wrong pass@host &&
+       git -c "credential.$HTTPD_URL.username=user@host" \
+               clone --recursive super super-clone &&
+       expect_askpass pass user@host
+'
+
+test_expect_success 'cmdline credential config passes submodule via fetch' '
+       set_askpass wrong pass@host &&
+       test_must_fail git -C super-clone fetch --recurse-submodules &&
+
+       set_askpass wrong pass@host &&
+       git -C super-clone \
+           -c "credential.$HTTPD_URL.username=user@host" \
+           fetch --recurse-submodules &&
+       expect_askpass pass user@host
+'
+
+test_expect_success 'cmdline credential config passes submodule update' '
+       # advance the submodule HEAD so that a fetch is required
+       git commit --allow-empty -m foo &&
+       git push "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/repo.git" HEAD &&
+       sha1=$(git rev-parse HEAD) &&
+       git -C super-clone update-index --cacheinfo 160000,$sha1,sub &&
+
+       set_askpass wrong pass@host &&
+       test_must_fail git -C super-clone submodule update &&
+
+       set_askpass wrong pass@host &&
+       git -C super-clone \
+           -c "credential.$HTTPD_URL.username=user@host" \
+           submodule update &&
+       expect_askpass pass user@host
+'
+
 test_expect_success 'fetch changes via http' '
        echo content >>file &&
        git commit -a -m two &&
@@ -214,15 +263,15 @@ check_language () {
                >expect
                ;;
        ?*)
-               echo "Accept-Language: $1" >expect
+               echo "=> Send header: Accept-Language: $1" >expect
                ;;
        esac &&
-       GIT_CURL_VERBOSE=1 \
+       GIT_TRACE_CURL=true \
        LANGUAGE=$2 \
        git ls-remote "$HTTPD_URL/dumb/repo.git" >output 2>&1 &&
        tr -d '\015' <output |
        sort -u |
-       sed -ne '/^Accept-Language:/ p' >actual &&
+       sed -ne '/^=> Send header: Accept-Language:/ p' >actual &&
        test_cmp expect actual
 }
 
@@ -246,8 +295,77 @@ ja;q=0.95, zh;q=0.94, sv;q=0.93, pt;q=0.92, nb;q=0.91, *;q=0.90" \
 '
 
 test_expect_success 'git client does not send an empty Accept-Language' '
-       GIT_CURL_VERBOSE=1 LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr &&
-       ! grep "^Accept-Language:" stderr
+       GIT_TRACE_CURL=true LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr &&
+       ! grep "^=> Send header: Accept-Language:" stderr
+'
+
+test_expect_success 'remote-http complains cleanly about malformed urls' '
+       # do not actually issue "list" or other commands, as we do not
+       # want to rely on what curl would actually do with such a broken
+       # URL. This is just about making sure we do not segfault during
+       # initialization.
+       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
 '
 
 stop_httpd
index 58207d88250f57d448f4e83baf2add3192cb9455..a51b7e20d32158d4b6609ba954e2ed59edaa6342 100755 (executable)
@@ -43,12 +43,21 @@ cat >exp <<EOF
 < Content-Type: application/x-git-upload-pack-result
 EOF
 test_expect_success 'clone http repository' '
-       GIT_CURL_VERBOSE=1 git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err &&
+       GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err &&
        test_cmp file clone/file &&
        tr '\''\015'\'' Q <err |
        sed -e "
                s/Q\$//
                /^[*] /d
+               /^== Info:/d
+               /^=> Send header, /d
+               /^=> Send header:$/d
+               /^<= Recv header, /d
+               /^<= Recv header:$/d
+               s/=> Send header: //
+               s/= Recv header://
+               /^<= Recv data/d
+               /^=> Send data/d
                /^$/d
                /^< $/d
 
@@ -110,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 &&
@@ -261,12 +274,64 @@ test_expect_success CMDLINE_LIMIT \
 '
 
 test_expect_success 'large fetch-pack requests can be split across POSTs' '
-       GIT_CURL_VERBOSE=1 git -c http.postbuffer=65536 \
+       GIT_TRACE_CURL=true git -c http.postbuffer=65536 \
                clone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err &&
-       grep "^> POST" err >posts &&
+       grep "^=> Send header: POST" err >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" &&
@@ -282,5 +347,22 @@ test_expect_success EXPENSIVE 'http can handle enormous ref negotiation' '
        test_line_count = 100000 tags
 '
 
+test_expect_success 'custom http headers' '
+       test_must_fail git -c http.extraheader="x-magic-two: cadabra" \
+               fetch "$HTTPD_URL/smart_headers/repo.git" &&
+       git -c http.extraheader="x-magic-one: abra" \
+           -c http.extraheader="x-magic-two: cadabra" \
+           fetch "$HTTPD_URL/smart_headers/repo.git" &&
+       git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
+       git config -f .gitmodules submodule.sub.path sub &&
+       git config -f .gitmodules submodule.sub.url \
+               "$HTTPD_URL/smart_headers/repo.git" &&
+       git submodule init sub &&
+       test_must_fail git submodule update sub &&
+       git -c http.extraheader="x-magic-one: abra" \
+           -c http.extraheader="x-magic-two: cadabra" \
+               submodule update sub
+'
+
 stop_httpd
 test_done
index c1efb8e445402cccdddda987e1eafad4d4bb75f9..a43339420019718b76963d5ced92ebb981b0f0ed 100755 (executable)
@@ -308,7 +308,7 @@ test_expect_success 'clone checking out a tag' '
 
 setup_ssh_wrapper () {
        test_expect_success 'setup ssh wrapper' '
-               cp "$GIT_BUILD_DIR/test-fake-ssh$X" \
+               cp "$GIT_BUILD_DIR/t/helper/test-fake-ssh$X" \
                        "$TRASH_DIRECTORY/ssh-wrapper$X" &&
                GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper$X" &&
                export GIT_SSH &&
@@ -466,7 +466,7 @@ test_expect_success 'clone ssh://host.xz:22/~repo' '
 #IPv6
 for tuah in ::1 [::1] [::1]: user@::1 user@[::1] user@[::1]: [user@::1] [user@::1]:
 do
-       ehost=$(echo $tuah | sed -e "s/1]:/1]/ "| tr -d "[]")
+       ehost=$(echo $tuah | sed -e "s/1]:/1]/| tr -d "[]")
        test_expect_success "clone ssh://$tuah/home/user/repo" "
          test_clone_url ssh://$tuah/home/user/repo $ehost /home/user/repo
        "
similarity index 100%
rename from t/t5704-bundle.sh
rename to t/t5607-clone-bundle.sh
similarity index 100%
rename from t/t5705-clone-2gb.sh
rename to t/t5608-clone-2gb.sh
similarity index 63%
rename from t/t5708-clone-config.sh
rename to t/t5611-clone-config.sh
index 27d730c0a7209480c5349e4ace65f92c9e75c699..e4850b778c2f20df02ce187cc8cd057df2759d7d 100755 (executable)
@@ -37,4 +37,24 @@ test_expect_success 'clone -c config is available during clone' '
        test_cmp expect child/file
 '
 
+# Tests for the hidden file attribute on windows
+is_hidden () {
+       # Use the output of `attrib`, ignore the absolute path
+       case "$(attrib "$1")" in *H*?:*) return 0;; esac
+       return 1
+}
+
+test_expect_success MINGW 'clone -c core.hideDotFiles' '
+       test_commit attributes .gitattributes "" &&
+       rm -rf child &&
+       git clone -c core.hideDotFiles=false . child &&
+       ! is_hidden child/.gitattributes &&
+       rm -rf child &&
+       git clone -c core.hideDotFiles=dotGitOnly . child &&
+       ! is_hidden child/.gitattributes &&
+       rm -rf child &&
+       git clone -c core.hideDotFiles=true . child &&
+       is_hidden child/.gitattributes
+'
+
 test_done
diff --git a/t/t5613-info-alternate.sh b/t/t5613-info-alternate.sh
new file mode 100755 (executable)
index 0000000..895f46b
--- /dev/null
@@ -0,0 +1,139 @@
+#!/bin/sh
+#
+# Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
+#
+
+test_description='test transitive info/alternate entries'
+. ./test-lib.sh
+
+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 '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
+       )
+'
+
+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 '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
+'
+
+# 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 'validity of seventh repository' '
+       git -C G fsck
+'
+
+test_expect_success 'invalidity of eighth repository' '
+       test_must_fail git -C H fsck
+'
+
+test_expect_success 'breaking of loops' '
+       echo "$(pwd)"/B/.git/objects >>A/.git/objects/info/alternates &&
+       git -C C fsck
+'
+
+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' '
+       echo "../../../B/.git/objects" >C/.git/objects/info/alternates &&
+       git fsck
+'
+
+test_expect_success 'that relative alternate is recursive' '
+       git -C D fsck
+'
+
+# 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
+'
+
+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/t5614-clone-submodules.sh b/t/t5614-clone-submodules.sh
new file mode 100755 (executable)
index 0000000..a87d329
--- /dev/null
@@ -0,0 +1,122 @@
+#!/bin/sh
+
+test_description='Test shallow cloning of repos with submodules'
+
+. ./test-lib.sh
+
+pwd=$(pwd)
+
+test_expect_success 'setup' '
+       git checkout -b master &&
+       test_commit commit1 &&
+       test_commit commit2 &&
+       mkdir sub &&
+       (
+               cd sub &&
+               git init &&
+               test_commit subcommit1 &&
+               test_commit subcommit2 &&
+               test_commit subcommit3
+       ) &&
+       git submodule add "file://$pwd/sub" sub &&
+       git commit -m "add submodule"
+'
+
+test_expect_success 'nonshallow clone implies nonshallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules "file://$pwd/." super_clone &&
+       git -C super_clone log --oneline >lines &&
+       test_line_count = 3 lines &&
+       git -C super_clone/sub log --oneline >lines &&
+       test_line_count = 3 lines
+'
+
+test_expect_success 'shallow clone with shallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules --depth 2 --shallow-submodules "file://$pwd/." super_clone &&
+       git -C super_clone log --oneline >lines &&
+       test_line_count = 2 lines &&
+       git -C super_clone/sub log --oneline >lines &&
+       test_line_count = 1 lines
+'
+
+test_expect_success 'shallow clone does not imply shallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules --depth 2 "file://$pwd/." super_clone &&
+       git -C super_clone log --oneline >lines &&
+       test_line_count = 2 lines &&
+       git -C super_clone/sub log --oneline >lines &&
+       test_line_count = 3 lines
+'
+
+test_expect_success 'shallow clone with non shallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules --depth 2 --no-shallow-submodules "file://$pwd/." super_clone &&
+       git -C super_clone log --oneline >lines &&
+       test_line_count = 2 lines &&
+       git -C super_clone/sub log --oneline >lines &&
+       test_line_count = 3 lines
+'
+
+test_expect_success 'non shallow clone with shallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules --no-local --shallow-submodules "file://$pwd/." super_clone &&
+       git -C super_clone log --oneline >lines &&
+       test_line_count = 3 lines &&
+       git -C super_clone/sub log --oneline >lines &&
+       test_line_count = 1 lines
+'
+
+test_expect_success 'clone follows shallow recommendation' '
+       test_when_finished "rm -rf super_clone" &&
+       git config -f .gitmodules submodule.sub.shallow true &&
+       git add .gitmodules &&
+       git commit -m "recommed shallow for sub" &&
+       git clone --recurse-submodules --no-local "file://$pwd/." super_clone &&
+       (
+               cd super_clone &&
+               git log --oneline >lines &&
+               test_line_count = 4 lines
+       ) &&
+       (
+               cd super_clone/sub &&
+               git log --oneline >lines &&
+               test_line_count = 1 lines
+       )
+'
+
+test_expect_success 'get unshallow recommended shallow submodule' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --no-local "file://$pwd/." super_clone &&
+       (
+               cd super_clone &&
+               git submodule update --init --no-recommend-shallow &&
+               git log --oneline >lines &&
+               test_line_count = 4 lines
+       ) &&
+       (
+               cd super_clone/sub &&
+               git log --oneline >lines &&
+               test_line_count = 3 lines
+       )
+'
+
+test_expect_success 'clone follows non shallow recommendation' '
+       test_when_finished "rm -rf super_clone" &&
+       git config -f .gitmodules submodule.sub.shallow false &&
+       git add .gitmodules &&
+       git commit -m "recommed non shallow for sub" &&
+       git clone --recurse-submodules --no-local "file://$pwd/." super_clone &&
+       (
+               cd super_clone &&
+               git log --oneline >lines &&
+               test_line_count = 5 lines
+       ) &&
+       (
+               cd super_clone/sub &&
+               git log --oneline >lines &&
+               test_line_count = 3 lines
+       )
+'
+
+test_done
diff --git a/t/t5615-alternate-env.sh b/t/t5615-alternate-env.sh
new file mode 100755 (executable)
index 0000000..26ebb03
--- /dev/null
@@ -0,0 +1,89 @@
+#!/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
+'
+
+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
diff --git a/t/t5710-info-alternate.sh b/t/t5710-info-alternate.sh
deleted file mode 100755 (executable)
index 9cd2626..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
-#
-
-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 'validity of third repository' \
-'cd C &&
-test_valid_repo'
-
-cd "$base_dir"
-
-test_expect_success 'validity of fourth repository' \
-'cd D &&
-test_valid_repo'
-
-cd "$base_dir"
-
-test_expect_success 'breaking of loops' \
-'echo "$base_dir"/B/.git/objects >> "$base_dir"/A/.git/objects/info/alternates&&
-cd C &&
-test_valid_repo'
-
-cd "$base_dir"
-
-test_expect_success 'that info/alternates is necessary' \
-'cd C &&
-rm -f .git/objects/info/alternates &&
-! (test_valid_repo)'
-
-cd "$base_dir"
-
-test_expect_success 'that relative alternate is possible for current dir' \
-'cd C &&
-echo "../../../B/.git/objects" > .git/objects/info/alternates &&
-test_valid_repo'
-
-cd "$base_dir"
-
-test_expect_success \
-    'that relative alternate is only possible for current dir' '
-    cd D &&
-    ! (test_valid_repo)
-'
-
-cd "$base_dir"
-
-test_done
index 0d105d54174e061b20707de808b284314f730667..044cc152f83b05e090a65268c8818d56adb4422b 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 ||
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 b77d4c97c1102c4a9bf1313c7e9eb94a6936ac06..a1dcdb81d789cfa2d0e8fcc178311a807a608771 100755 (executable)
@@ -184,38 +184,38 @@ commit $head1
 \e[1;31;43mfoo\e[m
 EOF
 
-test_expect_success '%C(auto) does not enable color by default' '
+test_expect_success '%C(auto,...) does not enable color by default' '
        git log --format=$AUTO_COLOR -1 >actual &&
        has_no_color actual
 '
 
-test_expect_success '%C(auto) enables colors for color.diff' '
+test_expect_success '%C(auto,...) enables colors for color.diff' '
        git -c color.diff=always log --format=$AUTO_COLOR -1 >actual &&
        has_color actual
 '
 
-test_expect_success '%C(auto) enables colors for color.ui' '
+test_expect_success '%C(auto,...) enables colors for color.ui' '
        git -c color.ui=always log --format=$AUTO_COLOR -1 >actual &&
        has_color actual
 '
 
-test_expect_success '%C(auto) respects --color' '
+test_expect_success '%C(auto,...) respects --color' '
        git log --format=$AUTO_COLOR -1 --color >actual &&
        has_color actual
 '
 
-test_expect_success '%C(auto) respects --no-color' '
+test_expect_success '%C(auto,...) respects --no-color' '
        git -c color.ui=always log --format=$AUTO_COLOR -1 --no-color >actual &&
        has_no_color actual
 '
 
-test_expect_success TTY '%C(auto) respects --color=auto (stdout is tty)' '
+test_expect_success TTY '%C(auto,...) respects --color=auto (stdout is tty)' '
        test_terminal env TERM=vt100 \
                git log --format=$AUTO_COLOR -1 --color=auto >actual &&
        has_color actual
 '
 
-test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
+test_expect_success '%C(auto,...) respects --color=auto (stdout not tty)' '
        (
                TERM=vt100 && export TERM &&
                git log --format=$AUTO_COLOR -1 --color=auto >actual &&
@@ -223,6 +223,18 @@ test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
        )
 '
 
+test_expect_success '%C(auto) respects --color' '
+       git log --color --format="%C(auto)%H" -1 >actual &&
+       printf "\\033[33m%s\\033[m\\n" $(git rev-parse HEAD) >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success '%C(auto) respects --no-color' '
+       git log --no-color --format="%C(auto)%H" -1 >actual &&
+       git rev-parse HEAD >expect &&
+       test_cmp expect actual
+'
+
 iconv -f utf-8 -t $test_encoding > commit-msg <<EOF
 Test printing of complex bodies
 
index 28d4f6b259c1696435698cb3826c837c8eaf90e3..1408b608eb030f0e6bcc3d531aad426da5f06b12 100755 (executable)
@@ -207,4 +207,25 @@ test_expect_success '--count --left-right' '
        test_cmp expect actual
 '
 
+# Corrupt the object store deliberately to make sure
+# the object is not even checked for its existence.
+remove_loose_object () {
+       sha1="$(git rev-parse "$1")" &&
+       remainder=${sha1#??} &&
+       firsttwo=${sha1%$remainder} &&
+       rm .git/objects/$firsttwo/$remainder
+}
+
+test_expect_success '--cherry-pick avoids looking at full diffs' '
+       git checkout -b shy-diff &&
+       test_commit dont-look-at-me &&
+       echo Hello >dont-look-at-me.t &&
+       test_tick &&
+       git commit -m tip dont-look-at-me.t &&
+       git checkout -b mainline HEAD^ &&
+       test_commit to-cherry-pick &&
+       remove_loose_object shy-diff^:dont-look-at-me.t &&
+       git rev-list --cherry-pick ...shy-diff
+'
+
 test_done
index 66cda17ef342a2791ce7bac873eecfd4cf319faf..20e3e2554a132552b5e398a2c449cedbef6ccb1e 100755 (executable)
@@ -47,7 +47,9 @@ test_expect_success 'setup roots, merges and octopuses' '
        git checkout -b yetanotherbranch four &&
        test_commit eight &&
        git checkout master &&
-       test_merge normalmerge newroot &&
+       test_tick &&
+       git merge --allow-unrelated-histories -m normalmerge newroot &&
+       git tag normalmerge &&
        test_tick &&
        git merge -m tripus sidebranch anotherbranch &&
        git tag tripus &&
index 39b3238da211957eeec36a9c7b911cd5942de6dd..31db7b5f9125ed346450d7bfe29d8bb5fac0460a 100755 (executable)
@@ -215,11 +215,13 @@ test_expect_success 'criss-cross merge-base for octopus-step' '
        git reset --hard E &&
        test_commit CC2 &&
        test_tick &&
-       git merge -s ours CC1 &&
+       # E is a root commit unrelated to MMR root on which CC1 is based
+       git merge -s ours --allow-unrelated-histories CC1 &&
        test_commit CC-o &&
        test_commit CCB &&
        git reset --hard CC1 &&
-       git merge -s ours CC2 &&
+       # E is a root commit unrelated to MMR root on which CC1 is based
+       git merge -s ours --allow-unrelated-histories CC2 &&
        test_commit CCA &&
 
        git rev-parse CC1 CC2 >expected &&
@@ -258,6 +260,12 @@ test_expect_success 'using reflog to find the fork point' '
        test_cmp expect3 actual
 '
 
+test_expect_success '--fork-point works with empty reflog' '
+       git -c core.logallrefupdates=false branch no-reflog base &&
+       git merge-base --fork-point no-reflog derived &&
+       test_cmp expect3 actual
+'
+
 test_expect_success 'merge-base --octopus --all for complex tree' '
        # Best common ancestor for JE, JAA and JDD is JC
        #             JE
index b89cd6b07a3df8f10c89e97ddf5cad7338e065bc..2a0fbb87b1d63f1a07f8a3934e1546c695a73f56 100755 (executable)
@@ -71,7 +71,7 @@ test_expect_success setup '
        note J &&
 
        git checkout master &&
-       test_tick && git merge -m "Coolest" unrelated &&
+       test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated &&
        note K &&
 
        echo "Immaterial" >elif &&
index d00f7db8687b8bedcbc810735a16c65df2324c18..381f35ed16d152e7926774587c1c0a006a600ee6 100755 (executable)
@@ -257,7 +257,7 @@ test_expect_success 'rev-list accumulates multiple --exclude' '
 
 
 # "git rev-list<ENTER>" is likely to be a bug in the calling script and may
-# deserve an error message, but do cases where set of refs programatically
+# deserve an error message, but do cases where set of refs programmatically
 # given using globbing and/or --stdin need to fail with the same error, or
 # are we better off reporting a success with no output?  The following few
 # tests document the current behaviour to remind us that we might want to
index 755d30ce2a5d1c5e34751d8906ad41b02d553b03..3f59e58dfb5171d2e5ef53399c2f8d24fff1e94e 100755 (executable)
@@ -76,7 +76,7 @@ test_expect_success "result contains a conflict" "test_cmp expect a1"
 
 git ls-files --stage > out
 cat > expect << EOF
-100644 439cc46de773d8a83c77799b7cc9191c128bfcff 1      a1
+100644 ec3fe2a791706733f2d8fa7ad45d9a9672031f5e 1      a1
 100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2      a1
 100644 fd7923529855d0b274795ae3349c5e0438333979 3      a1
 EOF
index 04c0509c476de87bfb679f1c50556ca4c3a3d615..8f9b48a4937bb4141d17b7d9096d2b6fb695c25c 100755 (executable)
@@ -176,8 +176,32 @@ test_expect_success 'up-to-date merge without common ancestor' '
        test_tick &&
        (
                cd repo1 &&
-               git pull ../repo2 master
+               git fetch ../repo2 master &&
+               git merge --allow-unrelated-histories FETCH_HEAD
        )
 '
 
+test_expect_success 'custom merge does not lock index' '
+       git reset --hard anchor &&
+       write_script sleep-an-hour.sh <<-\EOF &&
+               sleep 3600 &
+               echo $! >sleep.pid
+       EOF
+
+       test_write_lines >.gitattributes \
+               "* merge=ours" "text merge=sleep-an-hour" &&
+       test_config merge.ours.driver true &&
+       test_config merge.sleep-an-hour.driver ./sleep-an-hour.sh &&
+
+       # We are testing that the custom merge driver does not block
+       # index.lock on Windows due to an inherited file handle.
+       # To ensure that the backgrounded process ran sufficiently
+       # long (and has been started in the first place), we do not
+       # ignore the result of the kill command.
+       # By packaging the command in test_when_finished, we get both
+       # the correctness check and the clean-up.
+       test_when_finished "kill \$(cat sleep.pid)" &&
+       git merge master
+'
+
 test_done
index 73fc240e8548911c65c4dffc4da0c6ff8ab4f27b..3e692454a719324a7ed3c12238416f45df080efa 100755 (executable)
@@ -49,7 +49,7 @@ test_expect_success 'setup' '
 
 test_expect_success 'initial merge' '
        git remote add -f gui ../git-gui &&
-       git merge -s ours --no-commit gui/master &&
+       git merge -s ours --no-commit --allow-unrelated-histories gui/master &&
        git read-tree --prefix=git-gui/ -u gui/master &&
        git commit -m "Merge git-gui as our subdirectory" &&
        git checkout -b work &&
index e74662ba5c638de5acb4188e2cd0c5ff2456ec13..5e5370feb40c851fa29bdec17d687eb5f22502bb 100755 (executable)
@@ -362,7 +362,7 @@ test_expect_success 'bisect starting with a detached HEAD' '
 test_expect_success 'bisect errors out if bad and good are mistaken' '
        git bisect reset &&
        test_must_fail git bisect start $HASH2 $HASH4 2> rev_list_error &&
-       grep "mistook good and bad" rev_list_error &&
+       test_i18ngrep "mistook good and bad" rev_list_error &&
        git bisect reset
 '
 
@@ -404,7 +404,7 @@ test_expect_success 'side branch creation' '
 
 test_expect_success 'good merge base when good and bad are siblings' '
        git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
-       grep "merge base must be tested" my_bisect_log.txt &&
+       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 &&
@@ -413,7 +413,7 @@ test_expect_success 'good merge base when good and bad are siblings' '
 '
 test_expect_success 'skipped merge base when good and bad are siblings' '
        git bisect start "$SIDE_HASH7" "$HASH7" > my_bisect_log.txt &&
-       grep "merge base must be tested" my_bisect_log.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH4 my_bisect_log.txt &&
        git bisect skip > my_bisect_log.txt 2>&1 &&
        grep "warning" my_bisect_log.txt &&
@@ -423,11 +423,11 @@ test_expect_success 'skipped merge base when good and bad are siblings' '
 
 test_expect_success 'bad merge base when good and bad are siblings' '
        git bisect start "$HASH7" HEAD > my_bisect_log.txt &&
-       grep "merge base must be tested" my_bisect_log.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        grep $HASH4 my_bisect_log.txt &&
        test_must_fail git bisect bad > my_bisect_log.txt 2>&1 &&
-       grep "merge base $HASH4 is bad" my_bisect_log.txt &&
-       grep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt &&
+       test_i18ngrep "merge base $HASH4 is bad" my_bisect_log.txt &&
+       test_i18ngrep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt &&
        git bisect reset
 '
 
@@ -460,9 +460,9 @@ test_expect_success 'many merge bases creation' '
 
 test_expect_success 'good merge bases when good and bad are siblings' '
        git bisect start "$B_HASH" "$A_HASH" > my_bisect_log.txt &&
-       grep "merge base must be tested" my_bisect_log.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        git bisect good > my_bisect_log2.txt &&
-       grep "merge base must be tested" my_bisect_log2.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log2.txt &&
        {
                {
                        grep "$SIDE_HASH5" my_bisect_log.txt &&
@@ -477,14 +477,14 @@ test_expect_success 'good merge bases when good and bad are siblings' '
 
 test_expect_success 'optimized merge base checks' '
        git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
-       grep "merge base must be tested" my_bisect_log.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log.txt &&
        grep "$HASH4" my_bisect_log.txt &&
        git bisect good > my_bisect_log2.txt &&
        test -f ".git/BISECT_ANCESTORS_OK" &&
        test "$HASH6" = $(git rev-parse --verify HEAD) &&
        git bisect bad > my_bisect_log3.txt &&
        git bisect good "$A_HASH" > my_bisect_log4.txt &&
-       grep "merge base must be tested" my_bisect_log4.txt &&
+       test_i18ngrep "merge base must be tested" my_bisect_log4.txt &&
        test_must_fail test -f ".git/BISECT_ANCESTORS_OK"
 '
 
@@ -562,7 +562,7 @@ test_expect_success 'skipping away from skipped commit' '
 
 test_expect_success 'erroring out when using bad path parameters' '
        test_must_fail git bisect start $PARA_HASH7 $HASH1 -- foobar 2> error.txt &&
-       grep "bad path parameters" error.txt
+       test_i18ngrep "bad path parameters" error.txt
 '
 
 test_expect_success 'test bisection on bare repo - --no-checkout specified' '
@@ -721,7 +721,7 @@ git bisect good 3de952f2416b6084f557ec417709eac740c6818c
 # first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.
 EOF
 
-test_expect_success 'bisect log: successfull result' '
+test_expect_success 'bisect log: successful result' '
        git bisect reset &&
        git bisect start $HASH4 $HASH2 &&
        git bisect good &&
@@ -803,7 +803,7 @@ test_expect_success 'bisect terms needs 0 or 1 argument' '
        test_must_fail git bisect terms 1 2 &&
        test_must_fail git bisect terms 2>actual &&
        echo "no terms defined" >expected &&
-       test_cmp expected actual
+       test_i18ncmp expected actual
 '
 
 test_expect_success 'bisect terms shows good/bad after start' '
@@ -875,7 +875,7 @@ test_expect_success 'bisect start --term-* does store terms' '
        Your current terms are two for the old state
        and one for the new state.
        EOF
-       test_cmp expected actual &&
+       test_i18ncmp expected actual &&
        git bisect terms --term-bad >actual &&
        echo one >expected &&
        test_cmp expected actual &&
index 9d6621c05604e22c258ea21ef0cd549ef4d0d278..18aa88b5c096c14f2f8a3a8d8c6488127fddf055 100755 (executable)
@@ -212,7 +212,8 @@ test_expect_success 'git detects differently handled merges conflict' '
                -L "" \
                -L "Temporary merge branch 1" \
                merged empty merge-me &&
-       test $(git rev-parse :1:new_a) = $(git hash-object merged)
+       sed -e "s/^\([<=>]\)/\1\1\1/" merged >merged-internal &&
+       test $(git rev-parse :1:new_a) = $(git hash-object merged-internal)
 '
 
 #
@@ -298,89 +299,6 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev
        test $(git rev-parse :3:file) = $(git rev-parse B:file)
 '
 
-#
-# criss-cross + modify/modify with very contrived file contents:
-#
-#      B   D
-#      o---o
-#     / \ / \
-#  A o   X   ? F
-#     \ / \ /
-#      o---o
-#      C   E
-#
-#   Commit A: file with contents 'A\n'
-#   Commit B: file with contents 'B\n'
-#   Commit C: file with contents 'C\n'
-#   Commit D: file with contents 'D\n'
-#   Commit E: file with contents:
-#      <<<<<<< Temporary merge branch 1
-#      C
-#      =======
-#      B
-#      >>>>>>> Temporary merge branch 2
-#
-# Now, when we merge commits D & E, does git detect the conflict?
-
-test_expect_success 'setup differently handled merges of content conflict' '
-       git clean -fdqx &&
-       rm -rf .git &&
-       git init &&
-
-       echo A >file &&
-       git add file &&
-       test_tick &&
-       git commit -m A &&
-
-       git branch B &&
-       git checkout -b C &&
-       echo C >file &&
-       git add file &&
-       test_tick &&
-       git commit -m C &&
-
-       git checkout B &&
-       echo B >file &&
-       git add file &&
-       test_tick &&
-       git commit -m B &&
-
-       git checkout B^0 &&
-       test_must_fail git merge C &&
-       echo D >file &&
-       git add file &&
-       test_tick &&
-       git commit -m D &&
-       git tag D &&
-
-       git checkout C^0 &&
-       test_must_fail git merge B &&
-       cat <<EOF >file &&
-<<<<<<< Temporary merge branch 1
-C
-=======
-B
->>>>>>> Temporary merge branch 2
-EOF
-       git add file &&
-       test_tick &&
-       git commit -m E &&
-       git tag E
-'
-
-test_expect_failure 'git detects conflict w/ criss-cross+contrived resolution' '
-       git checkout D^0 &&
-
-       test_must_fail git merge -s recursive E^0 &&
-
-       test 3 -eq $(git ls-files -s | wc -l) &&
-       test 3 -eq $(git ls-files -u | wc -l) &&
-       test 0 -eq $(git ls-files -o | wc -l) &&
-
-       test $(git rev-parse :2:file) = $(git rev-parse D:file) &&
-       test $(git rev-parse :3:file) = $(git rev-parse E:file)
-'
-
 #
 # criss-cross + d/f conflict via add/add:
 #   Commit A: Neither file 'a' nor directory 'a/' exists.
index 85c10b0940a896bb49aefee9a2885b1c39217bab..5e8d5fa50c9a6a548e5f2fdb11186c165519d06f 100755 (executable)
@@ -16,6 +16,13 @@ test_description='CRLF merge conflict across text=auto change
 
 test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b
 
+compare_files () {
+       tr '\015\000' QN <"$1" >"$1".expect &&
+       tr '\015\000' QN <"$2" >"$2".actual &&
+       test_cmp "$1".expect "$2".actual &&
+       rm "$1".expect "$2".actual
+}
+
 test_expect_success setup '
        git config core.autocrlf false &&
 
@@ -30,7 +37,7 @@ test_expect_success setup '
        git branch side &&
 
        echo "* text=auto" >.gitattributes &&
-       touch file &&
+       echo first line >file &&
        git add .gitattributes file &&
        test_tick &&
        git commit -m "normalize file" &&
@@ -81,38 +88,49 @@ test_expect_success 'Merge after setting text=auto' '
        rm -f .gitattributes &&
        git reset --hard a &&
        git merge b &&
-       test_cmp expected file
+       compare_files expected file
 '
 
-test_expect_success 'Merge addition of text=auto' '
+test_expect_success 'Merge addition of text=auto eol=LF' '
+       git config core.eol lf &&
        cat <<-\EOF >expected &&
        first line
        same line
        EOF
 
-       if test_have_prereq NATIVE_CRLF; then
-               append_cr <expected >expected.temp &&
-               mv expected.temp expected
-       fi &&
        git config merge.renormalize true &&
        git rm -fr . &&
        rm -f .gitattributes &&
        git reset --hard b &&
        git merge a &&
-       test_cmp expected file
+       compare_files  expected file
+'
+
+test_expect_success 'Merge addition of text=auto eol=CRLF' '
+       git config core.eol crlf &&
+       cat <<-\EOF >expected &&
+       first line
+       same line
+       EOF
+
+       append_cr <expected >expected.temp &&
+       mv expected.temp expected &&
+       git config merge.renormalize true &&
+       git rm -fr . &&
+       rm -f .gitattributes &&
+       git reset --hard b &&
+       echo >&2 "After git reset --hard b" &&
+       git ls-files -s --eol >&2 &&
+       git merge a &&
+       compare_files  expected file
 '
 
 test_expect_success 'Detect CRLF/LF conflict after setting text=auto' '
+       git config core.eol native &&
        echo "<<<<<<<" >expected &&
-       if test_have_prereq NATIVE_CRLF; then
-               echo first line | append_cr >>expected &&
-               echo same line | append_cr >>expected &&
-               echo ======= | append_cr >>expected
-       else
-               echo first line >>expected &&
-               echo same line >>expected &&
-               echo ======= >>expected
-       fi &&
+       echo first line >>expected &&
+       echo same line >>expected &&
+       echo ======= >>expected &&
        echo first line | append_cr >>expected &&
        echo same line | append_cr >>expected &&
        echo ">>>>>>>" >>expected &&
@@ -121,29 +139,23 @@ test_expect_success 'Detect CRLF/LF conflict after setting text=auto' '
        git reset --hard a &&
        test_must_fail git merge b &&
        fuzz_conflict file >file.fuzzy &&
-       test_cmp expected file.fuzzy
+       compare_files expected file.fuzzy
 '
 
 test_expect_success 'Detect LF/CRLF conflict from addition of text=auto' '
        echo "<<<<<<<" >expected &&
        echo first line | append_cr >>expected &&
        echo same line | append_cr >>expected &&
-       if test_have_prereq NATIVE_CRLF; then
-               echo ======= | append_cr >>expected &&
-               echo first line | append_cr >>expected &&
-               echo same line | append_cr >>expected
-       else
-               echo ======= >>expected &&
-               echo first line >>expected &&
-               echo same line >>expected
-       fi &&
+       echo ======= >>expected &&
+       echo first line >>expected &&
+       echo same line >>expected &&
        echo ">>>>>>>" >>expected &&
        git config merge.renormalize false &&
        rm -f .gitattributes &&
        git reset --hard b &&
        test_must_fail git merge a &&
        fuzz_conflict file >file.fuzzy &&
-       test_cmp expected file.fuzzy
+       compare_files expected file.fuzzy
 '
 
 test_expect_failure 'checkout -m after setting text=auto' '
@@ -158,7 +170,7 @@ test_expect_failure 'checkout -m after setting text=auto' '
        git reset --hard initial &&
        git checkout a -- . &&
        git checkout -m b &&
-       test_cmp expected file
+       compare_files expected file
 '
 
 test_expect_failure 'checkout -m addition of text=auto' '
@@ -173,7 +185,7 @@ test_expect_failure 'checkout -m addition of text=auto' '
        git reset --hard initial &&
        git checkout b -- . &&
        git checkout -m a &&
-       test_cmp expected file
+       compare_files expected file
 '
 
 test_expect_failure 'cherry-pick patch from after text=auto was added' '
@@ -187,7 +199,7 @@ test_expect_failure 'cherry-pick patch from after text=auto was added' '
        git reset --hard b &&
        test_must_fail git cherry-pick a >err 2>&1 &&
        grep "[Nn]othing added" err &&
-       test_cmp expected file
+       compare_files expected file
 '
 
 test_expect_success 'Test delete/normalize conflict' '
index c6b7aa6977e0a5a1017c759d93f8883cad3713b0..62b8a2e7bbd1cf26710be0a0eb90041d5e3f7d2c 100755 (executable)
@@ -8,7 +8,7 @@ test_description='bisect can handle submodules'
 git_bisect () {
        git status -su >expect &&
        ls -1pR * >>expect &&
-       tar czf "$TRASH_DIRECTORY/tmp.tgz" * &&
+       tar cf "$TRASH_DIRECTORY/tmp.tar" * &&
        GOOD=$(git rev-parse --verify HEAD) &&
        git checkout "$1" &&
        echo "foo" >bar &&
@@ -20,7 +20,7 @@ git_bisect () {
        git bisect start &&
        git bisect good $GOOD &&
        rm -rf * &&
-       tar xzf "$TRASH_DIRECTORY/tmp.tgz" &&
+       tar xf "$TRASH_DIRECTORY/tmp.tar" &&
        git status -su >actual &&
        ls -1pR * >>actual &&
        test_cmp expect actual &&
diff --git a/t/t6044-merge-unrelated-index-changes.sh b/t/t6044-merge-unrelated-index-changes.sh
new file mode 100755 (executable)
index 0000000..0102348
--- /dev/null
@@ -0,0 +1,153 @@
+#!/bin/sh
+
+test_description="merges with unrelated index changes"
+
+. ./test-lib.sh
+
+# Testcase for some simple merges
+#   A
+#   o-----o B
+#    \
+#     \---o C
+#      \
+#       \-o D
+#        \
+#         o E
+#   Commit A: some file a
+#   Commit B: adds file b, modifies end of a
+#   Commit C: adds file c
+#   Commit D: adds file d, modifies beginning of a
+#   Commit E: renames a->subdir/a, adds subdir/e
+
+test_expect_success 'setup trivial merges' '
+       test_seq 1 10 >a &&
+       git add a &&
+       test_tick && git commit -m A &&
+
+       git branch A &&
+       git branch B &&
+       git branch C &&
+       git branch D &&
+       git branch E &&
+
+       git checkout B &&
+       echo b >b &&
+       echo 11 >>a &&
+       git add a b &&
+       test_tick && git commit -m B &&
+
+       git checkout C &&
+       echo c >c &&
+       git add c &&
+       test_tick && git commit -m C &&
+
+       git checkout D &&
+       test_seq 2 10 >a &&
+       echo d >d &&
+       git add a d &&
+       test_tick && git commit -m D &&
+
+       git checkout E &&
+       mkdir subdir &&
+       git mv a subdir/a &&
+       echo e >subdir/e &&
+       git add subdir &&
+       test_tick && git commit -m E
+'
+
+test_expect_success 'ff update' '
+       git reset --hard &&
+       git checkout A^0 &&
+
+       touch random_file && git add random_file &&
+
+       git merge E^0 &&
+
+       test_must_fail git rev-parse HEAD:random_file &&
+       test "$(git diff --name-only --cached E)" = "random_file"
+'
+
+test_expect_success 'ff update, important file modified' '
+       git reset --hard &&
+       git checkout A^0 &&
+
+       mkdir subdir &&
+       touch subdir/e &&
+       git add subdir/e &&
+
+       test_must_fail git merge E^0
+'
+
+test_expect_success 'resolve, trivial' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge -s resolve C^0
+'
+
+test_expect_success 'resolve, non-trivial' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge -s resolve D^0
+'
+
+test_expect_success 'recursive' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge -s recursive C^0
+'
+
+test_expect_success 'octopus, unrelated file touched' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge C^0 D^0
+'
+
+test_expect_success 'octopus, related file removed' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       git rm b &&
+
+       test_must_fail git merge C^0 D^0
+'
+
+test_expect_success 'octopus, related file modified' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       echo 12 >>a && git add a &&
+
+       test_must_fail git merge C^0 D^0
+'
+
+test_expect_success 'ours' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge -s ours C^0
+'
+
+test_expect_success 'subtree' '
+       git reset --hard &&
+       git checkout B^0 &&
+
+       touch random_file && git add random_file &&
+
+       test_must_fail git merge -s subtree E^0
+'
+
+test_done
index 10b1452766b613932f66421f6c9bfafecc093177..8c617981a3a06c1ff49f03a2914bfdc31c0e293c 100755 (executable)
@@ -19,7 +19,7 @@ test_expect_success 'setup' '
        git checkout --orphan tmp &&
        test_commit start2 &&
        git checkout master &&
-       git merge -m next start2 &&
+       git merge -m next --allow-unrelated-histories start2 &&
        test_commit final &&
 
        test_seq 40 |
@@ -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 19a2823025e794a6adc3f75d65dd175a2021f282..039509a9cb94ef5c653df09e0453ac83157bf184 100755 (executable)
@@ -553,4 +553,14 @@ 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 HEAD &&
+       git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual &&
+       test_cmp expect actual
+'
+
 test_done
index cdb67a03b712cbd2cf187e91f7d69a3f717847bf..c734ce2388a79d15692875eae81e323c63ad2300 100755 (executable)
@@ -20,8 +20,8 @@ test_expect_success 'Broken refs are reported correctly' '
        test_when_finished "rm -f .git/$r" &&
        echo "warning: ignoring broken ref $r" >broken-err &&
        git for-each-ref >out 2>err &&
-       test_cmp full-list out &&
-       test_cmp broken-err err
+       test_i18ncmp full-list out &&
+       test_i18ncmp broken-err err
 '
 
 test_expect_success 'NULL_SHA1 refs are reported correctly' '
@@ -31,10 +31,10 @@ test_expect_success 'NULL_SHA1 refs are reported correctly' '
        echo "warning: ignoring broken ref $r" >zeros-err &&
        git for-each-ref >out 2>err &&
        test_cmp full-list out &&
-       test_cmp zeros-err err &&
+       test_i18ncmp zeros-err err &&
        git for-each-ref --format="%(objectname) %(refname)" >brief-out 2>brief-err &&
        test_cmp brief-list brief-out &&
-       test_cmp zeros-err brief-err
+       test_i18ncmp zeros-err brief-err
 '
 
 test_expect_success 'Missing objects are reported correctly' '
@@ -43,7 +43,7 @@ test_expect_success 'Missing objects are reported correctly' '
        test_when_finished "rm -f .git/$r" &&
        echo "fatal: missing object $MISSING for $r" >missing-err &&
        test_must_fail git for-each-ref 2>err &&
-       test_cmp missing-err err &&
+       test_i18ncmp missing-err err &&
        (
                cat brief-list &&
                echo "$MISSING $r"
index bcf472bf51999f3fd1a043b5d44601156d5c8049..d0ab09f4bd804730eb049ea982e5724653583f06 100755 (executable)
@@ -5,20 +5,27 @@ test_description='test for-each-refs usage of ref-filter APIs'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-gpg.sh
 
-if ! test_have_prereq GPG
-then
-       skip_all="skipping for-each-ref tests, GPG not available"
-       test_done
-fi
-
 test_expect_success 'setup some history and refs' '
        test_commit one &&
        test_commit two &&
        test_commit three &&
        git checkout -b side &&
        test_commit four &&
-       git tag -s -m "A signed tag message" signed-tag &&
-       git tag -s -m "Annonated doubly" double-tag signed-tag &&
+       git tag -m "An annotated tag" annotated-tag &&
+       git tag -m "Annonated doubly" doubly-annotated-tag annotated-tag &&
+
+       # Note that these "signed" tags might not actually be signed.
+       # Tests which care about the distinction should be marked
+       # with the GPG prereq.
+       if test_have_prereq GPG
+       then
+               sign=-s
+       else
+               sign=
+       fi &&
+       git tag $sign -m "A signed tag" signed-tag &&
+       git tag $sign -m "Signed doubly" doubly-signed-tag signed-tag &&
+
        git checkout master &&
        git update-ref refs/odd/spot master
 '
@@ -36,6 +43,7 @@ test_expect_success 'filtering with --points-at' '
 test_expect_success 'check signed tags with --points-at' '
        sed -e "s/Z$//" >expect <<-\EOF &&
        refs/heads/side Z
+       refs/tags/annotated-tag four
        refs/tags/four Z
        refs/tags/signed-tag four
        EOF
@@ -58,7 +66,9 @@ test_expect_success 'filtering with --merged' '
 test_expect_success 'filtering with --no-merged' '
        cat >expect <<-\EOF &&
        refs/heads/side
-       refs/tags/double-tag
+       refs/tags/annotated-tag
+       refs/tags/doubly-annotated-tag
+       refs/tags/doubly-signed-tag
        refs/tags/four
        refs/tags/signed-tag
        EOF
@@ -71,7 +81,9 @@ test_expect_success 'filtering with --contains' '
        refs/heads/master
        refs/heads/side
        refs/odd/spot
-       refs/tags/double-tag
+       refs/tags/annotated-tag
+       refs/tags/doubly-annotated-tag
+       refs/tags/doubly-signed-tag
        refs/tags/four
        refs/tags/signed-tag
        refs/tags/three
@@ -90,7 +102,9 @@ test_expect_success 'left alignment is default' '
        refname is refs/heads/master  |refs/heads/master
        refname is refs/heads/side    |refs/heads/side
        refname is refs/odd/spot      |refs/odd/spot
-       refname is refs/tags/double-tag|refs/tags/double-tag
+       refname is refs/tags/annotated-tag|refs/tags/annotated-tag
+       refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
+       refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
        refname is refs/tags/four     |refs/tags/four
        refname is refs/tags/one      |refs/tags/one
        refname is refs/tags/signed-tag|refs/tags/signed-tag
@@ -106,7 +120,9 @@ test_expect_success 'middle alignment' '
        | refname is refs/heads/master |refs/heads/master
        |  refname is refs/heads/side  |refs/heads/side
        |   refname is refs/odd/spot   |refs/odd/spot
-       |refname is refs/tags/double-tag|refs/tags/double-tag
+       |refname is refs/tags/annotated-tag|refs/tags/annotated-tag
+       |refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
+       |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
        |  refname is refs/tags/four   |refs/tags/four
        |   refname is refs/tags/one   |refs/tags/one
        |refname is refs/tags/signed-tag|refs/tags/signed-tag
@@ -122,7 +138,9 @@ test_expect_success 'right alignment' '
        |  refname is refs/heads/master|refs/heads/master
        |    refname is refs/heads/side|refs/heads/side
        |      refname is refs/odd/spot|refs/odd/spot
-       |refname is refs/tags/double-tag|refs/tags/double-tag
+       |refname is refs/tags/annotated-tag|refs/tags/annotated-tag
+       |refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
+       |refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
        |     refname is refs/tags/four|refs/tags/four
        |      refname is refs/tags/one|refs/tags/one
        |refname is refs/tags/signed-tag|refs/tags/signed-tag
@@ -137,7 +155,9 @@ cat >expect <<-\EOF
 |       refname is refs/heads/master       |refs/heads/master
 |        refname is refs/heads/side        |refs/heads/side
 |         refname is refs/odd/spot         |refs/odd/spot
-|     refname is refs/tags/double-tag      |refs/tags/double-tag
+|    refname is refs/tags/annotated-tag    |refs/tags/annotated-tag
+|refname is refs/tags/doubly-annotated-tag |refs/tags/doubly-annotated-tag
+|  refname is refs/tags/doubly-signed-tag  |refs/tags/doubly-signed-tag
 |        refname is refs/tags/four         |refs/tags/four
 |         refname is refs/tags/one         |refs/tags/one
 |     refname is refs/tags/signed-tag      |refs/tags/signed-tag
@@ -182,7 +202,9 @@ test_expect_success 'alignment with format quote' "
        |'      '\''master| A U Thor'\''      '|
        |'       '\''side| A U Thor'\''       '|
        |'     '\''odd/spot| A U Thor'\''     '|
-       |'        '\''double-tag| '\''        '|
+       |'      '\''annotated-tag| '\''       '|
+       |'   '\''doubly-annotated-tag| '\''   '|
+       |'    '\''doubly-signed-tag| '\''     '|
        |'       '\''four| A U Thor'\''       '|
        |'       '\''one| A U Thor'\''        '|
        |'        '\''signed-tag| '\''        '|
@@ -198,7 +220,9 @@ test_expect_success 'nested alignment with quote formatting' "
        |'         master               '|
        |'           side               '|
        |'       odd/spot               '|
-       |'     double-tag               '|
+       |'  annotated-tag               '|
+       |'doubly-annotated-tag          '|
+       |'doubly-signed-tag             '|
        |'           four               '|
        |'            one               '|
        |'     signed-tag               '|
@@ -214,10 +238,12 @@ test_expect_success 'check `%(contents:lines=1)`' '
        master |three
        side |four
        odd/spot |three
-       double-tag |Annonated doubly
+       annotated-tag |An annotated tag
+       doubly-annotated-tag |Annonated doubly
+       doubly-signed-tag |Signed doubly
        four |four
        one |one
-       signed-tag |A signed tag message
+       signed-tag |A signed tag
        three |three
        two |two
        EOF
@@ -230,7 +256,9 @@ test_expect_success 'check `%(contents:lines=0)`' '
        master |
        side |
        odd/spot |
-       double-tag |
+       annotated-tag |
+       doubly-annotated-tag |
+       doubly-signed-tag |
        four |
        one |
        signed-tag |
@@ -246,10 +274,12 @@ test_expect_success 'check `%(contents:lines=99999)`' '
        master |three
        side |four
        odd/spot |three
-       double-tag |Annonated doubly
+       annotated-tag |An annotated tag
+       doubly-annotated-tag |Annonated doubly
+       doubly-signed-tag |Signed doubly
        four |four
        one |one
-       signed-tag |A signed tag message
+       signed-tag |A signed tag
        three |three
        two |two
        EOF
index 4008faead8ec4ea0d08e82d2916dbc3e17327c8a..e365d1ff77ee30e0f40b8f01c7e70ebc74e97901 100755 (executable)
@@ -292,6 +292,9 @@ test_expect_success 'setup submodule' '
        echo content >file &&
        git add file &&
        git commit -m "added sub and file" &&
+       mkdir -p deep/directory/hierarchy &&
+       git submodule add ./. deep/directory/hierarchy/sub &&
+       git commit -m "added another submodule" &&
        git branch submodule
 '
 
@@ -475,4 +478,17 @@ test_expect_success 'mv -k does not accidentally destroy submodules' '
        git checkout .
 '
 
+test_expect_success 'moving a submodule in nested directories' '
+       (
+               cd deep &&
+               git mv directory ../ &&
+               # git status would fail if the update of linking git dir to
+               # work dir of the submodule failed.
+               git status &&
+               git config -f ../.gitmodules submodule.deep/directory/hierarchy/sub.path >../actual &&
+               echo "directory/hierarchy/sub" >../expect
+       ) &&
+       test_cmp actual expect
+'
+
 test_done
index cf3469b142d7ab015dca14f4f9898bae784a9e9a..8b0f71a2ac15d65f977b0daa2a53ad47b64a043a 100755 (executable)
@@ -775,6 +775,47 @@ test_expect_success GPG '-s implies annotated tag' '
        test_cmp expect actual
 '
 
+get_tag_header forcesignannotated-implied-sign $commit commit $time >expect
+echo "A message" >>expect
+echo '-----BEGIN PGP SIGNATURE-----' >>expect
+test_expect_success GPG \
+       'git tag -s implied if configured with tag.forcesignannotated' \
+       'test_config tag.forcesignannotated true &&
+       git tag -m "A message" forcesignannotated-implied-sign &&
+       get_tag_msg forcesignannotated-implied-sign >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success GPG \
+       'lightweight with no message when configured with tag.forcesignannotated' \
+       'test_config tag.forcesignannotated true &&
+       git tag forcesignannotated-lightweight &&
+       tag_exists forcesignannotated-lightweight &&
+       test_must_fail git tag -v forcesignannotated-no-message
+'
+
+get_tag_header forcesignannotated-annotate $commit commit $time >expect
+echo "A message" >>expect
+test_expect_success GPG \
+       'git tag -a disable configured tag.forcesignannotated' \
+       'test_config tag.forcesignannotated true &&
+       git tag -a -m "A message" forcesignannotated-annotate &&
+       get_tag_msg forcesignannotated-annotate >actual &&
+       test_cmp expect actual &&
+       test_must_fail git tag -v forcesignannotated-annotate
+'
+
+get_tag_header forcesignannotated-disabled $commit commit $time >expect
+echo "A message" >>expect
+echo '-----BEGIN PGP SIGNATURE-----' >>expect
+test_expect_success GPG \
+       'git tag --sign enable GPG sign' \
+       'test_config tag.forcesignannotated false &&
+       git tag --sign -m "A message" forcesignannotated-disabled &&
+       get_tag_msg forcesignannotated-disabled >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success GPG \
        'trying to create a signed tag with non-existing -F file should fail' '
        ! test -f nonexistingfile &&
@@ -1161,10 +1202,17 @@ 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' \
+       '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
 
+# try to produce invalid signature
+test_expect_success GPG \
+       'git tag -s fails if gpg is misconfigured (bad signature format)' \
+       'test_config gpg.program echo &&
+        test_must_fail git tag -s -m tail tag-gpg-failure'
+
+
 # try to verify without gpg:
 
 rm -rf gpghome
index e4fc5c826c2c02d540c64ac88374f8ad85869023..c8dc665f2fdd0f0452779e6f8576395f8b3bdf11 100755 (executable)
@@ -49,6 +49,19 @@ test_expect_success TTY 'LESS and LV envvars are set for pagination' '
        grep ^LV= pager-env.out
 '
 
+test_expect_success !MINGW,TTY 'LESS and LV envvars set by git-sh-setup' '
+       (
+               sane_unset LESS LV &&
+               PAGER="env >pager-env.out; wc" &&
+               export PAGER &&
+               PATH="$(git --exec-path):$PATH" &&
+               export PATH &&
+               test_terminal sh -c ". git-sh-setup && git_pager"
+       ) &&
+       grep ^LESS= pager-env.out &&
+       grep ^LV= pager-env.out
+'
+
 test_expect_success TTY 'some commands do not use a pager' '
        rm -f paginated.out &&
        test_terminal git rev-list HEAD &&
index 88d60c1ce2933141c0800a76fdebca9037803258..84f41451ec4e34b6438313545ca886fbef75f34d 100755 (executable)
@@ -23,17 +23,15 @@ S sub/1
 H sub/2
 EOF
 
-NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
-
 setup_absent() {
        test -f 1 && rm 1
        git update-index --remove 1 &&
-       git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+       git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 &&
        git update-index --skip-worktree 1
 }
 
 test_absent() {
-       echo "100644 $NULL_SHA1 0       1" > expected &&
+       echo "100644 $EMPTY_BLOB 0      1" > expected &&
        git ls-files --stage 1 > result &&
        test_cmp expected result &&
        test ! -f 1
@@ -42,12 +40,12 @@ test_absent() {
 setup_dirty() {
        git update-index --force-remove 1 &&
        echo dirty > 1 &&
-       git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+       git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 &&
        git update-index --skip-worktree 1
 }
 
 test_dirty() {
-       echo "100644 $NULL_SHA1 0       1" > expected &&
+       echo "100644 $EMPTY_BLOB 0      1" > expected &&
        git ls-files --stage 1 > result &&
        test_cmp expected result &&
        echo dirty > expected
@@ -120,7 +118,7 @@ test_expect_success 'grep with skip-worktree file' '
        test "$(git grep --no-ext-grep test)" = "1:test"
 '
 
-echo ":000000 100644 $_z40 $NULL_SHA1 A        1" > expected
+echo ":000000 100644 $_z40 $EMPTY_BLOB A       1" > expected
 test_expect_success 'diff-index does not examine skip-worktree absent entries' '
        setup_absent &&
        git diff-index HEAD -- 1 > result &&
index 9ceaa4049f960f20ca37d58e58e9e6c4e9ff4398..9d1abe50eff6772673df545d3e6715d4d2e6f2db 100755 (executable)
@@ -53,17 +53,15 @@ test_expect_success 'read-tree removes worktree, dirty case' '
        git update-index --no-skip-worktree added
 '
 
-NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
-
 setup_absent() {
        test -f 1 && rm 1
        git update-index --remove 1 &&
-       git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+       git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 &&
        git update-index --skip-worktree 1
 }
 
 test_absent() {
-       echo "100644 $NULL_SHA1 0       1" > expected &&
+       echo "100644 $EMPTY_BLOB 0      1" > expected &&
        git ls-files --stage 1 > result &&
        test_cmp expected result &&
        test ! -f 1
@@ -72,12 +70,12 @@ test_absent() {
 setup_dirty() {
        git update-index --force-remove 1 &&
        echo dirty > 1 &&
-       git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+       git update-index --add --cacheinfo 100644 $EMPTY_BLOB 1 &&
        git update-index --skip-worktree 1
 }
 
 test_dirty() {
-       echo "100644 $NULL_SHA1 0       1" > expected &&
+       echo "100644 $EMPTY_BLOB 0      1" > expected &&
        git ls-files --stage 1 > result &&
        test_cmp expected result &&
        echo dirty > expected
index 4608e713438f93087d12664a17654c07be38c59f..07079a41c4f6b9f89786d7eb9187655102ed9bd0 100755 (executable)
@@ -112,4 +112,17 @@ test_expect_success GPG 'verify signatures with --raw' '
        )
 '
 
+test_expect_success GPG 'verify multiple tags' '
+       tags="fourth-signed sixth-signed seventh-signed" &&
+       for i in $tags
+       do
+               git verify-tag -v --raw $i || return 1
+       done >expect.stdout 2>expect.stderr.1 &&
+       grep "^.GNUPG:." <expect.stderr.1 >expect.stderr &&
+       git verify-tag -v --raw $tags >actual.stdout 2>actual.stderr.1 &&
+       grep "^.GNUPG:." <actual.stderr.1 >actual.stderr &&
+       test_cmp expect.stdout actual.stdout &&
+       test_cmp expect.stderr actual.stderr
+'
+
 test_done
index 44bf1d84af574509c5a8f6f05721d7c4f9719439..53cf42fac19c83f2da7de1cd5b6c4ca0cf6e5ccf 100755 (executable)
@@ -34,6 +34,7 @@ test_expect_success 'M/D conflict does not segfault' '
 On branch side
 You have unmerged paths.
   (fix conflicts and run "git commit")
+  (use "git merge --abort" to abort the merge)
 
 Unmerged paths:
   (use "git add/rm <file>..." as appropriate to mark resolution)
@@ -138,6 +139,7 @@ test_expect_success 'status when conflicts with add and rm advice (deleted by th
 On branch master
 You have unmerged paths.
   (fix conflicts and run "git commit")
+  (use "git merge --abort" to abort the merge)
 
 Unmerged paths:
   (use "git add/rm <file>..." as appropriate to mark resolution)
@@ -171,6 +173,7 @@ test_expect_success 'status when conflicts with add and rm advice (both deleted)
 On branch conflict_second
 You have unmerged paths.
   (fix conflicts and run "git commit")
+  (use "git merge --abort" to abort the merge)
 
 Unmerged paths:
   (use "git add/rm <file>..." as appropriate to mark resolution)
@@ -195,6 +198,7 @@ test_expect_success 'status when conflicts with only rm advice (both deleted)' '
 On branch conflict_second
 You have unmerged paths.
   (fix conflicts and run "git commit")
+  (use "git merge --abort" to abort the merge)
 
 Changes to be committed:
 
@@ -228,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 a971884cfd8f03de29c978734812ab295fcbb08f..0667bd9dd3e8bc650bc4e47ac9fcde5d63ef0d11 100755 (executable)
@@ -4,6 +4,20 @@ test_description='test untracked cache'
 
 . ./test-lib.sh
 
+# On some filesystems (e.g. FreeBSD's ext2 and ufs) directory mtime
+# is updated lazily after contents in the directory changes, which
+# forces the untracked cache code to take the slow path.  A test
+# that wants to make sure that the fast path works correctly should
+# call this helper to make mtime of the containing directory in sync
+# with the reality before checking the fast path behaviour.
+#
+# See <20160803174522.5571-1-pclouds@gmail.com> if you want to know
+# more.
+
+sync_mtime () {
+       find . -type d -ls >/dev/null
+}
+
 avoid_racy() {
        sleep 1
 }
@@ -53,7 +67,7 @@ A  two
 EOF
 
 cat >../dump.expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -137,7 +151,7 @@ EOF
 test_expect_success 'verify untracked cache dump' '
        test-dump-untracked-cache >../actual &&
        cat >../expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -184,7 +198,7 @@ EOF
 test_expect_success 'verify untracked cache dump' '
        test-dump-untracked-cache >../actual &&
        cat >../expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -416,7 +430,8 @@ test_expect_success 'create/modify files, some of which are gitignored' '
        echo four >done/four && # four is gitignored at a higher level
        echo five >done/five && # five is not gitignored
        echo test >base && #we need to ensure that the root dir is touched
-       rm base
+       rm base &&
+       sync_mtime
 '
 
 test_expect_success 'test sparse status with untracked cache' '
@@ -643,7 +658,7 @@ test_expect_success 'test ident field is working' '
        cp -R done dthree dtwo four three ../other_worktree &&
        GIT_WORK_TREE=../other_worktree git status 2>../err &&
        echo "warning: Untracked cache is disabled on this system or location." >../expect &&
-       test_cmp ../expect ../err
+       test_i18ncmp ../expect ../err
 '
 
 test_done
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 98bcfe21aa3b6088a228593c627821a7f2740407..86f23be34aa69a9a345f95554f8a32d6ac45af5d 100755 (executable)
@@ -66,14 +66,14 @@ test_expect_success 'reset --hard message' '
        hex=$(git log -1 --format="%h") &&
        git reset --hard > .actual &&
        echo HEAD is now at $hex $(commit_msg) > .expected &&
-       test_cmp .expected .actual
+       test_i18ncmp .expected .actual
 '
 
 test_expect_success 'reset --hard message (ISO8859-1 logoutputencoding)' '
        hex=$(git log -1 --format="%h") &&
        git -c "i18n.logOutputEncoding=$test_encoding" reset --hard > .actual &&
        echo HEAD is now at $hex $(commit_msg $test_encoding) > .expected &&
-       test_cmp .expected .actual
+       test_i18ncmp .expected .actual
 '
 
 >.diff_expect
index 885923610ab927c418c848fb706f621b5380d16b..d4b217b0ee5136d2836ba9526b286659d66afe80 100755 (executable)
@@ -257,7 +257,7 @@ test_expect_success 'checkout to detach HEAD' '
        git checkout -f renamer && git clean -f &&
        git checkout renamer^ 2>messages &&
        test_i18ngrep "HEAD is now at 7329388" messages &&
-       test_line_count -gt 1 messages &&
+       (test_line_count -gt 1 messages || test -n "$GETTEXT_POISON") &&
        H=$(git rev-parse --verify HEAD) &&
        M=$(git show-ref -s --verify refs/heads/master) &&
        test "z$H" = "z$M" &&
index 86ceb38b015807ada68357fa80ffa45f4f85f287..b89fd2a6ada025fc0e68b1a1c3d7e739aacec688 100755 (executable)
@@ -495,7 +495,7 @@ test_expect_success 'should not clean submodules' '
        test_path_is_missing to_clean
 '
 
-test_expect_success POSIXPERM 'should avoid cleaning possible submodules' '
+test_expect_success POSIXPERM,SANITY 'should avoid cleaning possible submodules' '
        rm -fr to_clean possible_sub1 &&
        mkdir to_clean possible_sub1 &&
        test_when_finished "rm -rf possible_sub*" &&
index e1abd1923033617540c915af4372ba42936326d0..b77cce8e4066ac7f46ba1a02eab7215a4cdeaaae 100755 (executable)
@@ -11,6 +11,10 @@ subcommands of git submodule.
 
 . ./test-lib.sh
 
+test_expect_success 'submodule deinit works on empty repository' '
+       git submodule deinit --all
+'
+
 test_expect_success 'setup - initial commit' '
        >t &&
        git add t &&
@@ -18,6 +22,22 @@ test_expect_success 'setup - initial commit' '
        git branch initial
 '
 
+test_expect_success 'submodule init aborts on missing .gitmodules file' '
+       test_when_finished "git update-index --remove sub" &&
+       git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
+       # missing the .gitmodules file here
+       test_must_fail git submodule init 2>actual &&
+       test_i18ngrep "No url found for submodule path" actual
+'
+
+test_expect_success 'submodule update aborts on missing .gitmodules file' '
+       test_when_finished "git update-index --remove sub" &&
+       git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&
+       # missing the .gitmodules file here
+       git submodule update sub 2>actual &&
+       test_i18ngrep "Submodule path .sub. not initialized" actual
+'
+
 test_expect_success 'configuration parsing' '
        test_when_finished "rm -f .gitmodules" &&
        cat >.gitmodules <<-\EOF &&
@@ -462,7 +482,7 @@ test_expect_success 'update --init' '
        git config --remove-section submodule.example &&
        test_must_fail git config submodule.example.url &&
 
-       git submodule update init > update.out &&
+       git submodule update init 2> update.out &&
        cat update.out &&
        test_i18ngrep "not initialized" update.out &&
        test_must_fail git rev-parse --resolve-git-dir init/.git &&
@@ -480,7 +500,7 @@ test_expect_success 'update --init from subdirectory' '
        mkdir -p sub &&
        (
                cd sub &&
-               git submodule update ../init >update.out &&
+               git submodule update ../init 2>update.out &&
                cat update.out &&
                test_i18ngrep "not initialized" update.out &&
                test_must_fail git rev-parse --resolve-git-dir ../init/.git &&
@@ -818,6 +838,47 @@ test_expect_success 'submodule add --name allows to replace a submodule with ano
        )
 '
 
+test_expect_success 'recursive relative submodules stay relative' '
+       test_when_finished "rm -rf super clone2 subsub sub3" &&
+       mkdir subsub &&
+       (
+               cd subsub &&
+               git init &&
+               >t &&
+               git add t &&
+               git commit -m "initial commit"
+       ) &&
+       mkdir sub3 &&
+       (
+               cd sub3 &&
+               git init &&
+               >t &&
+               git add t &&
+               git commit -m "initial commit" &&
+               git submodule add ../subsub dirdir/subsub &&
+               git commit -m "add submodule subsub"
+       ) &&
+       mkdir super &&
+       (
+               cd super &&
+               git init &&
+               >t &&
+               git add t &&
+               git commit -m "initial commit" &&
+               git submodule add ../sub3 &&
+               git commit -m "add submodule sub"
+       ) &&
+       git clone super clone2 &&
+       (
+               cd clone2 &&
+               git submodule update --init --recursive &&
+               echo "gitdir: ../.git/modules/sub3" >./sub3/.git_expect &&
+               echo "gitdir: ../../../.git/modules/sub3/modules/dirdir/subsub" >./sub3/dirdir/subsub/.git_expect
+       ) &&
+       test_cmp clone2/sub3/.git_expect clone2/sub3/.git &&
+       test_cmp clone2/sub3/dirdir/subsub/.git_expect clone2/sub3/dirdir/subsub/.git
+'
+
 test_expect_success 'submodule add with an existing name fails unless forced' '
        (
                cd addtest2 &&
@@ -857,8 +918,9 @@ test_expect_success 'submodule deinit works on repository without submodules' '
                git init &&
                >file &&
                git add file &&
-               git commit -m "repo should not be empty"
-               git submodule deinit .
+               git commit -m "repo should not be empty" &&
+               git submodule deinit . &&
+               git submodule deinit --all
        )
 '
 
@@ -880,7 +942,7 @@ test_expect_success 'submodule deinit from subdirectory' '
                cd sub &&
                git submodule deinit ../init >../output
        ) &&
-       grep "\\.\\./init" output &&
+       test_i18ngrep "\\.\\./init" output &&
        test -z "$(git config --get-regexp "submodule\.example\.")" &&
        test -n "$(git config --get-regexp "submodule\.example2\.")" &&
        test -f example2/.git &&
@@ -900,6 +962,19 @@ test_expect_success 'submodule deinit . deinits all initialized submodules' '
        rmdir init example2
 '
 
+test_expect_success 'submodule deinit --all deinits all initialized submodules' '
+       git submodule update --init &&
+       git config submodule.example.foo bar &&
+       git config submodule.example2.frotz nitfol &&
+       test_must_fail git submodule deinit &&
+       git submodule deinit --all >actual &&
+       test -z "$(git config --get-regexp "submodule\.example\.")" &&
+       test -z "$(git config --get-regexp "submodule\.example2\.")" &&
+       test_i18ngrep "Cleared directory .init" actual &&
+       test_i18ngrep "Cleared directory .example2" actual &&
+       rmdir init example2
+'
+
 test_expect_success 'submodule deinit deinits a submodule when its work tree is missing or empty' '
        git submodule update --init &&
        rm -rf init example2/* example2/.git &&
@@ -966,6 +1041,10 @@ test_expect_success 'submodule deinit is silent when used on an uninitialized su
        test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
        test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
        test_i18ngrep "Cleared directory .init" actual &&
+       git submodule deinit --all >actual &&
+       test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&
+       test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&
+       test_i18ngrep "Cleared directory .init" actual &&
        rmdir init example2
 '
 
index 79bc135bf69ea5813f0a372db6bbefa0f9a92753..0726799e74e7a587e920c35f356b3364737b70d2 100755 (executable)
@@ -62,13 +62,13 @@ test_expect_success 'change submodule' '
 '
 
 reset_submodule_urls () {
-       local root
-       root=$(pwd) &&
        (
+               root=$(pwd) &&
                cd super-clone/submodule &&
                git config remote.origin.url "$root/submodule"
        ) &&
        (
+               root=$(pwd) &&
                cd super-clone/submodule/sub-submodule &&
                git config remote.origin.url "$root/submodule"
        )
@@ -157,7 +157,7 @@ test_expect_success '"git submodule sync" should update submodule URLs - subdire
                cd sub &&
                git submodule sync >../../output
        ) &&
-       grep "\\.\\./submodule" output &&
+       test_i18ngrep "\\.\\./submodule" output &&
        test -d "$(
                cd super-clone/submodule &&
                git config remote.origin.url
@@ -188,7 +188,7 @@ test_expect_success '"git submodule sync --recursive" should update all submodul
                cd sub &&
                git submodule sync --recursive >../../output
        ) &&
-       grep "\\.\\./submodule/sub-submodule" output &&
+       test_i18ngrep "\\.\\./submodule/sub-submodule" output &&
        test -d "$(
                cd super-clone/submodule &&
                git config remote.origin.url
index 68ea31d6936cd1b19efc812cd11f63b7a6ca4fbb..64f322c4cc87493ebc060ae5837495563fe61958 100755 (executable)
@@ -63,6 +63,10 @@ test_expect_success 'setup a submodule tree' '
         git submodule add ../none none &&
         test_tick &&
         git commit -m "none"
+       ) &&
+       git clone . recursivesuper &&
+       ( cd recursivesuper
+        git submodule add ../super super
        )
 '
 
@@ -95,6 +99,47 @@ test_expect_success 'submodule update from subdirectory' '
        )
 '
 
+supersha1=$(git -C super rev-parse HEAD)
+mergingsha1=$(git -C super/merging rev-parse HEAD)
+nonesha1=$(git -C super/none rev-parse HEAD)
+rebasingsha1=$(git -C super/rebasing rev-parse HEAD)
+submodulesha1=$(git -C super/submodule rev-parse HEAD)
+pwd=$(pwd)
+
+cat <<EOF >expect
+Submodule path '../super': checked out '$supersha1'
+Submodule path '../super/merging': checked out '$mergingsha1'
+Submodule path '../super/none': checked out '$nonesha1'
+Submodule path '../super/rebasing': checked out '$rebasingsha1'
+Submodule path '../super/submodule': checked out '$submodulesha1'
+EOF
+
+cat <<EOF >expect2
+Submodule 'merging' ($pwd/merging) registered for path '../super/merging'
+Submodule 'none' ($pwd/none) registered for path '../super/none'
+Submodule 'rebasing' ($pwd/rebasing) registered for path '../super/rebasing'
+Submodule 'submodule' ($pwd/submodule) registered for path '../super/submodule'
+Cloning into '$pwd/recursivesuper/super/merging'...
+done.
+Cloning into '$pwd/recursivesuper/super/none'...
+done.
+Cloning into '$pwd/recursivesuper/super/rebasing'...
+done.
+Cloning into '$pwd/recursivesuper/super/submodule'...
+done.
+EOF
+
+test_expect_success 'submodule update --init --recursive from subdirectory' '
+       git -C recursivesuper/super reset --hard HEAD^ &&
+       (cd recursivesuper &&
+        mkdir tmp &&
+        cd tmp &&
+        git submodule update --init --recursive ../super >../../actual 2>../../actual2
+       ) &&
+       test_i18ncmp expect actual &&
+       test_i18ncmp expect2 actual2
+'
+
 apos="'";
 test_expect_success 'submodule update does not fetch already present commits' '
        (cd submodule &&
@@ -164,9 +209,42 @@ test_expect_success 'submodule update --remote should fetch upstream changes' '
        )
 '
 
+test_expect_success 'submodule update --remote should fetch upstream changes with .' '
+       (
+               cd super &&
+               git config -f .gitmodules submodule."submodule".branch "." &&
+               git add .gitmodules &&
+               git commit -m "submodules: update from the respective superproject branch"
+       ) &&
+       (
+               cd submodule &&
+               echo line4a >> file &&
+               git add file &&
+               test_tick &&
+               git commit -m "upstream line4a" &&
+               git checkout -b test-branch &&
+               test_commit on-test-branch
+       ) &&
+       (
+               cd super &&
+               git submodule update --remote --force submodule &&
+               git -C submodule log -1 --oneline >actual
+               git -C ../submodule log -1 --oneline master >expect
+               test_cmp expect actual &&
+               git checkout -b test-branch &&
+               git submodule update --remote --force submodule &&
+               git -C submodule log -1 --oneline >actual
+               git -C ../submodule log -1 --oneline test-branch >expect
+               test_cmp expect actual &&
+               git checkout master &&
+               git branch -d test-branch &&
+               git reset --hard HEAD^
+       )
+'
+
 test_expect_success 'local config should override .gitmodules branch' '
        (cd submodule &&
-        git checkout -b test-branch &&
+        git checkout test-branch &&
         echo line5 >> file &&
         git add file &&
         test_tick &&
@@ -311,16 +389,59 @@ test_expect_success 'submodule update - command in .git/config' '
        )
 '
 
+cat << EOF >expect
+Execution of 'false $submodulesha1' failed in submodule path 'submodule'
+EOF
+
 test_expect_success 'submodule update - command in .git/config catches failure' '
        (cd super &&
         git config submodule.submodule.update "!false"
        ) &&
        (cd super/submodule &&
-         git reset --hard HEAD^
+         git reset --hard $submodulesha1^
        ) &&
        (cd super &&
-        test_must_fail git submodule update submodule
-       )
+        test_must_fail git submodule update submodule 2>../actual
+       ) &&
+       test_i18ncmp actual expect
+'
+
+cat << EOF >expect
+Execution of 'false $submodulesha1' failed in submodule path '../submodule'
+EOF
+
+test_expect_success 'submodule update - command in .git/config catches failure -- subdirectory' '
+       (cd super &&
+        git config submodule.submodule.update "!false"
+       ) &&
+       (cd super/submodule &&
+         git reset --hard $submodulesha1^
+       ) &&
+       (cd super &&
+        mkdir tmp && cd tmp &&
+        test_must_fail git submodule update ../submodule 2>../../actual
+       ) &&
+       test_i18ncmp actual expect
+'
+
+cat << EOF >expect
+Execution of 'false $submodulesha1' failed in submodule path '../super/submodule'
+Failed to recurse into submodule path '../super'
+EOF
+
+test_expect_success 'recursive submodule update - command in .git/config catches failure -- subdirectory' '
+       (cd recursivesuper &&
+        git submodule update --remote super &&
+        git add super &&
+        git commit -m "update to latest to have more than one commit in submodules"
+       ) &&
+       git -C recursivesuper/super config submodule.submodule.update "!false" &&
+       git -C recursivesuper/super/submodule reset --hard $submodulesha1^ &&
+       (cd recursivesuper &&
+        mkdir -p tmp && cd tmp &&
+        test_must_fail git submodule update --recursive ../super 2>../../actual
+       ) &&
+       test_i18ncmp actual expect
 '
 
 test_expect_success 'submodule init does not copy command into .git/config' '
@@ -753,16 +874,35 @@ test_expect_success SYMLINKS 'submodule update can handle symbolic links in pwd'
 '
 
 test_expect_success 'submodule update clone shallow submodule' '
+       test_when_finished "rm -rf super3" &&
+       first=$(git -C cloned submodule status submodule |cut -c2-41) &&
+       second=$(git -C submodule rev-parse HEAD) &&
+       commit_count=$(git -C submodule rev-list --count $first^..$second) &&
        git clone cloned super3 &&
        pwd=$(pwd) &&
-       (cd super3 &&
-        sed -e "s#url = ../#url = file://$pwd/#" <.gitmodules >.gitmodules.tmp &&
-        mv -f .gitmodules.tmp .gitmodules &&
-        git submodule update --init --depth=3
-        (cd submodule &&
-         test 1 = $(git log --oneline | wc -l)
-        )
-)
+       (
+               cd super3 &&
+               sed -e "s#url = ../#url = file://$pwd/#" <.gitmodules >.gitmodules.tmp &&
+               mv -f .gitmodules.tmp .gitmodules &&
+               git submodule update --init --depth=$commit_count &&
+               test 1 = $(git -C submodule log --oneline | wc -l)
+       )
+'
+
+test_expect_success 'submodule update clone shallow submodule outside of depth' '
+       test_when_finished "rm -rf super3" &&
+       git clone cloned super3 &&
+       pwd=$(pwd) &&
+       (
+               cd super3 &&
+               sed -e "s#url = ../#url = file://$pwd/#" <.gitmodules >.gitmodules.tmp &&
+               mv -f .gitmodules.tmp .gitmodules &&
+               test_must_fail git submodule update --init --depth=1 2>actual &&
+               test_i18ngrep "Direct fetching of that commit failed." actual &&
+               git -C ../submodule config uploadpack.allowReachableSHA1InWant true &&
+               git submodule update --init --depth=1 >actual &&
+               test 1 = $(git -C submodule log --oneline | wc -l)
+       )
 '
 
 test_expect_success 'submodule update --recursive drops module name before recursing' '
@@ -774,4 +914,31 @@ test_expect_success 'submodule update --recursive drops module name before recur
         test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
        )
 '
+
+test_expect_success 'submodule update can be run in parallel' '
+       (cd super2 &&
+        GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 7 &&
+        grep "7 tasks" trace.out &&
+        git config submodule.fetchJobs 8 &&
+        GIT_TRACE=$(pwd)/trace.out git submodule update &&
+        grep "8 tasks" trace.out &&
+        GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 9 &&
+        grep "9 tasks" trace.out
+       )
+'
+
+test_expect_success 'git clone passes the parallel jobs config on to submodules' '
+       test_when_finished "rm -rf super4" &&
+       GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 7 . super4 &&
+       grep "7 tasks" trace.out &&
+       rm -rf super4 &&
+       git config --global submodule.fetchJobs 8 &&
+       GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules . super4 &&
+       grep "8 tasks" trace.out &&
+       rm -rf super4 &&
+       GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 9 . super4 &&
+       grep "9 tasks" trace.out &&
+       rm -rf super4
+'
+
 test_done
index 7ca10b8606372051ff1a4093e320722f7784fa6b..6ba5daf42ee870ce3a30c4fdb5a7cf84c18a2c84 100755 (executable)
@@ -177,6 +177,26 @@ test_expect_success 'test messages from "foreach --recursive"' '
        test_i18ncmp expect actual
 '
 
+cat > expect <<EOF
+Entering '../nested1'
+Entering '../nested1/nested2'
+Entering '../nested1/nested2/nested3'
+Entering '../nested1/nested2/nested3/submodule'
+Entering '../sub1'
+Entering '../sub2'
+Entering '../sub3'
+EOF
+
+test_expect_success 'test messages from "foreach --recursive" from subdirectory' '
+       (
+               cd clone2 &&
+               mkdir untracked &&
+               cd untracked &&
+               git submodule foreach --recursive >../../actual
+       ) &&
+       test_i18ncmp expect actual
+'
+
 cat > expect <<EOF
 nested1-nested1
 nested2-nested2
@@ -242,8 +262,12 @@ test_expect_success 'test "status --recursive"' '
        test_cmp expect actual
 '
 
-sed -e "/nested2 /s/.*/+$nested2sha1 nested1\/nested2 (file2~1)/;/sub[1-3]/d" < expect > expect2
-mv -f expect2 expect
+cat > expect <<EOF
+ $nested1sha1 nested1 (heads/master)
++$nested2sha1 nested1/nested2 (file2~1)
+ $nested3sha1 nested1/nested2/nested3 (heads/master)
+ $submodulesha1 nested1/nested2/nested3/submodule (heads/master)
+EOF
 
 test_expect_success 'ensure "status --cached --recursive" preserves the --cached flag' '
        (
@@ -257,6 +281,27 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached
        test_cmp expect actual
 '
 
+nested2sha1=$(git -C clone3/nested1/nested2 rev-parse HEAD)
+
+cat > expect <<EOF
+ $nested1sha1 ../nested1 (heads/master)
++$nested2sha1 ../nested1/nested2 (file2)
+ $nested3sha1 ../nested1/nested2/nested3 (heads/master)
+ $submodulesha1 ../nested1/nested2/nested3/submodule (heads/master)
+ $sub1sha1 ../sub1 ($sub1sha1_short)
+ $sub2sha1 ../sub2 ($sub2sha1_short)
+ $sub3sha1 ../sub3 (heads/master)
+EOF
+
+test_expect_success 'test "status --recursive" from sub directory' '
+       (
+               cd clone3 &&
+               mkdir tmp && cd tmp &&
+               git submodule status --recursive > ../../actual
+       ) &&
+       test_cmp expect actual
+'
+
 test_expect_success 'use "git clone --recursive" to checkout all submodules' '
        git clone --recursive super clone4 &&
        (
index eaea19b8f291ef6b9f13a05342dc10317f3bfbe9..1c1e289ffd982ab74ed80fb776b3ecc4d7abf2f1 100755 (executable)
@@ -8,74 +8,121 @@ 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_done
index fc97c3314e2d89e11b4a846457f5e183f4fc42c0..47562ce4654db9d763cdf0c6d6b91724489110ff 100755 (executable)
@@ -82,6 +82,17 @@ test_expect_success 'error in one submodule config lets continue' '
        )
 '
 
+test_expect_success 'error message contains blob reference' '
+       (cd super &&
+               sha1=$(git rev-parse HEAD) &&
+               test-submodule-config \
+                       HEAD b \
+                       HEAD submodule \
+                               2>actual_err &&
+               test_i18ngrep "submodule-blob $sha1:.gitmodules" actual_err >/dev/null
+       )
+'
+
 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'
index 63e04277f99a08b15e12c3392f9e128147180fad..0d8d893090e18af677b8c63b19c30c574b237ac9 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
@@ -200,6 +209,26 @@ test_expect_success '--amend --edit of empty message' '
        test_cmp expect msg
 '
 
+test_expect_success '--amend to set message to empty' '
+       echo bata >file &&
+       git add file &&
+       git commit -m "unamended" &&
+       git commit --amend --allow-empty-message -m "" &&
+       git diff-tree -s --format=%s HEAD >msg &&
+       echo "" >expect &&
+       test_cmp expect msg
+'
+
+test_expect_success '--amend to set empty message needs --allow-empty-message' '
+       echo conga >file &&
+       git add file &&
+       git commit -m "unamended" &&
+       test_must_fail git commit --amend -m "" &&
+       git diff-tree -s --format=%s HEAD >msg &&
+       echo "unamended" >expect &&
+       test_cmp expect msg
+'
+
 test_expect_success '-m --edit' '
        echo amended >expect &&
        git commit --allow-empty -m buffer &&
@@ -587,4 +616,24 @@ test_expect_success '--only works on to-be-born branch' '
        test_cmp expected actual
 '
 
+test_expect_success '--dry-run with conflicts fixed from a merge' '
+       # setup two branches with conflicting information
+       # in the same file, resolve the conflict,
+       # call commit with --dry-run
+       echo "Initial contents, unimportant" >test-file &&
+       git add test-file &&
+       git commit -m "Initial commit" &&
+       echo "commit-1-state" >test-file &&
+       git commit -m "commit 1" -i test-file &&
+       git tag commit-1 &&
+       git checkout -b branch-2 HEAD^1 &&
+       echo "commit-2-state" >test-file &&
+       git commit -m "commit 2" -i test-file &&
+       ! $(git merge --no-commit commit-1) &&
+       echo "commit-2-state" >test-file &&
+       git add test-file &&
+       git commit --dry-run &&
+       git commit -m "conflicts fixed from merge."
+'
+
 test_done
index b39e313ac2a7393899e2fbaa5bc860c4d95c68ee..725687d5d5f26d6535b3f26d1fa221a8c567d57c 100755 (executable)
@@ -527,11 +527,6 @@ try_commit_status_combo () {
                test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
        '
 
-       test_expect_success 'commit' '
-               try_commit "" &&
-               test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
-       '
-
        test_expect_success 'commit --status' '
                try_commit --status &&
                test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG
index 2ddf28c984de99cb17884f76d68a708076f57e12..ed2653d46fe6cd0ed1dd5dc2dfd73f7340b8fe31 100755 (executable)
@@ -3,11 +3,10 @@
 test_description='verbose commit template'
 . ./test-lib.sh
 
-cat >check-for-diff <<EOF
-#!$SHELL_PATH
-exec grep '^diff --git' "\$1"
+write_script "check-for-diff" <<\EOF &&
+grep '^diff --git' "$1" >out
+exit 0
 EOF
-chmod +x check-for-diff
 test_set_editor "$PWD/check-for-diff"
 
 cat >message <<'EOF'
@@ -23,7 +22,8 @@ test_expect_success 'setup' '
 '
 
 test_expect_success 'initial commit shows verbose diff' '
-       git commit --amend -v
+       git commit --amend -v &&
+       test_line_count = 1 out
 '
 
 test_expect_success 'second commit' '
@@ -39,13 +39,15 @@ check_message() {
 
 test_expect_success 'verbose diff is stripped out' '
        git commit --amend -v &&
-       check_message message
+       check_message message &&
+       test_line_count = 1 out
 '
 
 test_expect_success 'verbose diff is stripped out (mnemonicprefix)' '
        git config diff.mnemonicprefix true &&
        git commit --amend -v &&
-       check_message message
+       check_message message &&
+       test_line_count = 1 out
 '
 
 cat >diff <<'EOF'
@@ -96,4 +98,60 @@ test_expect_success 'verbose diff is stripped out with set core.commentChar' '
        test_i18ngrep "Aborting commit due to empty commit message." err
 '
 
+test_expect_success 'status does not verbose without --verbose' '
+       git status >actual &&
+       ! grep "^diff --git" actual
+'
+
+test_expect_success 'setup -v -v' '
+       echo dirty >file
+'
+
+for i in true 1
+do
+       test_expect_success "commit.verbose=$i and --verbose omitted" "
+               git -c commit.verbose=$i commit --amend &&
+               test_line_count = 1 out
+       "
+done
+
+for i in false -2 -1 0
+do
+       test_expect_success "commit.verbose=$i and --verbose omitted" "
+               git -c commit.verbose=$i commit --amend &&
+               test_line_count = 0 out
+       "
+done
+
+for i in 2 3
+do
+       test_expect_success "commit.verbose=$i and --verbose omitted" "
+               git -c commit.verbose=$i commit --amend &&
+               test_line_count = 2 out
+       "
+done
+
+for i in true false -2 -1 0 1 2 3
+do
+       test_expect_success "commit.verbose=$i and --verbose" "
+               git -c commit.verbose=$i commit --amend --verbose &&
+               test_line_count = 1 out
+       "
+
+       test_expect_success "commit.verbose=$i and --no-verbose" "
+               git -c commit.verbose=$i commit --amend --no-verbose &&
+               test_line_count = 0 out
+       "
+
+       test_expect_success "commit.verbose=$i and -v -v" "
+               git -c commit.verbose=$i commit --amend -v -v &&
+               test_line_count = 2 out
+       "
+done
+
+test_expect_success "status ignores commit.verbose=true" '
+       git -c commit.verbose=true status >actual &&
+       ! grep "^diff --git actual"
+'
+
 test_done
index c3ed7cb51c9a73b5bb6152b56824e6c6b8347d2c..fb00e6d9b07f4cc6f478bb532749403017599400 100755 (executable)
@@ -803,7 +803,7 @@ EOF
 '
 
 cat >expect <<EOF
-:100644 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 M     dir1/modified
+:100644 100644 $EMPTY_BLOB 0000000000000000000000000000000000000000 M  dir1/modified
 EOF
 test_expect_success 'status refreshes the index' '
        touch dir2/added &&
@@ -1377,7 +1377,7 @@ EOF
        git config --add -f .gitmodules submodule.subname.ignore all &&
        git config --add -f .gitmodules submodule.subname.path sm &&
        git status > output &&
-       test_cmp expect output &&
+       test_i18ncmp expect output &&
        git config -f .gitmodules  --remove-section submodule.subname
 '
 
@@ -1387,7 +1387,7 @@ test_expect_success '.git/config ignore=all suppresses unstaged submodule summar
        git config --add submodule.subname.ignore all &&
        git config --add submodule.subname.path sm &&
        git status > output &&
-       test_cmp expect output &&
+       test_i18ncmp expect output &&
        git config --remove-section submodule.subname &&
        git config -f .gitmodules  --remove-section submodule.subname
 '
index 18e5cf06630273a6131d13d9a82f085d33f15153..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' '
@@ -45,12 +46,18 @@ test_expect_success GPG 'create signed commits' '
        git tag seventh-signed &&
 
        echo 8 >file && test_tick && git commit -a -m eighth -SB7227189 &&
-       git tag eighth-signed-alt
+       git tag eighth-signed-alt &&
+
+       # commit.gpgsign is still on but this must not be signed
+       git tag ninth-unsigned $(echo 9 | git commit-tree HEAD^{tree}) &&
+       # explicit -S of course must sign.
+       git tag tenth-signed $(echo 9 | git commit-tree -S HEAD^{tree})
 '
 
 test_expect_success GPG 'verify and show signatures' '
        (
-               for commit in initial second merge fourth-signed fifth-signed sixth-signed seventh-signed
+               for commit in initial second merge fourth-signed \
+                       fifth-signed sixth-signed seventh-signed tenth-signed
                do
                        git verify-commit $commit &&
                        git show --pretty=short --show-signature $commit >actual &&
@@ -60,7 +67,8 @@ test_expect_success GPG 'verify and show signatures' '
                done
        ) &&
        (
-               for commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned
+               for commit in merge^2 fourth-unsigned sixth-unsigned \
+                       seventh-unsigned ninth-unsigned
                do
                        test_must_fail git verify-commit $commit &&
                        git show --pretty=short --show-signature $commit >actual &&
@@ -183,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
@@ -193,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
@@ -203,4 +221,11 @@ test_expect_success GPG 'show lack of signature with custom format' '
        test_cmp expect actual
 '
 
+test_expect_success GPG 'log.showsignature behaves like --show-signature' '
+       test_config log.showsignature true &&
+       git show initial >actual &&
+       grep "gpg: Signature made" actual &&
+       grep "gpg: Good signature" actual
+'
+
 test_done
index 49d19a3b36d0649dfd01de29acdbf0fab2532e17..5c3db656dfaa0171598445720b62e63f13f67f44 100755 (executable)
@@ -29,6 +29,7 @@ test_expect_success 'status when conflicts unresolved' '
 On branch conflicts
 You have unmerged paths.
   (fix conflicts and run "git commit")
+  (use "git merge --abort" to abort the merge)
 
 Unmerged paths:
   (use "git add <file>..." to mark resolution)
index aee785cffa8d656fa52e6b893921153faf748fe9..4dd1d7c52085d25546f64692acd0b351a7dddd72 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 &&
index 337e6e30c35fd6881eb20e9ec27ac81662c3a8e7..2a22fa7588d365c11b35cfdcee82dbef3f97ecaf 100755 (executable)
@@ -36,4 +36,51 @@ test_expect_success 'succeeds cloning if global email is not set' '
        git clone . clone
 '
 
+test_expect_success 'set up rebase scenarios' '
+       # temporarily enable an actual ident for this setup
+       test_config user.email foo@example.com &&
+       test_commit new &&
+       git branch side-without-commit HEAD^ &&
+       git checkout -b side-with-commit HEAD^ &&
+       test_commit side
+'
+
+test_expect_success 'fast-forward rebase does not care about ident' '
+       git checkout -B tmp side-without-commit &&
+       git rebase master
+'
+
+test_expect_success 'non-fast-forward rebase refuses to write commits' '
+       test_when_finished "git rebase --abort || true" &&
+       git checkout -B tmp side-with-commit &&
+       test_must_fail git rebase master
+'
+
+test_expect_success 'fast-forward rebase does not care about ident (interactive)' '
+       git checkout -B tmp side-without-commit &&
+       git rebase -i master
+'
+
+test_expect_success 'non-fast-forward rebase refuses to write commits (interactive)' '
+       test_when_finished "git rebase --abort || true" &&
+       git checkout -B tmp side-with-commit &&
+       test_must_fail git rebase -i master
+'
+
+test_expect_success 'noop interactive rebase does not care about ident' '
+       git checkout -B tmp side-with-commit &&
+       git rebase -i HEAD^
+'
+
+test_expect_success 'fast-forward rebase does not care about ident (preserve)' '
+       git checkout -B tmp side-without-commit &&
+       git rebase -p master
+'
+
+test_expect_success 'non-fast-forward rebase refuses to write commits (preserve)' '
+       test_when_finished "git rebase --abort || true" &&
+       git checkout -B tmp side-with-commit &&
+       test_must_fail git rebase -p master
+'
+
 test_done
index 302e23826341bce6c3797330b5f2996877dc5baf..85248a14b61d68b61932d595eb0fa8fcaa8506b1 100755 (executable)
@@ -33,9 +33,11 @@ printf '%s\n' 1 2 3 4 5 6 7 8 9 >file
 printf '%s\n' '1 X' 2 3 4 5 6 7 8 9 >file.1
 printf '%s\n' 1 2 3 4 '5 X' 6 7 8 9 >file.5
 printf '%s\n' 1 2 3 4 5 6 7 8 '9 X' >file.9
+printf '%s\n' 1 2 3 4 5 6 7 8 '9 Y' >file.9y
 printf '%s\n' '1 X' 2 3 4 5 6 7 8 9 >result.1
 printf '%s\n' '1 X' 2 3 4 '5 X' 6 7 8 9 >result.1-5
 printf '%s\n' '1 X' 2 3 4 '5 X' 6 7 8 '9 X' >result.1-5-9
+printf '%s\n' 1 2 3 4 5 6 7 8 '9 Z' >result.9z
 >empty
 
 create_merge_msgs () {
@@ -128,6 +130,12 @@ test_expect_success 'setup' '
        git tag c2 &&
        c2=$(git rev-parse HEAD) &&
        git reset --hard "$c0" &&
+       cp file.9y file &&
+       git add file &&
+       test_tick &&
+       git commit -m "commit 7" &&
+       git tag c7 &&
+       git reset --hard "$c0" &&
        cp file.9 file &&
        git add file &&
        test_tick &&
@@ -218,6 +226,26 @@ test_expect_success 'merge c1 with c2' '
        verify_parents $c1 $c2
 '
 
+test_expect_success 'merge --squash c3 with c7' '
+       git reset --hard c3 &&
+       test_must_fail git merge --squash c7 &&
+       cat result.9z >file &&
+       git commit --no-edit -a &&
+
+       {
+               cat <<-EOF
+               Squashed commit of the following:
+
+               $(git show -s c7)
+
+               # Conflicts:
+               #       file
+               EOF
+       } >expect &&
+       git cat-file commit HEAD | sed -e '1,/^$/d' >actual &&
+       test_cmp expect actual
+'
+
 test_debug 'git log --graph --decorate --oneline --all'
 
 test_expect_success 'merge c1 with c2 and c3' '
@@ -725,4 +753,14 @@ test_expect_success 'merge detects mod-256 conflicts (resolve)' '
        test_must_fail git merge -s resolve master
 '
 
+test_expect_success 'merge nothing into void' '
+       git init void &&
+       (
+               cd void &&
+               git remote add up .. &&
+               git fetch up &&
+               test_must_fail git merge FETCH_HEAD
+       )
+'
+
 test_done
index 0cb9d11f2171de19b260391017310f0ee792f89b..5d56c3854647b2f2bc2fdf4221b1f76f5d0b0629 100755 (executable)
@@ -27,7 +27,7 @@ test_expect_success 'setup' '
        git tag c3
 '
 
-test_expect_success 'merge c1 to c2' '
+merge_c1_to_c2_cmds='
        git reset --hard c1 &&
        git merge -s resolve c2 &&
        test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
@@ -41,6 +41,10 @@ test_expect_success 'merge c1 to c2' '
        test 3 = $(git ls-files | wc -l)
 '
 
+test_expect_success 'merge c1 to c2'        "$merge_c1_to_c2_cmds"
+
+test_expect_success 'merge c1 to c2, again' "$merge_c1_to_c2_cmds"
+
 test_expect_success 'merge c2 to c3 (fails)' '
        git reset --hard c2 &&
        test_must_fail git merge -s resolve c3
index 758a623cdbb5f7e367bcfce5c239d79258c46e84..9444d6a9b9026748028178c4b66ee8bbbc1d89fa 100755 (executable)
@@ -115,7 +115,7 @@ cat >expect <<\EOF
 error: The following untracked working tree files would be overwritten by merge:
        sub
        sub2
-Please move or remove them before you can merge.
+Please move or remove them before you merge.
 Aborting
 EOF
 
@@ -125,7 +125,7 @@ test_expect_success 'will not overwrite untracked file in leading path' '
        cp important sub &&
        cp important sub2 &&
        test_must_fail git merge sub 2>out &&
-       test_cmp out expect &&
+       test_i18ncmp out expect &&
        test_path_is_missing .git/MERGE_HEAD &&
        test_cmp important sub &&
        test_cmp important sub2 &&
index 85cd971f243bcdbe56481daa5a8a7383976d4dc3..e90413204ee32cafc3380244a5cf013eadcd72c1 100755 (executable)
@@ -31,7 +31,7 @@ error: The following untracked working tree files would be overwritten by merge:
        four
        three
        two
-Please move or remove them before you can merge.
+Please move or remove them before you merge.
 Aborting
 EOF
 
@@ -53,10 +53,10 @@ error: Your local changes to the following files would be overwritten by merge:
        four
        three
        two
-Please commit your changes or stash them before you can merge.
+Please commit your changes or stash them before you merge.
 error: The following untracked working tree files would be overwritten by merge:
        five
-Please move or remove them before you can merge.
+Please move or remove them before you merge.
 Aborting
 EOF
 
@@ -72,7 +72,7 @@ cat >expect <<\EOF
 error: Your local changes to the following files would be overwritten by checkout:
        rep/one
        rep/two
-Please commit your changes or stash them before you can switch branches.
+Please commit your changes or stash them before you switch branches.
 Aborting
 EOF
 
@@ -94,7 +94,7 @@ cat >expect <<\EOF
 error: Your local changes to the following files would be overwritten by checkout:
        rep/one
        rep/two
-Please commit your changes or stash them before you can switch branches.
+Please commit your changes or stash them before you switch branches.
 Aborting
 EOF
 
index 6f12b235b3a9330497e814d5e8f564aec94d0c44..63d36fb28e44426708a743979c4bc341bdac714e 100755 (executable)
@@ -243,6 +243,70 @@ test_expect_success 'mergetool takes partial path' '
        git reset --hard
 '
 
+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_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 &&
+       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 &&
+       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_expect_success 'mergetool produces no errors when keepBackup is used' '
+       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_expect_success 'mergetool honors tempfile config for deleted files' '
+       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_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
+       test_config mergetool.keepTemporaries true &&
+       test_must_fail git merge move-to-b &&
+       ! (echo a; echo n) | git mergetool a/a/file.txt &&
+       test -d a/a &&
+       cat >expect <<-\EOF &&
+       file_BASE_.txt
+       file_LOCAL_.txt
+       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_expect_success 'deleted vs modified submodule' '
        git checkout -b test6 branch1 &&
        git submodule update -N &&
@@ -525,7 +589,13 @@ test_expect_success 'filenames seen by tools start with ./' '
        git reset --hard master >/dev/null 2>&1
 '
 
-test_expect_success 'temporary filenames are used with mergetool.writeToTemp' '
+test_lazy_prereq MKTEMP '
+       tempdir=$(mktemp -d -t foo.XXXXXX) &&
+       test -d "$tempdir" &&
+       rmdir "$tempdir"
+'
+
+test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToTemp' '
        git checkout -b test16 branch1 &&
        test_config mergetool.writeToTemp true &&
        test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
@@ -537,4 +607,64 @@ test_expect_success 'temporary filenames are used with mergetool.writeToTemp' '
        git reset --hard master >/dev/null 2>&1
 '
 
+test_expect_success 'diff.orderFile configuration is honored' '
+       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 &&
+       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 &&
+       test_must_fail git merge order-file-side1 &&
+       cat >expect <<-\EOF &&
+               Merging:
+               b
+               a
+       EOF
+       git mergetool --no-prompt --tool myecho >output &&
+       git grep --no-index -h -A2 Merging: output >actual &&
+       test_cmp expect actual &&
+       git reset --hard >/dev/null
+'
+test_expect_success 'mergetool -Oorder-file is honored' '
+       test_config diff.orderFile order-file &&
+       test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+       test_config mergetool.myecho.trustExitCode true &&
+       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 >/dev/null 2>&1 &&
+
+       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 &&
+       git reset --hard >/dev/null 2>&1
+'
+
 test_done
index b66e3838665ea47d748a7e1a64facd755ee32fb8..987573c41fcd4aee3d5f8fd8aa587c97551c1872 100755 (executable)
@@ -122,4 +122,32 @@ test_expect_success 'keep packed objects found only in index' '
        git cat-file blob :file
 '
 
+test_expect_success 'repack -k keeps unreachable packed objects' '
+       # create packed-but-unreachable object
+       sha1=$(echo unreachable-packed | git hash-object -w --stdin) &&
+       pack=$(echo $sha1 | git pack-objects .git/objects/pack/pack) &&
+       git prune-packed &&
+
+       # -k should keep it
+       git repack -adk &&
+       git cat-file -p $sha1 &&
+
+       # and double check that without -k it would have been removed
+       git repack -ad &&
+       test_must_fail git cat-file -p $sha1
+'
+
+test_expect_success 'repack -k packs unreachable loose objects' '
+       # create loose unreachable object
+       sha1=$(echo would-be-deleted-loose | git hash-object -w --stdin) &&
+       objpath=.git/objects/$(echo $sha1 | sed "s,..,&/,") &&
+       test_path_is_file $objpath &&
+
+       # and confirm that the loose object goes away, but we can
+       # still access it (ergo, it is packed)
+       git repack -adk &&
+       test_path_is_missing $objpath &&
+       git cat-file -p $sha1
+'
+
 test_done
index 4e713f7aa54d4713cfd74978460ec9aa144fc773..99d4123461096196c11368864c1f8c3d524d5c1a 100755 (executable)
@@ -20,7 +20,7 @@ difftool_test_setup ()
 prompt_given ()
 {
        prompt="$1"
-       test "$prompt" = "Launch 'test-tool' [Y/n]: branch"
+       test "$prompt" = "Launch 'test-tool' [Y/n]? branch"
 }
 
 # Create a file on master and change it on branch
@@ -124,6 +124,12 @@ 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_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' '
        difftool_test_setup &&
        test_config merge.tool bogus-tool &&
@@ -368,6 +374,7 @@ test_expect_success PERL 'setup change in subdirectory' '
        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 &&
@@ -403,12 +410,63 @@ 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 &&
+               # "sub" must only exist in "right"
+               # "file" and "file2" must be listed in both "left" and "right"
+               test "1" = $(grep sub output | wc -l) &&
+               test "2" = $(grep file"$" output | wc -l) &&
+               test "2" = $(grep file2 output | wc -l)
+       )
+'
+
+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.
+               test "2" = $(grep sub output | wc -l) &&
+               test "2" = $(grep file output | wc -l) &&
+               test "0" = $(grep file2 output | wc -l)
+       )
+'
+
+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
+               test "1" = $(grep sub output | wc -l) &&
+               test "0" = $(grep file output | wc -l)
+       )
+'
+
+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
+               test "2" = $(grep sub output | wc -l) &&
+               test "0" = $(grep file output | wc -l)
+       )
+'
+
+run_dir_diff_test 'difftool --dir-diff from subdirectory with GIT_DIR set' '
+       (
+               GIT_DIR=$(pwd)/.git &&
+               export GIT_DIR &&
+               GIT_WORK_TREE=$(pwd) &&
+               export GIT_WORK_TREE &&
+               cd sub &&
+               git difftool --dir-diff $symlinks --extcmd ls \
+                       branch -- sub >output &&
                grep sub output &&
-               grep file output
+               grep file output
        )
 '
 
@@ -419,11 +477,34 @@ run_dir_diff_test 'difftool --dir-diff when worktree file is missing' '
        grep file2 output
 '
 
+run_dir_diff_test 'difftool --dir-diff with unmerged files' '
+       test_when_finished git reset --hard &&
+       test_config difftool.echo.cmd "echo ok" &&
+       git checkout -B conflict-a &&
+       git checkout -B conflict-b &&
+       git checkout conflict-a &&
+       echo a >>file &&
+       git add file &&
+       git commit -m conflict-a &&
+       git checkout conflict-b &&
+       echo b >>file &&
+       git add file &&
+       git commit -m conflict-b &&
+       git checkout master &&
+       git merge conflict-a &&
+       test_must_fail git merge conflict-b &&
+       cat >expect <<-EOF &&
+               ok
+       EOF
+       git difftool --dir-diff $symlinks -t echo >actual &&
+       test_cmp expect actual
+'
+
 write_script .git/CHECK_SYMLINKS <<\EOF
 for f in file file2 sub/sub
 do
        echo "$f"
-       readlink "$2/$f"
+       ls -ld "$2/$f" | sed -e 's/.* -> //'
 done >actual
 EOF
 
index b540944408a6feb35f28ff7e18601db7a29f8635..de2405ccba29016d2b83e16482bcfcbe70429e46 100755 (executable)
@@ -9,7 +9,9 @@ test_description='git grep various.
 . ./test-lib.sh
 
 cat >hello.c <<EOF
+#include <assert.h>
 #include <stdio.h>
+
 int main(int argc, const char **argv)
 {
        printf("Hello world.\n");
@@ -175,7 +177,7 @@ do
 
        test_expect_success "grep -c $L (no /dev/null)" '
                ! git grep -c test $H | grep /dev/null
-        '
+       '
 
        test_expect_success "grep --max-depth -1 $L" '
                {
@@ -353,7 +355,7 @@ test_expect_success 'grep -l -C' '
 cat >expected <<EOF
 file:5
 EOF
-test_expect_success 'grep -l -C' '
+test_expect_success 'grep -c -C' '
        git grep -c -C1 foo >actual &&
        test_cmp expected actual
 '
@@ -579,7 +581,7 @@ test_expect_success 'log grep (9)' '
 '
 
 test_expect_success 'log grep (9)' '
-       git log -g --grep-reflog="commit: third" --author="non-existant" --pretty=tformat:%s >actual &&
+       git log -g --grep-reflog="commit: third" --author="non-existent" --pretty=tformat:%s >actual &&
        : >expect &&
        test_cmp expect actual
 '
@@ -715,6 +717,7 @@ test_expect_success 'grep -p' '
 
 cat >expected <<EOF
 hello.c-#include <stdio.h>
+hello.c-
 hello.c=int main(int argc, const char **argv)
 hello.c-{
 hello.c-       printf("Hello world.\n");
@@ -740,6 +743,16 @@ test_expect_success 'grep -W' '
        test_cmp expected actual
 '
 
+cat >expected <<EOF
+hello.c-#include <assert.h>
+hello.c:#include <stdio.h>
+EOF
+
+test_expect_success 'grep -W shows no trailing empty lines' '
+       git grep -W stdio >actual &&
+       test_cmp expected actual
+'
+
 cat >expected <<EOF
 hello.c=       printf("Hello world.\n");
 hello.c:       return 0;
@@ -905,6 +918,33 @@ test_expect_success 'inside git repository but with --no-index' '
        )
 '
 
+test_expect_success 'grep --no-index descends into repos, but not .git' '
+       rm -fr non &&
+       mkdir -p non/git &&
+       (
+               GIT_CEILING_DIRECTORIES="$(pwd)/non" &&
+               export GIT_CEILING_DIRECTORIES &&
+               cd non/git &&
+
+               echo magic >file &&
+               git init repo &&
+               (
+                       cd repo &&
+                       echo magic >file &&
+                       git add file &&
+                       git commit -m foo &&
+                       echo magic >.git/file
+               ) &&
+
+               cat >expect <<-\EOF &&
+               file
+               repo/file
+               EOF
+               git grep -l --no-index magic >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_expect_success 'setup double-dash tests' '
 cat >double-dash <<EOF &&
 --
@@ -1205,8 +1245,8 @@ test_expect_success 'grep --heading' '
 
 cat >expected <<EOF
 <BOLD;GREEN>hello.c<RESET>
-2:int main(int argc, const <BLACK;BYELLOW>char<RESET> **argv)
-6:     /* <BLACK;BYELLOW>char<RESET> ?? */
+4:int main(int argc, const <BLACK;BYELLOW>char<RESET> **argv)
+8:     /* <BLACK;BYELLOW>char<RESET> ?? */
 
 <BOLD;GREEN>hello_world<RESET>
 3:Hel<BLACK;BYELLOW>lo_w<RESET>orld
@@ -1313,7 +1353,7 @@ test_expect_success 'grep --color -e A --and --not -e B with context' '
 '
 
 cat >expected <<EOF
-hello.c-#include <stdio.h>
+hello.c-
 hello.c=int main(int argc, const char **argv)
 hello.c-{
 hello.c:       pr<RED>int<RESET>f("<RED>Hello<RESET> world.\n");
@@ -1337,4 +1377,62 @@ test_expect_success 'grep --color -e A --and -e B -p with context' '
        test_cmp expected actual
 '
 
+test_expect_success 'grep can find things only in the work tree' '
+       : >work-tree-only &&
+       git add work-tree-only &&
+       test_when_finished "git rm -f work-tree-only" &&
+       echo "find in work tree" >work-tree-only &&
+       git grep --quiet "find in work tree" &&
+       test_must_fail git grep --quiet --cached "find in work tree" &&
+       test_must_fail git grep --quiet "find in work tree" HEAD
+'
+
+test_expect_success 'grep can find things only in the work tree (i-t-a)' '
+       echo "intend to add this" >intend-to-add &&
+       git add -N intend-to-add &&
+       test_when_finished "git rm -f intend-to-add" &&
+       git grep --quiet "intend to add this" &&
+       test_must_fail git grep --quiet --cached "intend to add this" &&
+       test_must_fail git grep --quiet "intend to add this" HEAD
+'
+
+test_expect_success 'grep does not search work tree with assume unchanged' '
+       echo "intend to add this" >intend-to-add &&
+       git add -N intend-to-add &&
+       git update-index --assume-unchanged intend-to-add &&
+       test_when_finished "git rm -f intend-to-add" &&
+       test_must_fail git grep --quiet "intend to add this" &&
+       test_must_fail git grep --quiet --cached "intend to add this" &&
+       test_must_fail git grep --quiet "intend to add this" HEAD
+'
+
+test_expect_success 'grep can find things only in the index' '
+       echo "only in the index" >cache-this &&
+       git add cache-this &&
+       rm cache-this &&
+       test_when_finished "git rm --cached cache-this" &&
+       test_must_fail git grep --quiet "only in the index" &&
+       git grep --quiet --cached "only in the index" &&
+       test_must_fail git grep --quiet "only in the index" HEAD
+'
+
+test_expect_success 'grep does not report i-t-a with -L --cached' '
+       echo "intend to add this" >intend-to-add &&
+       git add -N intend-to-add &&
+       test_when_finished "git rm -f intend-to-add" &&
+       git ls-files | grep -v "^intend-to-add\$" >expected &&
+       git grep -L --cached "nonexistent_string" >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'grep does not report i-t-a and assume unchanged with -L' '
+       echo "intend to add this" >intend-to-add-assume-unchanged &&
+       git add -N intend-to-add-assume-unchanged &&
+       test_when_finished "git rm -f intend-to-add-assume-unchanged" &&
+       git update-index --assume-unchanged intend-to-add-assume-unchanged &&
+       git ls-files | grep -v "^intend-to-add-assume-unchanged\$" >expected &&
+       git grep -L "nonexistent_string" >actual &&
+       test_cmp expected actual
+'
+
 test_done
diff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh
new file mode 100755 (executable)
index 0000000..169fd8d
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+test_description='grep icase on non-English locales'
+
+. ./lib-gettext.sh
+
+test_expect_success GETTEXT_LOCALE 'setup' '
+       test_write_lines "TILRAUN: Halló Heimur!" >file &&
+       git add file &&
+       LC_ALL="$is_IS_locale" &&
+       export LC_ALL
+'
+
+test_have_prereq GETTEXT_LOCALE &&
+test-regex "HALLÓ" "Halló" ICASE &&
+test_set_prereq REGEX_LOCALE
+
+test_expect_success REGEX_LOCALE 'grep literal string, no -F' '
+       git grep -i "TILRAUN: Halló Heimur!" &&
+       git grep -i "TILRAUN: HALLÓ HEIMUR!"
+'
+
+test_expect_success GETTEXT_LOCALE,LIBPCRE 'grep pcre utf-8 icase' '
+       git grep --perl-regexp    "TILRAUN: H.lló Heimur!" &&
+       git grep --perl-regexp -i "TILRAUN: H.lló Heimur!" &&
+       git grep --perl-regexp -i "TILRAUN: H.LLÓ HEIMUR!"
+'
+
+test_expect_success GETTEXT_LOCALE,LIBPCRE 'grep pcre utf-8 string with "+"' '
+       test_write_lines "TILRAUN: Hallóó Heimur!" >file2 &&
+       git add file2 &&
+       git grep -l --perl-regexp "TILRAUN: H.lló+ Heimur!" >actual &&
+       echo file >expected &&
+       echo file2 >>expected &&
+       test_cmp expected actual
+'
+
+test_expect_success REGEX_LOCALE 'grep literal string, with -F' '
+       git grep --debug -i -F "TILRAUN: Halló Heimur!"  2>&1 >/dev/null |
+                grep fixed >debug1 &&
+       test_write_lines "fixed TILRAUN: Halló Heimur!" >expect1 &&
+       test_cmp expect1 debug1 &&
+
+       git grep --debug -i -F "TILRAUN: HALLÓ HEIMUR!"  2>&1 >/dev/null |
+                grep fixed >debug2 &&
+       test_write_lines "fixed TILRAUN: HALLÓ HEIMUR!" >expect2 &&
+       test_cmp expect2 debug2
+'
+
+test_expect_success REGEX_LOCALE 'grep string with regex, with -F' '
+       test_write_lines "^*TILR^AUN:.* \\Halló \$He[]imur!\$" >file &&
+
+       git grep --debug -i -F "^*TILR^AUN:.* \\Halló \$He[]imur!\$" 2>&1 >/dev/null |
+                grep fixed >debug1 &&
+       test_write_lines "fixed \\^*TILR^AUN:\\.\\* \\\\Halló \$He\\[]imur!\\\$" >expect1 &&
+       test_cmp expect1 debug1 &&
+
+       git grep --debug -i -F "^*TILR^AUN:.* \\HALLÓ \$HE[]IMUR!\$"  2>&1 >/dev/null |
+                grep fixed >debug2 &&
+       test_write_lines "fixed \\^*TILR^AUN:\\.\\* \\\\HALLÓ \$HE\\[]IMUR!\\\$" >expect2 &&
+       test_cmp expect2 debug2
+'
+
+test_expect_success REGEX_LOCALE 'pickaxe -i on non-ascii' '
+       git commit -m first &&
+       git log --format=%f -i -S"TILRAUN: HALLÓ HEIMUR!" >actual &&
+       echo first >expected &&
+       test_cmp expected actual
+'
+
+test_done
diff --git a/t/t7813-grep-icase-iso.sh b/t/t7813-grep-icase-iso.sh
new file mode 100755 (executable)
index 0000000..efef7fb
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='grep icase on non-English locales'
+
+. ./lib-gettext.sh
+
+test_expect_success GETTEXT_ISO_LOCALE 'setup' '
+       printf "TILRAUN: Halló Heimur!" >file &&
+       git add file &&
+       LC_ALL="$is_IS_iso_locale" &&
+       export LC_ALL
+'
+
+test_expect_success GETTEXT_ISO_LOCALE,LIBPCRE 'grep pcre string' '
+       git grep --perl-regexp -i "TILRAUN: H.lló Heimur!" &&
+       git grep --perl-regexp -i "TILRAUN: H.LLÓ HEIMUR!"
+'
+
+test_done
index ff09aced6855dbc9eaa963571b698919d7289871..ab79de95441f4f474525b48b14313f1d04172fce 100755 (executable)
@@ -6,6 +6,11 @@ test_description='git blame'
 PROG='git blame -c'
 . "$TEST_DIRECTORY"/annotate-tests.sh
 
+test_expect_success 'blame untracked file in empty repo' '
+       >untracked &&
+       test_must_fail git blame untracked
+'
+
 PROG='git blame -c -e'
 test_expect_success 'blame --show-email' '
        check_count \
index 6568429753d5f90426ad6acc0703b79e9f7a3284..661f9d430d28834b8a006fa0bcc958f52c95258b 100755 (executable)
@@ -41,12 +41,12 @@ test_expect_success setup '
        test_tick &&
        GIT_AUTHOR_NAME=Fourth git commit -m Fourth &&
 
-       {
-               echo ABC
-               echo DEF
-               echo XXXX
-               echo GHIJK
-       } >cow &&
+       cat >cow <<-\EOF &&
+       ABC
+       DEF
+       XXXX
+       GHIJK
+       EOF
        git add cow &&
        test_tick &&
        GIT_AUTHOR_NAME=Fifth git commit -m Fifth
@@ -115,11 +115,11 @@ test_expect_success 'append with -C -C -C' '
 test_expect_success 'blame wholesale copy' '
 
        git blame -f -C -C1 HEAD^ -- cow | sed -e "$pick_fc" >current &&
-       {
-               echo mouse-Initial
-               echo mouse-Second
-               echo mouse-Third
-       } >expected &&
+       cat >expected <<-\EOF &&
+       mouse-Initial
+       mouse-Second
+       mouse-Third
+       EOF
        test_cmp expected current
 
 '
@@ -127,16 +127,61 @@ test_expect_success 'blame wholesale copy' '
 test_expect_success 'blame wholesale copy and more' '
 
        git blame -f -C -C1 HEAD -- cow | sed -e "$pick_fc" >current &&
-       {
-               echo mouse-Initial
-               echo mouse-Second
-               echo cow-Fifth
-               echo mouse-Third
-       } >expected &&
+       cat >expected <<-\EOF &&
+       mouse-Initial
+       mouse-Second
+       cow-Fifth
+       mouse-Third
+       EOF
        test_cmp expected current
 
 '
 
+test_expect_success 'blame wholesale copy and more in the index' '
+
+       cat >horse <<-\EOF &&
+       ABC
+       DEF
+       XXXX
+       YYYY
+       GHIJK
+       EOF
+       git add horse &&
+       test_when_finished "git rm -f horse" &&
+       git blame -f -C -C1 -- horse | sed -e "$pick_fc" >current &&
+       cat >expected <<-\EOF &&
+       mouse-Initial
+       mouse-Second
+       cow-Fifth
+       horse-Not
+       mouse-Third
+       EOF
+       test_cmp expected current
+
+'
+
+test_expect_success 'blame during cherry-pick with file rename conflict' '
+
+       test_when_finished "git reset --hard && git checkout master" &&
+       git checkout HEAD~3 &&
+       echo MOUSE >> mouse &&
+       git mv mouse rodent &&
+       git add rodent &&
+       GIT_AUTHOR_NAME=Rodent git commit -m "rodent" &&
+       git checkout --detach master &&
+       (git cherry-pick HEAD@{1} || test $? -eq 1) &&
+       git show HEAD@{1}:rodent > rodent &&
+       git add rodent &&
+       git blame -f -C -C1 rodent | sed -e "$pick_fc" >current &&
+       cat current &&
+       cat >expected <<-\EOF &&
+       mouse-Initial
+       mouse-Second
+       rodent-Not
+       EOF
+       test_cmp expected current
+'
+
 test_expect_success 'blame path that used to be a directory' '
        mkdir path &&
        echo A A A A A >path/file &&
@@ -167,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' '
@@ -212,4 +257,18 @@ test_expect_success 'blame file with CRLF attributes text' '
        grep "A U Thor" actual
 '
 
+test_expect_success 'blame file with CRLF core.autocrlf=true' '
+       git config core.autocrlf false &&
+       printf "testcase\r\n" >crlfinrepo &&
+       >.gitattributes &&
+       git add crlfinrepo &&
+       git commit -m "add crlfinrepo" &&
+       git config core.autocrlf true &&
+       mv crlfinrepo tmp &&
+       git checkout crlfinrepo &&
+       rm tmp &&
+       git blame crlfinrepo >actual &&
+       grep "A U Thor" actual
+'
+
 test_done
index 29f84a6dd17752aabc76ee3d84d1c6b1064481ba..92c8e792d166ee37d5463de2bce32f61cfa570a1 100755 (executable)
@@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' '
        test_cmp expect actual
 '
 
+test_expect_success '--porcelain detects first non-blank line as subject' '
+       (
+               GIT_INDEX_FILE=.git/tmp-index &&
+               export GIT_INDEX_FILE &&
+               echo "This is it" >single-file &&
+               git add single-file &&
+               tree=$(git write-tree) &&
+               commit=$(printf "%s\n%s\n%s\n\n\n  \noneline\n\nbody\n" \
+                       "tree $tree" \
+                       "author A <a@b.c> 123456789 +0000" \
+                       "committer C <c@d.e> 123456789 +0000" |
+               git hash-object -w -t commit --stdin) &&
+               git blame --porcelain $commit -- single-file >output &&
+               grep "^summary oneline$" output
+       )
+'
+
 test_done
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
index 2d05d3eeab3f801fcf74a93c9305d067ac628937..dfeaa9c6550eac1f9beeca64682cecfebfe2c7d3 100755 (executable)
@@ -32,15 +32,15 @@ my @success_list = (q[Jane],
        q["Jane\" Doe" <jdoe@example.com>],
        q[Doe, jane <jdoe@example.com>],
        q["Jane Doe <jdoe@example.com>],
-       q['Jane 'Doe' <jdoe@example.com>]);
+       q['Jane 'Doe' <jdoe@example.com>],
+       q[Jane@:;\.,()<>Doe <jdoe@example.com>],
+       q[Jane <jdoe@example.com> Doe],
+       q[<jdoe@example.com> Jane Doe]);
 
 my @known_failure_list = (q[Jane\ Doe <jdoe@example.com>],
        q["Doe, Ja"ne <jdoe@example.com>],
        q["Doe, Katarina" Jane <jdoe@example.com>],
-       q[Jane@:;\.,()<>Doe <jdoe@example.com>],
        q[Jane jdoe@example.com],
-       q[<jdoe@example.com> Jane Doe],
-       q[Jane <jdoe@example.com> Doe],
        q["Jane "Kat"a" ri"na" ",Doe" <jdoe@example.com>],
        q[Jane Doe],
        q[Jane "Doe <jdoe@example.com>"],
index b3355d2c7016e55e99a465414f230569c3807230..3dc4a3454d223d37e85de6fa4ae8656046370e99 100755 (executable)
@@ -140,6 +140,35 @@ test_expect_success $PREREQ 'Verify commandline' '
        test_cmp expected commandline1
 '
 
+test_expect_success $PREREQ 'setup expect for cc trailer' "
+cat >expected-cc <<\EOF
+!recipient@example.com!
+!author@example.com!
+!one@example.com!
+!two@example.com!
+!three@example.com!
+!four@example.com!
+!five@example.com!
+EOF
+"
+
+test_expect_success $PREREQ 'cc trailer with various syntax' '
+       test_commit cc-trailer &&
+       test_when_finished "git reset --hard HEAD^" &&
+       git commit --amend -F - <<-EOF &&
+       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]
+       EOF
+       clean_fake_sendmail &&
+       git send-email -1 --to=recipient@example.com \
+               --smtp-server="$(pwd)/fake.sendmail" &&
+       test_cmp expected-cc commandline1
+'
+
 test_expect_success $PREREQ 'setup expect' "
 cat >expected-show-all-headers <<\EOF
 0001-Second.patch
index dfe95c923b49d913153b9b94ac7d393bb465bce9..b1c7919c4afa4180a00be6b8f80a130495358649 100755 (executable)
@@ -31,10 +31,10 @@ test_expect_success 'autocorrect showing candidates' '
        git config help.autocorrect 0 &&
 
        test_must_fail git lfg 2>actual &&
-       sed -e "1,/^Did you mean this/d" actual | grep lgf &&
+       grep "^ lgf" actual &&
 
        test_must_fail git distimdist 2>actual &&
-       sed -e "1,/^Did you mean this/d" actual | grep distimdistim
+       grep "^ distimdistim" actual
 '
 
 test_expect_success 'autocorrect running commands' '
index 22d8367ff397fc68683ff1084ce4914cfbfa9d89..8a8ba65a2ae583aa5d0b0526e604a8f9613b5a5e 100755 (executable)
@@ -8,8 +8,6 @@ GIT_SVN_LC_ALL=${LC_ALL:-$LANG}
 
 . ./lib-git-svn.sh
 
-say 'define NO_SVN_TESTS to skip git svn tests'
-
 case "$GIT_SVN_LC_ALL" in
 *.UTF-8)
        test_set_prereq UTF8
@@ -19,6 +17,14 @@ case "$GIT_SVN_LC_ALL" in
        ;;
 esac
 
+test_expect_success 'git svn --version works anywhere' '
+       nongit git svn --version
+'
+
+test_expect_success 'git svn help works anywhere' '
+       nongit git svn help
+'
+
 test_expect_success \
     'initialize git svn' '
        mkdir import &&
@@ -45,13 +51,13 @@ test_expect_success "checkout from svn" 'svn co "$svnrepo" "$SVN_TREE"'
 
 name='try a deep --rmdir with a commit'
 test_expect_success "$name" '
-       git checkout -f -b mybranch ${remotes_git_svn} &&
+       git checkout -f -b mybranch remotes/git-svn &&
        mv dir/a/b/c/d/e/file dir/file &&
        cp dir/file file &&
        git update-index --add --remove dir/a/b/c/d/e/file dir/file file &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch &&
+               remotes/git-svn..mybranch &&
        svn_cmd up "$SVN_TREE" &&
        test -d "$SVN_TREE"/dir && test ! -d "$SVN_TREE"/dir/a'
 
@@ -65,14 +71,14 @@ test_expect_success "$name" "
        git update-index --add dir/file/file &&
        git commit -m '$name' &&
        test_must_fail git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch
+               remotes/git-svn..mybranch
 "
 
 
 name='detect node change from directory to file #1'
 test_expect_success "$name" '
        rm -rf dir "$GIT_DIR"/index &&
-       git checkout -f -b mybranch2 ${remotes_git_svn} &&
+       git checkout -f -b mybranch2 remotes/git-svn &&
        mv bar/zzz zzz &&
        rm -rf bar &&
        mv zzz bar &&
@@ -80,14 +86,14 @@ test_expect_success "$name" '
        git update-index --add -- bar &&
        git commit -m "$name" &&
        test_must_fail git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch2
+               remotes/git-svn..mybranch2
 '
 
 
 name='detect node change from file to directory #2'
 test_expect_success "$name" '
        rm -f "$GIT_DIR"/index &&
-       git checkout -f -b mybranch3 ${remotes_git_svn} &&
+       git checkout -f -b mybranch3 remotes/git-svn &&
        rm bar/zzz &&
        git update-index --remove bar/zzz &&
        mkdir bar/zzz &&
@@ -95,7 +101,7 @@ test_expect_success "$name" '
        git update-index --add bar/zzz/yyy &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch3 &&
+               remotes/git-svn..mybranch3 &&
        svn_cmd up "$SVN_TREE" &&
        test -d "$SVN_TREE"/bar/zzz &&
        test -e "$SVN_TREE"/bar/zzz/yyy
@@ -104,7 +110,7 @@ test_expect_success "$name" '
 name='detect node change from directory to file #2'
 test_expect_success "$name" '
        rm -f "$GIT_DIR"/index &&
-       git checkout -f -b mybranch4 ${remotes_git_svn} &&
+       git checkout -f -b mybranch4 remotes/git-svn &&
        rm -rf dir &&
        git update-index --remove -- dir/file &&
        touch dir &&
@@ -112,19 +118,19 @@ test_expect_success "$name" '
        git update-index --add -- dir &&
        git commit -m "$name" &&
        test_must_fail git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch4
+               remotes/git-svn..mybranch4
 '
 
 
 name='remove executable bit from a file'
 test_expect_success POSIXPERM "$name" '
        rm -f "$GIT_DIR"/index &&
-       git checkout -f -b mybranch5 ${remotes_git_svn} &&
+       git checkout -f -b mybranch5 remotes/git-svn &&
        chmod -x exec.sh &&
        git update-index exec.sh &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch5 &&
+               remotes/git-svn..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test ! -x "$SVN_TREE"/exec.sh'
 
@@ -135,7 +141,7 @@ test_expect_success POSIXPERM "$name" '
        git update-index exec.sh &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch5 &&
+               remotes/git-svn..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -x "$SVN_TREE"/exec.sh'
 
@@ -147,7 +153,7 @@ test_expect_success SYMLINKS "$name" '
        git update-index exec.sh &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch5 &&
+               remotes/git-svn..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -h "$SVN_TREE"/exec.sh'
 
@@ -159,7 +165,7 @@ test_expect_success POSIXPERM,SYMLINKS "$name" '
        git update-index --add file exec-2.sh &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch5 &&
+               remotes/git-svn..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -x "$SVN_TREE"/file &&
        test -h "$SVN_TREE"/exec-2.sh'
@@ -172,7 +178,7 @@ test_expect_success POSIXPERM,SYMLINKS "$name" '
        git update-index exec-2.sh &&
        git commit -m "$name" &&
        git svn set-tree --find-copies-harder --rmdir \
-               ${remotes_git_svn}..mybranch5 &&
+               remotes/git-svn..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -f "$SVN_TREE"/exec-2.sh &&
        test ! -h "$SVN_TREE"/exec-2.sh &&
@@ -194,7 +200,7 @@ GIT_SVN_ID=alt
 export GIT_SVN_ID
 test_expect_success "$name" \
     'git svn init "$svnrepo" && git svn fetch &&
-     git rev-list --pretty=raw ${remotes_git_svn} | grep ^tree | uniq > a &&
+     git rev-list --pretty=raw remotes/git-svn | grep ^tree | uniq > a &&
      git rev-list --pretty=raw remotes/alt | grep ^tree | uniq > b &&
      test_cmp a b'
 
@@ -217,17 +223,17 @@ EOF
 
 test_expect_success POSIXPERM,SYMLINKS "$name" "test_cmp a expected"
 
-test_expect_success 'exit if remote refs are ambigious' "
+test_expect_success 'exit if remote refs are ambigious' '
         git config --add svn-remote.svn.fetch \
-                              bar:refs/${remotes_git_svn} &&
+               bar:refs/remotes/git-svn &&
        test_must_fail git svn migrate
-"
+'
 
 test_expect_success 'exit if init-ing a would clobber a URL' '
         svnadmin create "${PWD}/svnrepo2" &&
         svn mkdir -m "mkdir bar" "${svnrepo}2/bar" &&
         git config --unset svn-remote.svn.fetch \
-                                "^bar:refs/${remotes_git_svn}$" &&
+               "^bar:refs/remotes/git-svn$" &&
        test_must_fail git svn init "${svnrepo}2/bar"
         '
 
@@ -237,7 +243,7 @@ test_expect_success \
         git config --get svn-remote.svn.fetch \
                               "^bar:refs/remotes/bar$" &&
         git config --get svn-remote.svn.fetch \
-                              "^:refs/${remotes_git_svn}$"
+                             "^:refs/remotes/git-svn$"
         '
 
 test_expect_success 'dcommit $rev does not clobber current branch' '
@@ -259,26 +265,26 @@ test_expect_success 'dcommit $rev does not clobber current branch' '
        git branch -D my-bar
        '
 
-test_expect_success 'able to dcommit to a subdirectory' "
+test_expect_success 'able to dcommit to a subdirectory' '
        git svn fetch -i bar &&
        git checkout -b my-bar refs/remotes/bar &&
        echo abc > d &&
        git update-index --add d &&
-       git commit -m '/bar/d should be in the log' &&
+       git commit -m "/bar/d should be in the log" &&
        git svn dcommit -i bar &&
-       test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" &&
+       test -z "$(git diff refs/heads/my-bar refs/remotes/bar)" &&
        mkdir newdir &&
        echo new > newdir/dir &&
        git update-index --add newdir/dir &&
-       git commit -m 'add a new directory' &&
+       git commit -m "add a new directory" &&
        git svn dcommit -i bar &&
-       test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" &&
+       test -z "$(git diff refs/heads/my-bar refs/remotes/bar)" &&
        echo foo >> newdir/dir &&
        git update-index newdir/dir &&
-       git commit -m 'modify a file in new directory' &&
+       git commit -m "modify a file in new directory" &&
        git svn dcommit -i bar &&
-       test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\"
-       "
+       test -z "$(git diff refs/heads/my-bar refs/remotes/bar)"
+'
 
 test_expect_success 'dcommit should not fail with a touched file' '
        test_commit "commit-new-file-foo2" foo2 &&
@@ -291,13 +297,13 @@ test_expect_success 'rebase should not fail with a touched file' '
        git svn rebase
 '
 
-test_expect_success 'able to set-tree to a subdirectory' "
+test_expect_success 'able to set-tree to a subdirectory' '
        echo cba > d &&
        git update-index d &&
-       git commit -m 'update /bar/d' &&
+       git commit -m "update /bar/d" &&
        git svn set-tree -i bar HEAD &&
-       test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\"
-       "
+       test -z "$(git diff refs/heads/my-bar refs/remotes/bar)"
+'
 
 test_expect_success 'git-svn works in a bare repository' '
        mkdir bare-repo &&
index e8173d5fefa205fe74aae88a1e32247a71340bfb..07bfb63777c80f7e508e632faa9f9ce1823d90ea 100755 (executable)
@@ -73,11 +73,11 @@ test_expect_success 'fetch revisions from svn' 'git svn fetch'
 
 name='test svn:keywords ignoring'
 test_expect_success "$name" \
-       'git checkout -b mybranch ${remotes_git_svn} &&
+       'git checkout -b mybranch remotes/git-svn &&
        echo Hi again >> kw.c &&
        git commit -a -m "test keywords ignoring" &&
-       git svn set-tree ${remotes_git_svn}..mybranch &&
-       git pull . ${remotes_git_svn}'
+       git svn set-tree remotes/git-svn..mybranch &&
+       git pull . remotes/git-svn'
 
 expect='/* $Id$ */'
 got="$(sed -ne 2p kw.c)"
@@ -95,7 +95,7 @@ test_expect_success "propset CR on crlf files" '
 
 test_expect_success 'fetch and pull latest from svn and checkout a new wc' \
        'git svn fetch &&
-        git pull . ${remotes_git_svn} &&
+        git pull . remotes/git-svn &&
         svn_cmd co "$svnrepo" new_wc'
 
 for i in crlf ne_crlf lf ne_lf cr ne_cr empty_cr empty_lf empty empty_crlf
@@ -117,7 +117,7 @@ cd test_wc
         svn_cmd commit -m "propset CRLF on cr files"'
 cd ..
 test_expect_success 'fetch and pull latest from svn' \
-       'git svn fetch && git pull . ${remotes_git_svn}'
+       'git svn fetch && git pull . remotes/git-svn'
 
 b_cr="$(git hash-object cr)"
 b_ne_cr="$(git hash-object ne_cr)"
@@ -168,7 +168,7 @@ cat >create-ignore-index.expect <<\EOF
 EOF
 
 test_expect_success 'test create-ignore' "
-       git svn fetch && git pull . ${remotes_git_svn} &&
+       git svn fetch && git pull . remotes/git-svn &&
        git svn create-ignore &&
        cmp ./.gitignore create-ignore.expect &&
        cmp ./deeply/.gitignore create-ignore.expect &&
index eb70f4839ccb065425b5ad8d40b270178dedef1b..66cd51102c8b6f93e4614a13a20bb02dcb0633e5 100755 (executable)
@@ -17,7 +17,7 @@ test_expect_success 'initialize repo' '
 test_expect_success 'mirror via git svn' '
        git svn init "$svnrepo" &&
        git svn fetch &&
-       git checkout -f -b test-rmdir ${remotes_git_svn}
+       git checkout -f -b test-rmdir remotes/git-svn
        '
 
 test_expect_success 'Try a commit on rmdir' '
index 3413164cb127da9e8d601775769b3b049816173e..b28271345c63e752c02d6b3b867f8c59aba08ff8 100755 (executable)
@@ -23,17 +23,19 @@ test_expect_success 'make history for tracking' '
 
 test_expect_success 'clone repo with git' '
        git svn clone -s "$svnrepo" x &&
-       test -f x/FOLLOWME &&
-       test ! -f x/README
+       test_path_is_file x/FOLLOWME &&
+       test_path_is_missing x/README
 '
 
-test_expect_success 'make sure r2 still has old file' "
-       cd x &&
-               test -n \"\$(git svn find-rev r1)\" &&
-               git reset --hard \$(git svn find-rev r1) &&
-               test -f README &&
-               test ! -f FOLLOWME &&
-               test x\$(git svn find-rev r2) = x
-"
+test_expect_success 'make sure r2 still has old file' '
+       (
+               cd x &&
+               test -n "$(git svn find-rev r1)" &&
+               git reset --hard "$(git svn find-rev r1)" &&
+               test_path_is_file README &&
+               test_path_is_missing FOLLOWME &&
+               test -z "$(git svn find-rev r2)"
+       )
+'
 
 test_done
index f6d7ac7c5f67871ce332716561ea6aba7a6f920f..dbe8deac0d2f28099241957e8944e3f714ee2fde 100755 (executable)
@@ -44,7 +44,7 @@ test_expect_success 'commit complementing change from git' '
 test_expect_success 'dcommit fails to commit because of conflict' '
        git svn init "$svnrepo" &&
        git svn fetch &&
-       git reset --hard refs/${remotes_git_svn} &&
+       git reset --hard refs/remotes/git-svn &&
        svn_cmd co "$svnrepo" t.svn &&
        (
                cd t.svn &&
@@ -59,7 +59,7 @@ test_expect_success 'dcommit fails to commit because of conflict' '
        '
 
 test_expect_success 'dcommit does the svn equivalent of an index merge' "
-       git reset --hard refs/${remotes_git_svn} &&
+       git reset --hard refs/remotes/git-svn &&
        echo 'index merge' > file2 &&
        git update-index --add file2 &&
        git commit -a -m 'index merge' &&
@@ -81,7 +81,7 @@ test_expect_success 'commit another change from svn side' '
        '
 
 test_expect_success 'multiple dcommit from git svn will not clobber svn' "
-       git reset --hard refs/${remotes_git_svn} &&
+       git reset --hard refs/remotes/git-svn &&
        echo new file >> new-file &&
        git update-index --add new-file &&
        git commit -a -m 'new file' &&
index 906019803797b01a4b447858d7766486bba951aa..9f3ef8f2ef614814887f94b7f53e4a7e96f6bbcf 100755 (executable)
@@ -19,13 +19,14 @@ test_expect_success 'setup old-looking metadata' '
        git svn init "$svnrepo" &&
        git svn fetch &&
        rm -rf "$GIT_DIR"/svn &&
-       git update-ref refs/heads/git-svn-HEAD refs/${remotes_git_svn} &&
-       git update-ref refs/heads/svn-HEAD refs/${remotes_git_svn} &&
-       git update-ref -d refs/${remotes_git_svn} refs/${remotes_git_svn}
+       git update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn &&
+       git update-ref refs/heads/svn-HEAD refs/remotes/git-svn &&
+       git update-ref -d refs/remotes/git-svn refs/remotes/git-svn
        '
 
-head=$(git rev-parse --verify refs/heads/git-svn-HEAD^0)
-test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'"
+test_expect_success 'git-svn-HEAD is a real HEAD' '
+       git rev-parse --verify refs/heads/git-svn-HEAD^0
+'
 
 svnrepo_escaped=$(echo $svnrepo | sed 's/ /%20/')
 
@@ -35,11 +36,11 @@ test_expect_success 'initialize old-style (v0) git svn layout' '
        echo "$svnrepo" > "$GIT_DIR"/svn/info/url &&
        git svn migrate &&
        ! test -d "$GIT_DIR"/git-svn &&
-       git rev-parse --verify refs/${remotes_git_svn}^0 &&
+       git rev-parse --verify refs/remotes/git-svn^0 &&
        git rev-parse --verify refs/remotes/svn^0 &&
        test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" &&
        test $(git config --get svn-remote.svn.fetch) = \
-             ":refs/${remotes_git_svn}"
+               ":refs/remotes/git-svn"
        '
 
 test_expect_success 'initialize a multi-repository repo' '
@@ -56,9 +57,11 @@ test_expect_success 'initialize a multi-repository repo' '
                                "^tags/\*:refs/remotes/origin/tags/\*$" &&
        git config --add svn-remote.svn.fetch "branches/a:refs/remotes/origin/a" &&
        git config --add svn-remote.svn.fetch "branches/b:refs/remotes/origin/b" &&
-       for i in tags/0.1 tags/0.2 tags/0.3; do
+       for i in tags/0.1 tags/0.2 tags/0.3
+       do
                git config --add svn-remote.svn.fetch \
-                                $i:refs/remotes/origin/$i || exit 1; done &&
+                       $i:refs/remotes/origin/$i || return 1
+       done &&
        git config --get-all svn-remote.svn.fetch > fetch.out &&
        grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
        grep "^branches/a:refs/remotes/origin/a$" fetch.out &&
@@ -66,34 +69,42 @@ test_expect_success 'initialize a multi-repository repo' '
        grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
        grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
        grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
-       grep "^:refs/${remotes_git_svn}" fetch.out
+       grep "^:refs/remotes/git-svn" fetch.out
        '
 
 # refs should all be different, but the trees should all be the same:
-test_expect_success 'multi-fetch works on partial urls + paths' "
+test_expect_success 'multi-fetch works on partial urls + paths' '
+       refs="trunk a b tags/0.1 tags/0.2 tags/0.3" &&
        git svn multi-fetch &&
-       for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
-               git rev-parse --verify refs/remotes/origin/\$i^0 >> refs.out || exit 1;
-           done &&
-       test -z \"\$(sort < refs.out | uniq -d)\" &&
-       for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
-         for j in trunk a b tags/0.1 tags/0.2 tags/0.3; do
-               if test \$j != \$i; then continue; fi
-           test -z \"\$(git diff refs/remotes/origin/\$i \
-                                refs/remotes/origin/\$j)\" ||exit 1; done; done
-       "
+       for i in $refs
+       do
+               git rev-parse --verify refs/remotes/origin/$i^0 || return 1;
+       done >refs.out &&
+       test -z "$(sort <refs.out | uniq -d)" &&
+       for i in $refs
+       do
+               for j in $refs
+               do
+                       git diff --exit-code refs/remotes/origin/$i \
+                                            refs/remotes/origin/$j ||
+                               return 1
+               done
+       done
+'
 
 test_expect_success 'migrate --minimize on old inited layout' '
        git config --unset-all svn-remote.svn.fetch &&
        git config --unset-all svn-remote.svn.url &&
        rm -rf "$GIT_DIR"/svn &&
-       for i in $(cat fetch.out); do
+       for i in $(cat fetch.out)
+       do
                path=$(expr $i : "\([^:]*\):.*$")
                ref=$(expr $i : "[^:]*:\(refs/remotes/.*\)$")
                if test -z "$ref"; then continue; fi
                if test -n "$path"; then path="/$path"; fi
-               ( mkdir -p "$GIT_DIR"/svn/$ref/info/ &&
-               echo "$svnrepo"$path > "$GIT_DIR"/svn/$ref/info/url ) || exit 1;
+               mkdir -p "$GIT_DIR"/svn/$ref/info/ &&
+               echo "$svnrepo"$path >"$GIT_DIR"/svn/$ref/info/url ||
+               return 1
        done &&
        git svn migrate --minimize &&
        test -z "$(git config -l | grep "^svn-remote\.git-svn\.")" &&
@@ -104,7 +115,7 @@ test_expect_success 'migrate --minimize on old inited layout' '
        grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
        grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
        grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
-       grep "^:refs/${remotes_git_svn}" fetch.out
+       grep "^:refs/remotes/git-svn" fetch.out
        '
 
 test_expect_success  ".rev_db auto-converted to .rev_map.UUID" '
index 29fbdfdd3f02c2dfb6219e749dadd8a495a6c97d..dde0a3c2229abab27d1592e740db35ebfed544aa 100755 (executable)
@@ -22,31 +22,31 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
        git cat-file commit refs/remotes/bar | \
-          grep '^${git_svn_id}: $bar_url@12 $uuid$' &&
+          grep '^git-svn-id: $bar_url@12 $uuid$' &&
        git cat-file commit refs/remotes/bar~1 | \
-          grep '^${git_svn_id}: $bar_url@11 $uuid$' &&
+          grep '^git-svn-id: $bar_url@11 $uuid$' &&
        git cat-file commit refs/remotes/bar~2 | \
-          grep '^${git_svn_id}: $bar_url@10 $uuid$' &&
+          grep '^git-svn-id: $bar_url@10 $uuid$' &&
        git cat-file commit refs/remotes/bar~3 | \
-          grep '^${git_svn_id}: $bar_url@9 $uuid$' &&
+          grep '^git-svn-id: $bar_url@9 $uuid$' &&
        git cat-file commit refs/remotes/bar~4 | \
-          grep '^${git_svn_id}: $bar_url@6 $uuid$' &&
+          grep '^git-svn-id: $bar_url@6 $uuid$' &&
        git cat-file commit refs/remotes/bar~5 | \
-          grep '^${git_svn_id}: $bar_url@1 $uuid$'
+          grep '^git-svn-id: $bar_url@1 $uuid$'
        "
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
        git cat-file commit refs/remotes/e | \
-          grep '^${git_svn_id}: $e_url@1 $uuid$'
+          grep '^git-svn-id: $e_url@1 $uuid$'
        "
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
        git cat-file commit refs/remotes/dir | \
-          grep '^${git_svn_id}: $dir_url@2 $uuid$' &&
+          grep '^git-svn-id: $dir_url@2 $uuid$' &&
        git cat-file commit refs/remotes/dir~1 | \
-          grep '^${git_svn_id}: $dir_url@1 $uuid$'
+          grep '^git-svn-id: $dir_url@1 $uuid$'
        "
 
 test_expect_success 'find commit based on SVN revision number' "
index bd081c2ec39686196e7b2873610df9a6466355b3..22b6e5ee7d8c274b7fe60c9f10de45eaf4d3c385 100755 (executable)
@@ -21,31 +21,31 @@ uuid=161ce429-a9dd-4828-af4a-52023f968c89
 bar_url=http://mayonaise/svnrepo/bar
 test_expect_success 'verify metadata for /bar' "
        git cat-file commit refs/remotes/bar | \
-          grep '^${git_svn_id}: $bar_url@12 $uuid$' &&
+          grep '^git-svn-id: $bar_url@12 $uuid$' &&
        git cat-file commit refs/remotes/bar~1 | \
-          grep '^${git_svn_id}: $bar_url@11 $uuid$' &&
+          grep '^git-svn-id: $bar_url@11 $uuid$' &&
        git cat-file commit refs/remotes/bar~2 | \
-          grep '^${git_svn_id}: $bar_url@10 $uuid$' &&
+          grep '^git-svn-id: $bar_url@10 $uuid$' &&
        git cat-file commit refs/remotes/bar~3 | \
-          grep '^${git_svn_id}: $bar_url@9 $uuid$' &&
+          grep '^git-svn-id: $bar_url@9 $uuid$' &&
        git cat-file commit refs/remotes/bar~4 | \
-          grep '^${git_svn_id}: $bar_url@6 $uuid$' &&
+          grep '^git-svn-id: $bar_url@6 $uuid$' &&
        git cat-file commit refs/remotes/bar~5 | \
-          grep '^${git_svn_id}: $bar_url@1 $uuid$'
+          grep '^git-svn-id: $bar_url@1 $uuid$'
        "
 
 e_url=http://mayonaise/svnrepo/dir/a/b/c/d/e
 test_expect_success 'verify metadata for /dir/a/b/c/d/e' "
        git cat-file commit refs/remotes/e | \
-          grep '^${git_svn_id}: $e_url@1 $uuid$'
+          grep '^git-svn-id: $e_url@1 $uuid$'
        "
 
 dir_url=http://mayonaise/svnrepo/dir
 test_expect_success 'verify metadata for /dir' "
        git cat-file commit refs/remotes/dir | \
-          grep '^${git_svn_id}: $dir_url@2 $uuid$' &&
+          grep '^git-svn-id: $dir_url@2 $uuid$' &&
        git cat-file commit refs/remotes/dir~1 | \
-          grep '^${git_svn_id}: $dir_url@1 $uuid$'
+          grep '^git-svn-id: $dir_url@1 $uuid$'
        "
 
 test_done
index a87d3d3fc1e2d6dca0fc6280e33637d2589d3235..64bb495834698c8438c8b8dde488873072abc1fd 100755 (executable)
@@ -8,9 +8,10 @@ test_description='git svn dcommit can commit renames of files with ugly names'
 . ./lib-git-svn.sh
 
 test_expect_success 'load repository with strange names' '
-       svnadmin load -q "$rawsvnrepo" < "$TEST_DIRECTORY"/t9115/funky-names.dump &&
-       start_httpd gtk+
-       '
+       svnadmin load -q "$rawsvnrepo" <"$TEST_DIRECTORY"/t9115/funky-names.dump
+'
+
+maybe_start_httpd gtk+
 
 test_expect_success 'init and fetch repository' '
        git svn init "$svnrepo" &&
index ecb1fed147d206c7d1a3ac43f9d82110e9514e66..41a026637fa03174765d4e3facc3815bbf538e29 100755 (executable)
@@ -32,7 +32,7 @@ test_expect_success 'setup svnrepo' '
                        "$svnrepo/pr ject/branches/trailing_dotlock.lock" &&
        svn_cmd cp -m "reflog" "$svnrepo/pr ject/trunk" \
                        "$svnrepo/pr ject/branches/not-a@{0}reflog@" &&
-       start_httpd
+       maybe_start_httpd
        '
 
 # SVN 1.7 will truncate "not-a%40{0]" to just "not-a".
index 1c84ce1023cedc5005009d3632784125180be075..b28a1741e3f52296dcab35ed6d51fa01c2628652 100755 (executable)
@@ -15,14 +15,14 @@ test_expect_success 'setup svnrepo' '
        svn_cmd cp -m "tag" "$svnrepo/pr ject/trunk" \
          "$svnrepo/pr ject/tags/v1" &&
        rm -rf project &&
-       start_httpd
+       maybe_start_httpd
 '
 
 test_expect_success 'test clone with percent escapes' '
        git svn clone "$svnrepo/pr%20ject" clone &&
        (
                cd clone &&
-               git rev-parse refs/${remotes_git_svn}
+               git rev-parse refs/remotes/git-svn
        )
 '
 
@@ -42,7 +42,7 @@ test_expect_success 'test clone trunk with percent escapes and minimize-url' '
        git svn clone --minimize-url "$svnrepo/pr%20ject/trunk" minimize &&
        (
                cd minimize &&
-               git rev-parse refs/${remotes_git_svn}
+               git rev-parse refs/remotes/git-svn
        )
 '
 
@@ -50,7 +50,7 @@ test_expect_success 'test clone trunk with percent escapes' '
        git svn clone "$svnrepo/pr%20ject/trunk" trunk &&
        (
                cd trunk &&
-               git rev-parse refs/${remotes_git_svn}
+               git rev-parse refs/remotes/git-svn
        )
 '
 
index fd8184787fba13bbbf3f1ef377ad3f979ef8f47a..ead404589eb622edd30adda06ad9684517b7e1f4 100755 (executable)
@@ -17,7 +17,7 @@ rm -rf import
 test_expect_success 'init, fetch and checkout repository' '
        git svn init --rewrite-root=http://invalid.invalid/ "$svnrepo" &&
        git svn fetch &&
-       git checkout -b mybranch ${remotes_git_svn}
+       git checkout -b mybranch remotes/git-svn
        '
 
 test_expect_success 'remove rev_map' '
index e21ee5f663ce8333625c5d9d483c42dde3394675..9ee23be64003ab22277c80a6c4b364c8cc36f902 100755 (executable)
@@ -18,7 +18,7 @@ test_expect_success 'setup test repository' '
                svn_cmd add foo &&
                svn_cmd commit -m "add foo"
        ) &&
-       start_httpd
+       maybe_start_httpd
 '
 
 test_expect_success 'clone trunk with "-r HEAD"' '
index 88a2cfa233e54e405956303ca67b807192b16465..372ef156850098928ac1ed402ab2228460af3c00 100755 (executable)
@@ -17,9 +17,9 @@ test_expect_success 'load svn repo' "
 
 test_expect_success 'verify uuid' "
        git cat-file commit refs/remotes/git-svn~0 | \
-          grep '^${git_svn_id}: .*@2 $uuid$' &&
+          grep '^git-svn-id: .*@2 $uuid$' &&
        git cat-file commit refs/remotes/git-svn~1 | \
-          grep '^${git_svn_id}: .*@1 $uuid$'
+          grep '^git-svn-id: .*@1 $uuid$'
        "
 
 test_done
index 13f78f2682602014711714a09a8f675c3eed1ff0..a875b4510270aa8411ab5ee546223be49a1fd65b 100755 (executable)
@@ -7,8 +7,6 @@ test_description='git svn mergeinfo propagation'
 
 . ./lib-git-svn.sh
 
-say 'define NO_SVN_TESTS to skip git svn tests'
-
 test_expect_success 'initialize source svn repo' '
        svn_cmd mkdir -m x "$svnrepo"/trunk &&
        svn_cmd co "$svnrepo"/trunk "$SVN_TREE" &&
index b4a443460476bdeb783963e5a3b488b7ef6f4ad2..0ede3cfedb2a7b5ac66238a61615395001885a94 100755 (executable)
@@ -11,7 +11,6 @@ local Git repository with placeholder files.'
 
 . ./lib-git-svn.sh
 
-say 'define NO_SVN_TESTS to skip git svn tests'
 GIT_REPO=git-svn-repo
 
 test_expect_success 'initialize source svn repo containing empty dirs' '
index 4c5f3c9d418bf6f85f1067b2cb1481bf941ff954..2e0ba3ebd8ab3273144743dc38675e2b5d429ea1 100755 (executable)
@@ -7,23 +7,6 @@ test_description='test git fast-import utility'
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash
 
-# Print $1 bytes from stdin to stdout.
-#
-# This could be written as "head -c $1", but IRIX "head" does not
-# support the -c option.
-head_c () {
-       perl -e '
-               my $len = $ARGV[1];
-               while ($len > 0) {
-                       my $s;
-                       my $nread = sysread(STDIN, $s, $len);
-                       die "cannot read: $!" unless defined($nread);
-                       print $s;
-                       $len -= $nread;
-               }
-       ' - "$1"
-}
-
 verify_packs () {
        for p in .git/objects/pack/*.pack
        do
@@ -52,9 +35,14 @@ echo "$@"'
 ###
 
 test_expect_success 'empty stream succeeds' '
+       git config fastimport.unpackLimit 0 &&
        git fast-import </dev/null
 '
 
+test_expect_success 'truncated stream complains' '
+       echo "tag foo" | test_must_fail git fast-import
+'
+
 test_expect_success 'A: create pack from stdin' '
        test_tick &&
        cat >input <<-INPUT_END &&
@@ -2476,7 +2464,7 @@ test_expect_success PIPE 'R: copy using cat-file' '
 
                read blob_id type size <&3 &&
                echo "$blob_id $type $size" >response &&
-               head_c $size >blob <&3 &&
+               test_copy_bytes $size >blob <&3 &&
                read newline <&3 &&
 
                cat <<-EOF &&
@@ -2519,7 +2507,7 @@ test_expect_success PIPE 'R: print blob mid-commit' '
                EOF
 
                read blob_id type size <&3 &&
-               head_c $size >actual <&3 &&
+               test_copy_bytes $size >actual <&3 &&
                read newline <&3 &&
 
                echo
@@ -2554,7 +2542,7 @@ test_expect_success PIPE 'R: print staged blob within commit' '
                echo "cat-blob $to_get" &&
 
                read blob_id type size <&3 &&
-               head_c $size >actual <&3 &&
+               test_copy_bytes $size >actual <&3 &&
                read newline <&3 &&
 
                echo deleteall
@@ -2646,6 +2634,21 @@ test_expect_success 'R: ignore non-git options' '
        git fast-import <input
 '
 
+test_expect_success 'R: corrupt lines do not mess marks file' '
+       rm -f io.marks &&
+       blob=$(echo hi | git hash-object --stdin) &&
+       cat >expect <<-EOF &&
+       :3 0000000000000000000000000000000000000000
+       :1 $blob
+       :2 $blob
+       EOF
+       cp expect io.marks &&
+       test_must_fail git fast-import --import-marks=io.marks --export-marks=io.marks <<-\EOF &&
+
+       EOF
+       test_cmp expect io.marks
+'
+
 ##
 ## R: very large blobs
 ##
@@ -2671,6 +2674,7 @@ test_expect_success 'R: blob bigger than threshold' '
        echo >>input &&
 
        test_create_repo R &&
+       git --git-dir=R/.git config fastimport.unpackLimit 0 &&
        git --git-dir=R/.git fast-import --big-file-threshold=1 <input
 '
 
diff --git a/t/t9302-fast-import-unpack-limit.sh b/t/t9302-fast-import-unpack-limit.sh
new file mode 100755 (executable)
index 0000000..a04de14
--- /dev/null
@@ -0,0 +1,105 @@
+#!/bin/sh
+test_description='test git fast-import unpack limit'
+. ./test-lib.sh
+
+test_expect_success 'create loose objects on import' '
+       test_tick &&
+       cat >input <<-INPUT_END &&
+       commit refs/heads/master
+       committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+       data <<COMMIT
+       initial
+       COMMIT
+
+       done
+       INPUT_END
+
+       git -c fastimport.unpackLimit=2 fast-import --done <input &&
+       git fsck --no-progress &&
+       test $(find .git/objects/?? -type f | wc -l) -eq 2 &&
+       test $(find .git/objects/pack -type f | wc -l) -eq 0
+'
+
+test_expect_success 'bigger packs are preserved' '
+       test_tick &&
+       cat >input <<-INPUT_END &&
+       commit refs/heads/master
+       committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+       data <<COMMIT
+       incremental should create a pack
+       COMMIT
+       from refs/heads/master^0
+
+       commit refs/heads/branch
+       committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+       data <<COMMIT
+       branch
+       COMMIT
+
+       done
+       INPUT_END
+
+       git -c fastimport.unpackLimit=2 fast-import --done <input &&
+       git fsck --no-progress &&
+       test $(find .git/objects/?? -type f | wc -l) -eq 2 &&
+       test $(find .git/objects/pack -type f | wc -l) -eq 2
+'
+
+test_expect_success 'lookups after checkpoint works' '
+       hello_id=$(echo hello | git hash-object --stdin -t blob) &&
+       id="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE" &&
+       before=$(git rev-parse refs/heads/master^0) &&
+       (
+               cat <<-INPUT_END &&
+               blob
+               mark :1
+               data 6
+               hello
+
+               commit refs/heads/master
+               mark :2
+               committer $id
+               data <<COMMIT
+               checkpoint after this
+               COMMIT
+               from refs/heads/master^0
+               M 100644 :1 hello
+
+               # pre-checkpoint
+               cat-blob :1
+               cat-blob $hello_id
+               checkpoint
+               # post-checkpoint
+               cat-blob :1
+               cat-blob $hello_id
+               INPUT_END
+
+               n=0 &&
+               from=$before &&
+               while test x"$from" = x"$before"
+               do
+                       if test $n -gt 30
+                       then
+                               echo >&2 "checkpoint did not update branch"
+                               exit 1
+                       else
+                               n=$(($n + 1))
+                       fi &&
+                       sleep 1 &&
+                       from=$(git rev-parse refs/heads/master^0)
+               done &&
+               cat <<-INPUT_END &&
+               commit refs/heads/master
+               committer $id
+               data <<COMMIT
+               make sure from "unpacked sha1 reference" works, too
+               COMMIT
+               from $from
+               INPUT_END
+               echo done
+       ) | git -c fastimport.unpackLimit=100 fast-import --done &&
+       test $(find .git/objects/?? -type f | wc -l) -eq 6 &&
+       test $(find .git/objects/pack -type f | wc -l) -eq 2
+'
+
+test_done
index d708cbf0320abe502d875ae3333eda2501208ca2..432c61d246c938192a2b31f2db35f4f9b320a788 100755 (executable)
@@ -45,7 +45,8 @@ test_expect_success 'setup' '
   touch secondrootfile &&
   git add secondrootfile &&
   git commit -m "second root") &&
-  git pull secondroot master &&
+  git fetch secondroot master &&
+  git merge --allow-unrelated-histories FETCH_HEAD &&
   git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&
   GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
   GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log" &&
index f324b9f010506d5f79388ef454df74156860ec13..84787eee9acec4b65f2404356e06b2f4904cea42 100755 (executable)
@@ -154,7 +154,7 @@ test_expect_success 'adding files' '
     echo "more text" > src.c &&
     GIT_CONFIG="$git_config" cvs -Q add src.c >cvs.log 2>&1 &&
     marked_as . src.c "" &&
-    echo "psuedo-binary" > temp.bin
+    echo "pseudo-binary" > temp.bin
     ) &&
     GIT_CONFIG="$git_config" cvs -Q add subdir/temp.bin >cvs.log 2>&1 &&
     marked_as subdir temp.bin "-kb" &&
index e94b2f147a72b216a1c97d278bb9c822aed7392a..6d06ed96cbc37ee0d19173a4c5379e021c1e5414 100755 (executable)
@@ -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 0730f18d0f83f4145c5a0dbfde784d71bdc57a1d..4d935222e93180da4bcd8825498f7af7cfed79e2 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
 '
index 0aafd03334125d1af23acdff3f396b1bdabaf6c1..6a86d6996b97de0bed0503021b76b33db8441029 100755 (executable)
@@ -300,7 +300,7 @@ test_expect_success 'git p4 clone complex branches' '
                test_path_is_file file2 &&
                test_path_is_file file3 &&
                ! grep update file2 &&
-               test_path_is_missing .git/git-p4-tmp
+               test_must_fail git show-ref --verify refs/git-p4-tmp
        )
 '
 
@@ -352,7 +352,7 @@ test_expect_success 'git p4 sync changes to two branches in the same changelist'
                test_path_is_file file2 &&
                test_path_is_file file3 &&
                ! grep update file2 &&
-               test_path_is_missing .git/git-p4-tmp
+               test_must_fail git show-ref --verify refs/git-p4-tmp
        )
 '
 
index 66d3fc91a739a7f04bb73694a2f5d75034045d10..eb9a8ed197b4c6383a4c688f5e5c3a3fcb102b12 100755 (executable)
@@ -223,12 +223,12 @@ build_gendouble() {
        import sys
        import struct
 
-       s = struct.pack(">LL18s",
+       s = struct.pack(b">LL18s",
                        0x00051607,  # AppleDouble
                        0x00020000,  # version 2
-                       ""           # pad to 26 bytes
+                       b""          # pad to 26 bytes
        )
-       sys.stdout.write(s)
+       getattr(sys.stdout, 'buffer', sys.stdout).write(s)
        EOF
 }
 
index 0b664a377c453d56ada45153b587a1422c837ecc..734b8db4cbd557cf8e703cc4e2b085185634baba 100755 (executable)
@@ -13,6 +13,10 @@ test_file_in_lfs () {
        FILE="$1" &&
        SIZE="$2" &&
        EXPECTED_CONTENT="$3" &&
+       sed -n '1,1 p' "$FILE" | grep "^version " &&
+       sed -n '2,2 p' "$FILE" | grep "^oid " &&
+       sed -n '3,3 p' "$FILE" | grep "^size " &&
+       test_line_count = 3 "$FILE" &&
        cat "$FILE" | grep "size $SIZE" &&
        HASH=$(cat "$FILE" | grep "oid sha256:" | sed -e "s/oid sha256://g") &&
        LFS_FILE=".git/lfs/objects/$(echo "$HASH" | cut -c1-2)/$(echo "$HASH" | cut -c3-4)/$HASH" &&
@@ -38,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 &&
@@ -265,7 +271,7 @@ test_expect_success 'Add big files to repo and store files in LFS based on compr
                # We only import HEAD here ("@all" is missing!)
                git p4 clone --destination="$git" //depot &&
 
-               test_file_in_lfs file6.bin 13 "content 6 bin 39 bytes XXXXXYYYYYZZZZZ"
+               test_file_in_lfs file6.bin 39 "content 6 bin 39 bytes XXXXXYYYYYZZZZZ" &&
                test_file_count_in_dir ".git/lfs/objects" 1 &&
 
                cat >expect <<-\EOF &&
index be12960d396a1e3e0a0d6babeb1ad853e21b2727..fa8b9daf1fafba7498583e916cfea52d3c7207f5 100755 (executable)
@@ -47,23 +47,23 @@ test_expect_success 'Clone repo root path with all history' '
                git init . &&
                git p4 clone --use-client-spec --destination="$git" //depot@all &&
                cat >expect <<-\EOF &&
-Remove file 4
-[git-p4: depot-paths = "//depot/": change = 6]
+               Remove file 4
+               [git-p4: depot-paths = "//depot/": change = 6]
 
-Remove file 3
-[git-p4: depot-paths = "//depot/": change = 5]
+               Remove file 3
+               [git-p4: depot-paths = "//depot/": change = 5]
 
-Add file 4
-[git-p4: depot-paths = "//depot/": change = 4]
+               Add file 4
+               [git-p4: depot-paths = "//depot/": change = 4]
 
-Add file 3
-[git-p4: depot-paths = "//depot/": change = 3]
+               Add file 3
+               [git-p4: depot-paths = "//depot/": change = 3]
 
-Add file 2
-[git-p4: depot-paths = "//depot/": change = 2]
+               Add file 2
+               [git-p4: depot-paths = "//depot/": change = 2]
 
-Add file 1
-[git-p4: depot-paths = "//depot/": change = 1]
+               Add file 1
+               [git-p4: depot-paths = "//depot/": change = 1]
 
                EOF
                git log --format=%B >actual &&
@@ -80,23 +80,23 @@ test_expect_success 'Clone repo subdir with all history but keep empty commits'
                git config git-p4.keepEmptyCommits true &&
                git p4 clone --use-client-spec --destination="$git" //depot@all &&
                cat >expect <<-\EOF &&
-Remove file 4
-[git-p4: depot-paths = "//depot/": change = 6]
+               Remove file 4
+               [git-p4: depot-paths = "//depot/": change = 6]
 
-Remove file 3
-[git-p4: depot-paths = "//depot/": change = 5]
+               Remove file 3
+               [git-p4: depot-paths = "//depot/": change = 5]
 
-Add file 4
-[git-p4: depot-paths = "//depot/": change = 4]
+               Add file 4
+               [git-p4: depot-paths = "//depot/": change = 4]
 
-Add file 3
-[git-p4: depot-paths = "//depot/": change = 3]
+               Add file 3
+               [git-p4: depot-paths = "//depot/": change = 3]
 
-Add file 2
-[git-p4: depot-paths = "//depot/": change = 2]
+               Add file 2
+               [git-p4: depot-paths = "//depot/": change = 2]
 
-Add file 1
-[git-p4: depot-paths = "//depot/": change = 1]
+               Add file 1
+               [git-p4: depot-paths = "//depot/": change = 1]
 
                EOF
                git log --format=%B >actual &&
@@ -112,14 +112,14 @@ test_expect_success 'Clone repo subdir with all history' '
                git init . &&
                git p4 clone --use-client-spec --destination="$git" --verbose //depot@all &&
                cat >expect <<-\EOF &&
-Remove file 3
-[git-p4: depot-paths = "//depot/": change = 5]
+               Remove file 3
+               [git-p4: depot-paths = "//depot/": change = 5]
 
-Add file 3
-[git-p4: depot-paths = "//depot/": change = 3]
+               Add file 3
+               [git-p4: depot-paths = "//depot/": change = 3]
 
-Add file 1
-[git-p4: depot-paths = "//depot/": change = 1]
+               Add file 1
+               [git-p4: depot-paths = "//depot/": change = 1]
 
                EOF
                git log --format=%B >actual &&
diff --git a/t/t9828-git-p4-map-user.sh b/t/t9828-git-p4-map-user.sh
new file mode 100755 (executable)
index 0000000..e20395c
--- /dev/null
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+test_description='Clone repositories and map users'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+       start_p4d
+'
+
+test_expect_success 'Create a repo with different users' '
+       client_view "//depot/... //client/..." &&
+       (
+               cd "$cli" &&
+
+               >author.txt &&
+               p4 add author.txt &&
+               p4 submit -d "Add file author\\n" &&
+
+               P4USER=mmax &&
+               >max.txt &&
+               p4 add max.txt &&
+               p4 submit -d "Add file max" &&
+
+               P4USER=eri &&
+               >moritz.txt &&
+               p4 add moritz.txt &&
+               p4 submit -d "Add file moritz" &&
+
+               P4USER=no &&
+               >nobody.txt &&
+               p4 add nobody.txt &&
+               p4 submit -d "Add file nobody"
+       )
+'
+
+test_expect_success 'Clone repo root path with all history' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git init . &&
+               git config --add git-p4.mapUser "mmax = Max Musterman   <max@example.com> "  &&
+               git config --add git-p4.mapUser "  eri=Erika Musterman <erika@example.com>" &&
+               git p4 clone --use-client-spec --destination="$git" //depot@all &&
+               cat >expect <<-\EOF &&
+                       no <no@client>
+                       Erika Musterman <erika@example.com>
+                       Max Musterman <max@example.com>
+                       Dr. author <author@example.com>
+               EOF
+               git log --format="%an <%ae>" >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'kill p4d' '
+       kill_p4d
+'
+
+test_done
diff --git a/t/t9829-git-p4-jobs.sh b/t/t9829-git-p4-jobs.sh
new file mode 100755 (executable)
index 0000000..971aeee
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+test_description='git p4 retrieve job info'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+       start_p4d
+'
+
+test_expect_success 'add p4 jobs' '
+       (
+               p4_add_job TESTJOB-A &&
+               p4_add_job TESTJOB-B
+       )
+'
+
+test_expect_success 'add p4 files' '
+       client_view "//depot/... //client/..." &&
+       (
+               cd "$cli" &&
+               >file1 &&
+               p4 add file1 &&
+               p4 submit -d "Add file 1"
+       )
+'
+
+test_expect_success 'check log message of changelist with no jobs' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git init . &&
+               git p4 clone --use-client-spec --destination="$git" //depot@all &&
+               cat >expect <<-\EOF &&
+               Add file 1
+               [git-p4: depot-paths = "//depot/": change = 1]
+
+               EOF
+               git log --format=%B >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'add TESTJOB-A to change 1' '
+       (
+               cd "$cli" &&
+               p4 fix -c 1 TESTJOB-A
+       )
+'
+
+test_expect_success 'check log message of changelist with one job' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git init . &&
+               git p4 clone --use-client-spec --destination="$git" //depot@all &&
+               cat >expect <<-\EOF &&
+               Add file 1
+               Jobs: TESTJOB-A
+               [git-p4: depot-paths = "//depot/": change = 1]
+
+               EOF
+               git log --format=%B >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'add TESTJOB-B to change 1' '
+       (
+               cd "$cli" &&
+               p4 fix -c 1 TESTJOB-B
+       )
+'
+
+test_expect_success 'check log message of changelist with more jobs' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git init . &&
+               git p4 clone --use-client-spec --destination="$git" //depot@all &&
+               cat >expect <<-\EOF &&
+               Add file 1
+               Jobs: TESTJOB-A TESTJOB-B
+               [git-p4: depot-paths = "//depot/": change = 1]
+
+               EOF
+               git log --format=%B >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'kill p4d' '
+       kill_p4d
+'
+
+test_done
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..a34e55f874ca06da4cae6ab5d46bc3263c58d521 100755 (executable)
@@ -257,12 +257,7 @@ test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
 '
 
 test_expect_success '__gitdir - not a git repository' '
-       (
-               cd subdir/subsubdir &&
-               GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
-               export GIT_CEILING_DIRECTORIES &&
-               test_must_fail __gitdir
-       )
+       nongit test_must_fail __gitdir
 '
 
 test_expect_success '__gitcomp - trailing space - options' '
index ffbfa0efb8712f06cb14adc986ae29c4d1c23bf1..97c9b32c2ecfa608f1e9c37c1c6402a1772e4187 100755 (executable)
@@ -107,7 +107,7 @@ test_expect_success 'prompt - describe detached head - contains' '
 '
 
 test_expect_success 'prompt - describe detached head - branch' '
-       printf " ((b1~1))" >expected &&
+       printf " ((tags/t2~1))" >expected &&
        git checkout b1^ &&
        test_when_finished "git checkout master" &&
        (
@@ -177,7 +177,7 @@ test_expect_success 'prompt - interactive rebase' '
        git checkout b1 &&
        test_when_finished "git checkout master" &&
        git rebase -i HEAD^ &&
-       test_when_finished "git rebase --abort"
+       test_when_finished "git rebase --abort" &&
        __git_ps1 >"$actual" &&
        test_cmp expected "$actual"
 '
index 8d99eb303fd62a1c179ab31f471a3376898586b0..adab7f51f4c962967c90e3184853377feece2b1e 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/'
 }
@@ -612,7 +616,7 @@ test_must_fail () {
        then
                echo >&2 "test_must_fail: command succeeded: $*"
                return 1
-       elif test $exit_code -eq 141 && list_contains "$_test_ok" sigpipe
+       elif test_match_signal 13 $exit_code && list_contains "$_test_ok" sigpipe
        then
                return 0
        elif test $exit_code -gt 129 && test $exit_code -le 192
@@ -718,20 +722,13 @@ test_cmp_rev () {
        test_cmp expect.rev actual.rev
 }
 
-# Print a sequence of numbers or letters in increasing order.  This is
-# similar to GNU seq(1), but the latter might not be available
-# everywhere (and does not do letters).  It may be used like:
+# Print a sequence of integers in increasing order, either with
+# two arguments (start and end):
 #
-#      for i in $(test_seq 100)
-#      do
-#              for j in $(test_seq 10 20)
-#              do
-#                      for k in $(test_seq a z)
-#                      do
-#                              echo $i-$j-$k
-#                      done
-#              done
-#      done
+#     test_seq 1 5 -- outputs 1 2 3 4 5 one line at a time
+#
+# or with one argument (end), in which case it starts counting
+# from 1.
 
 test_seq () {
        case $# in
@@ -739,7 +736,12 @@ test_seq () {
        2)      ;;
        *)      error "bug in the test script: not 1 or 2 parameters to test_seq" ;;
        esac
-       perl -le 'print for $ARGV[0]..$ARGV[1]' -- "$@"
+       test_seq_counter__=$1
+       while test "$test_seq_counter__" -le "$2"
+       do
+               echo "$test_seq_counter__"
+               test_seq_counter__=$(( $test_seq_counter__ + 1 ))
+       done
 }
 
 # This function can be used to schedule some commands to be run
@@ -941,3 +943,68 @@ mingw_read_file_strip_cr_ () {
                eval "$1=\$$1\$line"
        done
 }
+
+# Like "env FOO=BAR some-program", but run inside a subshell, which means
+# it also works for shell functions (though those functions cannot impact
+# the environment outside of the test_env invocation).
+test_env () {
+       (
+               while test $# -gt 0
+               do
+                       case "$1" in
+                       *=*)
+                               eval "${1%%=*}=\${1#*=}"
+                               eval "export ${1%%=*}"
+                               shift
+                               ;;
+                       *)
+                               "$@"
+                               exit
+                               ;;
+                       esac
+               done
+       )
+}
+
+# Returns true if the numeric exit code in "$2" represents the expected signal
+# in "$1". Signals should be given numerically.
+test_match_signal () {
+       if test "$2" = "$((128 + $1))"
+       then
+               # POSIX
+               return 0
+       elif test "$2" = "$((256 + $1))"
+       then
+               # ksh
+               return 0
+       fi
+       return 1
+}
+
+# Read up to "$1" bytes (or to EOF) from stdin and write them to stdout.
+test_copy_bytes () {
+       perl -e '
+               my $len = $ARGV[1];
+               while ($len > 0) {
+                       my $s;
+                       my $nread = sysread(STDIN, $s, $len);
+                       die "cannot read: $!" unless defined($nread);
+                       print $s;
+                       $len -= $nread;
+               }
+       ' - "$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 0b47eb6bb299492d31111c94557c216bb3f32c7f..cde7fc7fcf355d04708126980d099df820cd00ce 100644 (file)
@@ -54,12 +54,22 @@ case "$GIT_TEST_TEE_STARTED, $* " in
 done,*)
        # do not redirect again
        ;;
-*' --tee '*|*' --va'*)
+*' --tee '*|*' --va'*|*' --verbose-log '*)
        mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results"
        BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)"
+
+       # Make this filename available to the sub-process in case it is using
+       # --verbose-log.
+       GIT_TEST_TEE_OUTPUT_FILE=$BASE.out
+       export GIT_TEST_TEE_OUTPUT_FILE
+
+       # Truncate before calling "tee -a" to get rid of the results
+       # from any previous runs.
+       >"$GIT_TEST_TEE_OUTPUT_FILE"
+
        (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
-        echo $? > $BASE.exit) | tee $BASE.out
-       test "$(cat $BASE.exit)" = 0
+        echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
+       test "$(cat "$BASE.exit")" = 0
        exit
        ;;
 esac
@@ -89,6 +99,7 @@ unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e '
                UNZIP
                PERF_
                CURL_VERBOSE
+               TRACE_CURL
        ));
        my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env);
        print join("\n", @vars);
@@ -162,6 +173,9 @@ _x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
 # Zero SHA-1
 _z40=0000000000000000000000000000000000000000
 
+EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+EMPTY_BLOB=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+
 # Line feed
 LF='
 '
@@ -170,7 +184,7 @@ LF='
 # when case-folding filenames
 u200c=$(printf '\342\200\214')
 
-export _x05 _x40 _z40 LF u200c
+export _x05 _x40 _z40 LF u200c EMPTY_TREE EMPTY_BLOB
 
 # Each test should start with something like this, after copyright notices:
 #
@@ -202,13 +216,13 @@ do
                }
                run_list=$1; shift ;;
        --run=*)
-               run_list=$(expr "z$1" : 'z[^=]*=\(.*\)'); shift ;;
+               run_list=${1#--*=}; shift ;;
        -h|--h|--he|--hel|--help)
                help=t; shift ;;
        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
                verbose=t; shift ;;
        --verbose-only=*)
-               verbose_only=$(expr "z$1" : 'z[^=]*=\(.*\)')
+               verbose_only=${1#--*=}
                shift ;;
        -q|--q|--qu|--qui|--quie|--quiet)
                # Ignore --quiet under a TAP::Harness. Saying how many tests
@@ -222,15 +236,15 @@ do
                valgrind=memcheck
                shift ;;
        --valgrind=*)
-               valgrind=$(expr "z$1" : 'z[^=]*=\(.*\)')
+               valgrind=${1#--*=}
                shift ;;
        --valgrind-only=*)
-               valgrind_only=$(expr "z$1" : 'z[^=]*=\(.*\)')
+               valgrind_only=${1#--*=}
                shift ;;
        --tee)
                shift ;; # was handled already
        --root=*)
-               root=$(expr "z$1" : 'z[^=]*=\(.*\)')
+               root=${1#--*=}
                shift ;;
        --chain-lint)
                GIT_TEST_CHAIN_LINT=1
@@ -242,6 +256,9 @@ do
                trace=t
                verbose=t
                shift ;;
+       --verbose-log)
+               verbose_log=t
+               shift ;;
        *)
                echo "error: unknown test option '$1'" >&2; exit 1 ;;
        esac
@@ -304,6 +321,16 @@ say () {
        say_color info "$*"
 }
 
+if test -n "$HARNESS_ACTIVE"
+then
+       if test "$verbose" = t || test -n "$verbose_only"
+       then
+               printf 'Bail out! %s\n' \
+                'verbose mode forbidden under TAP harness; try --verbose-log'
+               exit 1
+       fi
+fi
+
 test "${test_description}" != "" ||
 error "Test script did not set test_description."
 
@@ -315,13 +342,29 @@ fi
 
 exec 5>&1
 exec 6<&0
-if test "$verbose" = "t"
+if test "$verbose_log" = "t"
+then
+       exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3
+elif test "$verbose" = "t"
 then
        exec 4>&2 3>&1
 else
        exec 4>/dev/null 3>/dev/null
 fi
 
+# Send any "-x" output directly to stderr to avoid polluting tests
+# which capture stderr. We can do this unconditionally since it
+# has no effect if tracing isn't turned on.
+#
+# Note that this sets up the trace fd as soon as we assign the variable, so it
+# must come after the creation of descriptor 4 above. Likewise, we must never
+# unset this, as it has the side effect of closing descriptor 4, which we
+# use to show verbose tests to the user.
+#
+# Note also that we don't need or want to export it. The tracing is local to
+# this shell, and we would not want to influence any shells we exec.
+BASH_XTRACEFD=4
+
 test_failure=0
 test_count=0
 test_fixed=0
@@ -671,9 +714,9 @@ test_done () {
                test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
                mkdir -p "$test_results_dir"
                base=${0##*/}
-               test_results_path="$test_results_dir/${base%.sh}-$$.counts"
+               test_results_path="$test_results_dir/${base%.sh}.counts"
 
-               cat >>"$test_results_path" <<-EOF
+               cat >"$test_results_path" <<-EOF
                total $test_count
                success $test_success
                fixed $test_fixed
@@ -766,7 +809,14 @@ then
                return;
 
                base=$(basename "$1")
-               symlink_target=$GIT_BUILD_DIR/$base
+               case "$base" in
+               test-*)
+                       symlink_target="$GIT_BUILD_DIR/t/helper/$base"
+                       ;;
+               *)
+                       symlink_target="$GIT_BUILD_DIR/$base"
+                       ;;
+               esac
                # do not override scripts
                if test -x "$symlink_target" &&
                    test ! -d "$symlink_target" &&
@@ -785,7 +835,7 @@ then
        # override all git executables in TEST_DIRECTORY/..
        GIT_VALGRIND=$TEST_DIRECTORY/valgrind
        mkdir -p "$GIT_VALGRIND"/bin
-       for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-*
+       for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/t/helper/test-*
        do
                make_valgrind_symlink $file
        done
@@ -854,10 +904,10 @@ test -d "$GIT_BUILD_DIR"/templates/blt || {
        error "You haven't built things yet, have you?"
 }
 
-if ! test -x "$GIT_BUILD_DIR"/test-chmtime
+if ! test -x "$GIT_BUILD_DIR"/t/helper/test-chmtime
 then
        echo >&2 'You need to build test-chmtime:'
-       echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
+       echo >&2 'Run "make t/helper/test-chmtime" in the source (toplevel) directory'
        exit 1
 fi
 
@@ -1056,6 +1106,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
@@ -1098,3 +1152,12 @@ run_with_limited_cmdline () {
 }
 
 test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true'
+
+build_option () {
+       git version --build-options |
+       sed -ne "s/^$1: //p"
+}
+
+test_lazy_prereq LONG_IS_64BIT '
+       test 8 -le "$(build_option sizeof-long)"
+'
index 42153036dcfdee66e54fa4bd777ad3c36233d640..669ebaf68be006ee53911f02da72e56cb5a100f0 100755 (executable)
@@ -1,11 +1,19 @@
 #!/bin/sh
 
 base=$(basename "$0")
+case "$base" in
+test-*)
+       program="$GIT_VALGRIND/../../t/helper/$base"
+       ;;
+*)
+       program="$GIT_VALGRIND/../../$base"
+       ;;
+esac
 
 TOOL_OPTIONS='--leak-check=no'
 
 test -z "$GIT_VALGRIND_ENABLED" &&
-exec "$GIT_VALGRIND"/../../"$base" "$@"
+exec "$program" "$@"
 
 case "$GIT_VALGRIND_MODE" in
 memcheck-fast)
@@ -29,4 +37,4 @@ exec valgrind -q --error-exitcode=126 \
        --log-fd=4 \
        --input-fd=4 \
        $GIT_VALGRIND_OPTIONS \
-       "$GIT_VALGRIND"/../../"$base" "$@"
+       "$program" "$@"
diff --git a/tag.c b/tag.c
index d72f742af9a4a6a76c8b0f6fd314473dea244b2a..d1dcd18cd7b53e21fa15bab9baad05cf16a3b9de 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -6,6 +6,59 @@
 
 const char *tag_type = "tag";
 
+static int run_gpg_verify(const char *buf, unsigned long size, unsigned flags)
+{
+       struct signature_check sigc;
+       size_t payload_size;
+       int ret;
+
+       memset(&sigc, 0, sizeof(sigc));
+
+       payload_size = parse_signature(buf, size);
+
+       if (size == payload_size) {
+               if (flags & GPG_VERIFY_VERBOSE)
+                       write_in_full(1, buf, payload_size);
+               return error("no signature found");
+       }
+
+       ret = check_signature(buf, payload_size, buf + payload_size,
+                               size - payload_size, &sigc);
+       print_signature_buffer(&sigc, flags);
+
+       signature_check_clear(&sigc);
+       return ret;
+}
+
+int gpg_verify_tag(const unsigned char *sha1, const char *name_to_report,
+               unsigned flags)
+{
+       enum object_type type;
+       char *buf;
+       unsigned long size;
+       int ret;
+
+       type = sha1_object_info(sha1, NULL);
+       if (type != OBJ_TAG)
+               return error("%s: cannot verify a non-tag object of type %s.",
+                               name_to_report ?
+                               name_to_report :
+                               find_unique_abbrev(sha1, DEFAULT_ABBREV),
+                               typename(type));
+
+       buf = read_sha1_file(sha1, &type, &size);
+       if (!buf)
+               return error("%s: unable to read file.",
+                               name_to_report ?
+                               name_to_report :
+                               find_unique_abbrev(sha1, DEFAULT_ABBREV));
+
+       ret = run_gpg_verify(buf, size, flags);
+
+       free(buf);
+       return ret;
+}
+
 struct object *deref_tag(struct object *o, const char *warn, int warnlen)
 {
        while (o && o->type == OBJ_TAG)
diff --git a/tag.h b/tag.h
index f4580aea42633d4e6d849735cf1eedcbc4730ed2..a5721b6731eb89e1db78e41fcf6b8dfd8784841e 100644 (file)
--- a/tag.h
+++ b/tag.h
@@ -17,5 +17,7 @@ extern int parse_tag_buffer(struct tag *item, const void *data, unsigned long si
 extern int parse_tag(struct tag *item);
 extern struct object *deref_tag(struct object *, const char *, int);
 extern struct object *deref_tag_noverify(struct object *);
+extern int gpg_verify_tag(const unsigned char *sha1,
+               const char *name_to_report, unsigned flags);
 
 #endif /* TAG_H */
index 0af7ebf016745c4a114a12d207381342b29ccf4f..2990c92424832d288d5bbab2dfe79b5db361e0b0 100644 (file)
@@ -120,7 +120,12 @@ int create_tempfile(struct tempfile *tempfile, const char *path)
        prepare_tempfile_object(tempfile);
 
        strbuf_add_absolute_path(&tempfile->filename, path);
-       tempfile->fd = open(tempfile->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
+       tempfile->fd = open(tempfile->filename.buf,
+                           O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0666);
+       if (O_CLOEXEC && tempfile->fd < 0 && errno == EINVAL)
+               /* Try again w/o O_CLOEXEC: the kernel might not support it */
+               tempfile->fd = open(tempfile->filename.buf,
+                                   O_RDWR | O_CREAT | O_EXCL, 0666);
        if (tempfile->fd < 0) {
                strbuf_reset(&tempfile->filename);
                return -1;
index 4219fe41bd3e2ad16f0b1caf55eedca0b2d9986e..2f0038decd5b6d00b55fa03ec8988a3810d1784f 100644 (file)
  *   * calling `fdopen_tempfile()` to get a `FILE` pointer for the
  *     open file and writing to the file using stdio.
  *
+ *   Note that the file descriptor returned by create_tempfile()
+ *   is marked O_CLOEXEC, so the new contents must be written by
+ *   the current process, not any spawned one.
+ *
  * When finished writing, the caller can:
  *
  * * Close the file descriptor and remove the temporary file by
diff --git a/templates/hooks--pre-receive.sample b/templates/hooks--pre-receive.sample
new file mode 100755 (executable)
index 0000000..a1fd29e
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to make use of push options.
+# The example simply echoes all push options that start with 'echoback='
+# and rejects all pushes when the "reject" push option is used.
+#
+# To enable this hook, rename this file to "pre-receive".
+
+if test -n "$GIT_PUSH_OPTION_COUNT"
+then
+       i=0
+       while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
+       do
+               eval "value=\$GIT_PUSH_OPTION_$i"
+               case "$value" in
+               echoback=*)
+                       echo "echo from the pre-receive-hook: ${value#*=}" >&2
+                       ;;
+               reject)
+                       exit 1
+               esac
+               i=$((i + 1))
+       done
+fi
diff --git a/test-match-trees.c b/test-match-trees.c
deleted file mode 100644 (file)
index 109f03e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "cache.h"
-#include "tree.h"
-
-int main(int ac, char **av)
-{
-       unsigned char hash1[20], hash2[20], shifted[20];
-       struct tree *one, *two;
-
-       if (get_sha1(av[1], hash1))
-               die("cannot parse %s as an object name", av[1]);
-       if (get_sha1(av[2], hash2))
-               die("cannot parse %s as an object name", av[2]);
-       one = parse_tree_indirect(hash1);
-       if (!one)
-               die("not a tree-ish %s", av[1]);
-       two = parse_tree_indirect(hash2);
-       if (!two)
-               die("not a tree-ish %s", av[2]);
-
-       shift_tree(one->object.oid.hash, two->object.oid.hash, shifted, -1);
-       printf("shifted: %s\n", sha1_to_hex(shifted));
-
-       exit(0);
-}
diff --git a/test-regex.c b/test-regex.c
deleted file mode 100644 (file)
index 0dc598e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "git-compat-util.h"
-
-int main(int argc, char **argv)
-{
-       char *pat = "[^={} \t]+";
-       char *str = "={}\nfred";
-       regex_t r;
-       regmatch_t m[1];
-
-       if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
-               die("failed regcomp() for pattern '%s'", pat);
-       if (regexec(&r, str, 1, m, 0))
-               die("no match of pattern '%s' to string '%s'", pat, str);
-
-       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
-       if (m[0].rm_so == 3) /* matches '\n' when it should not */
-               die("regex bug confirmed: re-build git with NO_REGEX=1");
-
-       exit(0);
-}
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 */
diff --git a/trace.c b/trace.c
index 4aeea60973100bfed212842cb46a5a81154b7781..7508aea028bb642140cabcd02c37cdaf3a21234c 100644 (file)
--- a/trace.c
+++ b/trace.c
 #include "cache.h"
 #include "quote.h"
 
+/*
+ * "Normalize" a key argument by converting NULL to our trace_default,
+ * and otherwise passing through the value. All caller-facing functions
+ * should normalize their inputs in this way, though most get it
+ * for free by calling get_trace_fd() (directly or indirectly).
+ */
+static void normalize_trace_key(struct trace_key **key)
+{
+       static struct trace_key trace_default = { "GIT_TRACE" };
+       if (!*key)
+               *key = &trace_default;
+}
+
 /* Get a trace file descriptor from "key" env variable. */
 static int get_trace_fd(struct trace_key *key)
 {
-       static struct trace_key trace_default = { "GIT_TRACE" };
        const char *trace;
 
-       /* use default "GIT_TRACE" if NULL */
-       if (!key)
-               key = &trace_default;
+       normalize_trace_key(&key);
 
        /* don't open twice */
        if (key->initialized)
@@ -51,22 +61,19 @@ static int get_trace_fd(struct trace_key *key)
        else if (is_absolute_path(trace)) {
                int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT, 0666);
                if (fd == -1) {
-                       fprintf(stderr,
-                               "Could not open '%s' for tracing: %s\n"
-                               "Defaulting to tracing on stderr...\n",
+                       warning("could not open '%s' for tracing: %s",
                                trace, strerror(errno));
-                       key->fd = STDERR_FILENO;
+                       trace_disable(key);
                } else {
                        key->fd = fd;
                        key->need_close = 1;
                }
        } else {
-               fprintf(stderr, "What does '%s' for %s mean?\n"
-                       "If you want to trace into a file, then please set "
-                       "%s to an absolute pathname (starting with /).\n"
-                       "Defaulting to tracing on stderr...\n",
-                       trace, key->key, key->key);
-               key->fd = STDERR_FILENO;
+               warning("unknown trace value for '%s': %s\n"
+                       "         If you want to trace into a file, then please set %s\n"
+                       "         to an absolute pathname (starting with /)",
+                       key->key, trace, key->key);
+               trace_disable(key);
        }
 
        key->initialized = 1;
@@ -75,6 +82,8 @@ static int get_trace_fd(struct trace_key *key)
 
 void trace_disable(struct trace_key *key)
 {
+       normalize_trace_key(&key);
+
        if (key->need_close)
                close(key->fd);
        key->fd = 0;
@@ -82,9 +91,6 @@ void trace_disable(struct trace_key *key)
        key->need_close = 0;
 }
 
-static const char err_msg[] = "Could not trace into fd given by "
-       "GIT_TRACE environment variable";
-
 static int prepare_trace_line(const char *file, int line,
                              struct trace_key *key, struct strbuf *buf)
 {
@@ -120,18 +126,27 @@ static int prepare_trace_line(const char *file, int line,
        return 1;
 }
 
+static void trace_write(struct trace_key *key, const void *buf, unsigned len)
+{
+       if (write_in_full(get_trace_fd(key), buf, len) < 0) {
+               normalize_trace_key(&key);
+               warning("unable to write trace for %s: %s",
+                       key->key, strerror(errno));
+               trace_disable(key);
+       }
+}
+
 void trace_verbatim(struct trace_key *key, const void *buf, unsigned len)
 {
        if (!trace_want(key))
                return;
-       write_or_whine_pipe(get_trace_fd(key), buf, len, err_msg);
+       trace_write(key, buf, len);
 }
 
 static void print_trace_line(struct trace_key *key, struct strbuf *buf)
 {
        strbuf_complete_line(buf);
-
-       write_or_whine_pipe(get_trace_fd(key), buf->buf, buf->len, err_msg);
+       trace_write(key, buf->buf, buf->len);
        strbuf_release(buf);
 }
 
index 8e48a5c9909ec7e8ba44e5b0678455b4dc8d2d02..f0ecde2d2f8b35c565ab176c76882a5fee8d8fb2 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,40 @@ 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 = ":";
 
 #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,21 +78,26 @@ 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);
 }
@@ -91,12 +118,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 +145,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 +161,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 +247,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 +265,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;
+
+       if (list_empty(head))
+               return 0;
 
-       for (in_tok = start_tok; in_tok; in_tok = following_tok) {
-               following_tok = backwards ? in_tok->previous : in_tok->next;
+       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;
-
-       if (!*arg_tok_first)
-               return;
+       struct list_head *pos, *p;
+       struct arg_item *arg_tok;
 
-       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,41 +413,32 @@ 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;
-       if (src->name)
-               dst->name = xstrdup(src->name);
-       if (src->key)
-               dst->key = xstrdup(src->key);
-       if (src->command)
-               dst->command = xstrdup(src->command);
+       dst->name = xstrdup_or_null(src->name);
+       dst->key = xstrdup_or_null(src->key);
+       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;
 }
@@ -509,7 +488,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;
@@ -562,38 +541,12 @@ static int git_trailer_config(const char *conf_key, const char *value, void *cb)
                        warning(_("unknown value '%s' for key '%s'"), value, conf_key);
                break;
        default:
-               die("internal bug in trailer.c");
-       }
-       return 0;
-}
-
-static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char *trailer)
-{
-       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);
+               die("BUG: trailer.c: unhandled type %d", type);
        }
        return 0;
 }
 
-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;
@@ -602,94 +555,134 @@ 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)
+/*
+ * Return the location of the first separator in line, or -1 if there is no
+ * separator.
+ */
+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 loc = strcspn(line, separators);
+       if (!line[loc])
+               return -1;
+       return loc;
+}
 
-       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)
@@ -737,6 +730,15 @@ static int find_patch_start(struct strbuf **lines, int count)
 static int find_trailer_start(struct strbuf **lines, int count)
 {
        int start, end_of_title, 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++) {
@@ -748,26 +750,71 @@ static int find_trailer_start(struct strbuf **lines, int count)
        end_of_title = start;
 
        /*
-        * 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)
+               const char **p;
+               int separator_pos;
+
+               if (lines[start]->buf[0] == comment_line_char) {
+                       non_trailer_lines += possible_continuation_lines;
+                       possible_continuation_lines = 0;
                        continue;
+               }
                if (contains_only_spaces(lines[start]->buf)) {
                        if (only_spaces)
                                continue;
-                       return start + 1;
+                       non_trailer_lines += possible_continuation_lines;
+                       if (recognized_prefix &&
+                           trailer_lines * 3 >= non_trailer_lines)
+                               return start + 1;
+                       if (trailer_lines && !non_trailer_lines)
+                               return start + 1;
+                       return count;
                }
-               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(lines[start]->buf, *p)) {
+                               trailer_lines++;
+                               possible_continuation_lines = 0;
+                               recognized_prefix = 1;
+                               goto continue_outer_loop;
+                       }
+               }
+
+               separator_pos = find_separator(lines[start]->buf, separators);
+               if (separator_pos >= 1 && !isspace(lines[start]->buf[0])) {
+                       struct list_head *pos;
+
+                       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(lines[start]->buf, item,
+                                                      separator_pos)) {
+                                       recognized_prefix = 1;
+                                       break;
+                               }
+                       }
+               } else if (isspace(lines[start]->buf[0]))
+                       possible_continuation_lines++;
+               else {
+                       non_trailer_lines++;
+                       non_trailer_lines += possible_continuation_lines;
+                       possible_continuation_lines = 0;
                }
-               return count;
+continue_outer_loop:
+               ;
        }
 
-       return only_spaces ? count : 0;
+       return count;
 }
 
 /* Get the index of the end of the trailers */
@@ -805,11 +852,13 @@ static void print_lines(FILE *outfile, struct strbuf **lines, int start, int end
 
 static int process_input_file(FILE *outfile,
                              struct strbuf **lines,
-                             struct trailer_item **in_tok_first,
-                             struct trailer_item **in_tok_last)
+                             struct list_head *head)
 {
        int count = 0;
        int patch_start, trailer_start, trailer_end, i;
+       struct strbuf tok = STRBUF_INIT;
+       struct strbuf val = STRBUF_INIT;
+       struct trailer_item *last = NULL;
 
        /* Get the line count */
        while (lines[count])
@@ -827,20 +876,43 @@ static int process_input_file(FILE *outfile,
 
        /* 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);
+               int separator_pos;
+               if (lines[i]->buf[0] == comment_line_char)
+                       continue;
+               if (last && isspace(lines[i]->buf[0])) {
+                       struct strbuf sb = STRBUF_INIT;
+                       strbuf_addf(&sb, "%s\n%s", last->value, lines[i]->buf);
+                       strbuf_strip_suffix(&sb, "\n");
+                       free(last->value);
+                       last->value = strbuf_detach(&sb, NULL);
+                       continue;
+               }
+               separator_pos = find_separator(lines[i]->buf, separators);
+               if (separator_pos >= 1) {
+                       parse_trailer(&tok, &val, NULL, lines[i]->buf,
+                                     separator_pos);
+                       last = add_trailer_item(head,
+                                               strbuf_detach(&tok, NULL),
+                                               strbuf_detach(&val, NULL));
+               } else {
+                       strbuf_addbuf(&val, lines[i]);
+                       strbuf_strip_suffix(&val, "\n");
+                       add_trailer_item(head,
+                                        NULL,
+                                        strbuf_detach(&val, NULL));
+                       last = NULL;
                }
        }
 
        return trailer_end;
 }
 
-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));
        }
 }
 
@@ -877,9 +949,8 @@ 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;
+       LIST_HEAD(head);
+       LIST_HEAD(arg_head);
        struct strbuf **lines;
        int trailer_end;
        FILE *outfile = stdout;
@@ -894,15 +965,15 @@ void process_trailers(const char *file, int in_place, int trim_empty, struct str
                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, lines, &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);
index b934183236ca571093f55818f5018c278150e274..91aed35ebbc3cbb4fb9acbad55ab3de69e62d9f5 100644 (file)
@@ -258,8 +258,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 +315,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 +338,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;
 }
@@ -1038,7 +1072,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
                                (*tail)->status |= REF_STATUS_UPTODATE;
                                if (read_ref((*tail)->name,
                                             (*tail)->old_oid.hash) < 0)
-                                       die(N_("Could not read ref %s"),
+                                       die(_("Could not read ref %s"),
                                            (*tail)->name);
                        }
                }
@@ -1103,7 +1137,7 @@ static void transfer_debug(const char *fmt, ...)
 }
 
 /* Stream state: More data may be coming in this direction. */
-#define SSTATE_TRANSFERING 0
+#define SSTATE_TRANSFERRING 0
 /*
  * Stream state: No more data coming in this direction, flushing rest of
  * data.
@@ -1112,7 +1146,7 @@ static void transfer_debug(const char *fmt, ...)
 /* Stream state: Transfer in this direction finished. */
 #define SSTATE_FINISHED 2
 
-#define STATE_NEEDS_READING(state) ((state) <= SSTATE_TRANSFERING)
+#define STATE_NEEDS_READING(state) ((state) <= SSTATE_TRANSFERRING)
 #define STATE_NEEDS_WRITING(state) ((state) <= SSTATE_FLUSHING)
 #define STATE_NEEDS_CLOSING(state) ((state) == SSTATE_FLUSHING)
 
@@ -1152,7 +1186,7 @@ static void udt_close_if_finished(struct unidirectional_transfer *t)
 }
 
 /*
- * Tries to read read data from source into buffer. If buffer is full,
+ * Tries to read data from source into buffer. If buffer is full,
  * no data is read. Returns 0 on success, -1 on error.
  */
 static int udt_do_read(struct unidirectional_transfer *t)
@@ -1166,7 +1200,7 @@ static int udt_do_read(struct unidirectional_transfer *t)
        bytes = read(t->src, t->buf + t->bufuse, BUFFERSIZE - t->bufuse);
        if (bytes < 0 && errno != EWOULDBLOCK && errno != EAGAIN &&
                errno != EINTR) {
-               error("read(%s) failed: %s", t->src_name, strerror(errno));
+               error_errno("read(%s) failed", t->src_name);
                return -1;
        } else if (bytes == 0) {
                transfer_debug("%s EOF (with %i bytes in buffer)",
@@ -1193,7 +1227,7 @@ static int udt_do_write(struct unidirectional_transfer *t)
        transfer_debug("%s is writable", t->dest_name);
        bytes = xwrite(t->dest, t->buf, t->bufuse);
        if (bytes < 0 && errno != EWOULDBLOCK) {
-               error("write(%s) failed: %s", t->dest_name, strerror(errno));
+               error_errno("write(%s) failed", t->dest_name);
                return -1;
        } else if (bytes > 0) {
                t->bufuse -= bytes;
@@ -1306,7 +1340,7 @@ static int tloop_join(pid_t pid, const char *name)
 {
        int tret;
        if (waitpid(pid, &tret, 0) < 0) {
-               error("%s process failed to wait: %s", name, strerror(errno));
+               error_errno("%s process failed to wait", name);
                return 1;
        }
        if (!WIFEXITED(tret) || WEXITSTATUS(tret)) {
@@ -1369,7 +1403,7 @@ int bidirectional_transfer_loop(int input, int output)
        state.ptg.dest = 1;
        state.ptg.src_is_sock = (input == output);
        state.ptg.dest_is_sock = 0;
-       state.ptg.state = SSTATE_TRANSFERING;
+       state.ptg.state = SSTATE_TRANSFERRING;
        state.ptg.bufuse = 0;
        state.ptg.src_name = "remote input";
        state.ptg.dest_name = "stdout";
@@ -1378,7 +1412,7 @@ int bidirectional_transfer_loop(int input, int output)
        state.gtp.dest = output;
        state.gtp.src_is_sock = 0;
        state.gtp.dest_is_sock = (input == output);
-       state.gtp.state = SSTATE_TRANSFERING;
+       state.gtp.state = SSTATE_TRANSFERRING;
        state.gtp.bufuse = 0;
        state.gtp.src_name = "stdin";
        state.gtp.dest_name = "remote output";
index 095e61f0adde0741a3c95817f10df4b957d473ee..04e5d6623e39014622e0a185d37f8a456fd352e6 100644 (file)
@@ -59,7 +59,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
                                localname + 11, transport->remote->name,
                                remotename);
                else
-                       printf("Would set upstream of '%s' to '%s' of '%s'\n",
+                       printf(_("Would set upstream of '%s' to '%s' of '%s'\n"),
                                localname + 11, remotename + 11,
                                transport->remote->name);
        }
@@ -148,9 +148,18 @@ static int set_git_option(struct git_transport_options *opts,
                        char *end;
                        opts->depth = strtol(value, &end, 0);
                        if (*end)
-                               die("transport: invalid depth option '%s'", value);
+                               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;
 }
@@ -211,6 +220,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;
@@ -295,7 +307,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 +321,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,26 +335,23 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
        }
 }
 
-static const char *status_abbrev(unsigned char sha1[20])
-{
-       return find_unique_abbrev(sha1, DEFAULT_ABBREV);
-}
-
-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;
                const char *msg;
 
-               strbuf_addstr(&quickref, status_abbrev(ref->old_oid.hash));
+               strbuf_add_unique_abbrev(&quickref, ref->old_oid.hash,
+                                        DEFAULT_ABBREV);
                if (ref->forced_update) {
                        strbuf_addstr(&quickref, "...");
                        type = '+';
@@ -350,76 +361,107 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
                        type = ' ';
                        msg = NULL;
                }
-               strbuf_addstr(&quickref, status_abbrev(ref->new_oid.hash));
+               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)
-               fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
+       if (!count) {
+               char *url = transport_anonymize_url(dest);
+               fprintf(porcelain ? stdout : stderr, "To %s\n", url);
+               free(url);
+       }
 
        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_SHA1_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)
 {
@@ -427,25 +469,29 @@ void transport_print_push_status(const char *dest, struct ref *refs,
        int n = 0;
        unsigned char head_sha1[20];
        char *head;
+       int summary_width = transport_summary_width(refs);
 
        head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, 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;
@@ -510,6 +556,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
        args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
        args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
        args.atomic = !!(flags & TRANSPORT_PUSH_ATOMIC);
+       args.push_options = transport->push_options;
        args.url = transport->url;
 
        if (flags & TRANSPORT_PUSH_CERT_ALWAYS)
@@ -563,7 +610,7 @@ void transport_take_over(struct transport *transport,
        struct git_transport_data *data;
 
        if (!transport->smart_options)
-               die("Bug detected: Taking over transport requires non-NULL "
+               die("BUG: taking over transport requires non-NULL "
                    "smart_options field.");
 
        data = xcalloc(1, sizeof(*data));
@@ -767,19 +814,19 @@ static void die_with_unpushed_submodules(struct string_list *needs_pushing)
 {
        int i;
 
-       fprintf(stderr, "The following submodule paths contain changes that can\n"
-                       "not be found on any remote:\n");
+       fprintf(stderr, _("The following submodule paths contain changes that can\n"
+                       "not be found on any remote:\n"));
        for (i = 0; i < needs_pushing->nr; i++)
-               printf("  %s\n", needs_pushing->items[i].string);
-       fprintf(stderr, "\nPlease try\n\n"
-                       "       git push --recurse-submodules=on-demand\n\n"
-                       "or cd to the path and use\n\n"
-                       "       git push\n\n"
-                       "to push them to a remote.\n\n");
+               fprintf(stderr, "  %s\n", needs_pushing->items[i].string);
+       fprintf(stderr, _("\nPlease try\n\n"
+                         "     git push --recurse-submodules=on-demand\n\n"
+                         "or cd to the path and use\n\n"
+                         "     git push\n\n"
+                         "to push them to a remote.\n\n"));
 
        string_list_clear(needs_pushing, 0);
 
-       die("Aborting.");
+       die(_("Aborting."));
 }
 
 static int run_pre_push_hook(struct transport *transport,
@@ -902,23 +949,39 @@ int transport_push(struct transport *transport,
 
                if ((flags & TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND) && !is_bare_repository()) {
                        struct ref *ref = remote_refs;
+                       struct sha1_array commits = SHA1_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))
+                                       sha1_array_append(&commits, ref->new_oid.hash);
+
+                       if (!push_unpushed_submodules(&commits,
+                                                     transport->remote->name,
+                                                     pretend)) {
+                               sha1_array_clear(&commits);
+                               die("Failed to push all needed submodules!");
+                       }
+                       sha1_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) &&
+                     !pretend)) && !is_bare_repository()) {
                        struct ref *ref = remote_refs;
                        struct string_list needs_pushing = STRING_LIST_INIT_DUP;
+                       struct sha1_array commits = SHA1_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))
+                                       sha1_array_append(&commits, ref->new_oid.hash);
+
+                       if (find_unpushed_submodules(&commits, transport->remote->name,
+                                               &needs_pushing)) {
+                               sha1_array_clear(&commits);
+                               die_with_unpushed_submodules(&needs_pushing);
+                       }
+                       string_list_clear(&needs_pushing, 0);
+                       sha1_array_clear(&commits);
                }
 
                push_ret = transport->push_refs(transport, remote_refs, flags);
@@ -1083,9 +1146,7 @@ static int refs_from_alternate_cb(struct alternate_object_database *e,
        const struct ref *extra;
        struct alternate_refs_data *cb = data;
 
-       e->name[-1] = '\0';
-       other = xstrdup(real_path(e->base));
-       e->name[-1] = '/';
+       other = xstrdup(real_path(e->path));
        len = strlen(other);
 
        while (other[len-1] == '/')
index c68140892c6258925104f7dda385e635fcf95e20..b8e4ee8099260a74e5207048cf2837c9fd686568 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;
@@ -48,6 +53,12 @@ struct transport {
         */
        unsigned cloning : 1;
 
+       /*
+        * These strings will be passed to the {pre, post}-receive hook,
+        * on the remote side, if both sides support the push options capability.
+        */
+       const struct string_list *push_options;
+
        /**
         * Returns 0 if successful, positive if the option is not
         * recognized or is inapplicable, and negative if the option
@@ -134,9 +145,9 @@ struct transport {
 #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)
+extern int transport_summary_width(const struct ref *refs);
 
 /* Returns a transport suitable for the url */
 struct transport *transport_get(struct remote *, const char *);
@@ -179,6 +190,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"
 
index 4dda9a14abacbf38ba19fcf89b2ef54576a26538..e164e532b2f76617d822c3bef9492b9525b56e83 100644 (file)
  */
 #define S_IFXMIN_NEQ   S_DIFFTREE_IFXMIN_NEQ
 
+#define FAST_ARRAY_ALLOC(x, nr) do { \
+       if ((nr) <= 2) \
+               (x) = xalloca((nr) * sizeof(*(x))); \
+       else \
+               ALLOC_ARRAY((x), nr); \
+} while(0)
+#define FAST_ARRAY_FREE(x, nr) do { \
+       if ((nr) > 2) \
+               free((x)); \
+} while(0)
 
 static struct combine_diff_path *ll_diff_tree_paths(
        struct combine_diff_path *p, const unsigned char *sha1,
@@ -183,7 +193,7 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
 
        if (t) {
                /* path present in resulting tree */
-               sha1 = tree_entry_extract(t, &path, &mode);
+               sha1 = tree_entry_extract(t, &path, &mode)->hash;
                pathlen = tree_entry_len(&t->entry);
                isdir = S_ISDIR(mode);
        } else {
@@ -229,7 +239,7 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
                                                DIFF_STATUS_ADDED;
 
                        if (tpi_valid) {
-                               sha1_i = tp[i].entry.sha1;
+                               sha1_i = tp[i].entry.oid->hash;
                                mode_i = tp[i].entry.mode;
                        }
                        else {
@@ -265,19 +275,19 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
        if (recurse) {
                const unsigned char **parents_sha1;
 
-               parents_sha1 = xalloca(nparent * sizeof(parents_sha1[0]));
+               FAST_ARRAY_ALLOC(parents_sha1, nparent);
                for (i = 0; i < nparent; ++i) {
                        /* same rule as in emitthis */
                        int tpi_valid = tp && !(tp[i].entry.mode & S_IFXMIN_NEQ);
 
-                       parents_sha1[i] = tpi_valid ? tp[i].entry.sha1
+                       parents_sha1[i] = tpi_valid ? tp[i].entry.oid->hash
                                                    : NULL;
                }
 
                strbuf_add(base, path, pathlen);
                strbuf_addch(base, '/');
                p = ll_diff_tree_paths(p, sha1, parents_sha1, nparent, base, opt);
-               xalloca_free(parents_sha1);
+               FAST_ARRAY_FREE(parents_sha1, nparent);
        }
 
        strbuf_setlen(base, old_baselen);
@@ -402,8 +412,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
        void *ttree, **tptree;
        int i;
 
-       tp     = xalloca(nparent * sizeof(tp[0]));
-       tptree = xalloca(nparent * sizeof(tptree[0]));
+       FAST_ARRAY_ALLOC(tp, nparent);
+       FAST_ARRAY_ALLOC(tptree, nparent);
 
        /*
         * load parents first, as they are probably already cached.
@@ -482,7 +492,7 @@ static struct combine_diff_path *ll_diff_tree_paths(
                                                continue;
 
                                        /* diff(t,pi) != ø */
-                                       if (hashcmp(t.entry.sha1, tp[i].entry.sha1) ||
+                                       if (oidcmp(t.entry.oid, tp[i].entry.oid) ||
                                            (t.entry.mode != tp[i].entry.mode))
                                                continue;
 
@@ -531,8 +541,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
        free(ttree);
        for (i = nparent-1; i >= 0; i--)
                free(tptree[i]);
-       xalloca_free(tptree);
-       xalloca_free(tp);
+       FAST_ARRAY_FREE(tptree, nparent);
+       FAST_ARRAY_FREE(tp, nparent);
 
        return p;
 }
@@ -607,7 +617,7 @@ static void try_to_follow_renames(const unsigned char *old, const unsigned char
        diff_setup_done(&diff_opts);
        ll_diff_tree_sha1(old, new, base, &diff_opts);
        diffcore_std(&diff_opts);
-       free_pathspec(&diff_opts.pathspec);
+       clear_pathspec(&diff_opts.pathspec);
 
        /* Go through the new set of filepairing, and see if we find a more interesting one */
        opt->found_follow = 0;
@@ -630,7 +640,7 @@ static void try_to_follow_renames(const unsigned char *old, const unsigned char
                        /* Update the path we use from now on.. */
                        path[0] = p->one->path;
                        path[1] = NULL;
-                       free_pathspec(&opt->pathspec);
+                       clear_pathspec(&opt->pathspec);
                        parse_pathspec(&opt->pathspec,
                                       PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL,
                                       PATHSPEC_LITERAL_PATH, "", path);
index cd4bb2c38bdf40f497ece781ce3a9e61de6b4399..828f4356be039bc07ec09665ac725341515a36ea 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.sha1 = (const unsigned char *)(path + len);
+       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,21 +102,44 @@ 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.sha1 + 20;
+       const unsigned char *end = desc->entry.oid->hash + 20;
        unsigned long size = desc->size;
        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);
@@ -110,7 +173,7 @@ void setup_traverse_info(struct traverse_info *info, const char *base)
                pathlen--;
        info->pathlen = pathlen ? pathlen + 1 : 0;
        info->name.path = base;
-       info->name.sha1 = (void *)(base + pathlen + 1);
+       info->name.oid = (void *)(base + pathlen + 1);
        if (pathlen)
                info->prev = &dummy;
 }
@@ -433,10 +496,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char
        int namelen = strlen(name);
        while (t->size) {
                const char *entry;
-               const unsigned char *sha1;
+               const struct object_id *oid;
                int entrylen, cmp;
 
-               sha1 = tree_entry_extract(t, &entry, mode);
+               oid = tree_entry_extract(t, &entry, mode);
                entrylen = tree_entry_len(&t->entry);
                update_tree_entry(t);
                if (entrylen > namelen)
@@ -447,7 +510,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char
                if (cmp < 0)
                        break;
                if (entrylen == namelen) {
-                       hashcpy(result, sha1);
+                       hashcpy(result, oid->hash);
                        return 0;
                }
                if (name[entrylen] != '/')
@@ -455,10 +518,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, unsigned char
                if (!S_ISDIR(*mode))
                        break;
                if (++entrylen == namelen) {
-                       hashcpy(result, sha1);
+                       hashcpy(result, oid->hash);
                        return 0;
                }
-               return get_tree_entry(sha1, name + entrylen, result, mode);
+               return get_tree_entry(oid->hash, name + entrylen, result, mode);
        }
        return -1;
 }
index 174eb617dfb9d6a85bcf1e309227c8b724089765..68bb78b928b5059202e5672f445fd5d6e22f9921 100644 (file)
@@ -2,7 +2,7 @@
 #define TREE_WALK_H
 
 struct name_entry {
-       const unsigned char *sha1;
+       const struct object_id *oid;
        const char *path;
        unsigned int mode;
 };
@@ -13,26 +13,34 @@ struct tree_desc {
        unsigned int size;
 };
 
-static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
+static inline const struct object_id *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
 {
        *pathp = desc->entry.path;
        *modep = desc->entry.mode;
-       return desc->entry.sha1;
+       return desc->entry.oid;
 }
 
 static inline int tree_entry_len(const struct name_entry *ne)
 {
-       return (const char *)ne->sha1 - ne->path - 1;
+       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 f79ff9813e37529cf7adbcda307027b0495cfb1c..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);
 }
 
@@ -76,7 +76,7 @@ static int read_tree_1(struct tree *tree, struct strbuf *base,
                                continue;
                }
 
-               switch (fn(entry.sha1, base,
+               switch (fn(entry.oid->hash, base,
                           entry.path, entry.mode, stage, context)) {
                case 0:
                        continue;
@@ -87,19 +87,19 @@ static int read_tree_1(struct tree *tree, struct strbuf *base,
                }
 
                if (S_ISDIR(entry.mode))
-                       hashcpy(sha1, entry.sha1);
+                       hashcpy(sha1, entry.oid->hash);
                else if (S_ISGITLINK(entry.mode)) {
                        struct commit *commit;
 
-                       commit = lookup_commit(entry.sha1);
+                       commit = lookup_commit(entry.oid->hash);
                        if (!commit)
                                die("Commit %s in submodule path %s%s not found",
-                                   sha1_to_hex(entry.sha1),
+                                   oid_to_hex(entry.oid),
                                    base->buf, entry.path);
 
                        if (parse_commit(commit))
                                die("Invalid commit %s in submodule path %s%s",
-                                   sha1_to_hex(entry.sha1),
+                                   oid_to_hex(entry.oid),
                                    base->buf, entry.path);
 
                        hashcpy(sha1, commit->tree->object.oid.hash);
@@ -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 129a3547dc5be189d4d6ae46d904307195bb6667..7a6df99d10e1dbabc9f7df74316fd91bd55c1fd5 100644 (file)
@@ -62,17 +62,17 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
        if (!strcmp(cmd, "checkout"))
                msg = advice_commit_before_merge
                      ? _("Your local changes to the following files would be overwritten by checkout:\n%%s"
-                         "Please commit your changes or stash them before you can switch branches.")
+                         "Please commit your changes or stash them before you switch branches.")
                      : _("Your local changes to the following files would be overwritten by checkout:\n%%s");
        else if (!strcmp(cmd, "merge"))
                msg = advice_commit_before_merge
                      ? _("Your local changes to the following files would be overwritten by merge:\n%%s"
-                         "Please commit your changes or stash them before you can merge.")
+                         "Please commit your changes or stash them before you merge.")
                      : _("Your local changes to the following files would be overwritten by merge:\n%%s");
        else
                msg = advice_commit_before_merge
                      ? _("Your local changes to the following files would be overwritten by %s:\n%%s"
-                         "Please commit your changes or stash them before you can %s.")
+                         "Please commit your changes or stash them before you %s.")
                      : _("Your local changes to the following files would be overwritten by %s:\n%%s");
        msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] =
                xstrfmt(msg, cmd, cmd);
@@ -83,34 +83,34 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
        if (!strcmp(cmd, "checkout"))
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be removed by checkout:\n%%s"
-                         "Please move or remove them before you can switch branches.")
+                         "Please move or remove them before you switch branches.")
                      : _("The following untracked working tree files would be removed by checkout:\n%%s");
        else if (!strcmp(cmd, "merge"))
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be removed by merge:\n%%s"
-                         "Please move or remove them before you can merge.")
+                         "Please move or remove them before you merge.")
                      : _("The following untracked working tree files would be removed by merge:\n%%s");
        else
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be removed by %s:\n%%s"
-                         "Please move or remove them before you can %s.")
+                         "Please move or remove them before you %s.")
                      : _("The following untracked working tree files would be removed by %s:\n%%s");
        msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = xstrfmt(msg, cmd, cmd);
 
        if (!strcmp(cmd, "checkout"))
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be overwritten by checkout:\n%%s"
-                         "Please move or remove them before you can switch branches.")
+                         "Please move or remove them before you switch branches.")
                      : _("The following untracked working tree files would be overwritten by checkout:\n%%s");
        else if (!strcmp(cmd, "merge"))
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be overwritten by merge:\n%%s"
-                         "Please move or remove them before you can merge.")
+                         "Please move or remove them before you merge.")
                      : _("The following untracked working tree files would be overwritten by merge:\n%%s");
        else
                msg = advice_commit_before_merge
                      ? _("The following untracked working tree files would be overwritten by %s:\n%%s"
-                         "Please move or remove them before you can %s.")
+                         "Please move or remove them before you %s.")
                      : _("The following untracked working tree files would be overwritten by %s:\n%%s");
        msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = xstrfmt(msg, cmd, cmd);
 
@@ -123,9 +123,9 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
        msgs[ERROR_SPARSE_NOT_UPTODATE_FILE] =
                _("Cannot update sparse checkout: the following entries are not up-to-date:\n%s");
        msgs[ERROR_WOULD_LOSE_ORPHANED_OVERWRITTEN] =
-               _("The following Working tree files would be overwritten by sparse checkout update:\n%s");
+               _("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");
+               _("The following working tree files would be removed by sparse checkout update:\n%s");
 
        opts->show_all_errors = 1;
        /* rejected paths may not have a static buffer */
@@ -218,8 +218,8 @@ static void unlink_entry(const struct cache_entry *ce)
        schedule_dir_for_removal(ce->name, ce_namelen(ce));
 }
 
-static struct checkout state;
-static int check_updates(struct unpack_trees_options *o)
+static int check_updates(struct unpack_trees_options *o,
+                        const struct checkout *state)
 {
        unsigned cnt = 0, total = 0;
        struct progress *progress = NULL;
@@ -264,7 +264,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);
                        }
                }
        }
@@ -509,7 +509,7 @@ static int traverse_trees_recursive(int n, unsigned long dirmask,
        for (i = 0; i < n; i++, dirmask >>= 1) {
                const unsigned char *sha1 = NULL;
                if (dirmask & 1)
-                       sha1 = names[i].sha1;
+                       sha1 = names[i].oid->hash;
                buf[i] = fill_tree_descriptor(t+i, sha1);
        }
 
@@ -625,7 +625,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->sha1);
+       oidcpy(&ce->oid, n->oid);
        make_traverse_path(ce->name, info, n);
 
        return ce;
@@ -1094,11 +1094,10 @@ 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 = CHECKOUT_INIT;
 
        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;
@@ -1239,7 +1238,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        }
 
        o->src_index = NULL;
-       ret = check_updates(o) ? (-2) : 0;
+       ret = check_updates(o, &state) ? (-2) : 0;
        if (o->dst_index) {
                if (!ret) {
                        if (!o->result.cache_tree)
@@ -1287,7 +1286,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);
 }
 
 
@@ -1393,7 +1392,7 @@ static int verify_clean_subdirectory(const struct cache_entry *ce,
                /* If we are not going to update the submodule, then
                 * we don't care.
                 */
-               if (!hashcmp(sha1, ce->sha1))
+               if (!hashcmp(sha1, ce->oid.hash))
                        return 0;
                return verify_clean_submodule(ce, error_type, o);
        }
@@ -1533,8 +1532,7 @@ static int verify_absent_1(const struct cache_entry *ce,
 
                path = xmemdupz(ce->name, len);
                if (lstat(path, &st))
-                       ret = error("cannot stat '%s': %s", path,
-                                       strerror(errno));
+                       ret = error_errno("cannot stat '%s'", path);
                else
                        ret = check_ok_to_remove(path, len, DT_UNKNOWN, NULL,
                                                 &st, error_type, o);
@@ -1542,8 +1540,7 @@ static int verify_absent_1(const struct cache_entry *ce,
                return ret;
        } else if (lstat(ce->name, &st)) {
                if (errno != ENOENT)
-                       return error("cannot stat '%s': %s", ce->name,
-                                    strerror(errno));
+                       return error_errno("cannot stat '%s'", ce->name);
                return 0;
        } else {
                return check_ok_to_remove(ce->name, ce_namelen(ce),
@@ -1667,7 +1664,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);
 }
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 b3f6653ffda1a3d6d319752676511307d9cd032b..7597ba3405e161d59608e18ec580946c60f9e6d2 100644 (file)
 #include "sigchain.h"
 #include "version.h"
 #include "string-list.h"
+#include "parse-options.h"
+#include "argv-array.h"
+#include "prio-queue.h"
 
-static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
+static const char * const upload_pack_usage[] = {
+       N_("git upload-pack [<options>] <dir>"),
+       NULL
+};
 
 /* Remember to update object flag allocation in object.h */
 #define THEY_HAVE      (1u << 11)
@@ -31,6 +37,7 @@ static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<
 
 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;
@@ -39,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;
@@ -52,26 +61,28 @@ static int keepalive = 5;
 static int use_sideband;
 static int advertise_refs;
 static int stateless_rpc;
+static const char *pack_objects_hook;
 
 static void reset_timeout(void)
 {
        alarm(timeout);
 }
 
-static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
+static void send_client_data(int fd, const char *data, ssize_t sz)
 {
-       if (use_sideband)
-               return send_sideband(1, fd, data, sz, use_sideband);
+       if (use_sideband) {
+               send_sideband(1, fd, data, sz, use_sideband);
+               return;
+       }
        if (fd == 3)
                /* emergency quit */
                fd = 2;
        if (fd == 2) {
                /* XXX: are we happy to lose stuff here? */
                xwrite(fd, data, sz);
-               return sz;
+               return;
        }
        write_or_die(fd, data, sz);
-       return sz;
 }
 
 static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
@@ -90,35 +101,39 @@ static void create_pack_file(void)
                "corruption on the remote side.";
        int buffered = -1;
        ssize_t sz;
-       const char *argv[13];
-       int i, arg = 0;
+       int i;
        FILE *pipe_fd;
 
+       if (!pack_objects_hook)
+               pack_objects.git_cmd = 1;
+       else {
+               argv_array_push(&pack_objects.args, pack_objects_hook);
+               argv_array_push(&pack_objects.args, "git");
+               pack_objects.use_shell = 1;
+       }
+
        if (shallow_nr) {
-               argv[arg++] = "--shallow-file";
-               argv[arg++] = "";
+               argv_array_push(&pack_objects.args, "--shallow-file");
+               argv_array_push(&pack_objects.args, "");
        }
-       argv[arg++] = "pack-objects";
-       argv[arg++] = "--revs";
+       argv_array_push(&pack_objects.args, "pack-objects");
+       argv_array_push(&pack_objects.args, "--revs");
        if (use_thin_pack)
-               argv[arg++] = "--thin";
+               argv_array_push(&pack_objects.args, "--thin");
 
-       argv[arg++] = "--stdout";
+       argv_array_push(&pack_objects.args, "--stdout");
        if (shallow_nr)
-               argv[arg++] = "--shallow";
+               argv_array_push(&pack_objects.args, "--shallow");
        if (!no_progress)
-               argv[arg++] = "--progress";
+               argv_array_push(&pack_objects.args, "--progress");
        if (use_ofs_delta)
-               argv[arg++] = "--delta-base-offset";
+               argv_array_push(&pack_objects.args, "--delta-base-offset");
        if (use_include_tag)
-               argv[arg++] = "--include-tag";
-       argv[arg++] = NULL;
+               argv_array_push(&pack_objects.args, "--include-tag");
 
        pack_objects.in = -1;
        pack_objects.out = -1;
        pack_objects.err = -1;
-       pack_objects.git_cmd = 1;
-       pack_objects.argv = argv;
 
        if (start_command(&pack_objects))
                die("git upload-pack: unable to fork git-pack-objects");
@@ -177,8 +192,7 @@ static void create_pack_file(void)
 
                if (ret < 0) {
                        if (errno != EINTR) {
-                               error("poll failed, resuming: %s",
-                                     strerror(errno));
+                               error_errno("poll failed, resuming");
                                sleep(1);
                        }
                        continue;
@@ -233,9 +247,7 @@ static void create_pack_file(void)
                        }
                        else
                                buffered = -1;
-                       sz = send_client_data(1, data, sz);
-                       if (sz < 0)
-                               goto fail;
+                       send_client_data(1, data, sz);
                }
 
                /*
@@ -262,9 +274,7 @@ static void create_pack_file(void)
        /* flush the data */
        if (0 <= buffered) {
                data[0] = buffered;
-               sz = send_client_data(1, data, 1);
-               if (sz < 0)
-                       goto fail;
+               send_client_data(1, data, 1);
                fprintf(stderr, "flushed.\n");
        }
        if (use_sideband)
@@ -276,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;
@@ -312,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;
@@ -333,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);
 }
 
@@ -382,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)
@@ -403,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;
@@ -432,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);
@@ -449,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
@@ -526,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 (;;) {
@@ -550,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)
@@ -570,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,7 +827,8 @@ static void receive_needs(void)
                            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);
                }
@@ -628,55 +847,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++)
@@ -724,8 +923,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;
 
@@ -736,7 +935,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) ?
@@ -748,11 +947,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;
 }
 
@@ -812,60 +1011,52 @@ 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)
                        keepalive = -1;
+       } else if (current_config_scope() != CONFIG_SCOPE_REPO) {
+               if (!strcmp("uploadpack.packobjectshook", var))
+                       return git_config_string(&pack_objects_hook, var, value);
        }
        return parse_hide_refs_config(var, value, "uploadpack");
 }
 
-int main(int argc, char **argv)
+int cmd_main(int argc, const char **argv)
 {
-       char *dir;
-       int i;
+       const char *dir;
        int strict = 0;
-
-       git_setup_gettext();
+       struct option options[] = {
+               OPT_BOOL(0, "stateless-rpc", &stateless_rpc,
+                        N_("quit after a single request/response exchange")),
+               OPT_BOOL(0, "advertise-refs", &advertise_refs,
+                        N_("exit immediately after initial ref advertisement")),
+               OPT_BOOL(0, "strict", &strict,
+                        N_("do not try <directory>/.git/ if <directory> is no Git directory")),
+               OPT_INTEGER(0, "timeout", &timeout,
+                           N_("interrupt transfer after <n> seconds of inactivity")),
+               OPT_END()
+       };
 
        packet_trace_identity("upload-pack");
-       git_extract_argv0_path(argv[0]);
        check_replace_refs = 0;
 
-       for (i = 1; i < argc; i++) {
-               char *arg = argv[i];
+       argc = parse_options(argc, argv, NULL, options, upload_pack_usage, 0);
 
-               if (arg[0] != '-')
-                       break;
-               if (!strcmp(arg, "--advertise-refs")) {
-                       advertise_refs = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--stateless-rpc")) {
-                       stateless_rpc = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--strict")) {
-                       strict = 1;
-                       continue;
-               }
-               if (starts_with(arg, "--timeout=")) {
-                       timeout = atoi(arg+10);
-                       daemon_mode = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--")) {
-                       i++;
-                       break;
-               }
-       }
+       if (argc != 1)
+               usage_with_options(upload_pack_usage, options);
 
-       if (i != argc-1)
-               usage(upload_pack_usage);
+       if (timeout)
+               daemon_mode = 1;
 
        setup_path();
 
-       dir = argv[i];
+       dir = argv[0];
 
        if (!enter_repo(dir, strict))
                die("'%s' does not appear to be a git repository", dir);
diff --git a/url.c b/url.c
index 2d89ad190cfe1c57cd20194661329551ff229993..eaf4f07081eae122fbc38e05f60ee2f11a0c65a6 100644 (file)
--- a/url.c
+++ b/url.c
@@ -29,25 +29,6 @@ int is_url(const char *url)
        return (url[0] == ':' && url[1] == '/' && url[2] == '/');
 }
 
-static int url_decode_char(const char *q)
-{
-       int i;
-       unsigned char val = 0;
-       for (i = 0; i < 2; i++) {
-               unsigned char c = *q++;
-               val <<= 4;
-               if (c >= '0' && c <= '9')
-                       val += c - '0';
-               else if (c >= 'a' && c <= 'f')
-                       val += c - 'a' + 10;
-               else if (c >= 'A' && c <= 'F')
-                       val += c - 'A' + 10;
-               else
-                       return -1;
-       }
-       return val;
-}
-
 static char *url_decode_internal(const char **query, int len,
                                 const char *stop_at, struct strbuf *out,
                                 int decode_plus)
@@ -66,7 +47,7 @@ static char *url_decode_internal(const char **query, int len,
                }
 
                if (c == '%') {
-                       int val = url_decode_char(q + 1);
+                       int val = hex2chr(q + 1);
                        if (0 <= val) {
                                strbuf_addch(out, val);
                                q += 3;
diff --git a/usage.c b/usage.c
index 82ff13163b542aab07e68bfa1056dc46316634a1..17f52c1b5ce631eed1cdf3447d80e7223a2e6f01 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -70,6 +70,21 @@ void set_error_routine(void (*routine)(const char *err, va_list params))
        error_routine = routine;
 }
 
+void (*get_error_routine(void))(const char *err, va_list params)
+{
+       return error_routine;
+}
+
+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))
 {
        die_is_recursing = routine;
@@ -109,19 +124,11 @@ void NORETURN die(const char *err, ...)
        va_end(params);
 }
 
-void NORETURN die_errno(const char *fmt, ...)
+static const char *fmt_with_err(char *buf, int n, const char *fmt)
 {
-       va_list params;
-       char fmt_with_err[1024];
        char str_error[256], *err;
        int i, j;
 
-       if (die_is_recursing()) {
-               fputs("fatal: recursion detected in die_errno handler\n",
-                       stderr);
-               exit(128);
-       }
-
        err = strerror(errno);
        for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
                if ((str_error[j++] = err[i++]) != '%')
@@ -136,13 +143,38 @@ void NORETURN die_errno(const char *fmt, ...)
                }
        }
        str_error[j] = 0;
-       snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
+       snprintf(buf, n, "%s: %s", fmt, str_error);
+       return buf;
+}
+
+void NORETURN die_errno(const char *fmt, ...)
+{
+       char buf[1024];
+       va_list params;
+
+       if (die_is_recursing()) {
+               fputs("fatal: recursion detected in die_errno handler\n",
+                       stderr);
+               exit(128);
+       }
 
        va_start(params, fmt);
-       die_routine(fmt_with_err, params);
+       die_routine(fmt_with_err(buf, sizeof(buf), fmt), params);
        va_end(params);
 }
 
+#undef error_errno
+int error_errno(const char *fmt, ...)
+{
+       char buf[1024];
+       va_list params;
+
+       va_start(params, fmt);
+       error_routine(fmt_with_err(buf, sizeof(buf), fmt), params);
+       va_end(params);
+       return -1;
+}
+
 #undef error
 int error(const char *err, ...)
 {
@@ -154,6 +186,16 @@ int error(const char *err, ...)
        return -1;
 }
 
+void warning_errno(const char *warn, ...)
+{
+       char buf[1024];
+       va_list params;
+
+       va_start(params, warn);
+       warn_routine(fmt_with_err(buf, sizeof(buf), warn), params);
+       va_end(params);
+}
+
 void warning(const char *warn, ...)
 {
        va_list params;
index 6bf2505994b1d1054604b84d49faeb45eb6a9534..2125d6da26dbdc01f7397415ef1f67616e6f2a71 100644 (file)
@@ -148,6 +148,18 @@ PATTERNS("csharp",
         "[a-zA-Z_][a-zA-Z0-9_]*"
         "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?"
         "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"),
+IPATTERN("css",
+        "![:;][[:space:]]*$\n"
+        "^[_a-z0-9].*$",
+        /* -- */
+        /*
+         * This regex comes from W3C CSS specs. Should theoretically also
+         * allow ISO 10646 characters U+00A0 and higher,
+         * but they are not handled in this regex.
+         */
+        "-?[_a-zA-Z][-_a-zA-Z0-9]*" /* identifiers */
+        "|-?[0-9]+|\\#[0-9a-fA-F]+" /* numbers */
+),
 { "default", NULL, -1, { NULL, 0 } },
 };
 #undef PATTERNS
diff --git a/utf8.h b/utf8.h
index 7930b44f19c701cc671d9639289782abb1812034..6bbcf31a831d60faf119fdc3f82f1eb10233e255 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -48,7 +48,7 @@ static inline char *reencode_string(const char *in,
 int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
 
 /*
- * Returns true if the the path would match ".git" after HFS case-folding.
+ * Returns true if the path would match ".git" after HFS case-folding.
  * The path should be NUL-terminated, but we will match variants of both ".git\0"
  * and ".git/..." (but _not_ ".../.git"). This makes it suitable for both fsck
  * and verify_path().
index bd0f2c2b86847708e5ebe668773f0fd08b9efc5d..97cba39cdf5b6de75e3df0cd0240cae6adcf3859 100644 (file)
@@ -73,7 +73,7 @@ void fast_export_begin_note(uint32_t revision, const char *author,
        static int firstnote = 1;
        size_t loglen = strlen(log);
        printf("commit %s\n", note_ref);
-       printf("committer %s <%s@%s> %ld +0000\n", author, author, "local", timestamp);
+       printf("committer %s <%s@%s> %lu +0000\n", author, author, "local", timestamp);
        printf("data %"PRIuMAX"\n", (uintmax_t)loglen);
        fwrite(log, loglen, 1, stdout);
        if (firstnote) {
@@ -107,7 +107,7 @@ void fast_export_begin_commit(uint32_t revision, const char *author,
        }
        printf("commit %s\n", local_ref);
        printf("mark :%"PRIu32"\n", revision);
-       printf("committer %s <%s@%s> %ld +0000\n",
+       printf("committer %s <%s@%s> %lu +0000\n",
                   *author ? author : "nobody",
                   *author ? author : "nobody",
                   *uuid ? uuid : "local", timestamp);
index 57cc1cec033f638e6d408370039b46b653289e84..e416caf8a4fc744232ca95450bce2b6109388aad 100644 (file)
@@ -53,9 +53,9 @@ long buffer_tmpfile_prepare_to_read(struct line_buffer *buf)
 {
        long pos = ftell(buf->infile);
        if (pos < 0)
-               return error("ftell error: %s", strerror(errno));
+               return error_errno("ftell error");
        if (fseek(buf->infile, 0, SEEK_SET))
-               return error("seek error: %s", strerror(errno));
+               return error_errno("seek error");
        return pos;
 }
 
index f11d490995ee7e3367c1d18e1058f2e322cfa177..06d273c9e8ce2b6b8ddbf967693e5305355d5be6 100644 (file)
@@ -12,7 +12,7 @@ static int input_error(struct line_buffer *file)
 {
        if (!buffer_ferror(file))
                return error("delta preimage ends early");
-       return error("cannot read delta preimage: %s", strerror(errno));
+       return error_errno("cannot read delta preimage");
 }
 
 static int skip_or_whine(struct line_buffer *file, off_t gap)
index 74c97c4543d1fa707961aab1453edfb69b2679d2..75c753162ab3b39293b258ec51f06dcc8d07ec3a 100644 (file)
@@ -64,13 +64,13 @@ static int write_strbuf(struct strbuf *sb, FILE *out)
 {
        if (fwrite(sb->buf, 1, sb->len, out) == sb->len)        /* Success. */
                return 0;
-       return error("cannot write delta postimage: %s", strerror(errno));
+       return error_errno("cannot write delta postimage");
 }
 
 static int error_short_read(struct line_buffer *input)
 {
        if (buffer_ferror(input))
-               return error("error reading delta: %s", strerror(errno));
+               return error_errno("error reading delta");
        return error("invalid delta: unexpected end of file");
 }
 
index 31d1d83d451e0e78f19067799d14e555a62e2cc8..e4b395963b9457a680a369c3e1997c799f8793ab 100644 (file)
@@ -501,7 +501,7 @@ static void init(int report_fd)
 int svndump_init(const char *filename)
 {
        if (buffer_init(&input, filename))
-               return error("cannot open %s: %s", filename ? filename : "NULL", strerror(errno));
+               return error_errno("cannot open %s", filename ? filename : "NULL");
        init(REPORT_FILENO);
        return 0;
 }
@@ -509,7 +509,7 @@ int svndump_init(const char *filename)
 int svndump_init_fd(int in_fd, int back_fd)
 {
        if(buffer_fdinit(&input, xdup(in_fd)))
-               return error("cannot open fd %d: %s", in_fd, strerror(errno));
+               return error_errno("cannot open fd %d", in_fd);
        init(xdup(back_fd));
        return 0;
 }
index 08773d419f17a131c35e8e671bcfe4b174a9ceb3..2c86e406f92d9bf0063e6be4f9d76fdbbac17c89 100644 (file)
--- a/walker.c
+++ b/walker.c
@@ -9,10 +9,14 @@
 
 static unsigned char current_commit_sha1[20];
 
-void walker_say(struct walker *walker, const char *fmt, const char *hex)
+void walker_say(struct walker *walker, const char *fmt, ...)
 {
-       if (walker->get_verbosely)
-               fprintf(stderr, fmt, hex);
+       if (walker->get_verbosely) {
+               va_list ap;
+               va_start(ap, fmt);
+               vfprintf(stderr, fmt, ap);
+               va_end(ap);
+       }
 }
 
 static void report_missing(const struct object *obj)
@@ -43,12 +47,12 @@ static int process_tree(struct walker *walker, struct tree *tree)
                if (S_ISGITLINK(entry.mode))
                        continue;
                if (S_ISDIR(entry.mode)) {
-                       struct tree *tree = lookup_tree(entry.sha1);
+                       struct tree *tree = lookup_tree(entry.oid->hash);
                        if (tree)
                                obj = &tree->object;
                }
                else {
-                       struct blob *blob = lookup_blob(entry.sha1);
+                       struct blob *blob = lookup_blob(entry.oid->hash);
                        if (blob)
                                obj = &blob->object;
                }
index 95e576548474e942addcf1978f215720dd2f6e96..a869013e85110a0b64d8fe344c8bd67f5e8f7f09 100644 (file)
--- a/walker.h
+++ b/walker.h
@@ -19,7 +19,8 @@ struct walker {
 };
 
 /* Report what we got under get_verbosely */
-void walker_say(struct walker *walker, const char *, const char *);
+__attribute__((format (printf, 2, 3)))
+void walker_say(struct walker *walker, const char *fmt, ...);
 
 /* Load pull targets from stdin */
 int walker_targets_stdin(char ***target, const char ***write_ref);
index f91ba99f32c047e5f3238668ae83de647ab92df2..57c876580592ab246d0c5c20cf20079d2097243c 100644 (file)
@@ -136,7 +136,7 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                /*
                                 * Try to advance faster when an asterisk is
                                 * followed by a literal. We know in this case
-                                * that the the string before the literal
+                                * that the string before the literal
                                 * must belong to "*".
                                 * If match_slash is false, do not look past
                                 * the first slash as it cannot belong to '*'.
index 6181a66f1ee2e1e45d7d8b2c88d312746473661f..eb6121263b0d56b6b7ea7c5024e9ceb68256c1c5 100644 (file)
@@ -2,6 +2,8 @@
 #include "refs.h"
 #include "strbuf.h"
 #include "worktree.h"
+#include "dir.h"
+#include "wt-status.h"
 
 void free_worktrees(struct worktree **worktrees)
 {
@@ -9,8 +11,9 @@ void free_worktrees(struct worktree **worktrees)
 
        for (i = 0; worktrees[i]; i++) {
                free(worktrees[i]->path);
-               free(worktrees[i]->git_dir);
+               free(worktrees[i]->id);
                free(worktrees[i]->head_ref);
+               free(worktrees[i]->lock_reason);
                free(worktrees[i]);
        }
        free (worktrees);
@@ -18,7 +21,7 @@ void free_worktrees(struct worktree **worktrees)
 
 /*
  * read 'path_to_ref' into 'ref'.  Also if is_detached is not NULL,
- * set is_detached to 1 (0) if the ref is detatched (is not detached).
+ * set is_detached to 1 (0) if the ref is detached (is not detached).
  *
  * $GIT_COMMON_DIR/$symref (e.g. HEAD) is practically outside $GIT_DIR so
  * for linked worktrees, `resolve_ref_unsafe()` won't work (it uses
@@ -74,33 +77,25 @@ static struct worktree *get_main_worktree(void)
        struct worktree *worktree = NULL;
        struct strbuf path = STRBUF_INIT;
        struct strbuf worktree_path = STRBUF_INIT;
-       struct strbuf gitdir = STRBUF_INIT;
        struct strbuf head_ref = STRBUF_INIT;
        int is_bare = 0;
        int is_detached = 0;
 
-       strbuf_addf(&gitdir, "%s", absolute_path(get_git_common_dir()));
-       strbuf_addbuf(&worktree_path, &gitdir);
+       strbuf_add_absolute_path(&worktree_path, get_git_common_dir());
        is_bare = !strbuf_strip_suffix(&worktree_path, "/.git");
        if (is_bare)
                strbuf_strip_suffix(&worktree_path, "/.");
 
        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->git_dir = strbuf_detach(&gitdir, NULL);
        worktree->is_bare = is_bare;
-       worktree->head_ref = NULL;
        worktree->is_detached = is_detached;
-       add_head_info(&head_ref, worktree);
+       if (!parse_ref(path.buf, &head_ref, &is_detached))
+               add_head_info(&head_ref, worktree);
 
-done:
        strbuf_release(&path);
-       strbuf_release(&gitdir);
        strbuf_release(&worktree_path);
        strbuf_release(&head_ref);
        return worktree;
@@ -111,16 +106,13 @@ static struct worktree *get_linked_worktree(const char *id)
        struct worktree *worktree = NULL;
        struct strbuf path = STRBUF_INIT;
        struct strbuf worktree_path = STRBUF_INIT;
-       struct strbuf gitdir = STRBUF_INIT;
        struct strbuf head_ref = STRBUF_INIT;
        int is_detached = 0;
 
        if (!id)
                die("Missing linked worktree name");
 
-       strbuf_addf(&gitdir, "%s/worktrees/%s",
-                       absolute_path(get_git_common_dir()), id);
-       strbuf_addf(&path, "%s/gitdir", gitdir.buf);
+       strbuf_git_common_path(&path, "worktrees/%s/gitdir", id);
        if (strbuf_read_file(&worktree_path, path.buf, 0) <= 0)
                /* invalid gitdir file */
                goto done;
@@ -128,7 +120,7 @@ static struct worktree *get_linked_worktree(const char *id)
        strbuf_rtrim(&worktree_path);
        if (!strbuf_strip_suffix(&worktree_path, "/.git")) {
                strbuf_reset(&worktree_path);
-               strbuf_addstr(&worktree_path, absolute_path("."));
+               strbuf_add_absolute_path(&worktree_path, ".");
                strbuf_strip_suffix(&worktree_path, "/.");
        }
 
@@ -138,23 +130,44 @@ 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->git_dir = strbuf_detach(&gitdir, NULL);
-       worktree->is_bare = 0;
-       worktree->head_ref = NULL;
+       worktree->id = xstrdup(id);
        worktree->is_detached = is_detached;
        add_head_info(&head_ref, worktree);
 
 done:
        strbuf_release(&path);
-       strbuf_release(&gitdir);
        strbuf_release(&worktree_path);
        strbuf_release(&head_ref);
        return worktree;
 }
 
-struct worktree **get_worktrees(void)
+static void mark_current_worktree(struct worktree **worktrees)
+{
+       char *git_dir = xstrdup(absolute_path(get_git_dir()));
+       int i;
+
+       for (i = 0; worktrees[i]; i++) {
+               struct worktree *wt = worktrees[i];
+               const char *wt_git_dir = get_worktree_git_dir(wt);
+
+               if (!fspathcmp(git_dir, absolute_path(wt_git_dir))) {
+                       wt->is_current = 1;
+                       break;
+               }
+       }
+       free(git_dir);
+}
+
+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;
@@ -164,8 +177,7 @@ struct worktree **get_worktrees(void)
 
        list = xmalloc(alloc * sizeof(struct worktree *));
 
-       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);
@@ -173,7 +185,7 @@ struct worktree **get_worktrees(void)
        if (dir) {
                while ((d = readdir(dir)) != NULL) {
                        struct worktree *linked = NULL;
-                       if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+                       if (is_dot_or_dotdot(d->d_name))
                                continue;
 
                        if ((linked = get_linked_worktree(d->d_name))) {
@@ -185,35 +197,186 @@ 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;
 }
 
-char *find_shared_symref(const char *symref, const char *target)
+const char *get_worktree_git_dir(const struct worktree *wt)
+{
+       if (!wt)
+               return get_git_dir();
+       else if (!wt->id)
+               return get_git_common_dir();
+       else
+               return git_common_path("worktrees/%s", wt->id);
+}
+
+static struct worktree *find_worktree_by_suffix(struct worktree **list,
+                                               const char *suffix)
+{
+       struct worktree *found = NULL;
+       int nr_found = 0, suffixlen;
+
+       suffixlen = strlen(suffix);
+       if (!suffixlen)
+               return NULL;
+
+       for (; *list && nr_found < 2; list++) {
+               const char      *path    = (*list)->path;
+               int              pathlen = strlen(path);
+               int              start   = pathlen - suffixlen;
+
+               /* suffix must start at directory boundary */
+               if ((!start || (start > 0 && is_dir_sep(path[start - 1]))) &&
+                   !fspathcmp(suffix, path + start)) {
+                       found = *list;
+                       nr_found++;
+               }
+       }
+       return nr_found == 1 ? found : NULL;
+}
+
+struct worktree *find_worktree(struct worktree **list,
+                              const char *prefix,
+                              const char *arg)
 {
-       char *existing = NULL;
+       struct worktree *wt;
+       char *path;
+
+       if ((wt = find_worktree_by_suffix(list, arg)))
+               return wt;
+
+       arg = prefix_filename(prefix, strlen(prefix), arg);
+       path = xstrdup(real_path(arg));
+       for (; *list; list++)
+               if (!fspathcmp(path, real_path((*list)->path)))
+                       break;
+       free(path);
+       return *list;
+}
+
+int is_main_worktree(const struct worktree *wt)
+{
+       return !wt->id;
+}
+
+const char *is_worktree_locked(struct worktree *wt)
+{
+       assert(!is_main_worktree(wt));
+
+       if (!wt->lock_reason_valid) {
+               struct strbuf path = STRBUF_INIT;
+
+               strbuf_addstr(&path, worktree_git_path(wt, "locked"));
+               if (file_exists(path.buf)) {
+                       struct strbuf lock_reason = STRBUF_INIT;
+                       if (strbuf_read_file(&lock_reason, path.buf, 0) < 0)
+                               die_errno(_("failed to read '%s'"), path.buf);
+                       strbuf_trim(&lock_reason);
+                       wt->lock_reason = strbuf_detach(&lock_reason, NULL);
+               } else
+                       wt->lock_reason = NULL;
+               wt->lock_reason_valid = 1;
+               strbuf_release(&path);
+       }
+
+       return wt->lock_reason;
+}
+
+int is_worktree_being_rebased(const struct worktree *wt,
+                             const char *target)
+{
+       struct wt_status_state state;
+       int found_rebase;
+
+       memset(&state, 0, sizeof(state));
+       found_rebase = wt_status_check_rebase(wt, &state) &&
+               ((state.rebase_in_progress ||
+                 state.rebase_interactive_in_progress) &&
+                state.branch &&
+                starts_with(target, "refs/heads/") &&
+                !strcmp(state.branch, target + strlen("refs/heads/")));
+       free(state.branch);
+       free(state.onto);
+       return found_rebase;
+}
+
+int is_worktree_being_bisected(const struct worktree *wt,
+                              const char *target)
+{
+       struct wt_status_state state;
+       int found_rebase;
+
+       memset(&state, 0, sizeof(state));
+       found_rebase = wt_status_check_bisect(wt, &state) &&
+               state.branch &&
+               starts_with(target, "refs/heads/") &&
+               !strcmp(state.branch, target + strlen("refs/heads/"));
+       free(state.branch);
+       return found_rebase;
+}
+
+/*
+ * note: this function should be able to detect shared symref even if
+ * HEAD is temporarily detached (e.g. in the middle of rebase or
+ * bisect). New commands that do similar things should update this
+ * function as well.
+ */
+const struct worktree *find_shared_symref(const char *symref,
+                                         const char *target)
+{
+       const struct worktree *existing = NULL;
        struct strbuf path = STRBUF_INIT;
        struct strbuf sb = STRBUF_INIT;
-       struct worktree **worktrees = get_worktrees();
+       static struct worktree **worktrees;
        int i = 0;
 
+       if (worktrees)
+               free_worktrees(worktrees);
+       worktrees = get_worktrees(0);
+
        for (i = 0; worktrees[i]; i++) {
+               struct worktree *wt = worktrees[i];
+               if (wt->is_bare)
+                       continue;
+
+               if (wt->is_detached && !strcmp(symref, "HEAD")) {
+                       if (is_worktree_being_rebased(wt, target)) {
+                               existing = wt;
+                               break;
+                       }
+                       if (is_worktree_being_bisected(wt, target)) {
+                               existing = wt;
+                               break;
+                       }
+               }
+
                strbuf_reset(&path);
                strbuf_reset(&sb);
-               strbuf_addf(&path, "%s/%s", worktrees[i]->git_dir, symref);
+               strbuf_addf(&path, "%s/%s",
+                           get_worktree_git_dir(wt),
+                           symref);
 
                if (parse_ref(path.buf, &sb, NULL)) {
                        continue;
                }
 
                if (!strcmp(sb.buf, target)) {
-                       existing = xstrdup(worktrees[i]->path);
+                       existing = wt;
                        break;
                }
        }
 
        strbuf_release(&path);
        strbuf_release(&sb);
-       free_worktrees(worktrees);
 
        return existing;
 }
index b4b3dda79280707d2d65bf790be15c7a1e662b5e..d59ce1fee875800462a1e464592fd9dd01828e17 100644 (file)
@@ -3,15 +3,20 @@
 
 struct worktree {
        char *path;
-       char *git_dir;
+       char *id;
        char *head_ref;
+       char *lock_reason;      /* internal use */
        unsigned char head_sha1[20];
        int is_detached;
        int is_bare;
+       int is_current;
+       int lock_reason_valid;
 };
 
 /* 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
@@ -20,7 +25,32 @@ 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);
+
+/*
+ * Return git dir of the worktree. Note that the path may be relative.
+ * If wt is NULL, git dir of current worktree is returned.
+ */
+extern const char *get_worktree_git_dir(const struct worktree *wt);
+
+/*
+ * Search a worktree that can be unambiguously identified by
+ * "arg". "prefix" must not be NULL.
+ */
+extern struct worktree *find_worktree(struct worktree **list,
+                                     const char *prefix,
+                                     const char *arg);
+
+/*
+ * Return true if the given worktree is the main one.
+ */
+extern int is_main_worktree(const struct worktree *wt);
+
+/*
+ * Return the reason string if the given worktree is locked or NULL
+ * otherwise.
+ */
+extern const char *is_worktree_locked(struct worktree *wt);
 
 /*
  * Free up the memory for worktree(s)
@@ -29,10 +59,21 @@ extern void free_worktrees(struct worktree **);
 
 /*
  * Check if a per-worktree symref points to a ref in the main worktree
- * or any linked worktree, and return the path to the exising worktree
- * if it is.  Returns NULL if there is no existing ref.  The caller is
- * responsible for freeing the returned path.
+ * or any linked worktree, and return the worktree that holds the ref,
+ * or NULL otherwise. The result may be destroyed by the next call.
+ */
+extern const struct worktree *find_shared_symref(const char *symref,
+                                                const char *target);
+
+int is_worktree_being_rebased(const struct worktree *wt, const char *target);
+int is_worktree_being_bisected(const struct worktree *wt, const char *target);
+
+/*
+ * Similar to git_path() but can produce paths for a specified
+ * worktree instead of current one
  */
-extern char *find_shared_symref(const char *symref, const char *target);
+extern const char *worktree_git_path(const struct worktree *wt,
+                                    const char *fmt, ...)
+       __attribute__((format (printf, 2, 3)));
 
 #endif
index db0ec6a7370fd56e4e11c49a4b9e5e15f461e1f9..22b6e4948fbfa97da33dd0299da2130944940a42 100644 (file)
@@ -17,6 +17,7 @@ fi
 GITPERLLIB='@@BUILD_DIR@@/perl/blib/lib'"${GITPERLLIB:+:$GITPERLLIB}"
 GIT_TEXTDOMAINDIR='@@BUILD_DIR@@/po/build/locale'
 PATH='@@BUILD_DIR@@/bin-wrappers:'"$PATH"
+
 export GIT_EXEC_PATH GITPERLLIB PATH GIT_TEXTDOMAINDIR
 
 if test -n "$GIT_TEST_GDB"
index 9afc1a021c224d4ff2230fffeb0e4f0882d4a99e..e7f197996868a614c84537ad96fc672ea901148d 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -227,6 +227,24 @@ int xopen(const char *path, int oflag, ...)
        }
 }
 
+static int handle_nonblock(int fd, short poll_events, int err)
+{
+       struct pollfd pfd;
+
+       if (err != EAGAIN && err != EWOULDBLOCK)
+               return 0;
+
+       pfd.fd = fd;
+       pfd.events = poll_events;
+
+       /*
+        * no need to check for errors, here;
+        * a subsequent read/write will detect unrecoverable errors
+        */
+       poll(&pfd, 1, -1);
+       return 1;
+}
+
 /*
  * xread() is the same a read(), but it automatically restarts read()
  * operations with a recoverable error (EAGAIN and EINTR). xread()
@@ -242,20 +260,8 @@ ssize_t xread(int fd, void *buf, size_t len)
                if (nr < 0) {
                        if (errno == EINTR)
                                continue;
-                       if (errno == EAGAIN || errno == EWOULDBLOCK) {
-                               struct pollfd pfd;
-                               pfd.events = POLLIN;
-                               pfd.fd = fd;
-                               /*
-                                * it is OK if this poll() failed; we
-                                * want to leave this infinite loop
-                                * only when read() returns with
-                                * success, or an expected failure,
-                                * which would be checked by the next
-                                * call to read(2).
-                                */
-                               poll(&pfd, 1, -1);
-                       }
+                       if (handle_nonblock(fd, POLLIN, errno))
+                               continue;
                }
                return nr;
        }
@@ -273,8 +279,13 @@ ssize_t xwrite(int fd, const void *buf, size_t len)
            len = MAX_IO_SIZE;
        while (1) {
                nr = write(fd, buf, len);
-               if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
-                       continue;
+               if (nr < 0) {
+                       if (errno == EINTR)
+                               continue;
+                       if (handle_nonblock(fd, POLLOUT, errno))
+                               continue;
+               }
+
                return nr;
        }
 }
@@ -446,23 +457,6 @@ int git_mkstemp(char *path, size_t len, const char *template)
        return mkstemp(path);
 }
 
-/* git_mkstemps() - create tmp file with suffix honoring TMPDIR variable. */
-int git_mkstemps(char *path, size_t len, const char *template, int suffix_len)
-{
-       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 mkstemps(path, suffix_len);
-}
-
 /* Adapted from libiberty's mkstemp.c. */
 
 #undef TMP_MAX
@@ -572,7 +566,7 @@ static int warn_if_unremovable(const char *op, const char *file, int rc)
        if (!rc || errno == ENOENT)
                return 0;
        err = errno;
-       warning("unable to %s %s: %s", op, file, strerror(errno));
+       warning_errno("unable to %s %s", op, file);
        errno = err;
        return rc;
 }
@@ -608,7 +602,7 @@ int remove_or_warn(unsigned int mode, const char *file)
 
 void warn_on_inaccessible(const char *path)
 {
-       warning(_("unable to access '%s': %s"), path, strerror(errno));
+       warning_errno(_("unable to access '%s'"), path);
 }
 
 static int access_error_is_ok(int err, unsigned flag)
@@ -657,56 +651,28 @@ int xsnprintf(char *dst, size_t max, const char *fmt, ...)
        return len;
 }
 
-static int write_file_v(const char *path, int fatal,
-                       const char *fmt, va_list params)
+void write_file_buf(const char *path, const char *buf, size_t len)
 {
-       struct strbuf sb = STRBUF_INIT;
-       int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
-       if (fd < 0) {
-               if (fatal)
-                       die_errno(_("could not open %s for writing"), path);
-               return -1;
-       }
-       strbuf_vaddf(&sb, fmt, params);
-       strbuf_complete_line(&sb);
-       if (write_in_full(fd, sb.buf, sb.len) != sb.len) {
-               int err = errno;
-               close(fd);
-               strbuf_release(&sb);
-               errno = err;
-               if (fatal)
-                       die_errno(_("could not write to %s"), path);
-               return -1;
-       }
-       strbuf_release(&sb);
-       if (close(fd)) {
-               if (fatal)
-                       die_errno(_("could not close %s"), path);
-               return -1;
-       }
-       return 0;
+       int fd = xopen(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+       if (write_in_full(fd, buf, len) != len)
+               die_errno(_("could not write to %s"), path);
+       if (close(fd))
+               die_errno(_("could not close %s"), path);
 }
 
-int write_file(const char *path, const char *fmt, ...)
+void write_file(const char *path, const char *fmt, ...)
 {
-       int status;
        va_list params;
+       struct strbuf sb = STRBUF_INIT;
 
        va_start(params, fmt);
-       status = write_file_v(path, 1, fmt, params);
+       strbuf_vaddf(&sb, fmt, params);
        va_end(params);
-       return status;
-}
 
-int write_file_gently(const char *path, const char *fmt, ...)
-{
-       int status;
-       va_list params;
+       strbuf_complete_line(&sb);
 
-       va_start(params, fmt);
-       status = write_file_v(path, 0, fmt, params);
-       va_end(params);
-       return status;
+       write_file_buf(path, sb.buf, sb.len);
+       strbuf_release(&sb);
 }
 
 void sleep_millisec(int millisec)
index 49e80aa222132c3c151b79bd37749d92a12f745a..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
@@ -82,26 +69,3 @@ void write_or_die(int fd, const void *buf, size_t count)
                die_errno("write error");
        }
 }
-
-int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
-{
-       if (write_in_full(fd, buf, count) < 0) {
-               check_pipe(errno);
-               fprintf(stderr, "%s: write error (%s)\n",
-                       msg, strerror(errno));
-               return 0;
-       }
-
-       return 1;
-}
-
-int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
-{
-       if (write_in_full(fd, buf, count) < 0) {
-               fprintf(stderr, "%s: write error (%s)\n",
-                       msg, strerror(errno));
-               return 0;
-       }
-
-       return 1;
-}
index ef7486474a1eafb7d5d1344323cd6abf012c31db..a2e9d332d8332bb1dbeea26b683c5e3f032a822e 100644 (file)
@@ -15,6 +15,8 @@
 #include "column.h"
 #include "strbuf.h"
 #include "utf8.h"
+#include "worktree.h"
+#include "lockfile.h"
 
 static const char cut_line[] =
 "------------------------ >8 ------------------------\n";
@@ -138,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;
@@ -190,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);
 
@@ -206,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);
 
@@ -225,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);
@@ -237,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", "");
 }
@@ -262,7 +264,7 @@ static const char *wt_status_unmerged_status_string(int stagemask)
        case 7:
                return _("both modified:");
        default:
-               die(_("bug: unhandled unmerged status %x"), stagemask);
+               die("BUG: unhandled unmerged status %x", stagemask);
        }
 }
 
@@ -303,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;
@@ -330,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);
@@ -366,18 +368,18 @@ static void wt_status_print_change_data(struct wt_status *s,
                if (d->new_submodule_commits || d->dirty_submodule) {
                        strbuf_addstr(&extra, " (");
                        if (d->new_submodule_commits)
-                               strbuf_addf(&extra, _("new commits, "));
+                               strbuf_addstr(&extra, _("new commits, "));
                        if (d->dirty_submodule & DIRTY_SUBMODULE_MODIFIED)
-                               strbuf_addf(&extra, _("modified content, "));
+                               strbuf_addstr(&extra, _("modified content, "));
                        if (d->dirty_submodule & DIRTY_SUBMODULE_UNTRACKED)
-                               strbuf_addf(&extra, _("untracked content, "));
+                               strbuf_addstr(&extra, _("untracked content, "));
                        strbuf_setlen(&extra, extra.len - 2);
                        strbuf_addch(&extra, ')');
                }
                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);
        }
 
@@ -387,7 +389,7 @@ static void wt_status_print_change_data(struct wt_status *s,
        status_printf(s, color(WT_STATUS_HEADER, s), "\t");
        what = wt_status_diff_status_string(status);
        if (!what)
-               die(_("bug: unhandled diff status %c"), status);
+               die("BUG: unhandled diff status %c", status);
        len = label_width - utf8_strwidth(what);
        assert(len >= 0);
        if (status == DIFF_STATUS_COPIED || status == DIFF_STATUS_RENAMED)
@@ -431,7 +433,33 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
                        d->worktree_status = p->status;
                d->dirty_submodule = p->two->dirty_submodule;
                if (S_ISGITLINK(p->two->mode))
-                       d->new_submodule_commits = !!hashcmp(p->one->sha1, p->two->sha1);
+                       d->new_submodule_commits = !!oidcmp(&p->one->oid,
+                                                           &p->two->oid);
+
+               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;
+               }
+
        }
 }
 
@@ -477,12 +505,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;
                }
        }
@@ -496,6 +548,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) {
@@ -519,6 +572,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 {
@@ -554,6 +608,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) {
@@ -563,9 +619,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;
+                       hashcpy(d->oid_index.hash, ce->oid.hash);
+               }
        }
 }
 
@@ -625,7 +689,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;
@@ -638,17 +702,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;
@@ -662,14 +726,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);
 }
 
 /*
@@ -701,7 +765,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);
@@ -709,7 +773,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;
@@ -719,12 +783,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;
@@ -770,10 +834,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;
@@ -783,7 +847,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;
@@ -843,7 +907,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;
@@ -852,6 +916,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;
@@ -876,7 +941,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/";
@@ -894,7 +959,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;
@@ -946,17 +1011,21 @@ static void show_merge_in_progress(struct wt_status *s,
 {
        if (has_unmerged(s)) {
                status_printf_ln(s, color, _("You have unmerged paths."));
-               if (s->hints)
+               if (s->hints) {
                        status_printf_ln(s, color,
-                               _("  (fix conflicts and run \"git commit\")"));
+                                        _("  (fix conflicts and run \"git commit\")"));
+                       status_printf_ln(s, color,
+                                        _("  (use \"git merge --abort\" to abort the merge)"));
+               }
        } else {
+               s-> commitable = 1;
                status_printf_ln(s, color,
                        _("All conflicts fixed but you are still merging."));
                if (s->hints)
                        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,
@@ -977,7 +1046,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)
@@ -1047,7 +1116,6 @@ static void abbrev_sha1_in_line(struct strbuf *line)
        split = strbuf_split_max(line, ' ', 3);
        if (split[0] && split[1]) {
                unsigned char sha1[20];
-               const char *abbrev;
 
                /*
                 * strbuf_split_max left a space. Trim it and re-add
@@ -1055,17 +1123,16 @@ static void abbrev_sha1_in_line(struct strbuf *line)
                 */
                strbuf_trim(split[1]);
                if (!get_sha1(split[1]->buf, sha1)) {
-                       abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV);
                        strbuf_reset(split[1]);
-                       strbuf_addf(split[1], "%s ", abbrev);
+                       strbuf_add_unique_abbrev(split[1], sha1,
+                                                DEFAULT_ABBREV);
+                       strbuf_addch(split[1], ' ');
                        strbuf_reset(line);
                        for (i = 0; split[i]; i++)
-                               strbuf_addf(line, "%s", split[i]->buf);
+                               strbuf_addbuf(line, split[i]);
                }
        }
-       for (i = 0; split[i]; i++)
-               strbuf_release(split[i]);
-
+       strbuf_list_free(split);
 }
 
 static void read_rebase_todolist(const char *fname, struct string_list *lines)
@@ -1203,7 +1270,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,
@@ -1222,7 +1289,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,
@@ -1241,7 +1308,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,
@@ -1258,19 +1325,19 @@ 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);
 }
 
 /*
  * Extract branch information from rebase/bisect
  */
-static char *read_and_strip_branch(const char *path)
+static char *get_branch(const struct worktree *wt, const char *path)
 {
        struct strbuf sb = STRBUF_INIT;
        unsigned char sha1[20];
        const char *branch_name;
 
-       if (strbuf_read_file(&sb, git_path("%s", path), 0) <= 0)
+       if (strbuf_read_file(&sb, worktree_git_path(wt, "%s", path), 0) <= 0)
                goto got_nothing;
 
        while (sb.len && sb.buf[sb.len - 1] == '\n')
@@ -1282,10 +1349,8 @@ static char *read_and_strip_branch(const char *path)
        else if (starts_with(sb.buf, "refs/"))
                ;
        else if (!get_sha1_hex(sb.buf, sha1)) {
-               const char *abbrev;
-               abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV);
                strbuf_reset(&sb);
-               strbuf_addstr(&sb, abbrev);
+               strbuf_add_unique_abbrev(&sb, sha1, DEFAULT_ABBREV);
        } else if (!strcmp(sb.buf, "detached HEAD")) /* rebase */
                goto got_nothing;
        else                    /* bisect */
@@ -1322,8 +1387,7 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
        if (!strcmp(cb->buf.buf, "HEAD")) {
                /* HEAD is relative. Resolve it to the right reflog entry. */
                strbuf_reset(&cb->buf);
-               strbuf_addstr(&cb->buf,
-                             find_unique_abbrev(nsha1, DEFAULT_ABBREV));
+               strbuf_add_unique_abbrev(&cb->buf, nsha1, DEFAULT_ABBREV);
        }
        return 1;
 }
@@ -1362,40 +1426,62 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
        strbuf_release(&cb.buf);
 }
 
-void wt_status_get_state(struct wt_status_state *state,
-                        int get_detached_from)
+int wt_status_check_rebase(const struct worktree *wt,
+                          struct wt_status_state *state)
 {
        struct stat st;
-       unsigned char sha1[20];
 
-       if (!stat(git_path_merge_head(), &st)) {
-               state->merge_in_progress = 1;
-       } else if (!stat(git_path("rebase-apply"), &st)) {
-               if (!stat(git_path("rebase-apply/applying"), &st)) {
+       if (!stat(worktree_git_path(wt, "rebase-apply"), &st)) {
+               if (!stat(worktree_git_path(wt, "rebase-apply/applying"), &st)) {
                        state->am_in_progress = 1;
-                       if (!stat(git_path("rebase-apply/patch"), &st) && !st.st_size)
+                       if (!stat(worktree_git_path(wt, "rebase-apply/patch"), &st) && !st.st_size)
                                state->am_empty_patch = 1;
                } else {
                        state->rebase_in_progress = 1;
-                       state->branch = read_and_strip_branch("rebase-apply/head-name");
-                       state->onto = read_and_strip_branch("rebase-apply/onto");
+                       state->branch = get_branch(wt, "rebase-apply/head-name");
+                       state->onto = get_branch(wt, "rebase-apply/onto");
                }
-       } else if (!stat(git_path("rebase-merge"), &st)) {
-               if (!stat(git_path("rebase-merge/interactive"), &st))
+       } else if (!stat(worktree_git_path(wt, "rebase-merge"), &st)) {
+               if (!stat(worktree_git_path(wt, "rebase-merge/interactive"), &st))
                        state->rebase_interactive_in_progress = 1;
                else
                        state->rebase_in_progress = 1;
-               state->branch = read_and_strip_branch("rebase-merge/head-name");
-               state->onto = read_and_strip_branch("rebase-merge/onto");
+               state->branch = get_branch(wt, "rebase-merge/head-name");
+               state->onto = get_branch(wt, "rebase-merge/onto");
+       } else
+               return 0;
+       return 1;
+}
+
+int wt_status_check_bisect(const struct worktree *wt,
+                          struct wt_status_state *state)
+{
+       struct stat st;
+
+       if (!stat(worktree_git_path(wt, "BISECT_LOG"), &st)) {
+               state->bisect_in_progress = 1;
+               state->branch = get_branch(wt, "BISECT_START");
+               return 1;
+       }
+       return 0;
+}
+
+void wt_status_get_state(struct wt_status_state *state,
+                        int get_detached_from)
+{
+       struct stat st;
+       unsigned char sha1[20];
+
+       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)) {
                state->cherry_pick_in_progress = 1;
                hashcpy(state->cherry_pick_head_sha1, sha1);
        }
-       if (!stat(git_path("BISECT_LOG"), &st)) {
-               state->bisect_in_progress = 1;
-               state->branch = read_and_strip_branch("BISECT_START");
-       }
+       wt_status_check_bisect(NULL, state);
        if (!stat(git_path_revert_head(), &st) &&
            !get_sha1("REVERT_HEAD", sha1)) {
                state->revert_in_progress = 1;
@@ -1406,8 +1492,8 @@ void wt_status_get_state(struct wt_status_state *state,
                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)
@@ -1424,7 +1510,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);
@@ -1461,10 +1547,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);
@@ -1475,19 +1561,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,
@@ -1502,7 +1588,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"));
@@ -1532,7 +1618,7 @@ void wt_status_print(struct wt_status *s)
                        else
                                printf(_("nothing to commit\n"));
                } else
-                       printf(_("nothing to commit, working directory clean\n"));
+                       printf(_("nothing to commit, working tree clean\n"));
        }
 }
 
@@ -1691,7 +1777,7 @@ 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;
 
@@ -1723,7 +1809,7 @@ void wt_shortstatus_print(struct wt_status *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;
@@ -1731,3 +1817,475 @@ 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;
+               hashcpy(stages[stage - 1].oid.hash, ce->oid.hash);
+               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;
+
+       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(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 c9b3b744e923f2f559f64f1bf4a1f2159b5060d6..54fec77032dc9c5d0f7af4226afc886797a209c4 100644 (file)
@@ -6,6 +6,8 @@
 #include "color.h"
 #include "pathspec.h"
 
+struct worktree;
+
 enum color_wt_status {
        WT_STATUS_HEADER = 0,
        WT_STATUS_UPDATED,
@@ -36,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;
@@ -64,6 +79,9 @@ struct wt_status {
        int show_branch;
        int hints;
 
+       enum wt_status_format status_format;
+       unsigned char sha1_commit[GIT_SHA1_RAWSZ]; /* when not Initial */
+
        /* These are computed during processing of the individual sections */
        int commitable;
        int workdir_dirty;
@@ -100,13 +118,20 @@ void wt_status_prepare(struct wt_status *s);
 void wt_status_print(struct wt_status *s);
 void wt_status_collect(struct wt_status *s);
 void wt_status_get_state(struct wt_status_state *state, int get_detached_from);
-
-void wt_shortstatus_print(struct wt_status *s);
-void wt_porcelain_print(struct wt_status *s);
+int wt_status_check_rebase(const struct worktree *wt,
+                          struct wt_status_state *state);
+int wt_status_check_bisect(const struct worktree *wt,
+                          struct wt_status_state *state);
 
 __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 54236f24b9786710f91650ac63f6004cdeb012e6..060038c2d6b92512e6625d0f5d94ed5439cd249c 100644 (file)
@@ -100,9 +100,9 @@ static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
 
 /*
  * Trim down common substring at the end of the buffers,
- * but leave at least ctx lines at the end.
+ * but end on a complete line.
  */
-static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
+static void trim_common_tail(mmfile_t *a, mmfile_t *b)
 {
        const int blk = 1024;
        long trimmed = 0, recovered = 0;
@@ -110,9 +110,6 @@ static void trim_common_tail(mmfile_t *a, mmfile_t *b, long ctx)
        char *bp = b->ptr + b->size;
        long smaller = (a->size < b->size) ? a->size : b->size;
 
-       if (ctx)
-               return;
-
        while (blk + trimmed <= smaller && !memcmp(ap - blk, bp - blk, blk)) {
                trimmed += blk;
                ap -= blk;
@@ -134,7 +131,8 @@ int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t co
        if (mf1->size > MAX_XDIFF_SIZE || mf2->size > MAX_XDIFF_SIZE)
                return -1;
 
-       trim_common_tail(&a, &b, xecfg->ctxlen);
+       if (!xecfg->ctxlen && !(xecfg->flags & XDL_EMIT_FUNCCONTEXT))
+               trim_common_tail(&a, &b);
 
        return xdl_diff(&a, &b, xpp, xecfg, xecb);
 }
@@ -180,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;
 }
 
@@ -216,11 +214,10 @@ struct ff_regs {
 static long ff_regexp(const char *line, long len,
                char *buffer, long buffer_size, void *priv)
 {
-       char *line_buffer;
        struct ff_regs *regs = priv;
        regmatch_t pmatch[2];
        int i;
-       int result = -1;
+       int result;
 
        /* Exclude terminating newline (and cr) from matching */
        if (len > 0 && line[len-1] == '\n') {
@@ -230,18 +227,16 @@ static long ff_regexp(const char *line, long len,
                        len--;
        }
 
-       line_buffer = xstrndup(line, len); /* make NUL terminated */
-
        for (i = 0; i < regs->nr; i++) {
                struct ff_reg *reg = regs->array + i;
-               if (!regexec(&reg->re, line_buffer, 2, pmatch, 0)) {
+               if (!regexec_buf(&reg->re, line, len, 2, pmatch, 0)) {
                        if (reg->negate)
-                               goto fail;
+                               return -1;
                        break;
                }
        }
        if (regs->nr <= i)
-               goto fail;
+               return -1;
        i = pmatch[1].rm_so >= 0 ? 1 : 0;
        line += pmatch[i].rm_so;
        result = pmatch[i].rm_eo - pmatch[i].rm_so;
@@ -250,8 +245,6 @@ static long ff_regexp(const char *line, long len,
        while (result > 0 && (isspace(line[result - 1])))
                result--;
        memcpy(buffer, line, result);
- fail:
-       free(line_buffer);
        return result;
 }
 
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 4fb7e79410c22fba1fb390af2e09008e932f5ea8..8db16d4ae6def5657bc51fa2b9b354a7c0267201 100644 (file)
@@ -41,6 +41,9 @@ extern "C" {
 
 #define XDF_IGNORE_BLANK_LINES (1 << 7)
 
+#define XDF_COMPACTION_HEURISTIC (1 << 8)
+#define XDF_INDENT_HEURISTIC (1 << 9)
+
 #define XDL_EMIT_FUNCNAMES (1 << 0)
 #define XDL_EMIT_FUNCCONTEXT (1 << 2)
 
index 2358a2d6326e54308413cb8a5e6b61eba06324e9..760fbb6db7583f6d0ec5eed9b9c63ea6a0e7abe7 100644 (file)
@@ -400,106 +400,577 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
 }
 
 
-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;
-       xrecord_t **recs = xdf->recs;
+static int is_blank_line(xrecord_t *rec, long flags)
+{
+       return xdl_blankline(rec->ptr, rec->size, flags);
+}
 
+static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
+{
+       return (rec1->ha == rec2->ha &&
+               xdl_recmatch(rec1->ptr, rec1->size,
+                            rec2->ptr, rec2->size,
+                            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)
+{
+       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;
+}
+
+/*
+ * 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) {
+               /*
+                * The line has the same indentation level as its predecessor.
+                * No additional adjustments needed.
+                */
+       } else {
                /*
-                * 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 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:
                 */
-               ixs = ix;
-               for (ix++; rchg[ix]; ix++);
-               for (; rchgo[ixo]; ixo++);
+               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;
+       unsigned int blank_lines;
+
+       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;
+                       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[ixs - 1]->ha == recs[ix - 1]->ha &&
-                              xdl_recmatch(recs[ixs - 1]->ptr, recs[ixs - 1]->size, recs[ix - 1]->ptr, recs[ix - 1]->size, 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).
+                        * Boolean value that records whether there are any blank
+                        * lines that could be made to be the last line of this
+                        * group.
                         */
-                       ixref = rchgo[ixo - 1] ? ix: nrec;
+                       blank_lines = 0;
+
+                       /* 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[ixs]->ha == recs[ix]->ha &&
-                              xdl_recmatch(recs[ixs]->ptr, recs[ixs]->size, recs[ix]->ptr, recs[ix]->size, 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;
+                       earliest_end = g.end;
+
+                       if (go.end > go.start)
+                               end_matching_other = g.end;
+
+                       /* Now shift the group forward as far as possible: */
+                       while (1) {
+                               if (!blank_lines)
+                                       blank_lines = is_blank_line(
+                                                       xdf->recs[g.end - 1],
+                                                       flags);
+
+                               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 (grpsiz != ix - ixs);
+               } while (groupsize != g.end - g.start);
 
                /*
-                * Try to move back the possibly merged group of changes, to match
-                * the recorded position in the other file.
+                * If the group can be shifted, then we can possibly use this
+                * freedom to produce a more intuitive diff.
+                *
+                * The group is currently shifted as far down as possible, so the
+                * heuristics below only have to handle upwards shifts.
                 */
-               while (ixref < ix) {
-                       rchg[--ixs] = 1;
-                       rchg[--ix] = 0;
-                       while (rchgo[--ixo]);
+
+               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_COMPACTION_HEURISTIC) && blank_lines) {
+                       /*
+                        * Compaction heuristic: if it is possible to shift the
+                        * group to make its bottom line a blank line, do so.
+                        *
+                        * As we already shifted the group forward as far as
+                        * possible in the earlier loop, we only need to handle
+                        * backward shifts, not forward ones.
+                        */
+                       while (!is_blank_line(xdf->recs[g.end - 1], flags)) {
+                               if (group_slide_up(xdf, &g, flags))
+                                       xdl_bug("blank line disappeared");
+                               if (group_previous(xdfo, &go))
+                                       xdl_bug("group sync broken sliding to blank line");
+                       }
+               } 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 993724b11c40bacffee8df927018e5790a265bd4..7389ce41022dbee5776d44a937e8bcf780656f42 100644 (file)
 
 #include "xinclude.h"
 
-
-
-
-static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec);
-static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb);
-
-
-
-
 static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) {
 
        *rec = xdf->recs[ri]->ptr;
@@ -120,6 +111,16 @@ static long def_ff(const char *rec, long len, char *buf, long sz, void *priv)
        return -1;
 }
 
+static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
+                          char *buf, long sz)
+{
+       const char *rec;
+       long len = xdl_get_rec(xdf, ri, &rec);
+       if (!xecfg->find_func)
+               return def_ff(rec, len, buf, sz, xecfg->find_func_priv);
+       return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv);
+}
+
 struct func_line {
        long len;
        char buf[80];
@@ -128,7 +129,6 @@ struct func_line {
 static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
                          struct func_line *func_line, long start, long limit)
 {
-       find_func_t ff = xecfg->find_func ? xecfg->find_func : def_ff;
        long l, size, step = (start > limit) ? -1 : 1;
        char *buf, dummy[1];
 
@@ -136,9 +136,7 @@ static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
        size = func_line ? sizeof(func_line->buf) : sizeof(dummy);
 
        for (l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) {
-               const char *rec;
-               long reclen = xdl_get_rec(&xe->xdf1, l, &rec);
-               long len = ff(rec, reclen, buf, size, xecfg->find_func_priv);
+               long len = match_func_rec(&xe->xdf1, xecfg, l, buf, size);
                if (len >= 0) {
                        if (func_line)
                                func_line->len = len;
@@ -148,6 +146,18 @@ static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
        return -1;
 }
 
+static int is_empty_rec(xdfile_t *xdf, long ri)
+{
+       const char *rec;
+       long len = xdl_get_rec(xdf, ri, &rec);
+
+       while (len > 0 && XDL_ISSPACE(*rec)) {
+               rec++;
+               len--;
+       }
+       return !len;
+}
+
 int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                  xdemitconf_t const *xecfg) {
        long s1, s2, e1, e2, lctx;
@@ -164,7 +174,34 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);
 
                if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) {
-                       long fs1 = get_func_line(xe, xecfg, NULL, xch->i1, -1);
+                       long fs1, i1 = xch->i1;
+
+                       /* Appended chunk? */
+                       if (i1 >= xe->xdf1.nrec) {
+                               char dummy[1];
+                               long i2 = xch->i2;
+
+                               /*
+                                * We don't need additional context if
+                                * a whole function was added, possibly
+                                * starting with empty lines.
+                                */
+                               while (i2 < xe->xdf2.nrec &&
+                                      is_empty_rec(&xe->xdf2, i2))
+                                       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
+                                * pre-image.
+                                */
+                               i1 = xe->xdf1.nrec - 1;
+                       }
+
+                       fs1 = get_func_line(xe, xecfg, NULL, i1, -1);
                        if (fs1 < 0)
                                fs1 = 0;
                        if (fs1 < s1) {
@@ -173,7 +210,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                        }
                }
 
again:
post_context_calculation:
                lctx = xecfg->ctxlen;
                lctx = XDL_MIN(lctx, xe->xdf1.nrec - (xche->i1 + xche->chg1));
                lctx = XDL_MIN(lctx, xe->xdf2.nrec - (xche->i2 + xche->chg2));
@@ -185,6 +222,8 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                        long fe1 = get_func_line(xe, xecfg, NULL,
                                                 xche->i1 + xche->chg1,
                                                 xe->xdf1.nrec);
+                       while (fe1 > 0 && is_empty_rec(&xe->xdf1, fe1 - 1))
+                               fe1--;
                        if (fe1 < 0)
                                fe1 = xe->xdf1.nrec;
                        if (fe1 > e1) {
@@ -198,11 +237,12 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                         * its new end.
                         */
                        if (xche->next) {
-                               long l = xche->next->i1;
-                               if (l <= e1 ||
+                               long l = XDL_MIN(xche->next->i1,
+                                                xe->xdf1.nrec - 1);
+                               if (l - xecfg->ctxlen <= e1 ||
                                    get_func_line(xe, xecfg, NULL, l, e1) < 0) {
                                        xche = xche->next;
-                                       goto again;
+                                       goto post_context_calculation;
                                }
                        }
                }
index 04e1a1ab2a863814df3b9a91d4e854704d47f3f5..a613efc7034bc0dc45bf13428c819701f044323d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  LibXDiff by Davide Libenzi ( File Differential Library )
- *  Copyright (C) 2003-2009 Davide Libenzi, Johannes E. Schindelin
+ *  Copyright (C) 2003-2016 Davide Libenzi, Johannes E. Schindelin
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
index 63a22c630e521969b08c8ecb1ce9fa3e0f3ff513..13b55aba7441bc84d2c5c075110e9ef798ba18f8 100644 (file)
@@ -301,10 +301,11 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
 
                xdl_free_ctx(&xe->xdf2);
                xdl_free_ctx(&xe->xdf1);
+               xdl_free_classifier(&cf);
                return -1;
        }
 
-       if (!(xpp->flags & XDF_HISTOGRAM_DIFF))
+       if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)
                xdl_free_classifier(&cf);
 
        return 0;
index 62cb23dfd37743e4985655998ccabd56db160233..027192a1c7f12214c0ff6787296769ce708ba407 100644 (file)
@@ -200,8 +200,10 @@ int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags)
                                return 0;
                }
        } else if (flags & XDF_IGNORE_WHITESPACE_AT_EOL) {
-               while (i1 < s1 && i2 < s2 && l1[i1++] == l2[i2++])
-                       ; /* keep going */
+               while (i1 < s1 && i2 < s2 && l1[i1] == l2[i2]) {
+                       i1++;
+                       i2++;
+               }
        }
 
        /*